OpenEdv-开源电子网

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

STM32F1 外部晶振8M,倍频后系统时钟16M,延时初始化问题

[复制链接]

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-16 16:36:18 | 显示全部楼层 |阅读模式
5金钱
STM32F1  外部晶振8M,倍频后系统时钟16M,延时初始化问题。参考原子哥的delay_init()函数
{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);        //因为HCLK就是16M,所以没必要再8分频给systick吧?
        fac_us=SystemCoreClock/8000000;                                //为系统时钟的        这句8000000是怎么来的?




}

要通过IIC和MPU6050通信,需要精确都2us延时,大伙有做过相关的没?延时函数怎么初始化?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-3-8
在线时间
114 小时
发表于 2019-5-16 16:41:13 | 显示全部楼层
8000000就是8M,话说US不是应该除以1000000吗
回复

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
 楼主| 发表于 2019-5-16 16:53:27 | 显示全部楼层
15937417823 发表于 2019-5-16 16:41
8000000就是8M,话说US不是应该除以1000000吗

这个和我HCLK  16M有关系吗?
  fac_us=SystemCoreClock/8000000; 这个应该是算1us走多少个机器周期
回复

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
 楼主| 发表于 2019-5-16 20:20:22 | 显示全部楼层
15937417823 发表于 2019-5-16 16:41
8000000就是8M,话说US不是应该除以1000000吗

这是系统时钟截图
A9152627-161A-49ab-82CF-359sdfsdsdfsdCC426E546.png
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2019-5-16 22:05:44 | 显示全部楼层
原子的系统时钟是72M的,
72M/8000000=9是为了得到分频因子,
即9个周期为1us
看下面的注释:
//        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //此句与下句等效,BIT2为SYSTICK时钟选择,0为HCLK/8,1为HCLK
//        SysTick->CTRL &= ((uint32_t)0xFFFFFFFB); //置BIT2为0(复位值,所以此句可无),即选择外部时钟源HCLK/8  即9M(计数器每拍为1/9000000秒)
//        SysTick->CTRL |=1<<2;              //置BIT2为1,即选择外部时钟源HCLK  即72M(计数器每拍为8/9000000秒)   
//        fac_us=9;                              //对于72M的系统来说,fac_us=72000000/8000000=9 即9拍一个微秒
       
//        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //开启SYSTICK中断
//        SysTick->LOAD=fac_us*1000-1;                       //装载值设定为9*1000-1=8999  即每ms中断一次        
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
 楼主| 发表于 2019-5-16 22:19:44 | 显示全部楼层
warship 发表于 2019-5-16 22:05
原子的系统时钟是72M的,
72M/8000000=9是为了得到分频因子,
即9个周期为1us

我的系统时钟是16M的。改过来根本不行。按道理16M没必要分频。
SysTick_CLKSourceConfig(1);后面fac_us=16应该没毛病,实际IIC里的2us延时不准
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2019-5-16 22:55:08 来自手机 | 显示全部楼层
hope0116 发表于 2019-5-16 22:19
我的系统时钟是16M的。改过来根本不行。按道理16M没必要分频。
SysTick_CLKSourceConfig(1);后面fac_ ...

系统时钟是16兆的话,如果按照原子的前面代码不改,systick在8分频后应该是2M。你的因子应该是2才对。
回复

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
 楼主| 发表于 2019-5-17 09:32:07 | 显示全部楼层
warship 发表于 2019-5-16 22:55
系统时钟是16兆的话,如果按照原子的前面代码不改,systick在8分频后应该是2M。你的因子应该是2才对。

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us =2吗?
那如果SysTick_CLKSourceConfig这里不8分频
fac_us就等于16对吧

这两种我都试了,效果是一样的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 10:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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