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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版