1232 lines
30 KiB
C
Raw Normal View History

2021-09-28 14:26:43 +08:00
//UART <20><>
#include "stdio.h"
#include "sys.h"
#include "systick.h"
#include "uart.h"
COM_PORT_E printf_Com = COM1;
COM_PORT_E getchar_Com = COM1;
//USART1 PA9 PA10
#define USART1_CLK_ENABLE() __HAL_RCC_USART1_CLK_ENABLE()
#define USART1_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define USART1_TX_GPIO_PORT GPIOA
#define USART1_TX_PIN GPIO_PIN_9
#define USART1_TX_AF GPIO_AF7_USART1
#define USART1_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define USART1_RX_GPIO_PORT GPIOA
#define USART1_RX_PIN GPIO_PIN_10
#define USART1_RX_AF GPIO_AF7_USART1
//USART2 PD5 PD6
#define USART2_CLK_ENABLE() __HAL_RCC_USART2_CLK_ENABLE()
#define USART2_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
#define USART2_TX_GPIO_PORT GPIOD
#define USART2_TX_PIN GPIO_PIN_5
#define USART2_TX_AF GPIO_AF7_USART2
#define USART2_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
#define USART2_RX_GPIO_PORT GPIOD
#define USART2_RX_PIN GPIO_PIN_6
#define USART2_RX_AF GPIO_AF7_USART2
//USART3 PB10 PB11
#define USART3_CLK_ENABLE() __HAL_RCC_USART3_CLK_ENABLE()
#define USART3_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART3_TX_GPIO_PORT GPIOB
#define USART3_TX_PIN GPIO_PIN_10
#define USART3_TX_AF GPIO_AF7_USART3
#define USART3_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART3_RX_GPIO_PORT GPIOB
#define USART3_RX_PIN GPIO_PIN_11
#define USART3_RX_AF GPIO_AF7_USART3
//UART4 PC10 PC11
#define UART4_CLK_ENABLE() __HAL_RCC_UART4_CLK_ENABLE()
#define UART4_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define UART4_TX_GPIO_PORT GPIOC
#define UART4_TX_PIN GPIO_PIN_10
#define UART4_TX_AF GPIO_AF8_UART4
#define UART4_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define UART4_RX_GPIO_PORT GPIOC
#define UART4_RX_PIN GPIO_PIN_11
#define UART4_RX_AF GPIO_AF8_UART4
//UART5 PC12 PD2
#define UART5_CLK_ENABLE() __HAL_RCC_UART5_CLK_ENABLE()
#define UART5_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define UART5_TX_GPIO_PORT GPIOC
#define UART5_TX_PIN GPIO_PIN_12
#define UART5_TX_AF GPIO_AF8_UART5
#define UART5_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
#define UART5_RX_GPIO_PORT GPIOD
#define UART5_RX_PIN GPIO_PIN_2
#define UART5_RX_AF GPIO_AF8_UART5
//USART6 PG14 PC7
#define USART6_CLK_ENABLE() __HAL_RCC_USART6_CLK_ENABLE()
#define USART6_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE()
#define USART6_TX_GPIO_PORT GPIOG
#define USART6_TX_PIN GPIO_PIN_14
#define USART6_TX_AF GPIO_AF7_USART6
#define USART6_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define USART6_RX_GPIO_PORT GPIOC
#define USART6_RX_PIN GPIO_PIN_7
#define USART6_RX_AF GPIO_AF7_USART6
//UART7 PB4 PB3
#define UART7_CLK_ENABLE() __HAL_RCC_UART7_CLK_ENABLE()
#define UART7_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define UART7_TX_GPIO_PORT GPIOB
#define UART7_TX_PIN GPIO_PIN_4
#define UART7_TX_AF GPIO_AF11_UART7
#define UART7_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define UART7_RX_GPIO_PORT GPIOB
#define UART7_RX_PIN GPIO_PIN_3
#define UART7_RX_AF GPIO_AF11_UART7
//UART8 PJ8 PJ9
#define UART8_CLK_ENABLE() __HAL_RCC_UART8_CLK_ENABLE()
#define UART8_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOJ_CLK_ENABLE()
#define UART8_TX_GPIO_PORT GPIOJ
#define UART8_TX_PIN GPIO_PIN_8
#define UART8_TX_AF GPIO_AF8_UART8
#define UART8_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOJ_CLK_ENABLE()
#define UART8_RX_GPIO_PORT GPIOJ
#define UART8_RX_PIN GPIO_PIN_9
#define UART8_RX_AF GPIO_AF8_UART8
//<2F><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ڽṹ<DABD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#if UART1_FIFO_EN == 1
static UART_T g_tUart1;
static uint8_t g_TxBuf1[UART1_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf1[UART1_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART2_FIFO_EN == 1
static UART_T g_tUart2;
static uint8_t g_TxBuf2[UART2_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf2[UART2_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART3_FIFO_EN == 1
static UART_T g_tUart3;
static uint8_t g_TxBuf3[UART3_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf3[UART3_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART4_FIFO_EN == 1
static UART_T g_tUart4;
static uint8_t g_TxBuf4[UART4_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf4[UART4_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART5_FIFO_EN == 1
static UART_T g_tUart5;
static uint8_t g_TxBuf5[UART5_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf5[UART5_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART6_FIFO_EN == 1
static UART_T g_tUart6;
static uint8_t g_TxBuf6[UART6_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf6[UART6_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART7_FIFO_EN == 1
static UART_T g_tUart7;
static uint8_t g_TxBuf7[UART7_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf7[UART7_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
#if UART8_FIFO_EN == 1
static UART_T g_tUart8;
static uint8_t g_TxBuf8[UART8_TX_BUF_SIZE]; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
static uint8_t g_RxBuf8[UART8_RX_BUF_SIZE]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
#endif
static void UartVarInit(void);
static void InitHardUart(void);
static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen);
static uint8_t UartGetChar(UART_T *_pUart, uint8_t *_pByte);
static void UartIRQ(UART_T *_pUart);
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_Init(void)
{
UartVarInit(); //<2F><>ʼ<EFBFBD><CABC>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
InitHardUart(); //<2F><><EFBFBD>ô<EFBFBD><C3B4>ڵ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/**
* @brief <EFBFBD><EFBFBD> COM <EFBFBD>˿ں<EFBFBD>ת<EFBFBD><EFBFBD>Ϊ UART ָ<EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @retval UART ָ<EFBFBD><EFBFBD>
*/
UART_T *ComToUart(COM_PORT_E _ucPort)
{
if (_ucPort == COM1)
{
#if UART1_FIFO_EN == 1
return &g_tUart1;
#else
return 0;
#endif
}
else if (_ucPort == COM2)
{
#if UART2_FIFO_EN == 1
return &g_tUart2;
#else
return 0;
#endif
}
else if (_ucPort == COM3)
{
#if UART3_FIFO_EN == 1
return &g_tUart3;
#else
return 0;
#endif
}
else if (_ucPort == COM4)
{
#if UART4_FIFO_EN == 1
return &g_tUart4;
#else
return 0;
#endif
}
else if (_ucPort == COM5)
{
#if UART5_FIFO_EN == 1
return &g_tUart5;
#else
return 0;
#endif
}
else if (_ucPort == COM6)
{
#if UART6_FIFO_EN == 1
return &g_tUart6;
#else
return 0;
#endif
}
else if (_ucPort == COM7)
{
#if UART7_FIFO_EN == 1
return &g_tUart7;
#else
return 0;
#endif
}
else if (_ucPort == COM8)
{
#if UART8_FIFO_EN == 1
return &g_tUart8;
#else
return 0;
#endif
}
else
{
return 0;
}
}
/**
* @brief <EFBFBD><EFBFBD> COM <EFBFBD>˿ں<EFBFBD>ת<EFBFBD><EFBFBD>Ϊ USART_TypeDef*
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @retval USART_TypeDef*
*/
USART_TypeDef *ComToUSARTx(COM_PORT_E _ucPort)
{
if (_ucPort == COM1)
{
#if UART1_FIFO_EN == 1
return USART1;
#else
return 0;
#endif
}
else if (_ucPort == COM2)
{
#if UART2_FIFO_EN == 1
return USART2;
#else
return 0;
#endif
}
else if (_ucPort == COM3)
{
#if UART3_FIFO_EN == 1
return USART3;
#else
return 0;
#endif
}
else if (_ucPort == COM4)
{
#if UART4_FIFO_EN == 1
return UART4;
#else
return 0;
#endif
}
else if (_ucPort == COM5)
{
#if UART5_FIFO_EN == 1
return UART5;
#else
return 0;
#endif
}
else if (_ucPort == COM6)
{
#if UART6_FIFO_EN == 1
return USART6;
#else
return 0;
#endif
}
else if (_ucPort == COM7)
{
#if UART7_FIFO_EN == 1
return UART7;
#else
return 0;
#endif
}
else if (_ucPort == COM8)
{
#if UART8_FIFO_EN == 1
return UART8;
#else
return 0;
#endif
}
else
{
return 0;
}
}
/**
* @brief <EFBFBD>򴮿ڷ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>̨<EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param _ucaBuf: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _usLen : <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendBuf(COM_PORT_E _ucPort, uint8_t *_ucaBuf, uint16_t _usLen)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return;
}
if (pUart->SendBefore != 0)
{
pUart->SendBefore();
}
UartSend(pUart, _ucaBuf, _usLen);
}
/**
* @brief <EFBFBD>򴮿ڷ<EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD>ֽڡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>̨<EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param _ucByte: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendChar(COM_PORT_E _ucPort, uint8_t _ucByte)
{
Uart_SendBuf(_ucPort, &_ucByte, 1);
}
/**
* @brief <EFBFBD>ӽ<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ 1 <EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param _pByte: <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @retval 0 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>1 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ֽ<EFBFBD>
*/
uint8_t Uart_GetChar(COM_PORT_E _ucPort, uint8_t *_pByte)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return 0;
}
return UartGetChar(pUart, _pByte);
}
/**
* @brief <EFBFBD>ӽ<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ʱ
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param _pBuf: <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @param _endByte: <EFBFBD><EFBFBD>ֹ<EFBFBD>ֽ<EFBFBD>
* @param _timeout: <EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
* @retval 0 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1 <EFBFBD><EFBFBD>ʾ<EFBFBD>ɹ<EFBFBD>
*/
uint8_t Uart_GetBuffUntil(COM_PORT_E _ucPort, uint8_t *_pBuf, uint8_t _endByte, uint16_t _timeout)
{
uint8_t ch;
int32_t start_t = SysTick_GetRunTime();
uint16_t i = 0;
while (1)
{
if (Uart_GetChar(_ucPort, &ch) == 1)
{
if (ch == _endByte)
{
_pBuf[i] = '\0';
2021-10-06 00:36:37 +08:00
2021-09-28 14:26:43 +08:00
return 1;
}
_pBuf[i++] = ch;
}
else if (SysTick_GetRunTime() - start_t > _timeout)
{
return 0;
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
*/
void Uart_ClearTxFifo(COM_PORT_E _ucPort)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return;
}
pUart->usTxWrite = 0;
pUart->usTxRead = 0;
pUart->usTxCount = 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
*/
void Uart_ClearRxFifo(COM_PORT_E _ucPort)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return;
}
pUart->usRxWrite = 0;
pUart->usRxRead = 0;
pUart->usRxCount = 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ڵIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʡ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param _BaudRate: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SetBaud(COM_PORT_E _ucPort, uint32_t _BaudRate)
{
USART_TypeDef *USARTx;
USARTx = ComToUSARTx(_ucPort);
if (USARTx == 0)
{
return;
}
Uart_SetUartParam(USARTx, _BaudRate, UART_PARITY_NONE, UART_MODE_TX_RX);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param Receive: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_BindSendBeforeHandle(COM_PORT_E _ucPort, UartSendBeforeHandler SendBefore)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return;
}
pUart->SendBefore = SendBefore;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param Receive: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_BindSendOverHandle(COM_PORT_E _ucPort, UartSendOverHandler SendOver)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return;
}
pUart->SendOver = SendOver;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _ucPort: <EFBFBD>˿ں<EFBFBD> (COM1-8)
* @param Receive: <EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_BindReceiveHandle(COM_PORT_E _ucPort, UartReceiveHandler Receive)
{
UART_T *pUart;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return;
}
pUart->Receive = Receive;
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صı<EFBFBD><EFBFBD><EFBFBD>
*/
static void UartVarInit(void)
{
#if UART1_FIFO_EN == 1
g_tUart1.uart = USART1; //<2F><><EFBFBD><EFBFBD><EFBFBD>
g_tUart1.pTxBuf = g_TxBuf1; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
g_tUart1.pRxBuf = g_RxBuf1; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
g_tUart1.usTxBufSize = UART1_TX_BUF_SIZE; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
g_tUart1.usRxBufSize = UART1_RX_BUF_SIZE; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
g_tUart1.usTxWrite = 0; //<2F><><EFBFBD><EFBFBD>FIFOд<4F><D0B4><EFBFBD><EFBFBD>
g_tUart1.usTxRead = 0; //<2F><><EFBFBD><EFBFBD>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_tUart1.usRxWrite = 0; //<2F><><EFBFBD><EFBFBD>FIFOд<4F><D0B4><EFBFBD><EFBFBD>
g_tUart1.usRxRead = 0; //<2F><><EFBFBD><EFBFBD>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_tUart1.usRxCount = 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
g_tUart1.usTxCount = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
g_tUart1.SendBefore = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
g_tUart1.SendOver = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
g_tUart1.Receive = 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
g_tUart1.Sending = 0; //<2F><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>б<EFBFBD>־
#endif
#if UART2_FIFO_EN == 1
g_tUart2.uart = USART2; //<2F><><EFBFBD><EFBFBD><EFBFBD>
g_tUart2.pTxBuf = g_TxBuf2; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
g_tUart2.pRxBuf = g_RxBuf2; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
g_tUart2.usTxBufSize = UART2_TX_BUF_SIZE; //<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
g_tUart2.usRxBufSize = UART2_RX_BUF_SIZE; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
g_tUart2.usTxWrite = 0; //<2F><><EFBFBD><EFBFBD>FIFOд<4F><D0B4><EFBFBD><EFBFBD>
g_tUart2.usTxRead = 0; //<2F><><EFBFBD><EFBFBD>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_tUart2.usRxWrite = 0; //<2F><><EFBFBD><EFBFBD>FIFOд<4F><D0B4><EFBFBD><EFBFBD>
g_tUart2.usRxRead = 0; //<2F><><EFBFBD><EFBFBD>FIFO<46><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_tUart2.usRxCount = 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
g_tUart2.usTxCount = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
g_tUart2.SendBefore = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
g_tUart2.SendOver = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
g_tUart2.Receive = 0; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
g_tUart2.Sending = 0; //<2F><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>б<EFBFBD>־
#endif
#if UART3_FIFO_EN == 1
g_tUart3.uart = USART3;
g_tUart3.pTxBuf = g_TxBuf3;
g_tUart3.pRxBuf = g_RxBuf3;
g_tUart3.usTxBufSize = UART3_TX_BUF_SIZE;
g_tUart3.usRxBufSize = UART3_RX_BUF_SIZE;
g_tUart3.usTxWrite = 0;
g_tUart3.usTxRead = 0;
g_tUart3.usRxWrite = 0;
g_tUart3.usRxRead = 0;
g_tUart3.usRxCount = 0;
g_tUart3.usTxCount = 0;
g_tUart3.SendBefore = 0;
g_tUart3.SendOver = 0;
g_tUart3.Receive = 0;
g_tUart3.Sending = 0;
#endif
#if UART4_FIFO_EN == 1
g_tUart4.uart = UART4;
g_tUart4.pTxBuf = g_TxBuf4;
g_tUart4.pRxBuf = g_RxBuf4;
g_tUart4.usTxBufSize = UART4_TX_BUF_SIZE;
g_tUart4.usRxBufSize = UART4_RX_BUF_SIZE;
g_tUart4.usTxWrite = 0;
g_tUart4.usTxRead = 0;
g_tUart4.usRxWrite = 0;
g_tUart4.usRxRead = 0;
g_tUart4.usRxCount = 0;
g_tUart4.usTxCount = 0;
g_tUart4.SendBefore = 0;
g_tUart4.SendOver = 0;
g_tUart4.Receive = 0;
g_tUart4.Sending = 0;
#endif
#if UART5_FIFO_EN == 1
g_tUart5.uart = UART5;
g_tUart5.pTxBuf = g_TxBuf5;
g_tUart5.pRxBuf = g_RxBuf5;
g_tUart5.usTxBufSize = UART5_TX_BUF_SIZE;
g_tUart5.usRxBufSize = UART5_RX_BUF_SIZE;
g_tUart5.usTxWrite = 0;
g_tUart5.usTxRead = 0;
g_tUart5.usRxWrite = 0;
g_tUart5.usRxRead = 0;
g_tUart5.usRxCount = 0;
g_tUart5.usTxCount = 0;
g_tUart5.SendBefore = 0;
g_tUart5.SendOver = 0;
g_tUart5.Receive = 0;
g_tUart5.Sending = 0;
#endif
#if UART6_FIFO_EN == 1
g_tUart6.uart = USART6;
g_tUart6.pTxBuf = g_TxBuf6;
g_tUart6.pRxBuf = g_RxBuf6;
g_tUart6.usTxBufSize = UART6_TX_BUF_SIZE;
g_tUart6.usRxBufSize = UART6_RX_BUF_SIZE;
g_tUart6.usTxWrite = 0;
g_tUart6.usTxRead = 0;
g_tUart6.usRxWrite = 0;
g_tUart6.usRxRead = 0;
g_tUart6.usRxCount = 0;
g_tUart6.usTxCount = 0;
g_tUart6.SendBefore = 0;
g_tUart6.SendOver = 0;
g_tUart6.Receive = 0;
g_tUart6.Sending = 0;
#endif
#if UART7_FIFO_EN == 1
g_tUart7.uart = UART7;
g_tUart7.pTxBuf = g_TxBuf7;
g_tUart7.pRxBuf = g_RxBuf7;
g_tUart7.usTxBufSize = UART7_TX_BUF_SIZE;
g_tUart7.usRxBufSize = UART7_RX_BUF_SIZE;
g_tUart7.usTxWrite = 0;
g_tUart7.usTxRead = 0;
g_tUart7.usRxWrite = 0;
g_tUart7.usRxRead = 0;
g_tUart7.usRxCount = 0;
g_tUart7.usTxCount = 0;
g_tUart7.SendBefore = 0;
g_tUart7.SendOver = 0;
g_tUart7.Receive = 0;
g_tUart7.Sending = 0;
#endif
#if UART8_FIFO_EN == 1
g_tUart8.uart = UART8;
g_tUart8.pTxBuf = g_TxBuf8;
g_tUart8.pRxBuf = g_RxBuf8;
g_tUart8.usTxBufSize = UART8_TX_BUF_SIZE;
g_tUart8.usRxBufSize = UART8_RX_BUF_SIZE;
g_tUart8.usTxWrite = 0;
g_tUart8.usTxRead = 0;
g_tUart8.usRxWrite = 0;
g_tUart8.usRxRead = 0;
g_tUart8.usRxCount = 0;
g_tUart8.usTxCount = 0;
g_tUart8.SendBefore = 0;
g_tUart8.SendOver = 0;
g_tUart8.Receive = 0;
g_tUart8.Sending = 0;
#endif
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ڵ<EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Instance: USART_TypeDef*
* @param BaudRate: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Parity: У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>żУ<EFBFBD><EFBFBD>
* @param Mode: <EFBFBD><EFBFBD><EFBFBD>ͺͽ<EFBFBD><EFBFBD><EFBFBD>ģʽʹ<EFBFBD><EFBFBD>
*/
void Uart_SetUartParam(USART_TypeDef *Instance, uint32_t BaudRate, uint32_t Parity, uint32_t Mode)
{
UART_HandleTypeDef UartHandle;
UartHandle.Instance = Instance;
UartHandle.Init.BaudRate = BaudRate;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = Parity;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = Mode;
UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&UartHandle);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ڵ<EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void InitHardUart(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
/*
Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>USART1 <EFBFBD><EFBFBD> USART6 ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> PCLK2<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> 100MHz
USART2 USART3 UART4 UART5 UART6 UART7 UART8 ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> PLCK1<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> 100MHz
*/
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART16;
RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
#if UART1_FIFO_EN == 1
USART1_TX_GPIO_CLK_ENABLE();
USART1_RX_GPIO_CLK_ENABLE();
USART1_CLK_ENABLE();
GPIO_InitStruct.Pin = USART1_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = USART1_TX_AF;
HAL_GPIO_Init(USART1_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART1_RX_PIN;
GPIO_InitStruct.Alternate = USART1_RX_AF;
HAL_GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStruct);
//<2F><><EFBFBD><EFBFBD>NVIC the NVIC for UART
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ʡ<EFBFBD><CAA1><EFBFBD>żУ<C5BC><D0A3>
Uart_SetUartParam(USART1, UART1_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(USART1->ICR, USART_ICR_TCCF); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
SET_BIT(USART1->RQR, USART_RQR_RXFRQ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD>־
SET_BIT(USART1->CR1, USART_CR1_RXNEIE); //ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>ж<EFBFBD>
#endif
#if UART2_FIFO_EN == 1
USART2_TX_GPIO_CLK_ENABLE();
USART2_RX_GPIO_CLK_ENABLE();
USART2_CLK_ENABLE();
GPIO_InitStruct.Pin = USART2_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = USART2_TX_AF;
HAL_GPIO_Init(USART2_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART2_RX_PIN;
GPIO_InitStruct.Alternate = USART2_RX_AF;
HAL_GPIO_Init(USART2_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART2_IRQn, 0, 2);
HAL_NVIC_EnableIRQ(USART2_IRQn);
Uart_SetUartParam(USART2, UART2_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(USART2->ICR, USART_ICR_TCCF);
SET_BIT(USART2->RQR, USART_RQR_RXFRQ);
SET_BIT(USART2->CR1, USART_CR1_RXNEIE);
#endif
#if UART3_FIFO_EN == 1
USART3_TX_GPIO_CLK_ENABLE();
USART3_RX_GPIO_CLK_ENABLE();
USART3_CLK_ENABLE();
GPIO_InitStruct.Pin = USART3_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = USART3_TX_AF;
HAL_GPIO_Init(USART3_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART3_RX_PIN;
GPIO_InitStruct.Alternate = USART3_RX_AF;
HAL_GPIO_Init(USART3_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART3_IRQn, 0, 3);
HAL_NVIC_EnableIRQ(USART3_IRQn);
Uart_SetUartParam(USART3, UART3_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(USART3->ICR, USART_ICR_TCCF);
SET_BIT(USART3->RQR, USART_RQR_RXFRQ);
SET_BIT(USART3->CR1, USART_CR1_RXNEIE);
#endif
#if UART4_FIFO_EN == 1
UART4_TX_GPIO_CLK_ENABLE();
UART4_RX_GPIO_CLK_ENABLE();
UART4_CLK_ENABLE();
GPIO_InitStruct.Pin = UART4_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = UART4_TX_AF;
HAL_GPIO_Init(UART4_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = UART4_RX_PIN;
GPIO_InitStruct.Alternate = UART4_RX_AF;
HAL_GPIO_Init(UART4_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(UART4_IRQn, 0, 4);
HAL_NVIC_EnableIRQ(UART4_IRQn);
Uart_SetUartParam(UART4, UART4_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(UART4->ICR, USART_ICR_TCCF);
SET_BIT(UART4->RQR, USART_RQR_RXFRQ);
SET_BIT(UART4->CR1, USART_CR1_RXNEIE);
#endif
#if UART5_FIFO_EN == 1
UART5_TX_GPIO_CLK_ENABLE();
UART5_RX_GPIO_CLK_ENABLE();
UART5_CLK_ENABLE();
GPIO_InitStruct.Pin = UART5_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = UART5_TX_AF;
HAL_GPIO_Init(UART5_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = UART5_RX_PIN;
GPIO_InitStruct.Alternate = UART5_RX_AF;
HAL_GPIO_Init(UART5_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(UART5_IRQn, 0, 5);
HAL_NVIC_EnableIRQ(UART5_IRQn);
Uart_SetUartParam(UART5, UART5_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(UART5->ICR, USART_ICR_TCCF);
SET_BIT(UART5->RQR, USART_RQR_RXFRQ);
SET_BIT(UART5->CR1, USART_CR1_RXNEIE);
#endif
#if UART6_FIFO_EN == 1
USART6_TX_GPIO_CLK_ENABLE();
USART6_RX_GPIO_CLK_ENABLE();
USART6_CLK_ENABLE();
GPIO_InitStruct.Pin = USART6_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = USART6_TX_AF;
HAL_GPIO_Init(USART6_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART6_RX_PIN;
GPIO_InitStruct.Alternate = USART6_RX_AF;
HAL_GPIO_Init(USART6_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART6_IRQn, 0, 6);
HAL_NVIC_EnableIRQ(USART6_IRQn);
Uart_SetUartParam(USART6, UART6_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(USART6->ICR, USART_ICR_TCCF);
SET_BIT(USART6->RQR, USART_RQR_RXFRQ);
SET_BIT(USART6->CR1, USART_CR1_RXNEIE);
#endif
#if UART7_FIFO_EN == 1
UART7_TX_GPIO_CLK_ENABLE();
UART7_RX_GPIO_CLK_ENABLE();
UART7_CLK_ENABLE();
GPIO_InitStruct.Pin = UART7_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = UART7_TX_AF;
HAL_GPIO_Init(UART7_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = UART7_RX_PIN;
GPIO_InitStruct.Alternate = UART7_RX_AF;
HAL_GPIO_Init(UART7_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(UART7_IRQn, 0, 6);
HAL_NVIC_EnableIRQ(UART7_IRQn);
Uart_SetUartParam(UART7, UART7_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(UART7->ICR, USART_ICR_TCCF);
SET_BIT(UART7->RQR, USART_RQR_RXFRQ);
SET_BIT(UART7->CR1, USART_CR1_RXNEIE);
#endif
#if UART8_FIFO_EN == 1
UART8_TX_GPIO_CLK_ENABLE();
UART7_RX_GPIO_CLK_ENABLE();
UART8_CLK_ENABLE();
GPIO_InitStruct.Pin = UART8_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = UART8_TX_AF;
HAL_GPIO_Init(UART8_TX_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = UART8_RX_PIN;
GPIO_InitStruct.Alternate = UART8_RX_AF;
HAL_GPIO_Init(UART8_RX_GPIO_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(UART8_IRQn, 0, 6);
HAL_NVIC_EnableIRQ(UART8_IRQn);
Uart_SetUartParam(UART8, UART8_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(UART8->ICR, USART_ICR_TCCF);
SET_BIT(UART8->RQR, USART_RQR_RXFRQ);
SET_BIT(UART8->CR1, USART_CR1_RXNEIE);
#endif
}
/**
* @brief <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD> UART <EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϡ<EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>رշ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* @param _pUart
* @param _ucaBuf
* @param _usLen
*/
static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)
{
uint16_t i;
for (i = 0; i < _usLen; i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (1)
{
__IO uint16_t usCount;
DISABLE_INT();
usCount = _pUart->usTxCount;
ENABLE_INT();
if (usCount < _pUart->usTxBufSize)
{
break;
}
else if (usCount == _pUart->usTxBufSize) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if ((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)
{
SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE);
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
_pUart->pTxBuf[_pUart->usTxWrite] = _ucaBuf[i];
DISABLE_INT();
if (++_pUart->usTxWrite >= _pUart->usTxBufSize)
{
_pUart->usTxWrite = 0;
}
_pUart->usTxCount++;
ENABLE_INT();
}
SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE); //ʹ<>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>
}
/**
* @brief <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD> UART <EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϡ<EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>رշ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
* @param _pUart
* @param _pByte
* @retval <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD> 0
*/
static uint8_t UartGetChar(UART_T *_pUart, uint8_t *_pByte)
{
uint16_t usCount;
DISABLE_INT();
usCount = _pUart->usRxCount;
ENABLE_INT();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>򷵻<EFBFBD> 0
if (usCount == 0)
{
return 0;
}
else
{
*_pByte = _pUart->pRxBuf[_pUart->usRxRead]; //<2F>Ӵ<EFBFBD><D3B4>ڽ<EFBFBD><DABD><EFBFBD> FIFO ȡ 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>д FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DISABLE_INT();
if (++_pUart->usRxRead >= _pUart->usRxBufSize)
{
_pUart->usRxRead = 0;
}
_pUart->usRxCount--;
ENABLE_INT();
return 1;
}
}
/**
* @brief <EFBFBD>жϷ<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD>
* @param _ucPort
* @retval 1 Ϊ<EFBFBD>գ<EFBFBD>0 Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
uint8_t Uart_IsTxEmpty(COM_PORT_E _ucPort)
{
UART_T *pUart;
uint8_t Sending;
pUart = ComToUart(_ucPort);
if (pUart == 0)
{
return 0;
}
Sending = pUart->Sending;
if (Sending != 0)
{
return 0;
}
return 1;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>ͨ<EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _pUart
*/
static void UartIRQ(UART_T *_pUart)
{
uint32_t isrflags = READ_REG(_pUart->uart->ISR);
uint32_t cr1its = READ_REG(_pUart->uart->CR1);
uint32_t cr3its = READ_REG(_pUart->uart->CR3);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((isrflags & UART_FLAG_RXNE) != RESET)
{
//<2F>Ӵ<EFBFBD><D3B4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD> FIFO
uint8_t ch = READ_REG(_pUart->uart->RDR);
_pUart->pRxBuf[_pUart->usRxWrite] = ch;
if (++_pUart->usRxWrite >= _pUart->usRxBufSize)
_pUart->usRxWrite = 0;
if (_pUart->usRxCount < _pUart->usRxBufSize)
_pUart->usRxCount++;
//<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (_pUart->Receive)
_pUart->Receive(ch);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (((isrflags & UART_FLAG_TXE) != RESET) && (cr1its & USART_CR1_TXEIE) != RESET)
{
if (_pUart->usTxCount == 0)
{
//<2F><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TXEIE);
//ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
SET_BIT(_pUart->uart->CR1, USART_CR1_TCIE);
}
else
{
_pUart->Sending = 1;
//<2F>ӷ<EFBFBD><D3B7><EFBFBD> FIFO ȡ 1 <20><><EFBFBD>ֽ<EFBFBD>д<EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD>
_pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];
if (++_pUart->usTxRead >= _pUart->usTxBufSize)
{
_pUart->usTxRead = 0;
}
_pUart->usTxCount--;
}
}
//<2F><><EFBFBD><EFBFBD> bit λȫ<CEBB><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>ж<EFBFBD>
if (((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
{
if (_pUart->usTxCount == 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TCIE);
//<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (_pUart->SendOver)
{
_pUart->SendOver();
}
_pUart->Sending = 0;
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO <20><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> FIFO ȡ 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EBB7A2><EFBFBD><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD>
_pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];
if (++_pUart->usTxRead >= _pUart->usTxBufSize)
{
_pUart->usTxRead = 0;
}
_pUart->usTxCount--;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
SET_BIT(_pUart->uart->ICR, UART_CLEAR_PEF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_FEF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_NEF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_OREF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_IDLEF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_TCF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_LBDF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_CTSF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_CMF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_WUF);
SET_BIT(_pUart->uart->ICR, UART_CLEAR_TXFECF);
}
#if UART1_FIFO_EN == 1
void USART1_IRQHandler(void)
{
UartIRQ(&g_tUart1);
}
#endif
#if UART2_FIFO_EN == 1
void USART2_IRQHandler(void)
{
UartIRQ(&g_tUart2);
}
#endif
#if UART3_FIFO_EN == 1
void USART3_IRQHandler(void)
{
UartIRQ(&g_tUart3);
}
#endif
#if UART4_FIFO_EN == 1
void UART4_IRQHandler(void)
{
UartIRQ(&g_tUart4);
}
#endif
#if UART5_FIFO_EN == 1
void UART5_IRQHandler(void)
{
UartIRQ(&g_tUart5);
}
#endif
#if UART6_FIFO_EN == 1
void USART6_IRQHandler(void)
{
UartIRQ(&g_tUart6);
}
#endif
#if UART7_FIFO_EN == 1
void UART7_IRQHandler(void)
{
UartIRQ(&g_tUart7);
}
#endif
#if UART8_FIFO_EN == 1
void UART8_IRQHandler(void)
{
UartIRQ(&g_tUart8);
}
#endif
void Uart_SetprintfCom(COM_PORT_E _ucPort)
{
printf_Com = _ucPort;
}
void Uart_SetgetcharCom(COM_PORT_E _ucPort)
{
getchar_Com = _ucPort;
}
//<2F>ض<EFBFBD><D8B6><EFBFBD> fputc <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> printf
int fputc(int ch, FILE *f)
{
Uart_SendChar(printf_Com, ch);
return ch;
}
//<2F>ض<EFBFBD><D8B6><EFBFBD> fgetc <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> getchar
int fgetc(FILE *f)
{
uint8_t ucData;
while (Uart_GetChar(getchar_Com, &ucData) == 0)
;
return ucData;
}