**

这部分感觉有点乱可以先看后边的总结部分,代码的上边那里

**
stm32的时钟就是这个图。时钟她是一级一级整上去的。通过pll锁相环,把外部晶振的频率给他顶上去。再需要多少就分频多少,得到需要的频率

我们要通过外部晶振HSE来得到apb2处的点亮gpiob处的流水灯。需要的是72mhz的频率

所以看图

是这么个路线
但是这个是要配置的。所以
这个是内部时钟,上电以后内部时钟先运行,让cpu能够切换到外部时钟那里去。

所以我们看图,

先是这个,决定输入的时钟是否二分频。

然后是src,选择内部还是外部时钟源
mul来倍频


下一步这里,sw选择用哪个做系统时钟源
下一步ahb分频。
下一步apb2分频,也就是pclk2

这样就可以得到想要的时钟频率

然后我们来查手册
第一个PLLXTPRE,

这个寄存器

第十七位,就是我们的第一道门槛,因为复位值是0x00000000

所以这个不用管,自动不分频。

然后PLLSRC
用来选择哪个时钟源来pll倍频
我们选hse,置一。


然后还是这个寄存器,PLLMUL,第18-21位。我们的晶振是8mhz,所以要9倍频,就是0111。

然后sw,0-1位,我们选10,倍频过后的时钟给他。

往下走,是ahb预分频器,我们不让他分频,0000

继续往下,apb2分频器,不分频,000

输出就是72mhz

这里注意了,pll还有个专门配置的寄存器,就是RCC_CR

偏移量0,复位值0x00000083

24位置一,然后等PLL准备好后,25位由硬件置一,代表可用了。

16位,我们要启用外部时钟源,得置一。
准备好后,这个17位就会被硬件置一,代表准备完毕


0位是1,因为一开始cpu肯定要有一个时钟来提供时钟源,就是这个高速内部时钟源。他先运行起来,然后才能切换到外部
1位也是1,能用肯定是就绪的。下一个是内部高速时钟调整,这个是人家系统默认的。10000
所以0x83是这么来的。1000 0011

————————————————————————————_________________------------------------------------------------------

总结一下。

  1. RCC_CR 地址:0x40021000 + 0 = 0x40021000 复位值:0x00000083
    16位HSEON置一,然后判断17位HSERDY,外部时钟就绪后进性下一步
  2. RCC_CFGR 地址:0x40021000 + 0x04 = 0x40021004 复位值:0x00000000
    就是我们上边说的哪个顺序,16位PLLSRC置1,17位PLLXTPRE置0 ,然后18-21位的PLLMUL 置0111,4-7位AHB预分频置0000不分频,8-10位APB1预分频置100,2分频(因为ahb是72mhz,apb1最高可以36mhz,所以必须分频)。11-13位APB2预分频置000,不分频。
  3. RCC_CR
    24位PLLON置一,判断25位PLLRDY,为1说明就绪,继续下一步。
  4. RCC_CFGR
    0-1位SW置10,PLL输出作为系统时钟,然后判断2-3位,是否为10(PLL输出作为系统时钟)

配置完毕
思路很简单,先配置外部时钟稳定,然后设置里边的时钟路线,配置完毕就启动PLL开始倍频。倍频完毕后把倍频出来的结果送给系统。切换完成
所以是三层的嵌套。第一层判断HSE是否准备完毕,第二层判断PLL是否倍频完毕,第三层判断系统时钟是否已经切换为PLL的输出

下面是代码部分
设置时钟函数。我都给他分频了贼低。

#include "setClock.h"void SetClock72MHZ(void )
{uint GPIO_LED_HSERDY = 0;uint GPIO_LED_PLLRDY = 0;uint GPIO_LED_SWS = 0;uint WAIT_TIME = 0;rRCC_CR = 0x00000083;rRCC_CR &= ~(1 << 16); rRCC_CR |= (1 << 16); do{GPIO_LED_HSERDY = rRCC_CR & (1 << 17);WAIT_TIME ++;}while((WAIT_TIME < 0x0fffffff) && (GPIO_LED_HSERDY == 0));//confirm it's 1 or no respondif((rRCC_CR & (1 << 17)) != 0) //confirm it's 1 again{//rFLASH_ACR |= 0x10;//rFLASH_ACR &= (~0x03);//rFLASH_ACR |= (0x02);//now, HSE is ok, you can set referencesrRCC_CFGR &= ~((0x0f << 4) | (0x07 << 8) | (0x07 << 11));rRCC_CFGR |= ((0x09 << 4) | (0x04 << 8) | (0x07 << 11));rRCC_CFGR &= ~((1 << 16) | (1 << 17));rRCC_CFGR |= ((1 << 16) | (0 << 17));rRCC_CFGR &= ~(0x0f << 18);rRCC_CFGR |= (0x07 << 18);rRCC_CR &= ~(1 << 24);rRCC_CR |= (1 << 24);WAIT_TIME = 0;do{//ledFlash();delay(50);GPIO_LED_PLLRDY = rRCC_CR & (1 << 25);WAIT_TIME ++;}while(GPIO_LED_PLLRDY == 0);if((rRCC_CR & (1 << 25)) != 0){//PLL is readyrRCC_CFGR &= ~(0x03 << 0);rRCC_CFGR |= (0x02 << 0);WAIT_TIME = 0;ledFlash();do{GPIO_LED_SWS = rRCC_CR & (0x03 << 2);WAIT_TIME ++;}while((WAIT_TIME < 0x0fffffff) && (GPIO_LED_SWS != (0x02 << 2)));if((rRCC_CR & (0x03 << 2)) == (0x02 << 2)){//all ready}else {while(1); //pll set is wrong}}else {while (1);// PLL is wrong}}else {while (1);//HSE is wrong}}

咱们是用位操作干的,不是用库函数。用位操作就很容易理解这玩意的原理。
为什么要先与取反呢
是因为先要给他清零,再给值

//2020.5.5, the last day of haoliday. The first day for study every day...
#include "GPIO_LED72MHZ.h"
#include "setClock.h"void  main(void)
{ledInit();ledFlash();ledInit();SetClock72MHZ();ledFlash();while(1);//return 0;
}void ledInit(void)
{rRCC_APB2ENR = 0x00000008;rGPIOB_CRH = 0x33333333;rGPIOB_ODR = 0x0000ff00;
}void ledFlash(void)
{unsigned char i,j;for(i = 0; i < 4; i ++){rGPIOB_ODR = 0x0000ff00;for(j = 0; j < 100; j++)delay(50000);rGPIOB_ODR = 0x0000f000;for(j = 0; j < 100; j++)delay(50000);}}void delay(unsigned int i)
{while(i --);
}

这个是主函数,明显看到改变以后闪的慢了

STM32从零开始(三) 点亮led灯并且配置时钟为72mhz相关推荐

  1. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  2. STM32之初学点亮led灯

    板子使用的是洋桃电子的开发板,核心板上面的两个led灯连接的是PB0和PB1两个引脚,如下图所示 可以看到这个电路图,如果将PB0的引脚的信号设置为高电平,则电流会从LED灯的左边流向右边,即点亮LE ...

  3. 最小系统板 STM32入门,点亮 LED 灯(STM32F103C6T6)

    Hello, I'm Shendi 最近开整单片机,这里记录一下 我目前配置,最小系统板 STM32F103C6T6,ST-LINK V2 最小系统板,通电后PWR灯会亮,ST-LINK插上电脑后也会 ...

  4. STM32入门之点亮LED灯

    导语: stm32系列的芯片比起入门级的AT89C51.STC系列芯片,有更强大的性能以及资源.但在编程上也有着或大或小的改变,使得初学者总会面临一些麻烦,下面我来总结下自己初学时的经验. 首先在ke ...

  5. 野火霸道STM32开发板点亮LED灯课后作业

    #include "stm32f10x.h" int main(void) {     //打开GPIOB端口的时钟     *(unsigned int *)0x40021018 ...

  6. STM32汇编语言点亮led灯

    STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数.即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制. 一.背景 ...

  7. 【STM32】STM32CubeMX教程二--基本使用(新建工程点亮LED灯)

    前言 在配置好CubeMX之后,就是新建工程的开始了,那么首先我们需要一些准备,本片博客我们会很详细的介绍STM32CubeMx的基本使用和如何创建一个新的工程并且点亮LED灯  面向初学者   如果 ...

  8. 采用STM32外部中断模式控制LED灯亮灭

    文章目录 实验工具 一.STMCube配置项目 1.配置引脚 2.配置EXIT 3.配置SYS 4.配置GPIO 5.创建代码 二.使用KEil配置代码 1.打开生成的项目,找到stm32f1xx_i ...

  9. STM32笔记2-使用库函数点亮LED灯

    目录 一.硬件电路设计 二.软件设计 1.工程配置 2.程序编写 (1)led头文件 (2)Led_Init()函数编写 三.实验测试 四.使用宏定义 1.修改后的led.h中程序 2.修改后的Led ...

最新文章

  1. usaco ★Zero Sum 和为零
  2. Java多线程2:Thread中的实例方法
  3. SecureCRT脚本之WaitForString函数
  4. 动态规划(浅层基础)
  5. 支持javascript的ppt软件_github重磅推荐!一个很好用的PPT生成工具
  6. 让ModalPopupExtender的控制控件能响应服务器事件
  7. ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索
  8. 在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)
  9. Python安装与库导入
  10. 拦截Response.Redirect的跳转并转换为Js的跳转
  11. jupyter notebook使用opencv的例子_VSCode中使用jupyter notebook
  12. PHP函数set_magic_quotes_runtime()的作用
  13. API接口在线管理(Swagger和SosoApi)
  14. JSP简介和会话技术
  15. 使用Google镜像构建工具Jib报错:No plugin found for prefix 'jib' ...
  16. 还在用Excel做报表?建议你试试这个数据填报系统_光点科技
  17. 余三码的优点及其与8421码的对比
  18. java.sql.SQLException: 无效的列类型: 1111 报错问题解决
  19. 超市结算系统|Springboot+Vue通用超市结算收银系统
  20. 机器学习理论: PAC学习

热门文章

  1. BIGO面试经历20190902
  2. Spring Boot 第三篇:理解 spring-boot-starter-parent
  3. 旷视科技为何战略投资Video++?版图扩展打造AI+IoT 闭环 | 专访唐文斌
  4. 编写python程序计算所有个位数大于十位数的两位数的和_大学计算机及程序设计Ⅲ(曹进)-中国大学mooc-题库零氪...
  5. MyBatis的缓存问题
  6. 基于HTML5 画布功能canvas的绘画板:画线、画圆、画矩形、橡皮、改变线条
  7. HCIP---第十七天笔记
  8. 哈夫曼树和哈弗曼编码
  9. HAL库串口中断RX中的Overrun Error问题
  10. thinkcmf生成的验证码不显示