⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 STM32定时器程序
💻 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 + -