
使用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吗? |
stm32f4系列sdio 时钟如何获取
stm32f407这个STM32_RCC_PERIPHCLK_SDMMC 是哪里定义的
STM32 CUBEIDE 编译报error: expected identifier or '(' before '__asm'
简单聊聊STM32的SPI外设
STM32F405随机脉冲计数的定时器通道选择问题
STM32H7和F4做永磁同步电机FOC控制如何选型,哪个开发更好?
使用Cubeprogrammer无法连接、连接G431和一块H750的板子可以连上但是连另外一块H750的板子和F407的板子就直接报错,这个应该如何解决。
STM32F407的高速USB,采用的是虚拟串口方式,VCP驱动有linux系统的吗
如何使用TIM2的更新事件触发TIM1的PWM DMA
RAM 容量不足导致的数据溢出问题及优化方案
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写测试。从例程注释上也可以看出来,是破坏性的。所以这区间的内容一定被改掉。
例程中有恢复初始化的函数。 你对照看看,是这样的化就需要修改一下。