如果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编译选项就可以.