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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM