本帖最后由 a707083746 于 2018-9-11 11:40 编辑 芯片是STM32F103C8 我在 SystemInit();里改为使用内部晶振,倍频到48MHz; 然后设置TIM4为1ms中断,没有其他代码了。 在KEIL里全速运行、暂停反复操作就进入HardFault_Handler()了;暂停5秒以上再全速运行发生错误的机率比较大,一直运行反而没问题。 这是什么原因啊?百度了好多种查找HardFault_Handler原因的方法,也没能解决。大部分都是说看寄存器R14(LR) = 0xFFFFFFE9,或R14(LR) = 0xFFFFFFFD。但我这里是0xFFFFFFF1。程序中也没有数组,所以应该没有数组越界的问题,不知道怎么回事哪位高手指点一下呀 代码如下: 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、微信或支付宝)。 |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
系统时钟在这里初始化了:SystemInit();
这样可以清除标志位吧:TIM4->SR &= 0xFFFE;
芯片是一样的吗?我是多次全速运行/停止,中间间隔几秒钟就容易出现
有时点了好久也不出现……
我已从KEIL4.23换到4.72,5.14了
我换个芯片看看
我进去了,在keil下看到是总线IBUSERR导致进入的Hard Fault。正在看是哪条指令导致的。
我好像找到问题了,正在验证,是时钟配置的问题程序中的PCLK1没分频是48M,而手册中写的最大36M。TIM4又是用的这个,所以不稳定吧。
问题解决了,找到两个原因:
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);
可以看啊。打个断点,在call Stack + Locals就能看到