STM32F0的systick初始化的怪异问题
本帖最后由 sfesdmmm 于 2015-11-6 22:10 编辑用的芯片型号是STM32F030F4P6,TSSOP20封装,程序很简单,就把系统时钟设置为16M,然后产生一个100ms的systick中断,用一个LED来观察效果。
下面是初始化程序和主程序的截图:
系统初始化,时钟为16M,systick设置为100ms
SysTick_Handler里把flag置1,主函数里判断
问题描述:在把程序烧进去以后,发现灯闪得很慢,如果把函数改成SysTick_Config(1600000);//即100ms就可以正常闪了。这说明RCC_GetClocksFreq(&RCC_Clocks); 获取的值不对。
于是就在线调试,看到systick相关的寄存器值不对了
不知道大家有没有遇到这样的问题?请不吝赐教,谢谢!
另外,在线调试的时候,跟踪代码,发现RCC_GetClocksFreq函数里,有程序跑飞的情况。
问题依然存在,现在把工程放上来了,劳烦各位可以下来看看,谢谢了!
在线调试的时候,进入UartInit函数里,点击“step over”,发现还是有程序跑飞的情况。
帮顶了。:lol:lol:lol SysTick_Config(1600000); 如果正好是100MS一次,而RCC_GetClocksFreq(&RCC_Clocks); 不是100MS一次,那RCC_Clocks得到值 就不对,说明你前面设置的时钟源不是16M chifen 发表于 2015-11-3 21:50
SysTick_Config(1600000); 如果正好是100MS一次,而RCC_GetClocksFreq(&RCC_Clocks); 不是100MS一次,那R ...
是的,直接SysTick_Config(1600000)就没问题了。
但是,SysTick_Config(RCC_Clocks.HCLK_Frequency/10); 这样的方式,如果是在线烧录调试的话,又是正常的。我弄了几天,查了不少资料,感觉应该是systick设置的时候,出现了问题,这个跟优先级有关,但是又不知道怎么排除问题。
你 16M用外接晶振吧,我用内部的很正常的,
0x2DC6C00=48000000 48M 你这样仿真一下看看你的是多少M就知道 对不对了 其实真正设置时钟的函数是在这个SetSysClock()函数中。这个您这个应该是标准库的函数吧。STM32F030F4P6这个片子的HSI是几M,我给忘记了。这个要看时钟树的。 从来没遇到过这个问题,可能是我学识浅薄 chifen 发表于 2015-11-3 22:56
0x2DC6C00=48000000 48M
给你看一下吧,这是在线运行的结果:(