STM32F103C8使用TIM4中断会进入HardFault_Handler的问题
本帖最后由 a707083746 于 2018-9-11 11:40 编辑芯片是STM32F103C8
我在 SystemInit();里改为使用内部晶振,倍频到48MHz;
然后设置TIM4为1ms中断,没有其他代码了。
在KEIL里全速运行、暂停反复操作就进入HardFault_Handler()了;暂停5秒以上再全速运行发生错误的机率比较大,一直运行反而没问题。
这是什么原因啊?百度了好多种查找HardFault_Handler原因的方法,也没能解决。大部分都是说看寄存器R14(LR) = 0xFFFFFFE9,或R14(LR) = 0xFFFFFFFD。但我这里是0xFFFFFFF1。程序中也没有数组,所以应该没有数组越界的问题,不知道怎么回事:'(哪位高手指点一下呀:lol
代码如下:
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、微信或支付宝)。
1.看贴出来的代码,main函数中并没有初始化系统时钟,2.清中断标志位,3.可再参考官方例程 jundao721 发表于 2018-9-11 09:28
1.看贴出来的代码,main函数中并没有初始化系统时钟,2.清中断标志位,3.可再参考官方例程 ...
系统时钟在这里初始化了:SystemInit();
这样可以清除标志位吧:TIM4->SR &= 0xFFFE; 奇怪,我试了你的代码,没问题啊! 胤幻1988 发表于 2018-9-11 13:56
奇怪,我试了你的代码,没问题啊!
芯片是一样的吗?我是多次全速运行/停止,中间间隔几秒钟就容易出现 你这还挺难复现的……跑好久没进去 思行一 发表于 2018-9-11 14:54
你这还挺难复现的……跑好久没进去
有时点了好久也不出现……
我已从KEIL4.23换到4.72,5.14了:L
思行一 发表于 2018-9-11 14:54
你这还挺难复现的……跑好久没进去
我换个芯片看看:lol a707083746 发表于 2018-9-11 15:25
我换个芯片看看
我进去了,在keil下看到是总线IBUSERR导致进入的Hard Fault。正在看是哪条指令导致的。 思行一 发表于 2018-9-11 15:28
我进去了,在keil下看到是总线IBUSERR导致进入的Hard Fault。正在看是哪条指令导致的。 ...
我好像找到问题了,正在验证,是时钟配置的问题:L程序中的PCLK1没分频是48M,而手册中写的最大36M。TIM4又是用的这个,所以不稳定吧。
页:
[1]
2