新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2018-4-10
- 在线时间
- 0 小时
|
1金钱
小弟今天开始接触STM32F7 调试FSMC的时候,经常会跑飞到HardFault_Handler中
跑飞的地点:
*((volatile uint16_t *)0x60000000) = 1; //可运行
*((volatile uint16_t *)0x64000000) = 1; //可运行
*((volatile uint16_t *)0x68000000) = 1; //跑飞
*((volatile uint16_t *)0x6c000000) = 1;
用的是正点原子的LCD例程作为模板:
之前的相关初始化如下:
Cache_Enable();
HAL_Init();
Stm32_Clock_Init(432,25,2,9);
delay_init(216);
uart_init(115200);
LED_Init();
LCD_Init(); //上面的跑飞程序是在LCD_Init中进行测试的
void LCD_Init(void)
{
uint32_t Addr;
GPIO_InitTypeDef GPIO_Initure;
FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
__HAL_RCC_GPIOB_CLK_ENABLE(); //¿aÆôGPIOBê±Öó
GPIO_Initure.Pin=GPIO_PIN_5; //PB5,±31a¿ØÖÆ
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //íÆíìêä3ö
GPIO_Initure.Pull=GPIO_PULLUP; //éÏà-
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //¸ßËù
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
LCD_MPU_Config(); //ê1ÄüMPU±£»¤LCDÇøóò
SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;
SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;
SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK1; //ê1óÃNE1
SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //2»¸′óÃêy¾YÏß
SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM; //SRAM
SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16λêy¾Y¿í¶è
SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE; //′æ′¢Æ÷D′ê1Äü
SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE; //¶áD′ê1óÃ2»í¬μÄê±Dò
//FSMC¶áê±Dò¿ØÖƼÄ′æÆ÷
FSMC_ReadWriteTim.AddressSetupTime=15; //μØÖ·½¨á¢ê±¼ä(ADDSET)Îa15¸öHCLK 1/216M=4.6ns*15=69ns
FSMC_ReadWriteTim.AddressHoldTime=0x00;
FSMC_ReadWriteTim.DataSetupTime=80; //êy¾Y±£′æê±¼ä(DATAST)Îa85¸öHCLK =4.6*80=368ns
FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //Ä£ê½A
//FSMCD′ê±Dò¿ØÖƼÄ′æÆ÷
FSMC_WriteTim.AddressSetupTime=15; //μØÖ·½¨á¢ê±¼ä(ADDSET)Îa15¸öHCLK=69ns
FSMC_WriteTim.AddressHoldTime=0x00;
FSMC_WriteTim.DataSetupTime=15; //êy¾Y±£′æê±¼ä(DATAST)Îa4.6ns*15¸öHCLK=69ns
FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A; //Ä£ê½A
HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);
delay_ms(50); // delay 50 ms
while(1)
{
*((volatile uint16_t *)0x60000000) = 1;
*((volatile uint16_t *)0x64000000) = 1;
*((volatile uint16_t *)0x68000000) = 1;
*((volatile uint16_t *)0x6c000000) = 1;
}
上面的程序中MPU设置LCD_MPU_Config();中设置如下:
void LCD_MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_Initure;
HAL_MPU_Disable(); //ÅäÖÃMPU֮ǰÏè1رÕMPU,ÅäÖÃíê3éòÔoóÔúê1ÄüMPU
//ía2¿SRAMÎaregion0£¬′óD¡Îa2MB£¬′ËÇøóò¿é¶áD′
MPU_Initure.Enable=MPU_REGION_ENABLE; //ê1Äüregion
MPU_Initure.Number=MPU_REGION_NUMBER0; //éèÖÃregion£¬ía2¿SRAMê1óÃμÄregion0
MPU_Initure.BaseAddress=(0X60000000); //region»ùμØÖ·
MPU_Initure.Size=MPU_REGION_SIZE_256MB; //region′óD¡
MPU_Initure.SubRegionDisable=0X00;
MPU_Initure.TypeExtField=MPU_TEX_LEVEL0;
MPU_Initure.AccessPermission=MPU_REGION_FULL_ACCESS; //′Ëregion¿é¶áD′
MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE; //ÔêDí¶áè¡′ËÇøóòÖDμÄÖ¸áî
MPU_Initure.IsShareable=MPU_ACCESS_NOT_SHAREABLE;
MPU_Initure.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;
MPU_Initure.IsBufferable=MPU_ACCESS_BUFFERABLE;
HAL_MPU_ConfigRegion(&MPU_Initure);
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); //¿aÆôMPU
}
为什么往一个地址里写数据时会出现这样的问题?有人能够帮忙解答么?
|
|