使用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吗? |
给uint32_t数组填充整型值,除使用循环赋值外有没有c库函数可以实现
stm32F407平台上使用freertos,使用pvPortMalloc申请内存,发现内存中的数据总被修改,使用malloc就没有问题。
STM32F407高速USB Device模式在外部中断15响应后发送4K个数据,外部中断循环给出,会导致一部分外部中断接收不到
使用HAL_UARTEx_RxEventCallback实现的uart数据接收不会被清理,一直累加
STM32F7中FMC接多个通信外设
STM32F401RE的SDIO接口最大支持多大容量的TF卡?最大可以支持多少G?有支持大容量的芯片吗?
关于在做项目时候选用芯片的问题。
STM32F401下载失败问题
STM32H743+USB3300传输采集的数据前几次会丢包问题
关于F407嵌入式SRAM映射为0x20020000的问题。
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写测试。从例程注释上也可以看出来,是破坏性的。所以这区间的内容一定被改掉。
例程中有恢复初始化的函数。 你对照看看,是这样的化就需要修改一下。