1、STM32学习笔记——系统时钟初始化函数

发布者:快乐的旅程最新更新时间:2024-09-29 来源: cnblogs关键字:STM32  系统时钟  初始化函数 手机看文章 扫描二维码
随时随地手机看文章

STM32有三种不同的时钟源可被用来驱动系统时钟(SYSCLK): 

 1:HSI振荡器时钟(内部时钟)

2:HSE振荡器时钟 (外部时钟,即晶振所提供)

 3:PLL时钟(锁相环时钟)

 这些设备有以下2种二级时钟源: 

 (1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 

 (2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。 

 当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。

  

1:常用配置如下

 使用HSE作为PLL的输入源,将PLL的输出配置为72MHZ,然后将PLL作为系统时钟,最后将其他时钟配置为系统时钟的分频输出。

 2:配置过程

 -将所有和时钟相关的寄存器进行复位;

 -启动HSE并等待其稳定;

 -配置HCLK和SYSCLK相等;

 -配置PCLK1为HCLK的2分频;(由参考手册上的时钟树得知PCLK1为低速外设时钟,最大不超过36MHZ,所以,PLL倍频不建议超过72MHZ)

 -配置PCLK2和HCLK相等;(PCLK2为高速外设时钟,最大不超过72MHZ)

 -根据是否使用AD及其输入信号的频率配置ADCLK为PCLK2的若干分频;

 -根据是否使用USB设备接口,配置USB的时钟为48MHZ;

 -配置HSE为PLL的输入,并设置两个分频比使PLL输出72MHZ频率,等待其稳定;

 -将PLL输出作为系统时钟;

 -根据需要来决定是否启用时钟安全系统。
在写系统时钟初始化代码之前可以先看《STM32参考手册》的系统时钟树:


STM32PLL时钟配置函数:
 void Stm32_Clock_Init(u8 PLL)
 {
  unsigned char temp=0; //当前系统时钟状态标志  
  MYRCC_DeInit();   //复位并配置向量表
  RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
  while(!(RCC->CR>>17));//等待外部时钟就绪
  RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
  PLL-=2;//抵消2个单位  //这里PLL减去2是因为倍频系数从2开始,但倍频寄存器值从 0000开始,即如果是9倍频,则倍频寄存器应写0111。
  RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
  RCC->CFGR|=1<<16;   //由软件置’1’或清’0’来选择PLL输入时钟源。该位只有在PLL关闭时才 可以被写入。
  FLASH->ACR|=0x32;   //FLASH 2个延时周期
 
  RCC->CR|=0x01000000;  //PLLON
  while(!(RCC->CR>>25));//等待PLL锁定
  RCC->CFGR|=0x00000002;//PLL作为系统时钟  
  while(temp!=0x02)     //等待PLL作为系统时钟设置成功
  {   
  temp=RCC->CFGR>>2;
  temp&=0x03;
  }    
 }
MYRCC_DeInit函数原型:
 void MYRCC_DeInit(void)
{                    
 RCC->APB1RSTR = 0x00000000;//复位结束    
 RCC->APB2RSTR = 0x00000000; 
   
   RCC->AHBENR = 0x00000014;  //睡眠模式闪存SRAM时钟使能.其他关闭.   
   RCC->APB2ENR = 0x00000000; //外设时钟关闭.      
   RCC->APB1ENR = 0x00000000;   
 RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                 
 RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]      
 RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
 RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP       
 RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
 RCC->CIR = 0x00000000;     //关闭所有中断
 //配置向量表      
#ifdef  VECT_TAB_RAM
 MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else   
 MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}

时钟控制寄存器:


时钟控制寄存器:


      


关键字:STM32  系统时钟  初始化函数 引用地址:1、STM32学习笔记——系统时钟初始化函数

上一篇:STM32、ESP8266与MQTT连接阿里云物联网的串口通信异常解析
下一篇:2、STM32学习笔记——定时器

推荐阅读最新更新时间:2024-11-12 22:44

Uip在STM32平台移植之建立UDP链接
在STM32上通过建立UDP连接实现数据的传输。在上节提到采用的是轻型的TCP/IP协议栈Uip,在Uip协议中实现UDP连接的创建,需要以下步骤: 第一步,打开支持UDP协议的配置项,支持的UDP连接的个数,参考上节的配置文件。 第二步,确定本地的IP地址和端口号(192.168.0.100 9999),远程主机的IP地址和端口号(192.168.0.22 9998) #define IP_ADDR1 192 #define IP_ADDR2 168 /#define IP_ADDR3 3 /#define IP_ADDR4 100 #define UDP_REMOTE_PORT 9998 #define UDP_LOCA
[单片机]
STM32内部温度传感器
废话少说 先看看他的参数 1. STM32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量; 2. 测量范围 40~125℃,精度 1.5℃。 3. 温度传感器产生一个随温度线性变化的电压,转换范围在2V VDDA 3.6V之间。 转换公式如下图所示: 呵呵 其实 写代码的时候 公式直接简化就得啦 如果测量要求不怎么高的话 呵呵(其实高也高不了 呵呵) 我们都喜欢简单 简单明了 嘿嘿 简化的公式: vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25; 呵呵 重新说一下 过程: 1. 初始化ADC 初始化DMA
[单片机]
<font color='red'>STM32</font>内部温度传感器
STM32学习日志——I2C实验
今天学习的是I2C通信实验,I2C是一种两线式串行总线,有数据线SDA和时钟线SCL构成,可发送和接收数据,属于半双工通信。由于要有相同的时钟源,一般用于板内通信。 I2C有几个比较重要的状态:1)空闲状态,即两条线都拉高。2)起始信号:当SCL为高时SDA从高到低的跳变,停止信号:当SCL为高时,SDA从低到高的跳变。3)应答信号:每当发送器发送一个字节的数据时,在第九个脉冲,接收器会反馈一个应答信号ACK,低电平。如果接收器是主控器,则会发送一个非应答信号NACK,高电平,以通知发送方结束数据发送。4)数据有效性:数据必须在SCL的上升沿之前就准备好,并在SCL的下降沿结束前保持稳定。 iic头文件 SDA线需要发送数据
[单片机]
采用DSP和STM32的双核智能电液伺服控制器
  伺服控制系统大部分都采用传统的硬件结构,控制算法比较固定,而且也无法实现不同工况下的高性能控制算法,难以满足现代工业的需求。现阶段迫切需要研制一种智能型、具有高可靠性、控制性能更加优秀的电液伺服系统。基于DSP与STM32的智能型伺服控制器具有软硬件结合程度更加紧密、系统的智能化程度更高、可实现多种控制策略的优势。本系统从实际的需求出发,结合精确数字PID控制算法和Fuzzy控制算法自身的优势,组合成Fuzzy-PID控制算法,根据偏差的大小范围选择合适的控制算法进行调节。   本设计将两款工控芯片—TI公司的浮点型DSP TMS320F28335和ST公司的ARM7升级版STM32F103RET6引入智能电液伺服系统,设计
[单片机]
采用DSP和<font color='red'>STM32</font>的双核智能电液伺服控制器
STM32程序移植的一些注意方法
一,步骤 建立需要的子函数及将对应的函数在所有子函数之前声明。另一种方法是:新建一个子函数(.c)文件和头文件库(.h)文件,分别保存在用户文件夹中(这个文件夹是主函数所在的文件夹),将刚刚保存的子函数文件添加到程序文件夹中(保存在主函数所在的文件夹并不表示包含到了函数里,因此要在编程软件(即开发环境)添加,添加方法详见http://blog.csdn.net/ambizxzh/article/details/74324288) 移植的方法也可以参照上面这个链接。 二,注意 1,在配置子函数文件时,当出现多个结构体时结构体要在任何结构体元素赋值之前,也就是说对于A结构体,它必须放在A结构体、B结构体、C…等结构体的结构体元
[单片机]
简单初始化STM32的RTC
RTC嘛 就跟DS1302 差不多吧...当然了可分频又有32位的计数器...报警、秒、溢出中断.....等等。RTC在APB1总线上.... 要使用 RTC,一般来说也顺带地使用上后备寄存器 这是因为RTC 是一个简单的秒中断 定时器,年月日时分秒的信息必须要找个地方能掉电保存才有意义.STM32 的备份寄存器(BKP)是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。 此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。 复位后,对备份寄存器和RTC的访问被禁止,并且备份域被
[单片机]
简单<font color='red'>初始化</font><font color='red'>STM32</font>的RTC
STM32学习——内存管理
内存管理简介: 内存管理,是指软件运行时对mcu内存资源的分配和使用的技术。主要目的是高效快速的分配使用内存资源。在适当的时候释放回收内存资源。内存管理实现的方式最终是实现两个函数:malloc和free;malloc函数用于内存申请,free函数用于内存释放。 内存分配原理: 当指针P调用malloc申请内存的时候,先判断P要分配的内存块数(m),然后从n项开始,向下查找,直到找到连续的m块空间(即对应的内存管理项为“0”)。然后将这m个内存管理项的值都赋值为m(标记为占用)。,最后,把最后的内存地址返回给指针P,完成一次内存分配。注意:如果内存不够用的时候,或者没有连续的m块内存时,则返回NULL给P,表示分配失败。 内存释放
[单片机]
GD32如何替换STM32
GD32F103是GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的,虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST的库开发。 一、相同点 1)外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同。 2)芯片内部寄存器、外部IP寄存器地址和逻辑地址完全相同,但是有些寄存器默认值不同,有些外设模块的设计时序上和STM32有差异,这点差异主要体现在软件上修改,详情见下文。 3)编译工具:完全相同例如:KEIL 、IAR 4)型号命名方式完全相同,所以替代只需找尾缀相同的型号即可,例如:STM32F103C8T6 与 GD32E103C
[单片机]
GD32如何替换<font color='red'>STM32</font>?
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved