打印

STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结

[复制链接]
630|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
社畜一枚|  楼主 | 2018-8-4 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、为什么要保持原有数:

     比如在IAP(bootloader)+APP场合,我们有些全局变量希望在boot代码和APP代码里面都使用,这时NVIC_SystemReset就容易出问题。

2、问题

    H7测试发使用uint8_t,uint16_t定义的变量,软件复位后,各种问题,总结各种可能规律,发现规律太难找了。

3、最终解决方案

采用下数据宽度就没有问题了,切不要使用8bit和16bit的定义。
uint32_t ptrtcm[1] __attribute__((at(0x20000000),zero_init)); /* DTCM, D1域,推荐32bit */
uint64_t ptr[1] __attribute__((at(0x24000000), zero_init));     /* AXI SRAM, D1域,推荐64bit,因为AXI SRAM总线接口是64bit的 */
uint32_t ptr1[1] __attribute__((at(0x30000000), zero_init));   /* SRAM1, D2域,推荐32bit */
uint32_t ptr2[1] __attribute__((at(0x30020000), zero_init));   /* SRAM2, D2域,推荐32bit */
uint32_t ptr3[1] __attribute__((at(0x30040000), zero_init));   /* SRAM3, D2域,推荐32bit  */
uint32_t ptr4[1] __attribute__((at(0x38000000), zero_init));   /* SRAM4, D3域,推荐32bit  */


其中ptr[1],ptr[1],ptr1[1],ptr2[1],ptr[1]3,ptr4[1]要配置MPU属性为WT

比如AXI SRAM        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x30000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_128KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

397

主题

401

帖子

0

粉丝