本篇博文最后修改时间:2019年09月18日 15:16。

一、简介

本文以STM32F103编程为例,介绍STM32F103系统时钟初始化及延迟函数编写

二、实验平台

电脑平台:Windows7 64位旗舰

编译软件:Keil5

硬件平台:STM32F103RC

三、版权声明

博主:_懵懂

声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。

原文地址:http://blog.csdn.NET/qq_18842031

懵懂之MCU交流群:136384801

四、实验前提

1、在进行本文步骤前,请先安装keil5版本;准备好STM32F103RC硬件平台。

五、基础知识

暂无

六、源码地址

暂无

七、关联文章

暂无

八、实验内容

1.初始化系统时钟

/*外部时钟最高72MHz  内部时钟最高64MHz*/
typedef enum{HAL_CLOCK_HSE_SYS = (unsigned char)0x01,                /*外部时钟*/HAL_CLOCK_HSI_SYS = (unsigned char)0x02                    /*内部时钟*/
}Type_Hal_Clock_Sys;typedef enum{HAL_CLOCK_36MHZ = (unsigned char)0x01,HAL_CLOCK_48MHZ = (unsigned char)0x02,HAL_CLOCK_56MHZ = (unsigned char)0x03,HAL_CLOCK_64MHZ = (unsigned char)0x04,HAL_CLOCK_72MHZ = (unsigned char)0x05
}Type_Hal_Clock_Mhzx;/*********************************************************************
* @fn      Hal_SysClock_Init()
*
* @brief   系统时钟初始化
*
* @param   Type_Hal_Clock_Sys : HAL_CLOCK_HSE_SYS HAL_CLOCK_HSI_SYS
* @param     Type_Hal_Clock_Mhzx : HAL_CLOCK_20MHZ HAL_CLOCK_36MHZ HAL_CLOCK_48MHZ HAL_CLOCK_56MHZ HAL_CLOCK_64MHZ HAL_CLOCK_72MHZ
*
* @return  None.
********************************************************************/unsigned int Hal_SysClock_Init(Type_Hal_Clock_Sys clockx,Type_Hal_Clock_Mhzx mHzx)
{unsigned int newSysClock = 0;RCC_DeInit();switch(clockx){case HAL_CLOCK_HSE_SYS:{ErrorStatus HSEStartUpStatus;RCC_HSEConfig(RCC_HSE_ON);  HSEStartUpStatus = RCC_WaitForHSEStartUp();      if(HSEStartUpStatus == SUCCESS)  {RCC_HCLKConfig(RCC_SYSCLK_Div1);         RCC_PCLK2Config(RCC_HCLK_Div1);   RCC_PCLK1Config(RCC_HCLK_Div2); RCC_ADCCLKConfig(RCC_PCLK2_Div6);                   FLASH_SetLatency(FLASH_Latency_2);                   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); switch(mHzx){case HAL_CLOCK_36MHZ:{RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); newSysClock = 36000000;}break;case HAL_CLOCK_48MHZ:{RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_12); newSysClock = 48000000;}break;case HAL_CLOCK_56MHZ:{RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_14); newSysClock = 56000000;}break;case HAL_CLOCK_64MHZ:{RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_16); newSysClock = 64000000;}break;case HAL_CLOCK_72MHZ:{RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); newSysClock = 72000000;}break;            default:break;}}}break;case HAL_CLOCK_HSI_SYS:{RCC_HSICmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_ADCCLKConfig(RCC_PCLK2_Div8);FLASH_SetLatency(FLASH_Latency_2);FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);switch(mHzx){case HAL_CLOCK_36MHZ:{RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); newSysClock = 36000000;}break;case HAL_CLOCK_48MHZ:{RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); newSysClock = 48000000;}break;case HAL_CLOCK_56MHZ:{RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_14); newSysClock = 56000000;}break;case HAL_CLOCK_64MHZ:{RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);newSysClock = 64000000;}break;default:break;}}break;default:break;}RCC_PLLCmd(ENABLE);while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while (RCC_GetSYSCLKSource() != 0x08);return newSysClock;
}

2.延迟函数相关
提示:选择系统时钟36M时延迟误差较大

static unsigned charfac_us=0;                            //us延时倍乘数
static unsigned short fac_ms=0;                            //ms延时倍乘数,在ucos下,代表每个节拍的ms数/*********************************************************************
* @fn      Hal_delay_init()
*
* @brief   延迟函数初始化
*
* @param   mHzx :    HAL_CLOCK_36MHZ HAL_CLOCK_48MHZ HAL_CLOCK_46MHZ HAL_CLOCK_64MHZ HAL_CLOCK_72MHZ
* @param   sysClock : 系统时钟 例如 72000000M
*
* @return  None.
********************************************************************/
void Hal_delay_init(Type_Hal_Clock_Mhzx mHzx)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);switch(mHzx){case HAL_CLOCK_36MHZ:{SystemCoreClock = 36000000;}break;case HAL_CLOCK_48MHZ:{SystemCoreClock = 48000000;}break;case HAL_CLOCK_56MHZ:{SystemCoreClock = 56000000;}break;case HAL_CLOCK_64MHZ:{SystemCoreClock = 64000000;}break;case HAL_CLOCK_72MHZ:{SystemCoreClock = 72000000;}break;    default:break;}fac_us=SystemCoreClock/8000000;fac_ms=(unsigned short)fac_us*1000;
}/*********************************************************************
* @fn      Hal_delay_us()
*
* @brief   n us  精准延数
*
* @param   nus:需要延时的时间
*
* @return  None.
********************************************************************/
void Hal_delay_us(unsigned short nus)
{        unsigned int temp;SysTick->LOAD=nus*fac_us;SysTick->VAL=0x00;SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;SysTick->VAL =0X00;
}/*********************************************************************
* @fn      Hal_delay_ms()
*
* @brief   n ms  精准延数
*
* @param   nms:需要延时的时间
*
* @return  None.
********************************************************************/
void Hal_delay_ms(unsigned short nms)
{unsigned int temp;SysTick->LOAD=(u32)nms*fac_ms;SysTick->VAL =0x00;SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;SysTick->VAL =0X00;
}

2.编写主函数

​
/*********************************************************************
* @fn      main()
*
* @brief   主函数
*
* @param   None.
*
* @return  None.
********************************************************************/
int main(void)
{GPIO_InitTypeDef        GPIO_InitStructure;                   /*配置GPIO*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);   Hal_SysClock_Init(HAL_CLOCK_HSE_SYS,HAL_CLOCK_72MHZ);Hal_delay_init(HAL_CLOCK_72MHZ);​ while(1){Hal_delay_us(1000);GPIO_SetBits(GPIOB,GPIO_Pin_1);Hal_delay_us(1000);GPIO_ResetBits(GPIOB,GPIO_Pin_1);}
}

STM32F103之系统时钟初始化及延迟函数相关推荐

  1. 合宙AIR105(二): 时钟设置和延迟函数

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...

  2. CC2530 系统时钟初始化

    CC2530 系统时钟初始化 系统时钟      系统时钟是从所选的主系统时钟源获得的,主系统时钟源可以是 32 MHz XOSC 或 16 MHz RCOSC.CLKCONCMD.OSC 位选择主系 ...

  3. uboot中系统时钟初始化函数:system_clock_init

    时钟初始化函数内容如下: /** system_clock_init: Initialize core clock and bus clock.* void system_clock_init(voi ...

  4. STM32F103单片机系统时钟部分归纳

    STM32F103系列增强型微控制器 --时钟控制(RCC) 三种不同的时钟源可用作系统时钟(SYSCLOCK): HIS振荡器时钟(由芯片内部RC振荡器提供) HSE振荡器时钟(由芯片外部晶体振荡器 ...

  5. STM32F103 时钟树以及系统时钟配置

    1.时钟树 STM32的时钟树大致可分为3部分: 陶瓷晶振输入,进入预分频器 预分频器输出信号给到PLL倍频器 最终AHB桥总线速度,以及各总线的速度 晶振信号输入到芯片后有两条支路可以走,第一条是直 ...

  6. Cubemx与HAL库系列教程|系统时钟配置详解及源码分析

    STM32时钟系统简介 STM32种类繁多,时钟系统也不尽相同,但基本的还是大差不差,今日小飞哥就F1系列的MCU简单聊一聊STM32的时钟系统 1.时钟种类介绍: 先来看一看时钟树图,包含了整个系统 ...

  7. TMS320F28335之系统时钟

    TMS320F28335时钟(1) PLL作用就是对外部时钟进行倍频,降低产生高频时钟信号的成本.但是倍频配置的时候,需要在特定的条件下更改,因此需要检测PLL工作的各种状态信号,因此PLL有两个配置 ...

  8. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  9. STM32系统时钟设置,采用外部有源晶振相关配置问题

    今天在调试STM32系统时钟设置时遇到一个问题:TIM2定时1Ms,TIM2中断服务函数time++,time=100时LED状态改变.程序运行后发现LED不是按照0.1S的时间闪烁,闪烁的很慢. 查 ...

最新文章

  1. 第十五届全国大学生智能车东北赛区成绩
  2. java中super关键字_Java中关键字super与this的区别
  3. Specified VM install not found: type Standard VM, name jdk1.6_ 的疑问
  4. JavaSE——IO(上)(File、字节流、字符流、转换流、打印流、缓存流)
  5. 高中学生计算机软件,中学生计算器
  6. UE3 Lightmass 技术指南
  7. html里面textfield属性,StyleableTextField的CSS属性htmlText
  8. Linux之du命令
  9. VB获取窗体的位置和大小
  10. 群的概念,双线性映射
  11. K8S你知道,K9S你可能也知道,那Lens呢?
  12. scrum敏捷开发与测试
  13. Instrument API介绍
  14. [Unity] UGUI学习笔记
  15. 分享一点关于安装、使用达梦数据库的愚见
  16. 织梦模板安装后不能显示css的解决办法
  17. android 键盘 自动消失,Android 系统键盘怎么也不消失
  18. obiee12c ssl 启动服务报错BEA-149535BEA-149504
  19. java自学要学多久(java自学要学多久)
  20. 64位系统上使用PLSQL Developer的解决方案

热门文章

  1. 关于Web的学习(18.5.18)——css篇
  2. win10系统 改时间从2020年改成2050年
  3. Python中list的最大容量限制?最多支持多少?
  4. 【Python基础】Python数据容器(字符串)
  5. 关于定向耦合器(二)
  6. Cloudera Manager 简介
  7. 微软产品 .NET 6 迁移之旅
  8. 计算机科学与技术 大学书单,北京大学(北大)计算机科学与技术(智能科学与技术)高分学长推荐参考书目...
  9. 计算机网络专业毕业自我鉴定,计算机网络专业毕业生自我鉴定
  10. 解决linux中网络未托管问题