标签:mod sage 函数 串口数据 module tput void res target
UART串口
新唐M0/M4 UART都有16级或64级FIFO,用来缓存UART数据的收发。通常配合接收超时中断实现数据的接收任务。
例如:RX FIFO中断触发级别设为14,UART接收到14个字节后才发生RDA中断,降低CPU负荷;再设置接收超时中断,当接收上一个字节后超过定时时间,即发生超时中断,进行数据处理。
1 //初始化串口0 2 void uart0_init(void) 3 { 4 //开启时钟 5 CLK_EnableModuleClock(UART0_MODULE); 6 //选择时钟 7 CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HIRC, CLK_CLKDIV0_UART(1)); 8 //配置外设GPIO 9 SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk); 10 SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD); 11 //复位外设 12 SYS_ResetModule(UART0_RST); 13 //配置并打开外设 14 UART_Open(UART0, 115200); 15 //设置接收超时 16 UART_SetTimeoutCnt(UART0, 20); 17 //设置串口FIFO接收中断触发为4个字节 18 UART0->FIFO &= ~UART_FIFO_RFITL_4BYTES; 19 UART0->FIFO |= UART_FIFO_RFITL_8BYTES; 20 //使能中断 21 UART_ENABLE_INT(UART0, UART_INTEN_RDAIEN_Msk | UART_INTEN_TOCNTEN_Msk | UART_INTEN_RXTOIEN_Msk); 22 NVIC_EnableIRQ(UART0_IRQn); 23 }
1 //串口数据构造 2 UART_BUF_t UART_dat; 3 4 //串口中断服务函数 5 void UART0_IRQHandler(void) 6 { 7 if (UART_GET_INT_FLAG(UART0,UART_INTSTS_RDAINT_Msk)) 8 { 9 while(!UART_GET_RX_EMPTY(UART0)) 10 UART_dat.buf[UART_dat.len++] = UART_READ(UART0); 11 } 12 if (UART_GET_INT_FLAG(UART0,UART_INTSTS_RXTOIF_Msk)) 13 { 14 while(!UART_GET_RX_EMPTY(UART0)) 15 UART_dat.buf[UART_dat.len++] = UART_READ(UART0); 16 UART_dat.end = 1; 17 } 18 }
1 if(UART_dat.end) 2 { 3 printf("UART DAT:%s\n",UART_dat.buf); 4 UART_dat.end = 0; 5 UART_dat.len = 0; 6 }
注意到,配置完UART0后可以直接使用printf函数进行输出,因为system_M451Series.h定义了默认输出口为UART0
1 /*---------------------------------------------------------------------------------------------------------*/ 2 /* Macro Definition */ 3 /*---------------------------------------------------------------------------------------------------------*/ 4 #ifndef DEBUG_PORT 5 # define DEBUG_PORT UART0 /*!< Select Debug Port which is used for retarget.c to output debug message to UART */ 6 #endif
标签:mod sage 函数 串口数据 module tput void res target
原文地址:https://www.cnblogs.com/llw2017/p/9070031.html