下面是代码
uart.c
/*************************************************************************************************************
* 文件名: uart.c
* 功能: NUC970 UART通讯支持
* 作者: cp1300@139.com
* 创建时间: 2020-08-29
* 最后修改时间: 2020-08-29
* 详细: 串口通信底层支持,可惜串口都不支持DMA传输,只能使用中断方式接收数据
*************************************************************************************************************/
#include "nuc970_system.h"
#include "uart.h"
#include "typedef.h"
#include "irq_aic.h"
//串口中断接收函数
__inline static void UARTx_IRQHandler(UART_CH_Type ch); //串口中断处理
static void UART0_IRQHandler(void) {UARTx_IRQHandler(UART_CH0);} //串口0接收中断
static void UART1_IRQHandler(void) {UARTx_IRQHandler(UART_CH1);} //串口1接收中断
static void UART2_IRQHandler(void) {UARTx_IRQHandler(UART_CH2);} //串口2接收中断
static void UART3_IRQHandler(void) {UARTx_IRQHandler(UART_CH3);} //串口3接收中断
static void UART4_IRQHandler(void) {UARTx_IRQHandler(UART_CH4);} //串口4接收中断
static void UART5_IRQHandler(void) {UARTx_IRQHandler(UART_CH5);} //串口5接收中断
static void UART6_IRQHandler(void) {UARTx_IRQHandler(UART_CH6);} //串口6接收中断
static void UART7_IRQHandler(void) {UARTx_IRQHandler(UART_CH7);} //串口7接收中断
static void UART8_IRQHandler(void) {UARTx_IRQHandler(UART_CH8);} //串口8接收中断
static void UART9_IRQHandler(void) {UARTx_IRQHandler(UART_CH9);} //串口9接收中断
static void UART10_IRQHandler(void) {UARTx_IRQHandler(UART_CH10);} //串口10接收中断
//中断编号
static const AIC_IRQ_Typedef scg_UartIrqType[UART_ChMax] =
{ AIC_UART0_INT, AIC_UART1_INT, AIC_UART2_INT, AIC_UART3_INT, AIC_UART4_INT,
AIC_UART5_INT, AIC_UART6_INT, AIC_UART7_INT, AIC_UART8_INT, AIC_UART9_INT, AIC_UART10_INT};
//中断函数集合
static const void *scg_pUartIrqHandle[UART_ChMax] =
{(const void *)UART0_IRQHandler, (const void *)UART1_IRQHandler, (const void *)UART2_IRQHandler,
(const void *)UART3_IRQHandler, (const void *)UART4_IRQHandler, (const void *)UART5_IRQHandler,
(const void *)UART6_IRQHandler, (const void *)UART7_IRQHandler, (const void *)UART8_IRQHandler,
(const void *)UART9_IRQHandler, (const void *)UART10_IRQHandler};
//串口基址
static const u32 scg_UARTx_Base[UART_ChMax] =
{ UART0_BASE, UART1_BASE, UART2_BASE, UART3_BASE, UART4_BASE, UART5_BASE,
UART6_BASE, UART7_BASE, UART8_BASE, UART9_BASE, UART10_BASE};
//时钟使能
static const SYS_DEV_CLOCK scg_UARTx_DeviceClockEnable[UART_ChMax] =
{ DEV_UART0, DEV_UART1, DEV_UART2, DEV_UART3, DEV_UART4, DEV_UART5,
DEV_UART6, DEV_UART7, DEV_UART8, DEV_UART9, DEV_UART10};
//外设复位
static const SYS_DEV_RESET scg_UARTx_DeviceReset[UART_ChMax] =
{ DEV_RESET_UART0, DEV_RESET_UART1, DEV_RESET_UART2, DEV_RESET_UART3, DEV_RESET_UART4, DEV_RESET_UART5,
DEV_RESET_UART6, DEV_RESET_UART7, DEV_RESET_UART8, DEV_RESET_UART9, DEV_RESET_UART10};
//IO复用功能
static const GPIO_AF_Type scg_UARTx_AF_GPIO[UART_ChMax][2] =
{
{GPIO_PE0_UART0_TXD, GPIO_PE1_UART0_RXD}, {GPIO_PE2_UART1_TXD, GPIO_PE3_UART1_RXD}, {GPIO_PF11_UART2_TXD, GPIO_PF12_UART2_RXD},
{GPIO_PE12_UART3_TXD, GPIO_PE13_UART3_RXD}, {GPIO_PH8_UART4_TXD, GPIO_PH9_UART4_RXD}, {GPIO_PB0_UART5_TXD, GPIO_PB1_UART5_RXD},
{GPIO_PB2_UART6_TXD, GPIO_PB3_UART6_RXD}, {GPIO_PG4_UART7_TXD, GPIO_PG5_UART7_RXD}, {GPIO_PH12_UART8_TXD, GPIO_PH13_UART8_RXD},
{GPIO_PD14_UART9_TXD, GPIO_PD15_UART9_RXD}, {GPIO_PB12_UART10_TXD, GPIO_PB13_UART10_RXD}
};
//相关UART状态结构
typedef struct
{
bool isNewDataFlag; //接收到新数据
bool isBuffFull; //接收Buff满
bool isIntRx; //是否开启中断接收
u8 *RxBuff; //接收Buff指针
u16 RxBuffSize; //接收缓冲区大小,一帧数据大小
u16 UartRxCnt; //接收数据计数器
u8 TempData; //用于接收溢出后读取数据寄存器,清除读取数据标志
} UartRx_TypeDef;
static UartRx_TypeDef sg_UartRx[UART_ChMax];
|