OpenEdv-开源电子网

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

STM32初始化时钟函数中最后两句temp=RCC->CFGR>>2; temp&=0x03;怎么理解

[复制链接]

5

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-16
在线时间
10 小时
发表于 2018-4-25 10:37:39 | 显示全部楼层 |阅读模式
STM32PLL时钟配置函数:
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0; //当前系统时钟状态标志
MYRCC_DeInit(); //复位并配置向量表
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位 //这里PLL减去2是因为倍频系数从2开始,但倍频寄存器值从 0000开始,即如果是9倍频,则倍频寄存器应写0111。
RCC->CFGR|=PLL<<18; //设置PLL值 2~16
RCC->CFGR|=1<<16; //由软件置’1’或清’0’来选择PLL输入时钟源。该位只有在PLL关闭时才 可以被写入。
FLASH->ACR|=0x32; //FLASH 2个延时周期

RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}


个人理解:初始值temp=0,temp!=0x02所以执行while(temp!=0x02)内语句,但RCC->CFGR>>2值应该是多少呢?求大神指导?
                  还有就是RCC->CFGR|=0x00000002;这条语句等效于RCC->CFGR=RCC->CFGR|0x00000002这个结果应该是多少呢?如果这个结果不知道那么RCC->CFGR>>2也就不清楚了

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

使用道具 举报

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2018-3-29
在线时间
53 小时
发表于 2018-4-25 15:00:07 | 显示全部楼层

回帖奖励 +4 金钱


取地址,右移
第二个就是temp = temp & OX03(与运算)
我也是新手   错了勿喷
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-16
在线时间
10 小时
 楼主| 发表于 2018-4-25 15:40:53 | 显示全部楼层
XIAO萌新 发表于 2018-4-25 15:00
取地址,右移
第二个就是temp = temp & OX03(与运算)
我也是新手   错了勿喷

地址是多少?你没正面回答呢
回复 支持 反对

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2018-4-25 18:58:32 | 显示全部楼层

回帖奖励 +4 金钱

2222222222222222.JPG
CFGR的[2:3]是系统时钟当前是HSI、HSE或者PLL的。代码里面设置的是PLL作为系统时钟的CFGR右移两位然后赋值给temp,再与0X03与,就得到了CFGR[2:3]的值,这里加个while是判断PLL是否被设置PLL成功,RCC->CFGR=RCC->CFGR|0x00000002就是设置CFGR[0:1]来设置系统时钟为PLL的
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-16
在线时间
10 小时
 楼主| 发表于 2018-4-25 19:07:17 | 显示全部楼层
login_FAE 发表于 2018-4-25 18:58
CFGR的[2:3]是系统时钟当前是HSI、HSE或者PLL的。代码里面设置的是PLL作为系统时钟的CFGR右移两位然后赋 ...

PLL作为系统时钟的CFGR右移两位得到什么结果?
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-16
在线时间
10 小时
 楼主| 发表于 2018-4-25 19:18:39 | 显示全部楼层
login_FAE 发表于 2018-4-25 18:58
CFGR的[2:3]是系统时钟当前是HSI、HSE或者PLL的。代码里面设置的是PLL作为系统时钟的CFGR右移两位然后赋 ...

RCC->CFGR>>2值应该是多少呢
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-16
在线时间
10 小时
 楼主| 发表于 2018-4-25 19:38:44 | 显示全部楼层
login_FAE 发表于 2018-4-25 18:58
CFGR的[2:3]是系统时钟当前是HSI、HSE或者PLL的。代码里面设置的是PLL作为系统时钟的CFGR右移两位然后赋 ...

RCC->CFGR=RCC->CFGR|0x00000002,这里我们只看RCC->CFGR寄存区的最低位为2,十六进制就是0x0010,那么RCC->CFGR>>2后得到的temp最低位的十六进制就变成了0x0000
回复 支持 反对

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-26 11:09:28 | 显示全部楼层
stm3220180416 发表于 2018-4-25 19:38
RCC->CFGR=RCC->CFGR|0x00000002,这里我们只看RCC->CFGR寄存区的最低位为2,十六进制就是0x0010,那么RCC ...

上面表格里不是写了,CFGR  的  xxxxxxx sws1 sws0  sw1 sw0  排序么?
右移两个自然是把sws1 sws0 放到最后两位,再与一个3就是把除了最后两位前面的都变成0,再判断这个数是不是0 1 2 就能分辨现在的系统时钟是哪个了。

跟上面RCC->CFGR|=0x00000002;//PLL作为系统时钟  这句无关,或者关系就是与3把这句影响屏蔽掉。
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-16
在线时间
10 小时
 楼主| 发表于 2018-4-26 20:53:22 | 显示全部楼层
孟亮 发表于 2018-4-26 11:09
上面表格里不是写了,CFGR  的  xxxxxxx sws1 sws0  sw1 sw0  排序么?
右移两个自然是把sws1 sws0 放到 ...

非常详细,多谢大神
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-6-6
在线时间
1 小时
发表于 2018-4-26 23:25:52 | 显示全部楼层
看不懂啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 20:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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