新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2018-1-8
- 在线时间
- 3 小时
|
发表于 2018-1-11 16:55:00
|
显示全部楼层
本帖最后由 Geen 于 2018-1-11 17:02 编辑
解决了:问题在于SysTick_Config(ticks)函数中对SysTick->CTRL的赋值语句:
[mw_shl_code=c,true] SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;[/mw_shl_code]
第一行中的SysTick_CTRL_CLKSOURCE_Msk将 SysTick->CTRL寄存器中的CLKSOURCE时钟源选择位 置1了,这与前面的SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);是等价的。(参考《Cortex-M3权威指南》8.7小节 SysTick定时器)
也就是说,不论你前面怎样配置SysTick的时钟源,后面的SysTick_Config(ticks)函数都会重新选择内核的FCLK作为SysTick的时钟源(FCLK=HCLK/1),这就是使前面配置无效的原因。
修改方式:①把上面代码第一行SysTick_CTRL_CLKSOURCE_Msk部分删除,②将这个赋值语句的等号“=”改为或等于“|=”
[mw_shl_code=c,true] SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk | //使能SysTick中断 0x10
SysTick_CTRL_ENABLE_Msk; //启动SysTick定时器 0x1 [/mw_shl_code]
这样你再操作前面你自己写的SysTick初始化函数就可以发现:选择HCLK作为时钟源时,每125ms进一次SysTick中断; 选择HCLK/8作为时钟源时,每1s进一次SysTick中断
【附注:】在3.5固件库版本中SysTick_Config(ticks)函数是写在core_cm3.h中的,而这个core_cm3.h是只读文件,不能直接修改,解决办法:(一)你可以把这个函数有用的部分复制出来自己做一个新的函数进行修改
(二)你也可以不用这个函数,直接对SysTick->CTRL寄存器本身进行操作,代码如下:
[mw_shl_code=c,true]// SysTick->CTRL |= (1ul<<2); //时钟源选择FCLK
SysTick->CTRL &= (0ul<<2); //时钟源选择HCLK/8
SysTick->CTRL |= 0x03; //使能中断位、启动定时器[/mw_shl_code]
————最后,十分感谢各位网友的热心交流!
|
|