STM32H743 使用FMC 死机,进HardFault_Handler,定位到
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);
}
请各位指导下
|