2024-12-02 17:03:41 +08:00
|
|
|
|
#include "bsp_uart.h"
|
|
|
|
|
#include "lwrb.h"
|
2024-12-12 15:49:10 +08:00
|
|
|
|
#include "CH59x_uart.h"
|
2024-12-02 17:03:41 +08:00
|
|
|
|
#include "shell_port.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
lwrb_t Uart1Rx;
|
|
|
|
|
lwrb_t Uart1Tx;
|
2024-12-02 17:03:41 +08:00
|
|
|
|
uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0};
|
|
|
|
|
uint8_t uart1_rx_buf[UART1_RX_BUFFER_LENGTH] = {0};
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>
|
2024-12-02 17:03:41 +08:00
|
|
|
|
unsigned int BSP_Uart1_Receive_Data(void *buf, unsigned int len)
|
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
return lwrb_read(&Uart1Rx, buf, len);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-12-02 17:03:41 +08:00
|
|
|
|
unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len)
|
|
|
|
|
{
|
|
|
|
|
unsigned int ret;
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
ret = lwrb_write(&Uart1Tx, buf, len);
|
|
|
|
|
// UART1_INTCfg(ENABLE, RB_IER_THR_EMPTY);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
unsigned int BSP_Uart1_Send_String(const void *buf)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
return BSP_Uart1_Send_Data(buf, strlen((const char *)buf));
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Buffer event function
|
|
|
|
|
*/
|
2024-12-12 15:49:10 +08:00
|
|
|
|
static void Uart1_evt_fn(struct lwrb *buff, lwrb_evt_type_t evt, lwrb_sz_t bp)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
|
|
|
|
switch (evt)
|
|
|
|
|
{
|
|
|
|
|
case LWRB_EVT_RESET:
|
|
|
|
|
printf("[EVT] Buffer reset event!\r\n");
|
|
|
|
|
break;
|
|
|
|
|
case LWRB_EVT_READ:
|
|
|
|
|
printf("[EVT] Buffer read event: %d byte(s)!\r\n", (int)bp);
|
|
|
|
|
break;
|
|
|
|
|
case LWRB_EVT_WRITE:
|
|
|
|
|
printf("[EVT] Buffer write event: %d byte(s)!\r\n", (int)bp);
|
|
|
|
|
break;
|
2024-12-12 15:49:10 +08:00
|
|
|
|
default:
|
|
|
|
|
break;
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UART1_FifoInit(void)
|
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
lwrb_init(&Uart1Tx, uart1_tx_buf, sizeof(uart1_tx_buf));
|
|
|
|
|
lwrb_init(&Uart1Rx, uart1_rx_buf, sizeof(uart1_rx_buf));
|
2024-12-02 17:03:41 +08:00
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// lwrb_set_evt_fn(&Uart1Rx, Uart1_evt_fn);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// DEBUG
|
|
|
|
|
void BSP_UART1_Init(uint32_t baudrate)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// GPIOPinRemap(ENABLE, RB_PIN_UART1);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD> */
|
2024-12-12 15:49:10 +08:00
|
|
|
|
GPIOA_SetBits(bTXD1);
|
2024-12-12 19:38:57 +08:00
|
|
|
|
// GPIOB_ModeCfg(bRXD1, GPIO_ModeIN_PU); // RXD-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-12-12 15:49:10 +08:00
|
|
|
|
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // TXD-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
|
|
|
|
|
// UART1_DefInit();
|
|
|
|
|
{
|
|
|
|
|
UART1_BaudRateCfg(baudrate);
|
|
|
|
|
R8_UART1_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO<46><EFBFBD><F2BFAAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
R8_UART1_LCR = RB_LCR_WORD_SZ;
|
|
|
|
|
R8_UART1_IER = RB_IER_TXD_EN;
|
|
|
|
|
R8_UART1_DIV = 1;
|
|
|
|
|
}
|
2024-12-12 19:38:57 +08:00
|
|
|
|
// UART1_ByteTrigCfg(UART_1BYTE_TRIG);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
// <20>жϷ<D0B6>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-12-12 19:38:57 +08:00
|
|
|
|
// UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY);
|
|
|
|
|
// UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY);
|
|
|
|
|
// PFIC_EnableIRQ(UART1_IRQn);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
|
|
|
|
|
UART1_FifoInit();
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
SHELL_Init();
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// https://www.cnblogs.com/iot-fan/p/13439293.html
|
|
|
|
|
// tx process
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
|
|
|
|
|
void BSP_UART1_TxLoop(void)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
|
|
|
|
uint8_t data;
|
2024-12-12 15:49:10 +08:00
|
|
|
|
while (R8_UART1_TFC < UART_FIFO_SIZE)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// <20>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ƿ<EFBFBD><C7B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>һ<EFBFBD><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ӳ<EEB5BD><D3B2>fifo<66><6F>
|
|
|
|
|
if (lwrb_get_full(&Uart1Tx))
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
lwrb_read(&Uart1Tx, &data, 1);
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uart<72><74>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>fifo<66><6F>
|
|
|
|
|
UART1_SendByte(data);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
2024-12-12 15:49:10 +08:00
|
|
|
|
else
|
|
|
|
|
{
|
2024-12-02 17:03:41 +08:00
|
|
|
|
break;
|
2024-12-12 15:49:10 +08:00
|
|
|
|
}
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*********************************************************************
|
2024-12-12 15:49:10 +08:00
|
|
|
|
* @fn UART1_IRQHandler
|
2024-12-02 17:03:41 +08:00
|
|
|
|
*
|
|
|
|
|
* @brief UART1<EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* @return none
|
|
|
|
|
*/
|
|
|
|
|
__INTERRUPT
|
|
|
|
|
__HIGH_CODE
|
2024-12-12 15:49:10 +08:00
|
|
|
|
void UART1_IRQHandler(void)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
switch (UART1_GetITFlag())
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
|
|
|
|
case UART_II_LINE_STAT: // <20><>·״̬<D7B4><CCAC><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
UART1_GetLinSTA();
|
2024-12-02 17:03:41 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case UART_II_RECV_RDY:
|
2024-12-12 15:49:10 +08:00
|
|
|
|
case UART_II_RECV_TOUT: // <20><><EFBFBD>ճ<EFBFBD>ʱ
|
|
|
|
|
// lwrb_write(&Uart1Rx, &R8_UART1_RBR, 1);
|
|
|
|
|
while (R8_UART1_RFC)
|
2024-12-02 17:03:41 +08:00
|
|
|
|
{
|
2024-12-12 15:49:10 +08:00
|
|
|
|
shellHandler(&shell, R8_UART1_RBR);
|
2024-12-02 17:03:41 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case UART_II_THR_EMPTY: // <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-12-12 15:49:10 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-12-02 17:03:41 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case UART_II_MODEM_CHG: // ֻ֧<D6BB>ִ<EFBFBD><D6B4><EFBFBD>0
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-12-12 15:49:10 +08:00
|
|
|
|
|
|
|
|
|
int reboot(void)
|
|
|
|
|
{
|
|
|
|
|
PFIC_SystemReset();
|
|
|
|
|
}
|
|
|
|
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
|
|
|
|
|
reboot, reboot, "reboot");
|