完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include "main.h"
#include "rcc.h" void RCC_init() //我们单独列出来一个RCC_init()来管理时钟初始化工作 { /***** 以下是关于RCC时钟 详细请见《STM32F10XXX参考手册》6.3节RCC寄存器描述 *******/ unsigned char sws = 0; RCC->CR |= 0X00010000; //使能外部高速时钟HSEON while(!(RCC->CR>>17)); //将RCC_CR寄存器的值右移17位,等待HSERDY就绪,即外部时钟就绪 /* 因为手册有要求APB1时钟频率不超过36MHZ,而在STM32中最大为72MHZ */ /* 为了保证最大速度,我们这里设置成2分频 */ /* 设置寄存器CFGR里的8-10位的值为100 */ RCC->CFGR = 0x00000400; /* 寄存器CFGR的18-21四个bit位配置成以下值,则PLL就会设置成对应的值: 0000:PLL 2倍频输出 1000:PLL 10倍频输出 0001:PLL 3倍频输出 1001:PLL 11倍频输出 0010:PLL 4倍频输出 1010:PLL 12倍频输出 0011:PLL 5倍频输出 1011:PLL 13倍频输出 0100:PLL 6倍频输出 1100:PLL 14倍频输出 0101:PLL 7倍频输出 1101:PLL 15倍频输出 0110:PLL 8倍频输出 1110:PLL 16倍频输出 0111:PLL 9倍频输出 1111:PLL 16倍频输出 我们在这里,因为STM32神舟I号上的晶振是8MHZ的,配置成9倍输出就能达到STM32最大72MHZ工作频率*/ RCC->CFGR |= 7<<18; //本例程希望设置成40MHZ的工作频率,我们在这里尝试一下 //2右移动18位,即0011使得PLL获得5倍频输出,外部晶振是8MHZ //乘以4就是40MHZ了 RCC->CFGR |= 1<<16; //PLLSRC设置成1,使得HSE时钟作为PLL输入时钟 FLASH->ACR|=0x32; //FLASH 2个延时周期 RCC->CR |= 1<<24; //将PLL使能 while(!(RCC->CR>>25)); //监控寄存器CR的PLLRDY位,等待PLL时钟就绪 RCC->CFGR |= 1<<1; //将时钟切换寄存器配置成用PLL输出作为系统时钟 while(sws != 0x2) //等待CFGR寄存器的2,3位为10,系统正式切换到了PLL输出作为时钟 { sws = RCC->CFGR>>2; // 将CFGR寄存器右移2位,将2,3位SWS状态移出来, // 详情请见《STM32F10XXX参考手册》54页 sws &= 0x3; //这里的0x3为二进制的11,这个whlie循环设计的一个算法,为了判断sws是不是为10 } } 红色部分的算法是如何实现的呢?逻辑看不大懂 |
|
相关推荐
4个回答
|
|
不懂 和楼主一起学习
|
|
|
|
应该不难吧,STM32F10XXX参考手册
SWS[1:0]:系统时钟切换状态 (System clock switch status) 位3:2 由硬件置’1’或清’0’来指示哪一个时钟源被作为系统时钟。 00:HSI作为系统时钟; 01:HSE作为系统时钟; 10:PLL输出作为系统时钟; 11:不可用 算法 就是判断RCC->CFGR 位3:2状态是否为10状态,最后,判断PLL输出是否稳定。 |
|
|
|
***** 以下是关于RCC时钟 详细请见《STM32F10XXX参考手册》6.3节RCC寄存器描述 *******/
unsigned char sws = 0; RCC->CR |= 0X00010000; //使能外部高速时钟HSEON while(!(RCC->CR>>17)); //将RCC_CR寄存器的值右移17位,等待HSERDY就绪,即外部时钟就绪 /* 因为手册有要求APB1时钟频率不超过36MHZ,而在STM32中最大为72MHZ */ /* 为了保证最大速度,我们这里设置成2分频 */ /* 设置寄存器CFGR里的8-10位的值为100 */ RCC->CFGR = 0x00000400; SWS[1:0]:系统时钟切换状态 (System clock switch status) 位3:2 由硬件置’1’或清’0’来指示哪一个时钟源被作为系统时钟。 00:HSI作为系统时钟; 01:HSE作为系统时钟; 10:PLL输出作为系统时钟; 11:不可用 算法 就是判断RCC->CFGR 位3:2状态是否为10状态,最后,判断PLL输出是否稳定。 |
|
|
|
sws = RCC->CFGR>>2;
因为SWS在CFGR的2,3位,所以进行左移,目的是将SWS移动到最低位,方便进行计算。 sws &= 0x3; 因为SWS只有两位 所以把其他的高位地址进行屏蔽掉。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1168 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1105 浏览 2 评论
2203 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1297 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1718 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 21:06 , Processed in 0.659836 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号