stm32 HSE HSI

  • 时钟树
  • main.c
  • clkconfig.h
  • clkconfig.c

时钟树

HSE_SetSysClock和HSI_SetSysClock这两个函数就是根据上面这个时钟树编写的。

main.c

这个实验是通过HSE或者HSI配置系统时钟,结果就是,用HSE比HSI灯闪的快点,因为代码设置的是使用HSE时,SYSCLK=72,而使用HSI时,SYSCLK=64。那个RCC_MCOConfig控制的是MCO,MCO也就是微控制器时钟输出引脚,可以通过示波器查看MCO引脚时钟输出来验证系统时钟配置情况,MCO的时钟来源可以是HSE,HSI,PLLCLK/2,SYSCLK。

/* * 配置MCO引脚:PA8 对外提供时钟,最高频率不能超过IO口的翻转频率50MHZ* MCO 时钟来源可以是:PLLCLK/2 ,HSI,HSE,SYSCLK*/
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_clkconfig.h"
#include "bsp_mcooutput.h"//  软件延时函数,使用不同的系统时钟,延时不一样
void Delay(__IO u32 nCount); /*** @brief  主函数* @param  无  * @retval 无*/
int main(void)
{   // 程序来到main函数之前,启动文件:statup_stm32f10x_hd.s已经调用// SystemInit()函数把系统时钟初始化成72MHZ// SystemInit()在system_stm32f10x.c中定义// 如果用户想修改系统时钟,可自行编写程序修改// 重新设置系统时钟,这时候可以选择使用HSE还是HSI// 使用HSE时,SYSCLK = 8M * RCC_PLLMul_x, x:[2,3,...16],最高是128M//HSE_SetSysClock(RCC_PLLMul_9);// 使用HSI时,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MHHSI_SetSysClock(RCC_PLLMul_16);// MCO 引脚初始化MCO_GPIO_Config();// 设置MCO引脚输出时钟,用示波器即可在PA8测量到输出的时钟信号,// 我们可以把PLLCLK/2作为MCO引脚的时钟来检测系统时钟是否配置准确// MCO引脚输出可以是HSE,HSI,PLLCLK/2,SYSCLK //RCC_MCOConfig(RCC_MCO_HSE);                           //RCC_MCOConfig(RCC_MCO_HSI);                      //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);        RCC_MCOConfig(RCC_MCO_SYSCLK);            // LED 端口初始化LED_GPIO_Config();while (1){LED1( ON );             // 亮Delay(0x0FFFFF);LED1( OFF );        // 灭 Delay(0x0FFFFF);     }
}//  软件延时函数,使用不同的系统时钟,延时不一样
void Delay(__IO uint32_t nCount)
{for(; nCount != 0; nCount--);
}/*********************************************END OF FILE**********************/

clkconfig.h

#ifndef __CLKCONFIG_H
#define __CLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClock(uint32_t pllmul);
void HSI_SetSysClock(uint32_t pllmul);#endif /* __CLKCONFIG_H */

clkconfig.c

#include "bsp_clkconfig.h"
#include "stm32f10x_rcc.h"/** 使用HSE时,设置系统时钟的步骤* 1、开启HSE ,并等待 HSE 稳定* 2、设置 AHB、APB2、APB1的预分频因子* 3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置* 4、开启PLL,并等待PLL稳定* 5、把PLLCK切换为系统时钟SYSCLK* 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟*//* 设置 系统时钟:SYSCLK, AHB总线时钟:HCLK, APB2总线时钟:PCLK2, APB1总线时钟:PCLK1* PCLK2 = HCLK = SYSCLK* PCLK1 = HCLK/2,最高只能是36M* 参数说明:pllmul是PLL的倍频因子,在调用的时候可以是:RCC_PLLMul_x , x:[2,3,...16]* 举例:User_SetSysClock(RCC_PLLMul_9);  则设置系统时钟为:8MHZ * 9 = 72MHZ*       User_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:8MHZ * 16 = 128MHZ,超频慎用** HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法*/void HSE_SetSysClock(uint32_t pllmul)
{__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;// 把RCC外设初始化成复位状态,这句是必须的RCC_DeInit();//使能HSE,开启外部晶振,开发板用的是8MRCC_HSEConfig(RCC_HSE_ON);// 等待 HSE 启动稳定HSEStartUpStatus = RCC_WaitForHSEStartUp();// 只有 HSE 稳定之后则继续往下执行if (HSEStartUpStatus == SUCCESS){//----------------------------------------------------------------------//// 使能FLASH 预存取缓冲区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2// 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,// 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了// 0:0 < SYSCLK <= 24M// 1:24< SYSCLK <= 48M// 2:48< SYSCLK <= 72MFLASH_SetLatency(FLASH_Latency_2);
//----------------------------------------------------------------------//// AHB预分频因子设置为1分频,HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // APB2预分频因子设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1); // APB1预分频因子设置为1分频,PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这里设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因子// PLLCLK = 8MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllmul);
//------------------------------------------------------------------//// 开启PLL RCC_PLLCmd(ENABLE);// 等待 PLL稳定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 读取时钟切换状态位,确保PLLCLK被选为系统时钟while (RCC_GetSYSCLKSource() != 0x08){}}else{ // 如果HSE开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理// 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,// HSI是内部的高速时钟,8MHZwhile (1){}}
}/** 使用HSI时,设置系统时钟的步骤* 1、开启HSI ,并等待 HSI 稳定* 2、设置 AHB、APB2、APB1的预分频因子* 3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置* 4、开启PLL,并等待PLL稳定* 5、把PLLCK切换为系统时钟SYSCLK* 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟*//* 设置 系统时钟:SYSCLK, AHB总线时钟:HCLK, APB2总线时钟:PCLK2, APB1总线时钟:PCLK1* PCLK2 = HCLK = SYSCLK* PCLK1 = HCLK/2,最高只能是36M* 参数说明:pllmul是PLL的倍频因子,在调用的时候可以是:RCC_PLLMul_x , x:[2,3,...16]* 举例:HSI_SetSysClock(RCC_PLLMul_9);  则设置系统时钟为:4MHZ * 9 = 36MHZ*       HSI_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:4MHZ * 16 = 64MHZ** HSI作为时钟来源,经过PLL倍频作为系统时钟,这是在HSE故障的时候才使用的方法* HSI会因为温度等原因会有漂移,不稳定,一般不会用HSI作为时钟来源,除非是迫不得已的情况* 如果HSI要作为PLL时钟的来源的话,必须二分频之后才可以,即HSI/2,而PLL倍频因子最大只能是16* 所以当使用HSI的时候,SYSCLK最大只能是4M*16=64M*/void HSI_SetSysClock(uint32_t pllmul)
{__IO uint32_t HSIStartUpStatus = 0;// 把RCC外设初始化成复位状态,这句是必须的RCC_DeInit();//使能HSIRCC_HSICmd(ENABLE);// 等待 HSI 就绪HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;// 只有 HSI就绪之后则继续往下执行if (HSIStartUpStatus == RCC_CR_HSIRDY){//----------------------------------------------------------------------//// 使能FLASH 预存取缓冲区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2// 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,// 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了// 0:0 < SYSCLK <= 24M// 1:24< SYSCLK <= 48M// 2:48< SYSCLK <= 72MFLASH_SetLatency(FLASH_Latency_2);
//----------------------------------------------------------------------//// AHB预分频因子设置为1分频,HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // APB2预分频因子设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1); // APB1预分频因子设置为1分频,PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这里设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因子// PLLCLK = 4MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);
//------------------------------------------------------------------//// 开启PLL RCC_PLLCmd(ENABLE);// 等待 PLL稳定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 读取时钟切换状态位,确保PLLCLK被选为系统时钟while (RCC_GetSYSCLKSource() != 0x08){}}else{ // 如果HSI开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理// 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,// HSI是内部的高速时钟,8MHZwhile (1){}}
}

stm32 HSE HSI相关推荐

  1. STM32|HSE/HSI调频

    目录 什么是HSE 什么是HSI 配置HSE外部高速时钟 HSE配置 HSI配置 什么是HSE               HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 4-1 ...

  2. STM32使用HSE/HSI配置时钟(六)

    STM32时钟树 系统时钟 ①HSE 高速外部时钟信号 HSE 是高速外部时钟信号,可以由有源晶振或者无源晶振提供,频率为4~16MHz.当使用有源晶振时,时钟从OSC_IN引脚进入,OSC_OUT引 ...

  3. STM32系统学习——RCC(使用HSE/HSI配置时钟)

    ** STM32系统学习--RCC(使用HSE/HSI配置时钟) ** RCC :reset clock control 复位和时钟控制器.主要讲解时钟部分,特别是要着重理解时钟树,理解了时钟树,ST ...

  4. 野火学习笔记(8) —— RCC —— 使用 HSE/HSI 配置时钟

    文章目录 1. RCC 主要作用--时钟部分 2. RCC 框图剖析-时钟部分 2.1 系统时钟 ① HSE 高速外部时钟信号 ② PLL 时钟源 ③ PLL 时钟 PLLCLK ④ 系统时钟 SYS ...

  5. STM32前言知识总结

    目录 关于STM32 STM32F1 存储器 位带操作 三种启动模式 低功耗模式 复位 时钟系统 STM32库 仿真器和调试器 注:本文大部分内容来自于STMCU官网以及STM32数据手册. STM3 ...

  6. STM32 USB基础知识

    文章目录 拓展阅读 前言 一.USB基础知识 二.USB2.0 1.usb2.0模式说明 2.USB2.0全速USB和高速USB的识别过程分析 3.usb协议关系 4.USB2.0与USB1.x 硬件 ...

  7. STM32系统时钟设置(标准库)

    1.STM32F407时钟树 2.系统时钟相关的结构 HSE高速外部时钟信号 锁相环PLL 锁相环的主要作用就是对时钟进行倍频,然后把时钟输出到各个功能部件.PLL有两个,一个主PLL,另一个是专用的 ...

  8. [野火]STM32 F103 HAL库开发实战指南笔记之简单外设总结

    1.GPIO编程总结 使能 GPIO 端口时钟: 初始化 GPIO 目标引脚为推挽输出模式: 编写简单测试程序,控制 GPIO 引脚输出高.低电平. 这部分宏控制 LED 亮灭的操作是直接向 BSRR ...

  9. [野火]STM32 F103 HAL库开发实战指南笔记之基础总结

    1.本书配套的仿真器为 Fire-Debugger,遵循 ARM 公司的 CMSIS-DAP 标准,支持所有基于 Cortex-M 内核的单片机,常见的 M3.M4 和 M7 都可以完美支持.Fire ...

最新文章

  1. 其他算法-高斯白噪声
  2. php 删除一周前,linux下删除7天前日志的代码(php+shell)
  3. Python 读写文件和file对象(转)
  4. java字符串 删除指定字符的那些事
  5. Web Service 客户端,调用服务方法
  6. 按钮点击没有反应_时控开关按键没反应怎么办?
  7. 个人自学ccna的资料+工大瑞普模拟器
  8. java. 三个人比赛怎么写_蓝桥杯——分组比赛(2017JavaB组第3题)
  9. 在苹果Mac的Dock中如何添加AirDrop快捷方式?
  10. java套接字实验总结,实验三、WINSOCK套接字编程实验报告
  11. BT服务器的安装和配置
  12. VS2017 Community C++模块 离线打包安装
  13. 解除网页复制限制的Chrome插件-SuperCopy
  14. 【扫盲】------Zipf分布
  15. Web测试与App测试的区别
  16. thrift开源项目研究
  17. 深入浅出java web_深入浅出javaWeb实战第1讲Web的概念及其演变(上)
  18. DDR MC DFI PHY
  19. html复杂表格,横向多级表头,纵向多级表头,合并行或列
  20. modbus的使用说明——个人使用心得

热门文章

  1. Oracle笔记:创建表空间、创建用户、授权
  2. 局域网中另外一台服务器的内存_局域网共享打印机,但另外一台电脑却看不到,可能是这3个原因...
  3. 超级计算机发展及现状论文,浅谈超级计算机发展的过程及研究现状
  4. 韩泰机器人_[视频]Hankook Mirae展示四米高的Method-2载人两足机器人
  5. 网站设计软件linux,ubuntu下的网页设计 网页制作软件工具.pdf
  6. DS1819 对应版本的FFMPEG_OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4...
  7. keep行走和计步_‎App Store 上的“Keep - 跑步健身计步瑜伽”
  8. datatable怎么根据两列分组_谈谈怎么做服务隔离
  9. hssfworkbook.write 生成文件 数据丢失_电脑文件丢失了,数据恢复我只用这一个软件!...
  10. Win7旗舰版打不开任务管理器怎么办