本人在做F407的IAP功能时,首先调用了以前在F103上面的跳转代码,并根据网上资料写出了在F407芯片下运行的IAP跳转代码。然后就出现问题了,发送跳转函数不执行,调试后发现下面的if语句无法进入。 我很奇怪,因为不管是以前的IAP跳转程序还是网上的跳转程序,在这条语句上都是一致的,按理来说最不应该出问题的就是这句语句。然后通过调试发现,对地址取值按位或得到的数值为0x20020000,与0x20000000不匹配,所以进不去。然后我通过Prg查看寄存器值,如下所示: 发现0x08008000地址的值确实为0x20020000。所以我将if语句中的判断换成了0x20020000,代码就正常运行,可以实现跳转了。关于这个问题,后来我查询了数据手册,确实有一定的记载,如下所示: 但是我用的芯片为STM32F407VET6,并不是F42和F43系列的,按照手册上的表示,应该是0x20000000,而不是0x20020000,因此产生了矛盾。 在网上查询了许久,也没有找到答案,望各位大神指点指点小弟。 |
STM32H743+USB3300传输采集的数据前几次会丢包问题
Boot0通过10k电阻接地,Boot1作为输入使用被配置成外部中断,现在存在的问题是可能会导致单片机加密无法运行,且无法解密,RDP显示为FF,这是怎么导致的?
STM32F407IGT6烧录异常
RM0090文档和KEIL上的ETH_MMCTIMR寄存器的TGFM位不一致
STM32使用STLINK烧录问题上电顺序问题
由stm32cubemx按照配置重新生成工程,bsp_SysTick.c一直没有呢
STM32F401下载失败问题
MotionFX
STM32哪款单片机已使用CMSIS-FreeRTOS实现FreeRTOS例程?
STM32CubeMX生成FreeRTOS MDK版本无法使用AC6编译器
其实,这个MSP检查是可有可无的,你也没必要为了凑这个检查能通过而勉强改变写法。
这个MSP合法性检查跟使用的RAM起始地址及大小直接相关。它的作用就是检查栈顶落在
预期可用RAM空间。
从你提供的截图信息来看,那个MSP的值显然超出了128K空间,即超出了STM32F407的RAM可以空间。
建议你确认下你的APP工程默认使用的RAM空间起止范围,堆栈到底使用的哪个RAM区域。或说确认下,APP工程
是否是基于STM32F407创建的,而不是别的。
现在这个值有点巧,你可以增加一批有效全局变量,再看看这个MSP的值的变化,按理应该还要往高处走。
如果还没问题,尤其工程里有使用中断,建议中断里多几个局部变量,如果这都没问题,或许片内有一块根据
手册不该用 而你却用到了的RAM存在。呵呵~!
M内核的栈空间是从高地址向低地址生长,128kRAM的末尾是0x20020000,栈首地址当然是0x20020000,F42和F43系列这个0x20020000是SRAM3的起点不是末尾,256kRAM的栈首地址是0x20040000。
这个判断语句可以删掉,这部分编译器已经帮你做了,RAM不够用编译直接报错
而0x20020000刚好是RAM最高地址的下一位。
RAM是向下生长的,理论上是没问题的。
之所以是0x20000000, 我觉得是当时编译器(链接文件)对于栈顶生成都紧跟着RAM区的,通常不会用到最大。 所以不想改代码的话,调整一下RAM区域数量,有空间的话改一下栈顶即可。
[md]我查询发现STMF103系列和STMF407系列关于SRAM的在堆栈分布并没有不同,但是F103系列在对APP程序的首地址进行判断时,采用的都是0x20000000,而不是末尾的SRAM地址,这又是为什么呢?
代码更改后已经能跑了,就是对这个点有点疑惑
[md]这个没有用,写法就是有问题,掩码0x2FFE0000支持0x20000000~0x2001FFFF,128k肯定在范围内,实际判断不了堆栈是否超出RAM
这个工程代码是基于STM32cubeMx建立的,选用的芯片也是STM32F407VETx,在芯片配置上没有关于RAM的配置,都是默认的。
我查看IAP代码时,发现在IAP代码的首地址也是0x20020000,所以应该不是SRAM超出了范围所致。更像下面楼说的,这是由于SRAM的堆栈地址从高到低排序,而导致堆首地址反而是0x20020000。