使用STM32F411芯片,移植官方例程en.x-cube_classb/STM324xG_EVAL,使用IAR。 CtrlFlowCntInv是控制流所用变量,使用一切正常。 CtrlFlowCntInv是定义在RAM中0x20000058-0x2000007B地址的no_init型,与它一起定义的还有其他几个变量。 但是在执行了RAMMarch自检之后,控制流所用到的CtrlFlowCntInv变量被清除了,只要使用就会导致堆栈溢出卡死。 注:只有CtrlFlowCntInv在使用时会导致卡死,其它同样被存储在@ "CLASS_B_RAM_REV"空间的变量不会导致卡死。 在官方例程中有注释: 只有CtrlFlowCntInv需要使用到RAM_TEST_CALLEE(0xFFFFFFFF),因为在RAM检测中控制流计数器被破坏。 我想问一下这里为什么只有CtrlFlowCntInv被清除了,而在"CLASS_B_RAM_REV"空间的其他变量不会报错? 而例程中说明的RAM_TEST_CALLEE又该怎么使用呢?重新划出一片空间给CtrlFlowCntInv吗? |
STM32CubeMX生成FreeRTOS MDK版本无法使用AC6编译器
外部中断升降沿类型判断
定时器正交编码器功能
STM32F427串口接收和发送中断同时使能,出现接收中断丢数的现象。
为什么生成代码时一直卡在generating user source code 救救孩子吧。
easylogger打印失败
为什么ETH配置中没有Advanced Parameters?
与HAL_ADC_Start_DMA相关的一个十分怪异的问题
由stm32cubemx按照配置重新生成工程,bsp_SysTick.c一直没有呢
ptp PPS输出
2023年10月23日 查看ST官方提供的文档《AN4435 Application note》后,找到了解决方法。 RAM自检的范围是我们定义的RAM起始地址到结束地址,需要单独留下16位空间用以保存寄存器状态。
首先更改.icf链接文件,改变RAM结束地址。
在RAM中留出16位空间,定义 ICFEDIT_region_RAM_Backup_start 指向地址。
程序中添加RAM_BCKUP变量。
更改启动时RAM自检函数。 之前:SRAMErrorStatus STL_FullRamMarchC(uint32_t beg, uint32_t end, uint32_t pat); 改变后:SRAMErrorStatus STL_FullRamMarchC(uint32_t beg, uint32_t end, uint32_t pat, uint32_t *bckup); 增加一个参量用于保存寄存器状态。
现在程序中RAM自检函数:
根据手册,将STL_FullRamMarchC汇编函数中所有R3都改为R7。
之后在函数起始和结束位置分别添加:
程序即可正常运行。
试过更改为0x20000057,问题还是存在。
请问能解释的详细一点吗?
刚刚有和小伙伴讨论了一下这个官方的例程,所谓的RAM 测试,是对它的区域(RAM_START to RAM_END)进行0xFF 和 0x00写测试。从例程注释上也可以看出来,是破坏性的。所以这区间的内容一定被改掉。
例程中有恢复初始化的函数。 你对照看看,是这样的化就需要修改一下。