STM32CuteMX自动生成的代码,加上IAP后,产生HardFault
之前用标准库,基于STM32F407芯片开发了一个项目,今年有时间重新整理代码,使用STM32CuteMX自动生成代码,在无IAP层情况下运行正常,而IAP层加入后,经常出现HardFault,且每次出错位置不同,无法定位。
后来查找问题发现:IAP运行频率是168M,而APP层之前为了硬件稳定,降频到120M。
- 尝试修改IAP 的频率为120M,APP层不再出现HardFault,但是运行速度相较 无IAP的APP 慢很多。
- 对比了之前的标准库程序,发现标准库在SystemInit( )中有关闭外部时钟,复位CCR的操作,移植到现有代码后正常。
- 修改前的代码
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}
- 修改后的代码
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
/* Reset the RCC clock configuration to the default reset state ------------*/
/* Set HSION bit */
//IAP后,需要复位RCC配置,否则程序会跑飞
RCC->CR |= (uint32_t)0x00000001; //内部高速时钟使能
/* Reset CFGR register */
RCC->CFGR = 0x00000000; //复位时钟配置寄存器
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF; //关闭外部时钟、时钟安全系统、PLL
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010; //复位PLL配置寄存器,复位值 0x24003010 Q=4, P=8, N=192, M=16
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF; //不用旁边HSE振荡器
/* Disable all interrupts */
RCC->CIR = 0x00000000; //禁止 时钟中断
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}