STM32F7 内存对齐BUG

/ 0评 / 0

如果STM32F7xx与外部SDRAM一起使用,即访问0xC0000000-0xDFFFFFFF(仅这32MB范围)时,则可能会发生HardFault.一般来说,变量是对齐的,因为这些访问比未对齐的访问稍快,所以一般的变量访问不会出错,只有指针访问容易出错,不对齐导致出错的另一个原因,是因为ARMv7-M设计时候,考虑0xC0000000-0xDFFFFFFF都是设备储存器类型,设备储存器当然是对齐的.

既然是早定义好的,那么我们有几个解决方法.

方法1:修改MPU让这个区域变成正常储存器.

    /* Configure the MPU attributes as WT for SRAM */

    LL_MPU_ConfigRegion(LL_MPU_REGION_NUMBER1, 0x00, 0xC0000000UL,

                        LL_MPU_REGION_SIZE_16MB | LL_MPU_REGION_FULL_ACCESS | LL_MPU_ACCESS_NOT_BUFFERABLE |

                        LL_MPU_ACCESS_NOT_CACHEABLE | LL_MPU_ACCESS_NOT_SHAREABLE | LL_MPU_TEX_LEVEL1 |

                        LL_MPU_INSTRUCTION_ACCESS_DISABLE);

方法2:映射SDRAM到别的地址.(0x60000000,如果你外挂NOR Flash,这个方法行不通)

RCC-> APB2ENR | = RCC_APB2ENR_SYSCFGEN;

SYSCFG-> MEMRMP | = SYSCFG_MEMRMP_SWP_FMC_0;

方法3:强制编译对齐(下下策,影响效率)

编译器添加--no_unaligned_access编译选项就可以.

发表评论

您的电子邮箱地址不会被公开。