OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3219|回复: 2

IAP 跳转后,USART DMA收发不正常。

[复制链接]

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-4-29
在线时间
17 小时
发表于 2020-6-10 11:17:35 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 speciallyyj 于 2020-6-11 13:04 编辑

这个问题折磨我好多天了,死活解决不了,求各位大佬有没有解决方法。
芯片型号是STM32F411CE,我的BootLoader只使用了串口中断,在跳转代码里,也将所有的中断全部关闭,跳转至APP后,APP程序使用了USART DMA,第一次收发正常,但是第二次就一直返回HAL_UART_Transmit_DMA和HAL_UART_Receive_DMA 就一直返回HAL_BUSY我尝试中间复位USART,再初始化还是不管用,但是更神奇的现象就是,我开仿真去调试的时候,DMA收发就是正常的,不开仿真调试,DMA收发第一次有效后,就一直返回HAL_BUSY了,有没有大佬有过这方面的经验,求个解决办法,求求了。
就是在HAL_UART_Receive_DMA中if (huart->RxState == HAL_UART_STATE_READY)判断不通过过返回HAL_BUSY,HAL_UART_Transmit_DMA中if (huart->gState == HAL_UART_STATE_READY)判断不通过过返回HAL_BUSY。
APP的程序,我不使用IAP,也是正常运行的,就是使用了IAP后,就出现这种情况。
但是不用IAP跳转,直接把APP烧录在Flash的首地址,DMA收发是正常的。目前用了一个解决办法就是在每次收发的时候,关闭DMA的中断,关闭USART外设,再开启中断,再开启外设,就能实现正常的收发,但是这个可能有隐患,目前还是查不到问题出在哪里。

最佳答案

查看完整内容[请看2#楼]

问题找到了,是我BootLoader使用了IDLE这个中断去接收不定长度字符,然后在跳转的时候,其实我有去清除中断标志位且关闭IDLE中断,但是在清除中断的时候我用错了函数 一开始我使用的函数是__HAL_UART_CLEAR_FLAG(&huart,UART_FLAG_IDLE); 但是我后面又仔细的去找了一下官方的库,发现里面居然有一个这个函数 __HAL_UART_CLEAR_IDLEFLAG 原来这个才是清除IDLE标志位的函数。 那之前为什么DMA收发一次,就不能正常收发就明了了 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-4-29
在线时间
17 小时
 楼主| 发表于 2020-6-10 11:17:36 | 显示全部楼层
问题找到了,是我BootLoader使用了IDLE这个中断去接收不定长度字符,然后在跳转的时候,其实我有去清除中断标志位且关闭IDLE中断,但是在清除中断的时候我用错了函数
一开始我使用的函数是__HAL_UART_CLEAR_FLAG(&huart,UART_FLAG_IDLE);
但是我后面又仔细的去找了一下官方的库,发现里面居然有一个这个函数
__HAL_UART_CLEAR_IDLEFLAG
原来这个才是清除IDLE标志位的函数。
那之前为什么DMA收发一次,就不能正常收发就明了了,IDLE中断标志位没有清除,导致DMA在收到第一次数据后,检测到有IDLE的中断标志位,就认为USART一直在被占用,所以返回HAL_BUSY。
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-4-29
在线时间
17 小时
 楼主| 发表于 2020-6-10 11:20:29 | 显示全部楼层
用的是STM32F411CE
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表