【STM32的串口空闲中断】STM32串口使用DMA方式接收数据可以减小CPU的开销。对于接收定长数据,可以将DMA接收缓冲区的长度设定为待接收数据的长度,这样利用DMA的传输完成中断DMAx_IT_TCy就可以知道已经接收了一帧数据。对于接收不定长数据,如何知道意见完成了数据的接收呢?可以结合串口的空闲中断来实现。具体做法见http://wenku.baidu.com/link?url=ZGGaGpvy2dbSqoBaoTuXwkFBz0uc_hs3h02ILrIaQOlV_EulFZCssv1NFgFNIBX0K-F43exnBIclpHNltWVpdzDgi0o-AvKJKsi4BpxGOhq
空闲中断是在检测到在数据收受后,总线上在一个字节的时间内没有再接收到数据时发生。即串口的RXNE位被置位之后才开始检测,检测到空闲之后,串口的CR1寄存器的IDLE位被硬件置1,必须采用软件将IDLE位清零才能避免反复进入空闲中断。具体的做法是先读取USART_SR,再读取USART_DR。需要注意的是,不能采用库函数USART_ClearFlag()或者USART_ClearItPending()来清除IDEL标注,因为这两个函数接收的中断标志位仅包括:
- USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5).
- USART_FLAG_LBD: LIN Break detection flag.
- USART_FLAG_TC: Transmission Complete flag.
- USART_FLAG_RXNE: Receive data register not empty flag.
推荐阅读
- 课程笔记|uCos中的邮箱和消息队列
- 课程笔记|嵌入式系统复习题
- 【嵌入式系统】工作模式与任务特权级
- 【嵌入式系统】存储器映射与寄存器映射原理
- 【嵌入式系统】DMA工作原理与常用函数解析
- 【嵌入式系统】STM32时钟系统+时钟配置函数解析
- 电子模块实验|看看那些来自电路造型挑战赛中的作品
- led.S:12: Error: invalid constant -- `mov r0,#300000'