OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2903|回复: 1

关于stm32f103ZET6 系统滴答定时器的延迟问题

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
发表于 2020-4-19 22:18:08 | 显示全部楼层 |阅读模式
1金钱
写了个系统滴答定时器来实现查询等待延迟函数,在主函数里通过该延迟来点灯,中途发现一个问题

在毫秒级延迟函数中我选的是内核时钟(72MHZ),但是重载值寄存器的给值为        SysTick->LOAD = 9*count*1000;
按理来说 重载值寄存器的给值应该是SysTick->LOAD = 72*cout*1000;应该才能准确实现毫秒级延迟,但是事实上SysTick->LOAD = 9*count*1000;才能准确实现毫秒级延迟

难道内核时钟FCLK是9MHZ,然后STCLK是72MHZ?


但是我看了看时钟树 案例来说 FCLK就是72MHZ,他没有被分频啊 应该就是72MHZ,而STCLK被分频了(/8)应该是9MHZ才对,那为什么系统滴答定时器我选择内核时钟源,但是重载值寄存器给值 SysTick->LOAD = 9*count*1000;才能准确延迟  而不是SysTick->LOAD = 72*cout*1000;才能实现准确延迟?
延迟函数.png
CTRL.png
时钟树.png

最佳答案

查看完整内容[请看2#楼]

已经自己发现原因,我写的这个项目是纯配置寄存器的,当时没有包含system_stm32f10x.c文件 所以启动代码中不能调用System_Init函数进行SYSCLK时钟初始化,所以SYSCLK的时钟源默认是HSI即高速内部时钟(8M),此时系统滴答定时器的内核时钟就是8M,外部时钟即参考时钟是1M了,所以无论是库函数写工程还是寄存器写工程都要包含system_stm32f10x.c文件,这样在启动代码中就会自动调用System_Init()函数对SYSCLK进行初始化了,此时 SYSCL ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2020-4-14
在线时间
8 小时
 楼主| 发表于 2020-4-19 22:18:09 | 显示全部楼层
已经自己发现原因,我写的这个项目是纯配置寄存器的,当时没有包含system_stm32f10x.c文件 所以启动代码中不能调用System_Init函数进行SYSCLK时钟初始化,所以SYSCLK的时钟源默认是HSI即高速内部时钟(8M),此时系统滴答定时器的内核时钟就是8M,外部时钟即参考时钟是1M了,所以无论是库函数写工程还是寄存器写工程都要包含system_stm32f10x.c文件,这样在启动代码中就会自动调用System_Init()函数对SYSCLK进行初始化了,此时 SYSCLK的默认时钟源是HSE(8M)即高速外部时钟(比内部时钟稳定),HSE作为PLL倍频输入源,经过9倍频输出作为SYSCLK的时钟源,所以此时的内核时钟是8*9=72MHZ,外部时钟是72/9=8MHZ了
QQ图片20200420212456.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 17:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表