你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103C8使用TIM4中断会进入HardFault_Handler的问题

[复制链接]
a707083746 提问时间:2018-9-10 19:56 /
悬赏50ST金币未解决
本帖最后由 a707083746 于 2018-9-11 11:40 编辑

芯片是STM32F103C8
我在 SystemInit();里改为使用内部晶振,倍频到48MHz;
然后设置TIM4为1ms中断,没有其他代码了。
在KEIL里全速运行、暂停反复操作就进入HardFault_Handler()了;暂停5秒以上再全速运行发生错误的机率比较大,一直运行反而没问题。
这是什么原因啊?百度了好多种查找HardFault_Handler原因的方法,也没能解决。大部分都是说看寄存器R14(LR) = 0xFFFFFFE9,或R14(LR) = 0xFFFFFFFD。但我这里是0xFFFFFFF1。程序中也没有数组,所以应该没有数组越界的问题,不知道怎么回事哪位高手指点一下呀
硬件故障.png
代码如下:
void TIM4_Config(void)
{//1ms
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  TIM_DeInit(TIM4);
        TIM_TimeBaseStructure.TIM_Period = 100;                  
  TIM_TimeBaseStructure.TIM_Prescaler = 480 ;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
        TIM_ClearFlag(TIM4, TIM_FLAG_Update);
        TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM4, ENABLE);

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;               
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          //
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{
  TIM4_Config();

  while (1)                          
  {
        
  }
}


中断函数:
void TIM4_IRQHandler(void)
{//1ms中断一次
  if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET )
         {
          // TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
                 TIM4->SR &= 0xFFFE;//调试时最低位没见清零
                // TIM_ClearFlag(TIM4, TIM_FLAG_Update);
                 System_Tick ++;
         }
}

时钟初始化:
void SystemInit (void)
{
/* 开启HSI 即内部晶振时钟 */
RCC->CR |= (uint32_t)0x00000001;
/*选择HSI为PLL的时钟源HSI必须2分频给PLL*/
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2;
/*PLLCLK=8/2*12=48MHz   设置倍频得到时钟源PLL的频率*/
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL12;
/* PLL不分频输出  */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* 使能 PLL时钟 */
RCC->CR |= RCC_CR_PLLON;
/* 等待PLL时钟就绪*/
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* 选择PLL为系统时钟的时钟源 */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

/* 等到PLL成为系统时钟的时钟源*/
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
如能解决,将发50元红包请第一位大神喝水(支持QQ、微信或支付宝)。
STM32F103_会进入错误中断.rar (2.49 MB, 下载次数: 16)

收藏 评论13 发布时间:2018-9-10 19:56

举报

13个回答
jundao721 回答时间:2018-9-11 09:28:19
1.看贴出来的代码,main函数中并没有初始化系统时钟,2.清中断标志位,3.可再参考官方例程
a707083746 回答时间:2018-9-11 09:43:44
jundao721 发表于 2018-9-11 09:28
1.看贴出来的代码,main函数中并没有初始化系统时钟,2.清中断标志位,3.可再参考官方例程 ...

系统时钟在这里初始化了:SystemInit();
这样可以清除标志位吧:TIM4->SR &= 0xFFFE;
胤幻1988 回答时间:2018-9-11 13:56:58
奇怪,我试了你的代码,没问题啊!
a707083746 回答时间:2018-9-11 14:18:25
胤幻1988 发表于 2018-9-11 13:56
奇怪,我试了你的代码,没问题啊!

芯片是一样的吗?我是多次全速运行/停止,中间间隔几秒钟就容易出现
思行一 回答时间:2018-9-11 14:54:56
你这还挺难复现的……跑好久没进去
a707083746 回答时间:2018-9-11 15:15:02
思行一 发表于 2018-9-11 14:54
你这还挺难复现的……跑好久没进去

有时点了好久也不出现……
我已从KEIL4.23换到4.72,5.14了
a707083746 回答时间:2018-9-11 15:25:33
思行一 发表于 2018-9-11 14:54
你这还挺难复现的……跑好久没进去

我换个芯片看看
思行一 回答时间:2018-9-11 15:28:07

我进去了,在keil下看到是总线IBUSERR导致进入的Hard Fault。正在看是哪条指令导致的。
a707083746 回答时间:2018-9-11 20:11:12
思行一 发表于 2018-9-11 15:28
我进去了,在keil下看到是总线IBUSERR导致进入的Hard Fault。正在看是哪条指令导致的。 ...

我好像找到问题了,正在验证,是时钟配置的问题程序中的PCLK1没分频是48M,而手册中写的最大36M。TIM4又是用的这个,所以不稳定吧。
PCLK1.png
PCLK1_PDF.png

12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版