OpenEdv-开源电子网

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

STM32F205,不跑操作系统,USART1的TX和RX频繁通讯时,进入void HardFault_Handler(void)问题,各自单独运行都没有问题。

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-11-22
在线时间
4 小时
发表于 2015-11-23 10:12:29 | 显示全部楼层 |阅读模式
5金钱
问题描述:STM32F205,主频配置为120MHz,USART1的TX使用查询方式实现,每4ms发送15个字节数据;uart1的RX使用中断方式实现,函数内部定义了一个20字节的数组和两个char型的变量,两个函数单独频繁运行都没有问题,一起运行时,接收端接收超过17个字节的数据,运行一下就会进入void HardFault_Handler(void)。
继续跟进下,将RX接收端函数局部变量改为全局或静态就不会进入void HardFault_Handler(void)。
以为是堆栈大小问题,改大堆栈问题仍然有。
下面是堆栈大小信息:
<H3>Maximum Stack Usage =        240 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
UART4_IRQHandler &rArr; Motorctrl &rArr; NonlineControl &rArr; sqrt &rArr; _dsqrt &rArr; __fpl_dnaninf

我设置的为:
Stack_Size      EQU     0x00000800;0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
比较有问题和没有问题的htm文件差别如下:
没有问题的htm:
<><STRONG><a name="[32]"></a>USART1_IRQHandler</STRONG> (Thumb, 400 bytes, Stack size 8 bytes, drv_uart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = USART1_IRQHandler &rArr; USART_GetITStatus
有问题的htm:
<><STRONG><a name="[32]"></a>USART1_IRQHandler</STRONG> (Thumb, 368 bytes, Stack size 24 bytes, drv_uart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = USART1_IRQHandler &rArr; USART_GetITStatus
另外,开始我只是将RX中的数据改为static,如果只是使用USART1的话,是没有问题的,如果同时使用USART3,UART2就会有问题,需将另外两个布局变量也改为static。
程序逻辑是有信心没有问题的。
现在觉得中断里面的局部变量被篡改,导致越界或溢出,但是目前还是没有找到确切的问题点。麻烦各位高手指点下,谢谢!

最佳答案

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

回复【4楼】Rocks: --------------------------------- 问题找到了,估计还是太自信了,定义buf时,用的宏定义,记得是用的是定义的协议大小20的,结果弄成了大小为10的一个宏定义。问题已经解决了,感谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-11-22
在线时间
4 小时
 楼主| 发表于 2015-11-23 10:12:30 | 显示全部楼层
回复【4楼】Rocks:
---------------------------------
问题找到了,估计还是太自信了,定义buf时,用的宏定义,记得是用的是定义的协议大小20的,结果弄成了大小为10的一个宏定义。问题已经解决了,感谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-23 22:37:58 | 显示全部楼层
帮顶......
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-11-22
在线时间
4 小时
 楼主| 发表于 2015-11-24 09:35:34 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
有建议吗?我程序里面用到了两个for循环,后来把最后一个for循环写成函数调用,不定义局部变量数据,其他两个局部变量不定义成静态的,也是没有问题的,发50个字节的协议试了也没问题。
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-11-24 17:43:16 | 显示全部楼层
按照以往的經驗
這情況多半是程式隱藏BUG造成
例如你使用定址的方式去操作
像是 uint8_t *Data = RX_Data;
*(Data+i) = n
這種情況
如果對於i條件超出原本你要操作的範圍 而不自知
會寫到別的函數去

這種IDE不會報錯的 只能自己檢查

另外就是你寫了一個指針 卻沒有定義他指向哪
那預設是0x00000000
你操作了他 立馬會跳進去HardFault_Handler

這IDE也不會報錯
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 08:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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