STM32 时钟配置之寄存器操作

发布者:脑力风潮最新更新时间:2018-12-17 来源: eefocus关键字:STM32  时钟配置  寄存器操作 手机看文章 扫描二维码
随时随地手机看文章

1 时钟


1.1时钟树


Stm32 的时钟配置必须要参考时钟树,时钟树决定了时钟的配置的路径,兼着参考RCC寄存器就可以配置不同的时钟频率了。另外STM32外部晶振推荐为8M,所以用外部时钟时最好采用推荐值。



1.2 时钟配置


程序刚启动的时候,stm32采用的为内部高速时钟,通过上图的时钟树可以发现内部8M时钟通过SW成为系统时钟。RCC_CR的复位值为0x000XX83,展开后为HSION为1,也印证了时钟默认为内部高速时钟。如果需要采用外部时钟,需要按照如下的方式配置。


1、时钟初始化,即将时钟的寄存器采用默认值。


2、开始外部时钟且外部时钟起震准备就绪。


3、设置PLLXTPRE(只能在关闭PLL时才能写入此位),可选择分频不分频。


4、设置进入PLL的源时钟(只能在关闭PLL时才能写入此位)。因为采用外部时钟所以只有一种设置。


5、设置PLL倍频系数PLLMUL(只有在PLL关闭的情况下才可被写入)。


6、开启PLL,且准备就绪。


7、设置SW,选择时钟源为系统时钟。


8、判断是否是预选的时钟为系统时钟。


注:必须在使能每个PLL之前完成PLL的配置(选择时钟源、预分频系数和倍频系数等),同时应该在它们的输入时钟稳定(就绪位)后才能使能。一旦使能了PLL,这些参数将不能再被改变。AHB,APB1,APB2。只要系统时钟确定了,他们就确定了,但是和系统是几分频需要在系统时钟开启前设置好,这个是设置项,并不是开启项。另外,由于FASH取指用的是AHB的频率,在采用不同的系统频率时,在时钟配置的时候需要延时。这里需要参考stm32的FLASH编程手册。在开启PLL时钟之前需要设置FLASH->ACR|=0x32;目的是flash的取指的稳定性需要和系统时钟构成某种关系。


1.3程序实现


如上,外部晶振为8M,系统时钟为72M的配置程序如下。


/*


@brife:this is source file for system clock


@editor:houchao


*/


#include"stm32f10x.h"


#include"System_Clock.h"


voidRCC_DeInit()


{


         RCC->APB1RSTR&=(uint32_t)0x00000000;//


         RCC->APB2RSTR&=(uint32_t)0X00000000;//


         RCC->AHBENR&=(uint32_t)0x00000014;//


         RCC->APB1ENR&=(uint32_t)0x00000000;//


         RCC->APB2ENR&=(uint32_t)0x00000000;//


         RCC->CR|=0X00000001;//


        while(0==((RCC->CR>>1) &0x00000001));


        RCC->CFGR&=(uint32_t)0XFFFFFFFE;//


        while((RCC->CFGR>>2)!=1&&(RCC->CFGR>>3)==1);//


        RCC->CIR&=(uint32_t)0x00000000;//


}


/*


@brife:


@editor£ºhouchao


*/


voidsystem_clock(void)


{


         RCC_DeInit();


         RCC->CR |= (uint32_t) 0X00010000;


         while(0==((RCC->CR>>17)&0x00000001));


         //APB1=DIV2;APB2=DIV1;AHB=DIV1;


         RCC->CFGR=0X00000400;


        RCC->CFGR &=0xfffeffff;


        RCC->CFGR |=0x00007000;


        RCC->CFGR|=7<<18;//


         FLASH->ACR|=0x32;       //FLASH 2


         RCC->CR|=0x01000000;  //PLLON


         while(!(RCC->CR>>25));//


         RCC->CFGR|=0x00000002;//


         while(((RCC->CFGR>>2)&0x03)!=0x02);//


}


如上的程序在调试的过程中,发现程序下载后,单片机无法启动,经过排查程序出现在


while((RCC->CFGR>>2)!=1&&(RCC->CFGR>>3)==1);//确定内部时钟为高速时钟


当判断为 (RCC->CFGR>>2)!=1&&(RCC->CFGR>>3)==0时,程序无法跳出该语句。


该语句目的是保证单片机工作在内部时钟的频率下,仔细一看,不对呀,这条语句搞的太复杂了吧,于是化简如下:


while(((RCC->CFGR>>2)& 0x03 )!=0x00); 通过LED灯闪烁的频率证明,mcu的时钟发生切换,现在又存在另外一个问题,我们切换后的时钟,系统时钟到底是以多少的频率在跑呢?看到这里,我们发现该单片机能够将系统时钟通过配置输出到特定的单片机管脚,我们配置后,通过示波器看该管脚的波形,就知道了我们设置的系统时钟是否是我们预想的结果。



关键字:STM32  时钟配置  寄存器操作 引用地址:STM32 时钟配置之寄存器操作

上一篇:keil环境下stm32下载和擦除程序对Flash的影响
下一篇:STM32系统学习——USART(串口通信)

推荐阅读最新更新时间:2024-03-16 16:20

一种导致STM32重新上电后不工作的原因
【使用环境】 编译器:KEIL5.20 硬件:STM32F429 软件:FreeRTOS 【问题描述】 编译后烧录运行正常,重新上电无反应 【问题分析】 1. 在任务中使用了非系统延时 --非系统延时导致系统阻塞, 详看 2. 外设驱动初始化问题 --有些外设在重新上电后初始化失败,导致错误或是卡在此处 如MPU6050就需要在初始化前加入一定延时,不然再次初始化会失败 如GT811触摸芯片复位准备时长需要50ms 3. 配置为外部中断的GPIO悬空导致 --由于该引脚为悬空状态,且该引脚配置为中断模式,在上电时无法确定该引脚的电平状态,导致初始化瞬间产生一个边沿跳变,而进入中断,此时系统还未初始化完毕,导致中断服务程
[单片机]
STM32微控制器的可靠串口通信技术研究
引言 STM32F107微控制器是意法半导体推出的高性能32位以CortexM3为内核的面向工业控制的处理器。该处理器内部通过一个多层的AHB总线构架相连,其内部集成了丰富的外设,如USART、SPI、ADC等等。另外,STM32F107处理器还提供多达80个通用I/O接口,如此丰富的资源使STM32系列微控制器能够很理想地用于工业控制。本文设计出一种基于STM32F107的可靠串口通信设计方案,可以完成STM32F107处理器和PC机以及其他串口之间的可靠通信 。 1 串口通信的实现 1.1 硬件设计 STM32F107处理器的通用同步异步通信单元(USART)提供 5个独立的异步串行接口,并且都能工作在中断和DMA模式
[单片机]
<font color='red'>STM32</font>微控制器的可靠串口通信技术研究
STM32几种IO设置模式
在 STM32中选用 IO 模式 (1) 浮空输入 _IN_FLOATING —— 浮空输入,可以做 KEY 识别, RX (2)带上拉输入 _IPU—— IO 内部上拉电阻输入 (3)带下拉输入 _IPD—— IO内部下拉电阻输入 (4) 模拟输入 _AIN —— 应用 ADC 模拟输入,或者低功耗下省电 (5)开漏输出 _OUT_OD —— IO 输出 0接 GND , IO 输出 1,悬空,需要外接上拉电阻,才能 实现输出高电平。当输出为 1时, IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式, 这样 IO 口也就可以由外部电路改变为低电平或不变。 可以读 IO 输入电平变化, 实现 C51的 IO 双向功能 (6)
[单片机]
Stm32串口发送字符串数据
ps:把字符串分成字节循环发送 /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include stm32f10x_crc.h #include system_stm32f10x.h #include stdio.h #define PUTCHAR_PROTOTYPE int __io_putchar(in
[单片机]
STM32 对内部FLASH读写接口函数
因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序。 原理:先要把整页FLASH的内容搬到RAM中,然后在RAM中改动,然后擦除整页FLASH,再把改动后的内容写入原Flash页。下面程序调试通过。 /******************************************************************************* * Function Name : I2C_EE_BufferRead * Description : Reads a block of data from the
[单片机]
Altia为STM32H7和STM32MP1提供GUI开发工具
Altia 宣布扩展对 STM32 系列产品的代码生成支持,包括 STM32H7 和 STM32MP1。这种经过生产验证的图形用户界面 (GUI) 开发软件和经济高效的硬件相结合,特别适合用于医疗、消费和工业设备的嵌入式显示设备。 Altia 在与 ST合作为其产品提供 GUI 开发支持方面有着成功的历史。除了 Altia DeepScreen 对 STM32L4、STM32F4、STM32F7 和 Accordo5 的支持之外,Altia 还提供了最新针对 STM32H7 和 STM32MP1 的代码生成解决方案。 “使用 Altia 设计图形用户界面使产品制造商能够设计一次 GUI,然后在各种品牌和产品系列中部署相同的
[嵌入式]
STM32的NVIC和中断的总结
前言: 1.要想学习STM32中断,要先掌握STM32对优先级的定义; 2.有51单片机开发经验会比较容易理解中断优先级; 3.本篇博文基于STM32F103ZET6芯片和3.5.0标准库编写; 4.本篇博文从寄存器入手,最终实现编程的步骤;如有不足之处,还请前辈多多指教; 一 基础知识 1. cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍60个外部可屏蔽中断) 2. stm32只有84个中断,包括16个内核中断和68个可屏蔽中断 3. stm32f103上只有60个可屏蔽中断,f107上才有68个中断 4. 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断
[单片机]
<font color='red'>STM32</font>的NVIC和中断的总结
STM32电源管理系统浅谈
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。 STM32的电源管理系统主要分为: 1、备份域 2、调压器供电电路 3、ADC电源电路 备份域电路 STM32的备份域包括LSE振荡器、RTC、备份寄存器及备份SRAM这些器件,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电
[单片机]
<font color='red'>STM32</font>电源管理系统浅谈
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved