OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4909|回复: 1

STM32F7 FSMC 读写跑飞进入HardFault_Handler

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-4-10
在线时间
0 小时
发表于 2018-4-10 13:54:50 | 显示全部楼层 |阅读模式
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
}




为什么往一个地址里写数据时会出现这样的问题?有人能够帮忙解答么?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-4-11 01:37:20 | 显示全部楼层
同样的代码,在我们例程上,正常么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 08:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表