You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.2 KiB
66 lines
2.2 KiB
#include "systick.h"
|
|
|
|
/******************************************************************
|
|
*函数名称:void RCC_HSE_Config(void)
|
|
*函数功能:修改系统时钟
|
|
*输入:无
|
|
*输出:无
|
|
******************************************************************/
|
|
#ifdef REVISE_SYSTICK
|
|
void RCC_HSE_Config(void)
|
|
{
|
|
RCC_DeInit();//将RCC寄存器设置为缺省值
|
|
RCC_HSEConfig(RCC_HSE_ON);//打开HSE
|
|
if(RCC_WaitForHSEStartUp()==SUCCESS)//检查HSE是否稳定
|
|
{
|
|
RCC_HCLKConfig(RCC_SYSCLK_Div1);//将HCLK时钟等于系统时钟
|
|
RCC_PCLK1Config(RCC_HCLK_Div1);//将PCLK1时钟等于HCLK
|
|
RCC_PCLK2Config(RCC_HCLK_Div2);//PCLK2时钟等于HCLK的一半
|
|
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//锁相环将HSE进行9倍频
|
|
RCC_PLLCmd(ENABLE);//使能PLL
|
|
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//检查PLL是否准备就绪
|
|
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//将PLL时钟作为系统时钟
|
|
while(RCC_GetSYSCLKSource()!=0x08);//进一步检查是否已经将PLL作为系统时钟,如果不是将进入死循环
|
|
}
|
|
|
|
}
|
|
#endif
|
|
/******************************************************************
|
|
*函数名称:void delay_us(uint16_t uns)
|
|
*函数功能:系统实现精确延时1us
|
|
*输入:uns
|
|
*输出:无
|
|
******************************************************************/
|
|
void delay_us(uint16_t uns)
|
|
{
|
|
uint32_t temp;
|
|
SysTick->LOAD=9*uns;//向自动转载寄存器中装载值
|
|
SysTick->VAL=0x00;//清空计数寄存器,在清空寄存器的时候LOAD中的值会自动装载到VAL中
|
|
SysTick->CTRL=0x01;//打开系统定时器,并且时钟为HCLK/8
|
|
do
|
|
{
|
|
temp=SysTick->CTRL;//读取CTRL中的值,扫描标志位是否置位
|
|
}while((temp&0x01)&&(!(temp&(1<<16))));
|
|
SysTick->VAL=0x00;//清空VAL寄存器
|
|
SysTick->CTRL=0x00;//关闭定时器
|
|
}
|
|
|
|
/******************************************************************
|
|
*函数名称:void delay_ms(uint16_t ums)
|
|
*函数功能:系统实现精确延时1ms
|
|
*输入:uns
|
|
*输出:无
|
|
******************************************************************/
|
|
void delay_ms(uint16_t ums)
|
|
{
|
|
uint32_t temp;
|
|
SysTick->LOAD=9000*ums;//向自动转载寄存器中装载值
|
|
SysTick->VAL=0x00;//清空计数寄存器,在清空寄存器的时候LOAD中的值会自动装载到VAL中
|
|
SysTick->CTRL=0x01;//打开系统定时器,并且时钟为HCLK/8
|
|
do
|
|
{
|
|
temp=SysTick->CTRL;//读取CTRL中的值,扫描标志位是否置位
|
|
}while((temp&0x01)&&(!(temp&(1<<16))));
|
|
SysTick->VAL=0x00;//清空VAL寄存器
|
|
SysTick->CTRL=0x00;//关闭定时器
|
|
}
|
|
|