新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发。例如:如果RX FIFO 中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断。这样可以降低 CPU的负载。上面的情况,如果RX只接收到10个字节怎么办呢?这时候就要用到接收超时中断。当RXFIFO中收到1个字节以后,定时器就开始计数,如果定时器超时都没有再收到下一个字节就会发生接收超时中断(RTO)。 每个IP的初始化都需要先初始化时钟,然后才是IP功能初始化。初始化UART之前需要使能要用的晶振,然后选择时钟源并使能时钟。最后将UART用到的引脚切换为UART功能。
void UART0_Init()
{
/* UART选择HIRC做时钟源 */
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HIRC;
/* 使能UART0 IP的时钟 */
CLK->APBCLK |= CLK_APBCLK_UART0_EN;
/* PB13用作UART0 接收,PB14用作UART0发送 */
SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX); /* Init UART0 */
UART_Open(UART0, 115200);/*默认数据长度为8bit,没有奇偶校验,1个停止位*/
/*初始化UART1,波特率9600,数据长度8bit,1个停止位,偶校验*/
UART_SetLine_Config(UART1, 9600, UART_WORD_LEN_8, UART_PARITY_EVEN, UART_STOP_BIT_1); }
|