CMake构建CH58x项目,脱离eclipse使用Clion或者Vscode编写代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
2.8 KiB

#include "api-uart.h"
#include "stdio.h"
#include "stdarg.h"
#include "stdlib.h"
// 默认串口数2
Uart_t UartList[UART_NUMBER];
void Uart_Init(uint8_t uartId, GpioPin_t Tx, GpioPin_t Rx, uint32_t baudRate, DataBits_t dataBits,
StopBits_t stopBits, Parity_t parity)
{
uint32_t baud = 0;
Fifo_Init(&UartList[uartId].RxFifo, UartList[uartId].RxBuff, RxSize);
Gpio_Set(Tx);
Gpio_Init(Tx, GPIO_ModeOut_PP_5mA);
Gpio_Init(Rx, GPIO_ModeIN_PU);
baud = 10 * GetSysClock() / 8 / baudRate;
baud = (baud + 5) / 10;
Uart(uartId)->DL = (uint16_t) baud;
Uart(uartId)->FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN;
Uart(uartId)->LCR = dataBits | (stopBits << 2) | (parity == Parity_None ? 0 : (parity - 1) << 3);
Uart(uartId)->IER = RB_IER_TXD_EN;
Uart(uartId)->DIV = 1;
Uart_INCfg(uartId, ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
switch (uartId)
{
case 0:
PFIC_EnableIRQ(UART0_IRQn);
break;
case 1:
PFIC_EnableIRQ(UART1_IRQn);
break;
case 2:
PFIC_EnableIRQ(UART2_IRQn);
break;
case 3:
PFIC_EnableIRQ(UART3_IRQn);
break;
default:
break;
}
}
void Uart_INCfg(uint8_t uartId, FunctionalState s, uint8_t i)
{
if (s == ENABLE)
{
Uart(uartId)->IER |= i;
Uart(uartId)->MCR |= RB_MCR_INT_OE;
} else
{
Uart(uartId)->IER &= ~i;
}
}
/**
* @brief 自定义printf函数
* 这个函数在CMakelists.txt中添加了printf全局宏定义,使用printf函数时会调用这个函数
*/
int myPrintf(const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
int len = vsnprintf(NULL, 0, fmt, arg);
uint8_t *data = (uint8_t *) malloc(len);
vsprintf((char *) data, fmt, arg);
UART1_SendString(data, len); // 修改为你的串口发送函数
free(data);
va_end(arg);
data = NULL;
return 0;
}
bool Api_GetUartData(uint8_t id, uint8_t *cmd)
{
if (!Fifo_IsEmpty(&UartList[id].RxFifo))
{
*cmd = Fifo_Pop(&UartList[id].RxFifo);
return true;
}
return false;
}
__HIGH_CODE
void UART1_IRQHandler(void)
{
uint8_t cmd = 0;
if (UART1_GetITFlag() == UART_II_RECV_RDY)
{
if (R8_UART1_RFC)
{
if (!Fifo_IsFull(&UartList[1].RxFifo))
{
Fifo_Push(&UartList[1].RxFifo, R8_UART1_RBR);
}
}
}
if (UART1_GetITFlag() == UART_II_RECV_TOUT)
{
uint8_t RxData[RxSize] = {0};
uint16_t len = UART1_RecvString(RxData);
for (int j = 0; j < len; ++j)
{
if (!Fifo_IsFull(&UartList[1].RxFifo))
{
Fifo_Push(&UartList[1].RxFifo, RxData[j]);
}
}
}
}