STM32CuteMX自动生成的代码,加上IAP后,产生HardFault 原因

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
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值