stm32 延时函数

//延时 n us
//n us 为要延时的us数


void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL = 0X00;//清空计数器
SysTick->CTRL =0X01;//使能,减到零是无动作,采用外部时钟
do
{
temp=SysTick->CTRL;//读取当前计数值
}
while((temp&0x01)&&(!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0X00;//关闭计数器
SysTick->VAL=0X00;//清空计数器
}






void delay_us(u32 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL = 0X00;//清空计数器
SysTick->CTRL =0X01;//使能,减到零是无动作,采用外部时钟
do
{
temp=SysTick->CTRL;//读取当前计数值
}
while((temp&0x01)&&(!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0X00;//关闭计数器
SysTick->VAL=0X00;//清空计数器
}


//初始化延迟函数
//SYSCLK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟


void delay_init(u8 SYSCLK)
{
SysTick->CYRL&=0xffffffffb;//bit2清空,选外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}




void Stm32_Clock_Iint(8u PLL)
{
unsigned char temp=0;
MYRCC_DeInit();      //复位并配置向量表
RCC->CR|=0x00010000; //把时钟控制寄存器的第16置1来开启外部振荡器
while(RCC->CR>>17);  //通过判断时钟控制寄存器的第17位,看一下外部振荡器是否就绪
RCC->CFGR=0X00000400;//通过设置时钟配置寄存器8-10位来保证APB1时钟频率不超过36Mhz//抵消2个单位
PLL-=2;     //抵消2个单位
RCC->CFGR|=PLL<<18;  //设置PLL的值
RCC->CFGR|=1<<16;    //外部时钟作为PLL输入时钟
FLASH->CFGR|=0x32;   //等待PLL作为系统时钟设置成功

RCC->CR|=0x01000000;
while(temp!=0x02)
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}

你可能感兴趣的:(stm32)