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; |