sfesdmmm 发表于 2015-11-2 20:50:24

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”,发现还是有程序跑飞的情况。

me浩 发表于 2015-11-3 09:04:06

帮顶了。:lol:lol:lol

chifen 发表于 2015-11-3 21:50:06

SysTick_Config(1600000);   如果正好是100MS一次,而RCC_GetClocksFreq(&RCC_Clocks); 不是100MS一次,那RCC_Clocks得到值 就不对,说明你前面设置的时钟源不是16M

sfesdmmm 发表于 2015-11-3 21:59:13

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设置的时候,出现了问题,这个跟优先级有关,但是又不知道怎么排除问题。

chifen 发表于 2015-11-3 22:50:41

你 16M用外接晶振吧,我用内部的很正常的,

chifen 发表于 2015-11-3 22:56:36


0x2DC6C00=48000000    48M

chifen 发表于 2015-11-3 22:57:07

你这样仿真一下看看你的是多少M就知道 对不对了

huaiqiao 发表于 2015-11-4 10:02:50

其实真正设置时钟的函数是在这个SetSysClock()函数中。这个您这个应该是标准库的函数吧。STM32F030F4P6这个片子的HSI是几M,我给忘记了。这个要看时钟树的。

aabird 发表于 2015-11-4 10:15:16

从来没遇到过这个问题,可能是我学识浅薄

sfesdmmm 发表于 2015-11-4 19:47:27

chifen 发表于 2015-11-3 22:56
0x2DC6C00=48000000    48M


给你看一下吧,这是在线运行的结果:(
页: [1] 2 3
查看完整版本: STM32F0的systick初始化的怪异问题