STMF4编写系统时钟
目录
STMF4时钟系统重点概要
HSE作为系统时钟配置方法(附带程序)
正点开发板晶振问题(不同频率晶振配置方法)
STM F407时钟系统概要
时钟框图
设置系统时钟SYSCLK、设置AHB 分频因子(决定HCLK 等于多少)、设置APB2 分频因子(决定PCLK2 等于多少)、设置APB1 分频因子(决定PCLK1 等于多少)、设置各个外设的分频因子;控制AHB、APB2 和APB1 这三条总线时钟的开启、控制每个外设的时钟的开启。对于SYSCLK、HCLK、PCLK2、PCLK1 这四个时钟的配置一般是:HCLK = SYSCLK=PLLCLK = 168M, PCLK1=HCLK/2 = 84M,PCLK1=HCLK/4 = 42M。这个时钟配置也是库函数的标准配置,我们用的最多的就是这个。
HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从4-26MHZ 不等。当使用有源晶振时,时钟从OSC_IN 引脚进入,OSC_OUT 引脚悬空,当选用无源晶振时,时钟从OSC_IN 和OSC_OUT 进入,并且要配谐振电容。
HSE 或者HSI 经过PLL 时钟输入分频因子M(2~63)分频后,成为VCO 的时钟输入,VCO 的时钟必须在1~2M 之间(大多配为1较为方便),我们选择HSE=25M(正点原子HSE=8M) 作为PLL 的时钟输入,M 设置为25(设置为HSE值,这里正点原子M设置为8),那么VCO 输入时钟就等于1M。
VCO 输入时钟经过VCO 倍频因子N 倍频之后,成为VCO 时钟输出,VCO 时钟必须在192~432M之间。我们配置N 为336,则VCO的输出时钟等于336M。如果要把系统时钟超频,就得在VCO 倍频系数N 这里做手脚。PLLCLK_OUTMAX = VCOCLK_OUTMAX/P_MIN =432/2=216M,即F407最高可超频到216M。VCO 输出时钟之后有三个分频因子:PLLCLK 分频因子p,USB OTG FS/RNG/SDIO 时钟分频因子Q,分频因子R(F446 才有,F407 没有)。p 可以取值2、4、6、8, 我们配置为2,则得到PLLCLK=168M。Q 可以取值4~15,但是USB OTGFS 必须使用48M,Q=VCO 输出时钟336/48=7。有关PLL 的配置有一个专门的RCC PLL 配置寄存器RCC_PLLCFGR,具体描述看手册即可。当HSE 出现故障的时候,系统时钟会切换为HSI=16M,直到HSE 恢复正常为止。当HSE 直接或者间接(HSE 经过PLL 倍频)的作为系统时钟的时候,如果HSE 发生故障,不仅HSE 会被关闭,连PLL 也会被关闭,这个时候系统会自动切换HSI 作为系统时钟,此时SYSCLK=HSI=16M,如果没有开启CSS 和CSS 中断的话,那么整个系统就只能在低速率运行,这是系统跟瘫痪没什么两样。
如果开启了CSS 功能的话,那么可以当HSE 故障时,在CSS 中断里面采取补救措施,使用HSI,重新设置系统频率为168M,让系统恢复正常使用。但这只是权宜之计,并非万全之策,最好的方法还是要采取相应的补救措施并报警,然后修复HSE。临时使用HSI 只是为了把损失降低到最小,毕竟HSI 较于HSE 精度还是要低点。
HSE作为系统时钟配置方法
* 使用HSE时,设置系统时钟的步骤
* 1、开启HSE ,并等待 HSE 稳定
* 2、设置 AHB、APB2、APB1的预分频因子
* 3、设置PLL的时钟来源
* 设置VCO输入时钟 分频因子 m
* 设置VCO输出时钟 倍频因子 n
* 设置PLLCLK时钟分频因子 p
* 设置OTG FS,SDIO,RNG时钟分频因子 q
* 4、开启PLL,并等待PLL稳定
* 5、把PLLCK切换为系统时钟SYSCLK
* 6、读取时钟切换状态位,确保PLLCLK被选为系统时
程序
/ *野火HSE是25MHz,所以配置为 HSE_SetSysClock(25, 432, 2, 9);
正点原子HSE是8MHz,所以配置为 HSE_SetSysClock(8, 432, 2, 9);
*/
void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)
{
__IO uint32_t HSEStartUpStatus = 0;
// 使能HSE,开启外部晶振,野火F407使用 HSE=25M
RCC_HSEConfig(RCC_HSE_ON);
// 等待HSE启动稳定
HSEStartUpStatus = RCC_WaitForHSEStartUp();if (HSEStartUpStatus == SUCCESS)
{
// 调压器电压输出级别配置为1,以便在器件为最大频率
// 工作时使性能和功耗实现平衡
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_VOS;
// HCLK = SYSCLK / 1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// PCLK2 = HCLK / 2
RCC_PCLK2Config(RCC_HCLK_Div2);
// PCLK1 = HCLK / 4
RCC_PCLK1Config(RCC_HCLK_Div4);
// 如果要超频就得在这里下手啦
// 设置PLL来源时钟,设置VCO分频因子m,设置VCO倍频因子n,
// 设置系统时钟分频因子p,设置OTG FS,SDIO,RNG分频因子q
RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);
// 使能PLL
RCC_PLLCmd(ENABLE);
// 等待 PLL稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}/*-----------------------------------------------------*/
//开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)
// PWR->CR |= PWR_CR_ODEN;
// while((PWR->CSR & PWR_CSR_ODRDY) == 0)
// {
// }
// PWR->CR |= PWR_CR_ODSWEN;
// while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
// {
// }
// 配置FLASH预取指,指令缓存,数据缓存和等待状态
FLASH->ACR = FLASH_ACR_PRFTEN
| FLASH_ACR_ICEN
| FLASH_ACR_DCEN
| FLASH_ACR_LATENCY_5WS;
/*-----------------------------------------------------*/
// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 读取时钟切换状态位,确保PLLCLK被选为系统时钟
while (RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ // HSE启动出错处理while (1)
{
}
}
}
晶振问题
注意:STM32F407固件库默认使用的HSE=25MHz,野火用的也是25MHz,所以在配置时不用改动,可以直接用固件库内容,而正点原子HSE=8MHz,所以要在固件库上做一点修改.
RCC_GetClocksFreq这个函数获取时钟值并不是通过单片机内部的寄存器读值的,而是预先设定好的一个宏定义值,如下图所示:
很明显,这个值和我使用的实际的晶振值是不同的,因此需要把这个值修改成实际使用的晶振值才可以,否则,程序中依赖这个值进行计算的地方都会出错。
定位到这个宏定义在stm32f4xx.h文件下,如下图:
因此需要把这个值修改成实际使用的晶振值才可以,否则,程序中依赖这个值进行计算的地方都会出错。
定位到这个宏定义在stm32f4xx.h文件下, stm32f4xx.h文件下的第139行的HSE_VALUE值为实际晶振值,如下图:
正点原子教程在新建工程时要把HSE_VALUE改成8000000,M改成8就是这个原因.
STMF4编写系统时钟相关推荐
- HGP:STM32的用标准库函数自己编写的关于设置系统时钟72Mhz的函数
/其实在system_stm32f10x.c文件中有设置72MHz的函数,本文是我在学习STM32最底层用寄存器与固件库开发时写的一个例子,当做笔记发在博客上,希望对同样从STM32基层学起的读者有帮 ...
- STM32系统时钟默认设置
"我们一直都说STM32有一个非常复杂的时钟系统,然而在原子或者野火的例程中,只要涉及到时钟,我们却只能看到类似的库函数调用,如RCC_APB2PeriphClockCmd(RCC_APB2 ...
- STM32F2系列系统时钟默认配置
新到一家公司后,有个项目要用到STM32F207Vx单片机,找到网上的例子照猫画虎的写了几个例子,比如ADC,可是到了ADC多通道转换的时候就有点傻眼了,这里面的时钟跑的到底是多少M呢?单片机外挂的时 ...
- 【小梅哥SOPC学习笔记】系统时钟的使用
给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...
- STM32开发---F103系统时钟配置
本篇,用自问自答,记录STM32系统时钟配置一些关节点. 因为已重写了系统时钟配置的代码,不再细研配置的过程.步骤,忘了就翻代码就好,且网上不缺絮絮叨叨的各种教程. 一句话总结: 过程高深, 使用简 ...
- 利用c语言编写一个时钟计时器(c语言基础练习)
时间对于每个人都是宝贵的.人类从古至今都在发展计时设备和改善计时方法.远古时期,人类根据太阳和月亮的位置来判断时间.根据影子的方向长短来区分早晨.中午和黄昏.古代人也发明了很多计时的方法,日晷.沙漏. ...
- STM32系统时钟设置(标准库)
1.STM32F407时钟树 2.系统时钟相关的结构 HSE高速外部时钟信号 锁相环PLL 锁相环的主要作用就是对时钟进行倍频,然后把时钟输出到各个功能部件.PLL有两个,一个主PLL,另一个是专用的 ...
- 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树
系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...
- stm8L 初始化系统时钟
库函数编写程序时,在main中首先是调用sys_clock_init() sys_clock_init()函数用于配制芯片时钟,代码如下: /* 初始化系统时钟 */ void sys_clock_i ...
最新文章
- http协议的队首阻塞
- Electron 实战桌面计算器应用
- boost::hana::overload用法的测试程序
- easyuefi只能在基于uefi启动的_电脑知识:5分钟教你深入了解BIOS+MBR和UEFI+GPT
- ArcGIS实验教程——实验三十七:基于ArcGIS的太阳辐射分析案例教程
- 分模块开发创建service子模块——(八)
- QQ在线客服代码 网页qq咨询html代码
- 计算机操作系统--思维导图
- 苹果手机 计算机 错误,苹果手机的计算器连1+2+3都算不对!原因太尴尬!
- 数字图像处理的技术方法和应用
- Win10开启卓越性能模式
- 如何让计算机显示隐藏的文件夹,隐藏的文件夹如何显示 win7与xp系统显示隐藏文件夹的设置方法...
- (数据结构基础)Among the following threaded binary trees (the threads are represented by dotted curves),……
- 服务器centos系统诛仙,云服务器搭建诛仙教程
- Sqoop 是什么?Sqoop 有什么特点?
- 51单片机控制LCD1602模块
- HCL Nomad 1.0.9中的新功能
- 旅游行业数字化进程分析——2023年元旦与春节,旅游市场开启复苏模式,跨省游热度上升
- 免费高质量图标搜索引擎以及图标库
- mlag 堆叠_华为CE交换机M-LAG配置
热门文章
- 朋友找工作的奇葩规定
- 【转】CClientDC、CPaintDC、CWindowDC的区别及基本的绘图方法
- ·@ComponentScan中basePackages干什么的?
- Android开发从入门到精通教程大总结(源码,教程,面试题,书籍,视频)
- git提交规范,规范自己的提交标准
- vscode一格式化就报错?各种风格问题各种报错烦不胜烦,教你如何用好vue的eslint风格配置...
- 只需一键录音转文字,会议记录让你不在烦恼
- RocketMQ,同一个topic下是否可以通过不同的tag来进行订阅吗?
- 这位创业者足够疯狂:他选择向微软发起挑战
- 马斯克为啥要成立SpaceX