1.空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break中断)。
2.关于第二点有要铺垫的三个情况,datasheet中
"当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE位被设置将产生一个中断"
"空闲符号被视为完全由'1'组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位'1'的位数也包括了停止位的位数” 空闲符号的配图后面跟这一个低电平.
有人理解为只有收到下一个数据的起始位才会触发中断,这样理解是不对的,应该是数据后有空闲了一帧就会触发.
3.清中断的方式感觉奇怪,使用函数USART_ClearITPendingBit( USART1, USART_IT_IDLE )清除不了中断的.我用的是3.5的库,查看函数说明,里面的@param参数并没有IDLE,后面的@note中,这样说:
"PE(Parity error),FE(Framing error),NE(Noise error),ORE(OverRun error) and IDLE(Idle line detected) pending bits are cleared by software sequence: a read operation to USART_SR register (USART_GetITStatus()) followed by a read operation to USART_DR register (USART_ReceiveData())."
我是通过语句"USART1->DR;"来清除IDLE中断的.
现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下:
方法1:实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。
应用对象:适用于各种串口相关的通信协议,如:MODBUS,PPI ;还有类似于GPS数据接收解析,串口WIFI的数据接收等,都是很好的应用对象。
方法2:实现思路:直接利用stm32的RXNE和IDLE中断进行接收不定字节数据。
关键字:STM32 串口 空闲中断 IDEL
引用地址:
关于STM32串口空闲中断IDEL的问题
推荐阅读最新更新时间:2024-03-16 16:15
STM32CUBEIDE打印浮点数问题
IDE不像MDK5那样默认就可以使用串口输出浮点数。 解决办法: 右键你的工程,在最下面点击 properties 在弹出来的框中点击 C/C++ Build 下拉框 在下拉框中点击 Settings 在弹出来的框中最底部找到 Miscellaneous 并点击 在other flags 中点击 图标 输入 -u_printf_float ,然后点击ok 最后点击 Apply and close,就可以使用串口打印浮点数了。
[单片机]
STM32+AS608指纹模块
前言:这个串口逻辑有点问题,要是用串口做命令输入端的话要自己改一下串口逻辑,串口只是调试能不能用指纹模块的功能,后期不需要串口发命令所以没怎么写串口的命令逻辑 1.AS608的资料挺全的,就是按照他给的来写命令,基本上看懂会用就行,没必要一个个写太多了 2.AS608.c #include string.h #include system.h #include usart2.h #include as608.h u32 AS608Addr = 0XFFFFFFFF; //默认 //初始化PA6为下拉输入 //读摸出感应状态(触摸感应时输出高电平信号) void PS_StaGPIO_Init
[单片机]
STM32的ETR引脚计数功能
1. 基本介绍 1.1. 开发环境 开发板:WarShip STM32 BOARD V2.1 CPU:STM32F103ZET6 1.2. ETR引脚配置 由上可知,使用STM32的ETR引脚计脉冲数,需将定时器的时钟源选择为外部时钟模式2 选定此模式的方法:令TIMx_SMCR寄存器中的ECE=1 计数器能够在外部触发ETR的每一个上升沿或下降沿计数 例如,要配置在ETR引脚上,每2个上升沿计数一次的向上计数器,使用下列步骤: 1. 本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF =0000 2. 设置预分频器,置TIMx_SMCR寄存器中的ETPS =01 3. 设置在ETR的上升沿检测,
[单片机]
意法半导体更新TouchGFX软件,增加视频功能丰富STM32用户体验
意法半导体更新TouchGFX软件,增加视频功能,丰富STM32用户体验 2021 年 11月5日,中国——意法半导体发布了最新版的STM32* 微控制器 (MCU)图形界面开发软件TouchGFX Version 4.18,新增了视频播放功能,改进了多名开发者协同开发工具,支持新的 X-NUCLEO 显示板。 通过可以播放 Motion-JPEG (MJPEG) 视频文件,TouchGFX为家庭自动化产品、穿戴设备、医疗设备和工业传感器等小型设备带来了更多产品力,实现丰富的功能,例如,用户操作指南或有趣的启动和暂停屏幕,提升图形用户界面的视觉效果。开发人员可以使用自己的 MJPEG 文件或从软件提供的电影示例中选择
[嵌入式]
stm32 实现串口中断接收浮点型、整型数据
之前已经实现了在stm32中移植printf函数和scanf函数,相信很多网友也已经熟练掌握这个技能了。最近在项目中遇到了问题,需要在串口助手中向下位机stm32写整型或者浮点型数据。这个时候只能使用串口中断接收函数。 void USART1_IRQHandler(void) { uint8_t ch; while(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { ch=USART_ReceiveData(USART1); } } 但是很快发现程序这样写过于简陋,只能接收单个字符,不符合我的要求,然后参考网上例
[单片机]
Keil uCos 2.52 stm32 【worldsing笔记】
1、uCOSii V2.52 a、加了7个可以配置的钩子函数宏 #define OS_TASK_CREATE_HOOK_EN 0 /* 任务创建时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TASK_STAT_HOOK_EN 0 /* 统计任务运行时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TASK_SW_HOOK_EN 1 /* 任务调度时调用钩子函数 使能 1 / 禁止 0 */ #define OS_TIME_TICK_HOOK_EN 1 /* 滴答中断时调用钩子函数 使
[单片机]
32 配置两个串口透传 中断函数配置
本文主要是记录 在中断函数内部怎么进行配置 (基于寄存器编写) void USART1_IRQHandler(void) //串口1中断服务 { if(USART1- SR & (1 5)) //接收到数据 { USART2- DR = USART1- DR; //向串口2发送 }else if(USART1- SR & 0x40){ //发送一字节完成 USART1- SR &= ~0x40;//清发送完成标志 } } void USART2_IRQHandler(void) //串口2中断服务 { if(USART2- SR & (1 5)) //接收到数据 { USART1- D
[单片机]
STM32/CPU地址映射的概念
1总线的由来 很多人对总线和地址映射的概念都是一头雾水,但是我们如果知道为何需要总线和地址映射,他们是在什么背景下被衍化出来的,自然而然对此概念就清清楚楚了。 我们知道CPU都是通过总线访问外设,例如STM32使用AMBA规范的总线和外设进行交互,那么在总线的概念没有被提出来的时候,外设是怎样被访问的呢? 其实在最早期还没有总线概念的时候,CPU设计者会直接把CPU内核和各种接口控制器设计到一起,如果要访问一个硬件,直接在内核里面对各种接口控制器进行操作,从而操作相应的硬件。我们看下图。 后来设计者发现如果每添加一个外设都要修改CPU内核,这样不具有很好的扩展性,为了使得外设的改变(增加、删除、修改)不影响CPU内核架
[单片机]