【STM32】SYSCLK配置|学习笔记
一、RCC原理
所有stm32的外设都是挂载在相应的时钟上的,如下
挂载在AHB上的外设
挂载在APB1上的
APB2上的
所以RCC很重要,特别像TIM这种对时钟特别敏感的外设就必须把SYSCLK确定好,才能正常使用TIM外设。
那么问题来了,SYSCLK如何产生,或者如何配置?
其实不做任何配置芯片外设也是可以正常工作的,一般是默认设置,使用SYSCLK=HSI。对于F1就是8M,F2就是16M。
要配置自己想要的SYSCLK频率其实很简单。
1.确定好时钟源
RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
不难发现这里可以选择的时钟有三种HSI/HSE/PLLCLK三种。
前两种很好理解,HSE或HSI频率是多少SYSCLK的频率就是多少,直等关系。缺点是可选的频率少。
2.使用PLL产生需要的时钟频率
锁相环PLL理论上可以生成任意频率的时钟,PLL不产生时钟他也需要时钟源,如下图PLL可选HSI或SHE作为其时钟源。
RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);
然后需要设置其倍频分频系数,暂且设PLL的时钟源为S
PLLCLK = S*N/M*P
举个例子S=16M,需要PLLCLK=120M,怎么选择系数。
120 = 16N/M*P, N/M*P = 120/16(因为N要>192) = 240/32 = 240/16*2 = 240/8*4 配置方法不一
要注意的是时钟振荡频率不能大于120M对于F2系列来说。
二、代码实现(HSE版)
1.清除之前设置,还原默认值 RCC_DeInit();
2.打开HSE RCC_HSEConfig(RCC_HSE_ON);
3.等待起振 RCC_WaitForHSEStartUp() == SUCCESS
4.设置AHB RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB = 120M
设置高速AHB RCC_PCLK1Config(RCC_HCLK_Div1);//APB2 = 120M
设置低速AHB RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 = 120M
5.设置PLL RCC_PLLConfig(RCC_SYSCLKSource_HSI,8,240,4,0);//PLL=120M(NOTICE:CAN NOT OVER 120M)
开启PLL RCC_PLLCmd(ENABLE);
等待PLL RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET
6.选择SYSCLK为PLL RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
等待SYSCLK启动 (RCC_GetSYSCLKSource() != 0x08
HSI版:
void RCC_Config()
{
RCC_DeInit();
// RCC_HSEConfig(RCC_HSE_ON);外部晶振不准暂不启用
// if(RCC_WaitForHSEStartUp() == SUCCESS)
// {
// }
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB = 120M
RCC_PCLK1Config(RCC_HCLK_Div1);//APB2 = 120M
RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 = 120M
// /*设置FLASH存储器延时时钟周期数*/
// FLASH_SetLatency(FLASH_Latency_2);//FLASH_Latency_2 2延时周期
// /*选择FLASH预取指缓存的模式*/
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能
RCC_HSICmd(ENABLE);
RCC_PLLConfig(RCC_SYSCLKSource_HSI,8,240,4,0);//PLL=120M(NOTICE:CAN NOT OVER 120M)
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)//等待PLL启动
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)//等待SYSCLK启动
{
}
}
最新文章
- Oracle hint
- .Net mvc 根据前台参数动态绑定对象
- java基本算法之快速排序
- ios下input获取焦点以及在软键盘的上面
- pylab,matplotlib Invalid DISPLAY variable
- 解决Android SDK Content Loader 0%的问题
- Linux- Nginx简单的负载均衡(一)
- MVC3不能正确识别JSON中的Enum枚举值
- 集成 Union Pay - 银联支付
- ubuntu 修改ssh远程主机名称,mac开机运行命令,静默方式启动virtual box虚拟机,静默执行run脚本
- 【剑指offer】和为S的连续整数序列
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
- 中文模糊搜索 - chunyu
- 在CentOS6.0上安装Oracle 11gR2 (11.2.0.1)以及基本的配置(一)
- [转载]iOS开发:获取设备信息
- 【android】java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
- 辛星与您使用CSS导航条
- python3 - 通过BeautifulSoup 4抓取百度百科人物相关链接
- 二维码 iOS
- 收藏清单: python测试框架最全资源汇总
热门文章
- [UTCTF2020]basic_crypto
- 云原生数据库TDSQL-C 容灾的实践和探索
- C# HttpClient 上传大文件带进度
- html添加公共文件
- 如何将多个TXT合并成一个TXT,文件名称提取
- windows 10中Microsoft Edge Beta登录账户提示:以管理员身份运行 Microsoft Edge 时不支持登录。请以非管理员身份重新启动 Microsoft Edge,然后重新尝试登录。的解决方案
- ubuntu下安装lua和tolua++
- 2015 for Mac PDF编辑软件
- Datax-web的入门使用
- redis的windows下安装