滴答定时器代码
用途:操作系统定时或普通的延时
main.h
#include "led.h"
#include "beep.h"
#include "systick.h"
void delay(void);
int main(void){
led_init();
beep_init();
delay_init();
//3.开始I/O口的操作
while(1){
LED1_ON;
LED2_OFF;
BEEP_ON ;
delay_ms(500);//计数器是24bit 十进制16777215 nums最大745
delay_ms(500);//计数器是24bit 十进制16777215 nums最大745
LED2_ON;
LED1_OFF;
BEEP_OFF;
delay_ms(500);//计数器是24bit 十进制16777215 nums最大745
delay_ms(500);//计数器是24bit 十进制16777215 nums最大745
}
}
systick.c
#include "stm32f4xx.h"
void delay_init(void){
/*f=1/s
系统主频是180MHz,8分频之后是22.5MHz
1ms脉冲次数是22.5K=22500
1us脉冲次数是22.5
*/
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8 );
}
//计数器是24bit 十进制16777215 nums最大745
void delay_ms(int nms){
int temp;
SysTick->LOAD=22500*nms;//写入数值
SysTick->VAL=0; //将计数器中残余值清零
SysTick->CTRL|=0x1; //控制位的0bit职位1开启计数
//等待控制器的第16位变为0
do{
temp=SysTick->CTRL;//取出控制器的第16位读取
}while(!(temp &(1<<16)) && temp&0x1);
//!(temp &(1<<16)) 判断控制器的第16位是否为1,如果为1,取饭为0跳出循环,计数完毕
//temp&0x1 此时这不是中断,可能被打断,写的目地是防止被打断后
//无法继续执行,所以必须考虑这一种情况。
SysTick->CTRL&=0; //控制位的0bit职位0停止计数
SysTick->VAL=0; //将计数器中残余值清零
}
void delay_us(int nus){
int temp;
SysTick->LOAD=22.5*nus;//写入数值
SysTick->VAL=0; //将计数器中残余值清零
SysTick->CTRL|=0x1; //控制位的0bit职位1开启计数
//等待控制器的第16位变为0
do{
temp=SysTick->CTRL;//取出控制器的第16位读取
}while(!(temp &(1<<16)) && temp&0x1);
//!(temp &(1<<16)) 判断控制器的第16位是否为1,如果为1,取饭为0跳出循环,计数完毕
//temp&0x1 此时这不是中断,可能被打断,写的目地是防止被打断后
//无法继续执行,所以必须考虑这一种情况。
SysTick->CTRL&=0; //控制位的0bit职位0停止计数
SysTick->VAL=0; //将计数器中残余值清零
}
systick.h
#ifndef __SYSTICK_H
#define __SYSTICK_H
void delay_init(void);
void delay_ms(int nms);
void delay_us(int nus);
#endif