一、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启动
{
}
}

最新文章

  1. Oracle hint
  2. .Net mvc 根据前台参数动态绑定对象
  3. java基本算法之快速排序
  4. ios下input获取焦点以及在软键盘的上面
  5. pylab,matplotlib Invalid DISPLAY variable
  6. 解决Android SDK Content Loader 0%的问题
  7. Linux- Nginx简单的负载均衡(一)
  8. MVC3不能正确识别JSON中的Enum枚举值
  9. 集成 Union Pay - 银联支付
  10. ubuntu 修改ssh远程主机名称,mac开机运行命令,静默方式启动virtual box虚拟机,静默执行run脚本
  11. 【剑指offer】和为S的连续整数序列
  12. 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
  13. 中文模糊搜索 - chunyu
  14. 在CentOS6.0上安装Oracle 11gR2 (11.2.0.1)以及基本的配置(一)
  15. [转载]iOS开发:获取设备信息
  16. 【android】java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
  17. 辛星与您使用CSS导航条
  18. python3 - 通过BeautifulSoup 4抓取百度百科人物相关链接
  19. 二维码 iOS
  20. 收藏清单: python测试框架最全资源汇总

热门文章

  1. [UTCTF2020]basic_crypto
  2. 云原生数据库TDSQL-C 容灾的实践和探索
  3. C# HttpClient 上传大文件带进度
  4. html添加公共文件
  5. 如何将多个TXT合并成一个TXT,文件名称提取
  6. windows 10中Microsoft Edge Beta登录账户提示:以管理员身份运行 Microsoft Edge 时不支持登录。请以非管理员身份重新启动 Microsoft Edge,然后重新尝试登录。的解决方案
  7. ubuntu下安装lua和tolua++
  8. 2015 for Mac PDF编辑软件
  9. Datax-web的入门使用
  10. redis的windows下安装