📄 common.c
字号:
/* ************************************************************* **
系统时钟配置
============
* 描 述:.c 包含
* 1.系统时钟配置的函数
* 2.系统延时函数(SysTick)
* 3.IO操作函数
* .h 包含
* 1.常用无符号数据类型定义
* 2.对应头文件中包含IO口操作宏定义
* 文 件 名:common.c
* 芯 片 型 号:STM32F10x
* 库 版 本:STM32F10x_StdPeriph_Lib_V3.5.0
* 程 序 员:张伟亮
* 创 建 日 期:XXXX-XX-XX
* 版 本:V1.0
* *************************修 订 信 息************************* **
* 修 订 日 期:
* 当 前 版 本:
* 内 容 描 述:
** ************************************************************* */
#include "stm32f10x.h"
#include "common.h"
/* ---------------------------全局变量-------------------------- */
static u16 fac_ms; //ms延时系数
static u32 fac_us; //us延时系数
/* ************************************************************* **
* 函数名称:void System_Init(void)
* 函数功能:设置HCLK、PCLK1、PCLK2、FLASH预取缓冲
* 入口参数:无
* 出口参数:无
** ************************************************************* */
void System_Init(void)
{
ErrorStatus HSEStartUpStatus; //一个ErrorStartus枚举值,存储HSE起振状态
RCC_DeInit(); //将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON); //输入参数: RCC_HSE_ON-开启
// RCC_HSE_OFF-关闭
// RCC_HSE_BYPASS-晶振被外部时钟旁路
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振,若超时时间到则退出
//返回SUCCESS:HSE晶振稳定就绪
//返回ERROR :HSE晶振未就绪
if(SUCCESS == HSEStartUpStatus) //HSE晶振稳定且就绪
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟(HCLK),源自系统时钟SYSCLK
//输入参数如下:
//RCC_SYSCLK_Div1: AHB时钟=系统时钟
//RCC_SYSCLK_Div2: AHB时钟=系统时钟/2
//RCC_SYSCLK_Div4: AHB时钟=系统时钟/4
//RCC_SYSCLK_Div8: AHB时钟=系统时钟/8
//RCC_SYSCLK_Div16: AHB时钟=系统时钟/16
//RCC_SYSCLK_Div64: AHB时钟=系统时钟/64
//RCC_SYSCLK_Div128: AHB时钟=系统时钟/128
//RCC_SYSCLK_Div256: AHB时钟=系统时钟/256
//RCC_SYSCLK_Div512: AHB时钟=系统时钟/512
RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速PCLK1时钟(最大36MHz),源自AHB时钟(HCLK)
//输入参数如下:
//RCC_HCLK_Div1: APB1时钟=HCLK
//RCC_HCLK_Div2: APB1时钟=HCLK2
//RCC_HCLK_Div4: APB1时钟=HCLK/4
//RCC_HCLK_Div8: APB1时钟=HCLK/8
//RCC_HCLK_Div16: APB1时钟=HCLK/16
RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速PCLK2时钟(最大72MHz),源自AHB时钟(HCLK)
//输入参数如下:
//RCC_HCLK_Div1: APB1时钟=HCLK
//RCC_HCLK_Div2: APB1时钟=HCLK2
//RCC_HCLK_Div4: APB1时钟=HCLK/4
//RCC_HCLK_Div8: APB1时钟=HCLK/8
//RCC_HCLK_Div16: APB1时钟=HCLK/16
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH延时周期
//输入参数如下:
//FLASH_Latency_0 0延时周期
//FLASH_Latency_1 1延时周期
//FLASH_Latency_2 2延时周期
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //设置FLASH预取指
//输入参数如下:
//FLASH_PrefetchBuffer_Enable 预取指使能
//FLASH_PrefetchBuffer_Disable 预取指失能
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //设置PLL时钟源及倍频数
//输入参数如下:
//-----------------参数1设置PLL时钟源:
//RCC_PLLSource_HSI_Div2 PLL输入时钟=HSI时钟/2
//RCC_PLLSource_HSE_Div1 PLL输入时钟=HSE时钟
//RCC_PLLSource_HSE_Div2 PLL输入时钟=HSE时钟/2
//-----------------参数2设置PLL倍频数:
//RCC_PLLMul_2 PLL输入时钟*2
//RCC_PLLMul_3 PLL输入时钟*3
//RCC_PLLMul_4 PLL输入时钟*4
//RCC_PLLMul_5 PLL输入时钟*5
//RCC_PLLMul_6 PLL输入时钟*6
//RCC_PLLMul_7 PLL输入时钟*7
//RCC_PLLMul_8 PLL输入时钟*8
//RCC_PLLMul_9 PLL输入时钟*9
//RCC_PLLMul_10 PLL输入时钟*10
//RCC_PLLMul_11 PLL输入时钟*11
//RCC_PLLMul_12 PLL输入时钟*12
//RCC_PLLMul_13 PLL输入时钟*13
//RCC_PLLMul_14 PLL输入时钟*14
//RCC_PLLMul_15 PLL输入时钟*15
//RCC_PLLMul_16 PLL输入时钟*16
RCC_PLLCmd(ENABLE); //设置PLL使能或使能
//输入参数如下:
//ENABLE 使能PLL
//DISABLE 失能PLL
while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); //检查指定的RCC标志位设置与否,返回标志状态
//输入参数如下:
//RCC_FLAG_HSIRDY HSI晶振就绪
//RCC_FLAG_HSERDY HSE晶振就绪
//RCC_FLAG_PLLRDY PLL就绪
//RCC_FLAG_LSERDY LSE晶振就绪
//RCC_FLAG_LSIRDY LSI晶振就绪
//RCC_FLAG_PINRST 管脚复位
//RCC_FLAG_PORRST POR/PDR复位
//RCC_FLAG_SFTRST 软件复位
//RCC_FLAG_IWDGRST IWDG复位
//RCC_FLAG_WWDGRST WWDG复位
//RCC_FLAG_LPWRRST 低功耗复位
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择系统时钟
//输入参数如下:
//RCC_SYSCLKSource_HSI 选择HSI作为系统时钟
//RCC_SYSCLKSource_HSE 选择HSE作为系统时钟
//RCC_SYSCLKSource_PLLCLK 选择PLL作为系统时钟
while( 0x08 != RCC_GetSYSCLKSource() ); //返回用作系统时钟的时钟源
//返回值如下:
//0x00: HSI作为系统时钟
//0x04: HSE作为系统时钟
//0x08: PLL作为系统时钟
}
else //HSE晶振未就绪
{}
}
/* ************************************************************* **
* 函数名称:void Delay_Init(void)
* 函数功能:SysTick初始化
* 入口参数:系统时钟频率
* 出口参数:无
** ************************************************************* */
void Delay_Init(u8 m_SysClk)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源
//输入参数如下:
//SysTick_CLKSource_HCLK_Div8 SysTick时钟源为AHB时钟源/8
//SysTick_CLKSource_HCLK SysTick时钟源为AHB时钟源
fac_us = m_SysClk/8; //设置us系数
fac_ms = (u16)fac_us*1000; //设置ms系数
}
/* ************************************************************* **
* 函数名称:void Delay_ms(unsigned int ms)
* 函数功能:毫秒延时
* 入口参数:需要延时的时间,单位ms
* 出口参数:无
** ************************************************************* */
void Delay_ms(u16 m_ms)
{
//--------------------变量声明
u32 Temp;
//--------------------功能实现
SysTick->LOAD = (m_ms*fac_ms); //装载延时时间
SysTick->VAL = 0X00; //清除计数器值为0
SysTick->CTRL = 0X01; //使能计数
do
{Temp = SysTick->CTRL;}
while((Temp&0x01) && !(Temp&(0X0001<<16))); //检测是否递减到0
SysTick->CTRL = 0X00; //失能计数
SysTick->VAL = 0X00; //清除计数器值为0
}
/* ************************************************************* **
* 函数名称:void Delay_us(unsigned int us)
* 函数功能:微妙延时
* 入口参数:需要延时的时间单位us
* 出口参数:无
** ************************************************************* */
void Delay_us(u32 m_us)
{
//--------------------变量声明
u32 Temp;
//--------------------功能实现
SysTick->LOAD = (m_us*fac_us); //装载延时时间
SysTick->VAL = 0X00; //清除计数器值为0
SysTick->CTRL = 0X01; //使能计数
do
{Temp = SysTick->CTRL;}
while((Temp&0x01) && !(Temp&(0X0001<<16))); //检测是否递减到0
SysTick->CTRL = 0X00; //失能计数
SysTick->VAL = 0X00; //清除计数器值为0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -