GPIO Part 2
【前文中有几处错误,已更正,另外以后关于stm32的代码若未明确声明都是针对103系列的】接着上文中未分析完的部分,
首先回顾下SystemInit中的几步
1 Set HSION bit 
2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits
3. Reset HSEON, CSSON and PLLON bits 
4. Reset HSEBYP bit 
5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits 
6. Disable all interrupts and clear pending bits 
7. sysclock的配置
可以看到在前面几步时只有HSION被SET【置位了】,这说明开始用的是HIS,
其它诸如PLL什么的都暂时不用到了后面提到的sysclock配置时会把时钟调整到72Mhz,当然PLL是肯定要用的。
这里简单说明下具体寄存器的配置
这里面捡两个重点说一下
下面这是RCC_CR[CR对应的是control register]

之所以为control就是为了说明启用与否等功能用的。
可以看到里面有很多ON和RDY[就是ready了]分别用来说明该时钟源是否开启,以及其状态的检测
而HSI相关的东西似乎多了点,主要是因为HIS是内置的时钟源,可能会因为制程等产生差异,在器件初始时HSICAL里面会载入the factory calibration value【应该是叫做工厂校准值吧】,但因为湿度温度可能会产生影响,我们可以通过设置HSITRIM将HIS校准至一个较为标准的频率【而HSITRIM中步进为40Khz】{据说在校准后精度依旧一般}
另外还有个CSS代表的是Clock security system它可以对信号源进行检测,保证其正确性【似乎这么说不是很准确,感觉应该是有些跳沿检测或同步的东西】
还有就是HSE BYP【BYP代表ByPass旁路】,当使用别的时钟源而非晶振时启用此选项
下面看下RCC_CFGR[configuration register]

其中PRE代表prescaler,是分频用的度量,具体看我前文的那个时钟树图吧
出了用于分频的系数之外,CFGR中还要配置的是信号的选择
比如MCO,PLLSRC,SW【SWS则是硬件设置的用来反映SW的状态】都是用来选择不同的时钟源的,具体看还是看前文的那个时钟树图
另外补充说明下几个缩写PPRE2,PPRE1,HPRE分别对应了AHB,APB1,APB2的分频设置项
其它的寄存器像RCC_CIR之类就不多赘述了
下面再看下SetSysClock
Code
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
  SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();  
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();
#endif
}


我们在system_stm32f10x.c中定义了SYSCLK_FREQ_72MHz所以展开下SetSysClockTo72
具体如下
Code
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  }
 while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));

if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }

if (HSEStatus == (uint32_t)0x01)
  {
    FLASH->ACR |= FLASH_ACR_PRFTBE;
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
    RCC->CR |= RCC_CR_PLLON;
    while((RCC->CR & RCC_CR_PLLRDY) == 0);
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08);
  }
  else
  { 
    while (1);
  }
}


前面用的是HSI,现在要换成HSE,并把PLL,FLASH等的时钟配置好,而前面说道的RCC_CFGR则是这个函数主要针对的。

 

上面这个函式虽然复杂,但却很明了
其大致分为如下几步[只列出了正常状态下的步骤]
1.    HSE使能
2.    等待并检测HSE使能状态【还做了简单的超时检测。。吼吼。。XD】
3.    若HSE使能则进行如下
【1】    配置FLASH时钟,72Mhz要求两周期的等待,这点很是不如LM的
【2】    配置AHB ,APB1,APB2【里面的DIV什么的就是用来分频的系数】
【3】    配置PLL【这个是用来倍频的】
【4】    等待并检测PLL状态若是能则
(1)选择系统时钟
(2)没了。。。。。XD
应该很清楚了,关于RCC的配置就写到这里,有时间再继续。


转载于:https://www.cnblogs.com/pingf/archive/2009/09/13/1565897.html

Pingf的stm32学习笔记之GPIO_Part2[0913]相关推荐

  1. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  2. STM32学习笔记 | 引起电源和系统异常复位的原因

    关注+星标公众号,不错过精彩内容 每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种. STM32的复位功能非常强大,可通过软件.硬件和一些事件触发系统复位,而且通 ...

  3. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

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

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

  5. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  6. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

  7. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

  8. crh寄存器_牛人的STM32学习笔记(寄存器版本).doc

    牛人的STM32学习笔记(寄存器版本) 一.GPIO口的配置 STM32的DGPIO口最多可以有7组(GPIOa~GPIOg),而每一组GPIO口均有16个双向IO组成.并且没个IO口均可配置成8种模 ...

  9. STM32学习笔记(13)——模数转换ADC

    这个月一直忙于准备考试,已经考完一半科目了,偷闲写了这篇文章.因为还没考完试,估计还得咕一段时间了. STM32学习笔记(13)--模数转换ADC 第一部分:ADC功能框图 一.输入电压 二.输入通道 ...

最新文章

  1. [转]数据可视化:基本图表
  2. 做权限认证,还不了解IdentityServer4?不二话,赶紧拥抱吧,.NET Core官方推荐!...
  3. 论文中要用到的SPSS基础分析
  4. Haproxy 实现Apache的负载均衡
  5. github git clone ssh协议 clone超慢解决方案,提高Github Clone速度
  6. java面试题2018带答案_java面试题及答案下载
  7. JQuery淡入淡出 banner切换特效
  8. matlab 车牌识别源码,车牌识别的matlab程序
  9. Jmeter安装及简单使用
  10. 计算机组成与体系结构——存储器分层体系结构
  11. Podfile文件用法详解
  12. 安卓设计模式のAdapter模式
  13. html5制作国际象棋棋盘,用3DS MAX打造国际象棋的棋盘效果 -工程
  14. 编程高手与IT民工的区别在哪?
  15. Android开发者的Ane简单入门
  16. 100个精选Python实战项目案例,初学者练手必备
  17. 笔记本电脑不显示WIFI列表无法连接到网络的解决办法
  18. js 根据当前星期做跳转(代码段)
  19. 腾讯文档如何设置保护单元格与工作表?
  20. tiny6410 适用于win7 64bit的dnw 的USB下载驱动

热门文章

  1. 安装服务器选择什么系统盘,云服务器ecs选择什么系统盘
  2. 分布式选举协议:Raft
  3. DataStorage分析
  4. ElasticSearch核心基础之聚合
  5. (79)FPGA如何处理跨时钟域问题-面试必问(三)(第16天)
  6. (39)System Verilog程序Program设计实例
  7. (03)System Verilog 常用数据类型详解
  8. (4)FPGA面试技能提升篇(数字信号处理基础)
  9. 10 SystemVerilog语言编写SPI发送
  10. Xilinx PLL IP核功能仿真