打印
[STM32F3]

STM32F3写flash导致串口中断异常

[复制链接]
4091|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
红木甲板|  楼主 | 2014-11-13 08:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
芯片是stm32f301  stm32f302
开发环境是IAR7.2
工程中使用开启了usart1的发送中断和接收中断,写flash时芯片容易进入hardfault中断或者在串口中断中出不来
如果注释掉串口初始化写flash正常
如果写flash后重新初始化串口程序也能正常运行

代码是用库函数写的,单独使用串口或者写flash都是没有问题的,但是一起使用就异常,哪位大侠遇到过类似情况
沙发
mmuuss586| | 2014-11-13 08:57 | 只看该作者
写外部FLASH还是内部FLASH啊;
写内部FLASH的话,最好先将中断关掉;

问题原因,还用不用库函数应该没啥关系;
是不是,你程序的初始化设置不合理,2个接口同时打开,有冲突引起的;
再仔细查下代码看看;

使用特权

评论回复
板凳
mmuuss586| | 2014-11-13 08:59 | 只看该作者
进入hardfault中断,就是程序不对,又去操作相关的硬件,会导致如此;

使用特权

评论回复
地板
红木甲板|  楼主 | 2014-11-13 09:14 | 只看该作者
mmuuss586 发表于 2014-11-13 08:57
写外部FLASH还是内部FLASH啊;
写内部FLASH的话,最好先将中断关掉;

写内部flash,只写十个字节,试过关中断,关中断后不会进入hardfault,但是程序还是在串口中断里跑不出来,main函数循环里翻转LED不闪,串口中断翻转LED可以闪

使用特权

评论回复
5
红木甲板|  楼主 | 2014-11-13 09:16 | 只看该作者
mmuuss586 发表于 2014-11-13 08:59
进入hardfault中断,就是程序不对,又去操作相关的硬件,会导致如此;

不是每次都进hardfault,写flash前关中断就好了,debug调试flash可以写,但是进入串口中断后就出不来了,main函数循环里翻转LED不闪,串口中断翻转LED可以闪

使用特权

评论回复
6
红木甲板|  楼主 | 2014-11-13 09:37 | 只看该作者
本帖最后由 红木甲板 于 2014-11-13 09:39 编辑
mmuuss586 发表于 2014-11-13 08:57
写外部FLASH还是内部FLASH啊;
写内部FLASH的话,最好先将中断关掉;

最奇怪的还是写完flash立即复位串口1然后初始化串口1就一切正常了,跑了一晚上也没异常

使用特权

评论回复
7
周董| | 2014-11-13 14:48 | 只看该作者
mmuuss586 发表于 2014-11-13 08:59
进入hardfault中断,就是程序不对,又去操作相关的硬件,会导致如此;

这个是和开发环境有关吧。

使用特权

评论回复
8
红木甲板|  楼主 | 2014-11-14 11:11 | 只看该作者
mmuuss586 发表于 2014-11-13 08:59
进入hardfault中断,就是程序不对,又去操作相关的硬件,会导致如此;

手里这个模块以前是用的F100系列的MCU,现在换成F301的,原来的F100是可以正常运行的,现在只是改了库和相关的初始化代码,然后就有异常了

经过反复调试,我怀疑问题出在ORE寄存器,但是在串口中断里面加了
if((USART1->ISR)&0x000f != 0)//F100是USART1->SR
    USART_ReceiveData(USART1);
F100手册上说
ORE: Overrun error
This bit is set by hardware when the word currently being received in the shift register is
ready to be transferred into the RDR register while RXNE=1. An interrupt is generated if
RXNEIE=1 in the USART_CR1 register. It is cleared by a software sequence (an read to the
USART_SR register followed by a read to the USART_DR register).

0: No Overrun error
1: Overrun error is detected
Note: When this bit is set, the RDR register content will not be lost but the shift register will be
overwritten. An interrupt is generated on ORE flag in case of Multi Buffer
communication if the EIE bit is set.
而F301手册上说
ORE: Overrun error
This bit is set by hardware when the data currently being received in the shift register is
ready to be transferred into the RDR register while RXNE=1. It is cleared by a software,
writing 1 to the ORECF, in the USARTx_ICR register.
An interrupt is generated if RXNEIE=1 or EIE = 1 in the USARTx_CR1 register.
0: No overrun error
1: Overrun error is detected
Note: When this bit is set, the RDR register content is not lost but the shift register is
overwritten. An interrupt is generated if the ORE flag is set during multi buffer
communication if the EIE bit is set.
This bit is permanently forced to 0 (no overrun detection) when the OVRDIS bit is set in
the USARTx_CR3 register.
貌似F301读数据不会清ORE
现在我在F301的代码中让OVRDIS置位,强制ORE为0,然后代码可以正常运行了,暂时没发现异常

使用特权

评论回复
9
mmuuss586| | 2014-11-14 11:20 | 只看该作者
红木甲板 发表于 2014-11-14 11:11
手里这个模块以前是用的F100系列的MCU,现在换成F301的,原来的F100是可以正常运行的,现在只是改了库和 ...

既然你已经改好的话也可以;
以后可以用ST CUBE软件生成初始化代买看看;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

26

帖子

1

粉丝