文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。
本文章基于此系列和开发板展开讨论。
滴答定时器
简介
官方名称为SysTick,是一个简单的定时器,常用于制作延迟函数
初始化
我们就是用这个定时器制作延迟函数
使用这个函数可以快速初始化滴答定时器
void SysTick_Config(unit32_t ticks);
调用这个函数可以快速设置
- 时钟频率为AHB频率(系统频率)(见时钟系统)
- 中断计数值为传入的ticks(也就是通用定时器的定时器周期)
- 开启中断
SystemCoreClock //宏定义 系统时钟频率(单位Hz)
void SysTick_Handler(void); //滴答定时器的中断服务函数
所以,中断触发时间间隔为
( ticks + 1 ) / SystemCoreClock 单位s
思路
利用滴答定时器的中断,每隔1us使变量-1,直到其为0,可以产生任意长度的微秒时间间隔,注意要给一个高中断优先级,详情见中断
非常简单
代码
微秒延迟
uint32_t Delay_time=0; //多个函数调用且不能释放,需要全局变量
void Delay_us(uint32_t time)
{
SysTick_Config((SystemCoreClock/1000000)-1); //设置中断频率为1us触发一次
NVIC_SetPriority(SysTick_IRQn,0); //给定时器个高中断优先级
Delay_time=time; //将时间值输入到全局变量中
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //打开SysTick定时器
while(Delay_time); //等待全局变量归零,占用cpu
SysTick->CTRL|=~SysTick_CTRL_ENABLE_Msk; //关闭SysTick定时器
}
//每隔1us触发中断
void SysTick_Handler(void)
{
if(Delay_time)
{
Delay_time--; //每1us减一
}
}
毫秒,秒,分延迟
通过调用微秒延迟实现
void Delay_ms(uint32_t time)
{
while(time--)
{
Delay_us(1000);
}
}
void Delay_s(uint32_t time)
{
while(time--)
{
Delay_ms(1000);
}
}
void Delay_min(uint32_t time)
{
while(time--)
{
Delay_s(60);
}
}
成品
所有文件均可免费下载
CSDN
链接:百度网盘
提取码:n8jz