stm32延时函数delay
delay.h #ifndef __DELAY_H #define __DELAY_H #include "stm32f4xx.h" void Delay_Init(void); void delay_us(int nus); void delay_ms(int nms); void delay_s(int ns); #endif delay.c #include "delay.h" int my_us = 21; //在21MHZ下,计21个数,用1us int my_ms = 21000; //在21MHZ下,计21000个数,用1ms void Delay_Init(void) { //配置Systick定时器时钟 HCLK/8 = 168MHZ/8 = 21MHZ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); } //nus取值范围:1~798915 void delay_us(int nus) { u32 temp = 0x00; //设置重装载值寄存器 SysTick->LOAD = my_us*nus - 1; //设置当前值寄存器值为0 SysTick->VAL = 0x00; //开启定时器,让定时器开始计数,定时器一旦使能,重装载值寄存器的值则直接放置到当前值寄存器 SysTick->CTRL |= (0x01<<0); //系统自动计数 do { temp = SysTick->CTRL; // 判断定时器是否使能 判断第16位是否为1(计数器计数到0) }while( (temp & (0x01<<0)) && (!(temp&(0x01<<16))) ); //关闭定时器 SysTick->CTRL &= ~(0x01<<0); } //nms取值范围:1~798 void delay_ms(int nms) { u32 temp = 0x00; //设置重装载值寄存器 SysTick->LOAD = my_ms*nms - 1; //设置当前值寄存器值为0 SysTick->VAL = 0x00; //开启定时器,让定时器开始计数,定时器一旦使能,重装载值寄存器的值则直接放置到当前值寄存器 SysTick->CTRL |= (0x01<<0); //系统自动计数 do { temp = SysTick->CTRL; // 判断定时器是否使能 判断第16位是否为1(计数器计数到0) }while( (temp & (0x01<<0)) && (!(temp&(0x01<<16))) ); //关闭定时器 SysTick->CTRL &= ~(0x01<<0); } void delay_s(int ns) { int i; for(i=0; i<ns; i++) { delay_ms(500); delay_ms(500); } }