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

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, 下载次数: 17)

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

举报

15个回答
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

a707083746 回答时间:2018-9-11 20:14:56
本帖最后由 a707083746 于 2018-9-12 11:57 编辑

问题解决了,找到两个原因:
1、PCLK1设置为48MHz,超过了最大值36MHz;
2、读取flash的等待周期为0,而系统时钟为48Mhz应该为1(2也可以,但发现__NOP();用时会长一点)。
在网上找到了这样的解析
// SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2
// 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,
// 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了
// 0:0 < SYSCLK <= 24M
// 1:24< SYSCLK <= 48M
// 2:48< SYSCLK <= 72M
    FLASH_SetLatency(FLASH_Latency_1);


PCLK1.png
PCLK1_PDF.png
dengyijun103 回答时间:2018-9-20 17:21:38
pjzmj2012 回答时间:2020-3-30 14:20:28
RCC_Clocks的数值是变量watch窗口看的吗?我怎么看不了啊
a707083746 回答时间:2020-4-23 08:29:05
pjzmj2012 发表于 2020-3-30 14:20
RCC_Clocks的数值是变量watch窗口看的吗?我怎么看不了啊

可以看啊。打个断点,在call Stack + Locals就能看到
qunengguang 回答时间:2020-10-14 15:37:11
这个问题最终怎么解决的?
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版