[STM32H7]

STM32H743 使用FMC 死机,进HardFault_Handler,定位到

[复制链接]
1486|3
手机看帖
扫描二维码
随时随地手机跟帖
fengyu2513|  楼主 | 2021-5-15 18:43 | 显示全部楼层 |阅读模式
STM32H743  使用FMC  死机,进HardFault_Handler,定位到







44530609fa4ca2b0c4.png



static void Fpga_ConfigGPIO(void);
static void FPGA_ConfigFMC(void);
/*
*********************************************************************************************************
*        函 数 名: bsp_InitExtIO
*        功能说明: 配置扩展IO相关的GPIO. 上电只能执行一次。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitExtIO(void)
{
        Fpga_ConfigGPIO();
        FPGA_ConfigFMC();
       
}






/*
*********************************************************************************************************
*         
*        功能说明: 配置GPIO,FMC管脚设置为复用功能
*        形    参:  无
*        返 回 值: 无
*********************************************************************************************************
*/
static void Fpga_ConfigGPIO(void)
{
/*

         
         PB7                FMC_NL
         
PD0                FMC_D2
PD1                FMC_D3
PD3                FMC_CLK
PD4                FMC_NOE
PD5                FMC_NWE
PD6                FMC_NWAIT
PD7                FMC_NE1
PD8                FMC_D13
PD9                FMC_D14
PD10                FMC_D15
PD14                FMC_D0
PD15                FMC_D1
PE7                FMC_D4
PE8                FMC_D5
PE9                FMC_D6
PE10                FMC_D7
PE11                FMC_D8
PE12                FMC_D9
PE13                FMC_D10
PE14                FMC_D11
PE15                FMC_D12
PF0                FMC_A0
PF1                FMC_A1
PF2                FMC_A2
PF3                FMC_A3
PF4                FMC_A4
PF5                FMC_A5
PF12                FMC_A6
PF13                FMC_A7
PF14                FMC_A8
PF15                FMC_A9
               
PG0                FMC_A10
PG1                FMC_A11
PG2                FMC_A12
PG3                FMC_A13

         
         
*/       

        GPIO_InitTypeDef gpio_init_structure;

        /* 使能 GPIO时钟 */
        /*
        __HAL_RCC_GPIOD_CLK_ENABLE();
        __HAL_RCC_GPIOE_CLK_ENABLE();
        __HAL_RCC_GPIOG_CLK_ENABLE();
        __HAL_RCC_GPIOH_CLK_ENABLE();
        __HAL_RCC_GPIOI_CLK_ENABLE();
*/
__HAL_RCC_FMC_CLK_ENABLE();                 //??麱MC瓯??
    __HAL_RCC_GPIOB_CLK_ENABLE();               //??麲PIOC瓯??
    __HAL_RCC_GPIOD_CLK_ENABLE();               //??麲PIOD瓯??
    __HAL_RCC_GPIOE_CLK_ENABLE();               //??麲PIOE瓯??
     __HAL_RCC_GPIOF_CLK_ENABLE();               //??麲PIOF瓯??
    __HAL_RCC_GPIOG_CLK_ENABLE();               //??麲PIOG瓯??
        /* 使能FMC时钟 */
//        __HAL_RCC_FMC_CLK_ENABLE();

        /* 设置 GPIOD 相关的IO为复用推挽输出 */
        gpio_init_structure.Mode = GPIO_MODE_AF_PP;
        gpio_init_structure.Pull = GPIO_NOPULL;
        gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        gpio_init_structure.Alternate = GPIO_AF12_FMC;
       
        /* 配置GPIOD */
        gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 |
                                    GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |
                                    GPIO_PIN_15;
        HAL_GPIO_Init(GPIOD, &gpio_init_structure);

        /* 配置GPIOE */
        gpio_init_structure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |
                                    GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |
                                    GPIO_PIN_15;
        HAL_GPIO_Init(GPIOE, &gpio_init_structure);

        gpio_init_structure.Pin = GPIO_PIN_7 ;
                HAL_GPIO_Init(GPIOB, &gpio_init_structure);

        /* 配置GPIOF */
        gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4
                                                | GPIO_PIN_5 | GPIO_PIN_12 | GPIO_PIN_13| GPIO_PIN_14| GPIO_PIN_15;
        HAL_GPIO_Init(GPIOF, &gpio_init_structure);

        /* 配置GPIOG */
        gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 ;
        HAL_GPIO_Init(GPIOG, &gpio_init_structure);
}

/*
*********************************************************************************************************
*        函 数 名: HC574_ConfigFMC
*        功能说明: 配置FMC并口访问时序
*        形    参:  无
*        返 回 值: 无
*********************************************************************************************************
*/
static void FPGA_ConfigFMC(void)
{
        SRAM_HandleTypeDef hsram = {0};
        FMC_NORSRAM_TimingTypeDef SRAM_Timing = {0};
               
        hsram.Instance  = FMC_NORSRAM_DEVICE;
        hsram.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;

    /* FMC使用的HCLK3,主频200MHz,1个FMC时钟周期就是5ns */
        /* SRAM 总线时序配置 4-1-2-1-2-2 不稳定,5-2-2-1-2-2 稳定 */  
        SRAM_Timing.AddressSetupTime       = 5;  /* 5*5ns=25ns,地址建立时间,范围0 -15个FMC时钟周期个数 */
        SRAM_Timing.AddressHoldTime        = 2;  /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
        SRAM_Timing.DataSetupTime          = 2;  /* 2*5ns=10ns,数据保持时间,范围1 -255个时钟周期个数 */
        SRAM_Timing.BusTurnAroundDuration  = 1;  /* 此配置用不到这个参数 */
        SRAM_Timing.CLKDivision            = 2;  /* 此配置用不到这个参数 */
        SRAM_Timing.DataLatency            = 2;  /* 此配置用不到这个参数 */
        SRAM_Timing.AccessMode             = FMC_ACCESS_MODE_A; /* 配置为模式A */

        hsram.Init.NSBank             = FMC_NORSRAM_BANK1;              /* 使用的BANK1,即使用的片选FMC_NE1 */
        hsram.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_DISABLE;   /* 禁止地址数据复用 */
        hsram.Init.MemoryType         = FMC_MEMORY_TYPE_PSRAM;//FMC_MEMORY_TYPE_SRAM;     //      /* 存储器类型SRAM */
        hsram.Init.MemoryDataWidth    = FMC_NORSRAM_MEM_BUS_WIDTH_16;        /* 32位总线宽度 */
        hsram.Init.BurstAccessMode    = FMC_BURST_ACCESS_MODE_DISABLE;  /* 关闭突发模式 */
        hsram.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;   /* 用于设置等待信号的极性,关闭突发模式,此参数无效 */
        hsram.Init.WaitSignalActive   = FMC_WAIT_TIMING_BEFORE_WS;      /* 关闭突发模式,此参数无效 */
        hsram.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;     /* 用于使能或者禁止写保护 */
        hsram.Init.WaitSignal         = FMC_WAIT_SIGNAL_DISABLE;        /* 关闭突发模式,此参数无效 */
        hsram.Init.ExtendedMode       = FMC_EXTENDED_MODE_DISABLE;      /* 禁止扩展模式 */
        hsram.Init.AsynchronousWait   = FMC_ASYNCHRONOUS_WAIT_DISABLE;  /* 用于异步传输期间,使能或者禁止等待信号,这里选择关闭 */
        hsram.Init.WriteBurst         = FMC_WRITE_BURST_DISABLE;        /* 禁止写突发 */
        hsram.Init.ContinuousClock    = FMC_CONTINUOUS_CLOCK_SYNC_ONLY; /* 仅同步模式才做时钟输出 */
    hsram.Init.WriteFifo          = FMC_WRITE_FIFO_DISABLE;          /* 使能写FIFO */
        hsram.Init.PageSize    =  FMC_PAGE_SIZE_NONE;
        /* 初始化SRAM控制器 */
        if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK)
        {
                /* 初始化错误 */
                Error_Handler(__FILE__, __LINE__);
        }
}





???????????????????????


#define fpga_write(offset,data)        *((volatile signed short int *)(0x60000000 + (offset ))) = data

#define fpga_read(offset)        *((volatile signed short int *)(0x60000000 + (offset)))
       
void bsp_InitExtIO(void);



static void MPU_Config( void )
{
        MPU_Region_InitTypeDef MPU_InitStruct;

        /* 禁止 MPU */
        HAL_MPU_Disable();
        #if 0
        /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x24000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);
       
        #endif

        /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x60000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_16MB;       
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;        /* 不能用MPU_ACCESS_CACHEABLE,会出现2次CS、WE信号 */
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
       
        HAL_MPU_ConfigRegion(&MPU_InitStruct);

        /*使能 MPU */
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}


请各位指导下

FMC_FPGA.rar

5.56 MB

使用特权

评论回复
zchong| | 2021-5-15 18:46 | 显示全部楼层
看call stack啊,你这个能看出什么来

使用特权

评论回复
antusheng| | 2021-5-15 21:42 | 显示全部楼层
这个能找到原因吗

使用特权

评论回复
梁饮霜| | 2023-12-14 09:18 | 显示全部楼层
楼主找到原因了吗?我也遇到了相似的情况

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

38

帖子

0

粉丝