串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)
2024-10-19 07:28:39
1、空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断;
2、空闲中断是接收到一个数据以后,接收停顿超过一字节时间 认为桢收完,总线空闲中断是在检测到在接收数据后,数据总线上一个字节的时间内,没有再接到数据后发生。也就是RXNE位被置位之后,才开始检测,只被置位一次,除非再次检测到RXNE位被置位,然后才开始检测下一次的总线空闲。一次RXNE位被置位只进行一次。
实现思路:
采用串口1,并配置成空闲中断模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是100个字节,那么在单片机接收到一个字节的时候(RXNE位被置位)并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后(接收停顿超过一字节时间)串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。
就是在串口空闲中断中使用 Usart1RecLen = DMARecLen-DMA_GetCurrDataCounter(DMA1_Channel5); //算出接本帧数据长度 = DMA缓存的大小 - 剩余 DMA缓存大小
配置时候注意:
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启空闲中断
DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len; //DMA通道的DMA缓存的大小
最新文章
- Android studio 项目的layout的文件打开,preview 视图无法显示,提示“no sdk found...”可能原因?
- Handler 消息传递机制
- Codeforces Round #215 (Div. 2) B. Sereja and Suffixes
- StringBuilder和StringBuffer区别
- Github教程(2)
- 36.在字符串中删除特定的字符[Delete source from dest]
- matlab产生正态分布样本
- codeforces 285 D. Permutation Sum 状压 dfs打表
- 清理SQL多余登录信息
- C#读写word
- poj2121--暴力解法
- Qt多线程(有详细例子)
- 8位基本定时器(TIM4)
- input[type='file']样式美化及实现图片预览
- thinkphp mysql查询结果为什么全是string问题
- Xshell5 提示要继续使用此程序,您必须应用最新的更新或使用新版本
- 通用Logging框架设计
- lvm创建和在线扩容
- python3 不知文件编码情况下打开文件代码记录
- 编译和运行java文件 找不到或无法加载主类