完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天移植的程序有这么个现象:
uint8_t test; void Fun(uint16_t *para); uint16_t Read(void); void Fun(uint16_t *para) { *para = Read(); } 调用函数: Fun((uint16_t) test); 大家猜,Fun调用会出什么问题? 也许没问题,至少这个程序在STM32F103运行时没有由于这个地方出现问题。 但是在L051上运行时,在Read返回后就进入了HardFault中断。 小菜一碟,慢慢品尝... 之前有见2字节/4字节等的多字节变量转换为单字节访问方式,反过来还真是第一次见, 哈哈哈... |
|
相关推荐
1个回答
|
|
STM32L051进入HardFault中断的原因可能有多种,根据您提供的代码片段,我们可以分析以下几个可能导致HardFault的原因:
1. 堆栈溢出:在STM32中,如果函数调用太深,或者局部变量占用的堆栈空间过大,可能会导致堆栈溢出。当堆栈溢出时,程序计数器(PC)可能会指向一个非法的地址,从而触发HardFault中断。 2. 非法内存访问:在您的代码中,`Fun`函数接收一个指向`uint16_t`类型的指针作为参数。如果这个指针指向的内存区域是非法的,例如未初始化或指向了错误的内存地址,那么在执行`*para = Read();`时可能会触发HardFault。 3. 未定义行为:在C语言中,某些操作可能导致未定义行为,例如数组越界、空指针解引用等。这些未定义行为可能导致程序崩溃并触发HardFault中断。 4. 中断向量表错误:如果STM32的中断向量表配置不正确,或者中断服务例程(ISR)的地址设置错误,可能导致在执行中断服务例程时触发HardFault。 5. 寄存器溢出:在STM32中,某些寄存器操作可能导致寄存器溢出,例如将一个大于寄存器宽度的值赋给寄存器。这也可能触发HardFault中断。 为了解决这个问题,您可以尝试以下步骤: 1. 检查堆栈大小:确保您的程序没有使用过多的堆栈空间。您可以通过减小局部变量的大小或减少函数调用深度来减小堆栈使用。 2. 检查指针合法性:确保传递给`Fun`函数的指针是合法的,指向了正确的内存地址。 3. 避免未定义行为:检查您的代码,确保没有数组越界、空指针解引用等未定义行为。 4. 检查中断向量表:确保中断向量表配置正确,所有中断服务例程的地址都设置正确。 5. 检查寄存器操作:确保在操作寄存器时没有导致寄存器溢出的情况。 6. 使用调试工具:使用调试器(如Keil MDK、STM32CubeIDE等)来查看程序执行过程中的寄存器、堆栈和内存状态,以便找到触发HardFault的原因。 7. 阅读STM32参考手册:了解STM32L051的硬件特性和限制,以避免在编程过程中违反硬件规范。 通过以上步骤,您应该能够找到导致STM32L051进入HardFault中断的原因,并采取相应的措施解决问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1810 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1631 浏览 1 评论
1098 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
737 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1687 浏览 2 评论
1945浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
750浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
584浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
568浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 13:28 , Processed in 0.779588 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号