STM32之延时功能

本文介绍如何使用STM32 SysTick系统定时器实现延时功能。

本文适合对单片机及C语言有一定基础的开发人员阅读,MCU使用STM32F103VE系列。

 

1.1.    介绍

SysTick—系统定时器是CM3内核中的一个24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,当计数器值递减到0的时候,将自动重装载计数初值,开始新一轮计数系统,可以用SysTick实现简单的延时函数。

1.2.    说明

SysTick_Config()函数设置计数器重装载值,将当前值设置为0,并使能定时器。

1.3.    操作

直接调用delay_us()和delay_ms()函数即可。

 

 1 void delay_us(__IO uint32_t us)
 2 {
 3     uint32_t i;
 4     
 5     //将一次计数器时间设置为1us
 6     SysTick_Config(SystemCoreClock / 1000000);
 7     
 8     for(i = 0; i < us; i++)
 9     {
10         // 当计数器的值减小到0的时候,CTRL寄存器COUNTFLAG会置1
11         while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) );
12     }
13     // CTRL寄存器ENABLE寄存器置零,关闭SysTick定时器
14     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
15     
16 }
17 
18 void delay_ms(__IO uint32_t ms)
19 {
20     uint32_t i;    
21 
22     //将一次计数器时间设置为1ms
23     SysTick_Config(SystemCoreClock / 1000);
24     
25     for(i = 0; i < ms; i++)
26     {
27         // 当计数器的值减小到0的时候,CTRL寄存器COUNTFLAG会置1
28         while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) );
29     }
30     // CTRL寄存器ENABLE寄存器置零,关闭SysTick定时器
31     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
32 }

 

main()函数

1 int main(void)
2 {    
3     while (1)
4     {
5         delay_us(100);
6         delay_ms(100);
7     }
8 }

 

仿真结果

 编译完成后,点击开始仿真,单步执行,可以在下方状态栏查看程序执行时间。

      

可以看到在delay_us(100)函数执行前后时间差距大约是0.0001s,也就是100us,而delay_ms(100)函数执行前后时间差距大约是0.1s,也就是100ms,因此延时功能正确。

 

源码下载:(不包括工程文件和库文件)

https://files.cnblogs.com/files/greatpumpkin/Delay.zip

posted @ 2020-07-07 17:38  心灵航帆  阅读(1546)  评论(0编辑  收藏  举报