背景
在做Nbiot的一个路灯项目,NBiot模块一般都是串口接口,使用AT指令集,对接中国移动onenet平台。先用串口助手去测试,流程测试OK之后需要在MCU上重新写一遍。一开始用的STC15系列的MCU,然后跟平台之间对接协议很多,代码量较大,所以换到了STM32F1系列的MCU。
在STC15MCU上面通过串口接收数据只能老老实实用接收中断来做,每接收一帧数据都需要判断帧头帧尾,一帧结束再处理。之前就听说过STM32串口上面有帧中断,一直没有用过,然后才有了这篇博客。
备注:一帧数据是表示一个或多个字节组成的有含义的字符串。
STM32串口 IDLE中断
IDLE其实是 空闲的意思。IDLE中断叫空闲中断,不叫帧中断。那么什么叫空闲,怎么定义空闲呢?在实际发送数据的时候,比如一串字符串,我们会采用如下方式发送
void uart1_putc(char dat){
SBUF = dat;
while (!TI);
TI = 0;
}
void uart1_puts_n(char *str){
while (*str)
uart1_putc(*str++);
}
void uart1_puts_n("i am handsome");
其实发送的两个字符之间间隔非常短,所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据。空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。而总线在什么情况时,会有一个字节时间内没有接收到数据呢?一般就只有一个数据帧发送完成的情况,所以串口的空闲中断也叫帧中断。
要怎么开启帧中断呢?其实其他串口配置不用改变,只需要在开启串口接收中断的时候加上一句话就Ok。
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接收中断
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启串口空闲中断
然后中断函数如下
void USART2_IRQHandler(void){ //串口1中断服务程序
int clear;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ //字符接收中断(接收到的数据必须是0x0d 0x0a结尾)
USART2_RX_BUF[length++] = USART2->DR & 0x0FF;
}else if(USART_GetITStatus(USART2, USART_IT_IDLE ) != RESET){//空闲帧中断
//处理接受的数据
}
}
在普通中断的时候仅仅保存数据,在帧中断的时候需要执行相应处理函数。
如果没有帧中断,必须在接收中断中判断每一个接收数据与帧头帧尾是否相符,效率极低。
之前一直以为天下串口都一样,还是有很多细节的,可以提升不少效率!
改进办法
在原作者地下的评论中,发现有价值的评论,摘抄到此处。
空闲中断+串口DMA。不开接收中断,这样收到空闲中断了直接去处理DMA保存过来的数据。这样能减少CPU的负担。
使用空闲中断的话,如果连着发两帧数据给它,它有概率会当成一帧数据来接收,这是一个弊端
一问一答模式应该没问题。但是如果是主动发送模式,而且很多种数据排队发,总线就没有空闲时间的情况下,就无法进入idle中断了。比如数据量较大、时效性又很高时。你可以自己测试一下,按总线的最大能力来发送。比如波特率设置在9600,每帧数据构造到100个字节左右,每秒发7帧数据,应该就会出现了,评论区给出的解决办法。
上一篇:PWM里的控制
下一篇:STM32_管脚 部分映射和全映射
推荐阅读最新更新时间:2024-11-10 10:22
推荐帖子
- 想搞自动驾驶小车,在B站看到一个成本300的,在犹豫中
- 最近在网上看资料,看到好多开源自动驾驶的资源,最接近我想搞得,就是看到一个B站的up主(业余造物liguanxi)自己搞的小小车,只有手掌大小,运行ROS1机器人系统,可进行基础的激光雷达2维建图与导航功能,可用手机APP辅助控制,还有雷达追踪,视觉识别与跟踪等扩展功能。项目的资料和开发经验都有开源。成本为何可以控制在300?其中一个原因是把部分的工作交给了电脑。一般来说,机器人系统ROS都需要在树莓派等微型电脑上运行,而我想要以最低的成本去完成这个项目,所以我将运行ROS系统电脑
- 蓝猫淘气 汽车电子
- ce6.0 编译问题
- 编译CE6.0的工程文件时,总是会出现很多类似的错误,cs8900dbg_eboot.lib是不是在SOUCES里面路径设错了,如果错了,要怎样修改,哪位大哥帮帮我,NMAKE:U1073:don\'tknowhowtomake\'D:\\WINCE600\\platform\\smdk2443\\lib\\ARMV4I\\retail\\cs8900dbg_eboot.lib\'NMAKE.EXETargetExeFiles-i-cBUILDMSG=Stop
- 67067710 嵌入式系统
- ARM白皮书——ARM Cortex-M3处理器简介(BY 周立功)
- 目录:第1章简介...................................................................................................................................11.1通过提高效率来提高性能...........................................................................................
- chenzhufly 微控制器 MCU
- EVC中如何设置裁剪矩形?
- 如题EVC中如何设置裁剪矩形?跟WIN32一样利用设备环境类进行操作。具体可以看汪兵的EVC高级编程及其应用的第二章,都有详细说明。
- renguoquan 嵌入式系统
- 开关电源兴趣小组 第08次任务
- 第07次思考题 1、本文图(05)和图(06)中如果开关管中电流波形和《开关电源设计第三版》图2.1波形(c)和波形(e)相同,你认为本文图(05)和图(06)整流电路中电感L1里面电流是连续工作状态还是断续工作状态?理由是什么?图(01) 电感L1中电流必定是连续工作状态。如果电感L1中电流断续,那么本文图(01)也就是《开关电源设计第三版》图2.1中开关管Q1和Q2电流波形将从0开始,也就是没有图中红色标注的初始电流,换句话说,红色部分长度为零。 2、请根
- maychang 开关电源学习小组
- 您真的吃透了电阻的用法吗?转载
- 电阻作为一种最基本电子元器件,广泛运用在各种电路中,通常我们也认为电阻是用法最简单的一种电子元器件,除了功率外,没有过多的讲究。如果今天我说就这个小小的电阻,许多资深电子工程师都不一定真正懂得如何用,您相信吗?在选用电阻的时候,如果避除高频电路的特殊应用,一般我们只考虑电阻的功率,对于普通工程师,只要能通过流过电阻的电流选择合适的功率,就可算做合格,如果能考虑到瞬时功率,就可以算做不错的工程师。但要能真正正确使用电阻,只有做到这两点还不够,看了下面的文字您就会明白,原来用电阻还有这么多讲究
- tiankai001 模拟电子