赞
踩
SysTick—系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中。一般我们叫他系统定时器或者滴答定时器。是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,当重装载数值寄存器的值递减到 0的时候,系统定时器就产生一次中断,以此循环往复。嵌入式操作系统常有一个类似“心跳”的定时器,来分配时间片,实现宏观上的多任务。其实,操作系统的多任务,在微观上,CPU对多任务的管理是分时的。每个任务都给一定的时间片,就是把时间分成N个等份,优先级高或是重要的任务多占几个时间片,优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统是基于时间片的。如ucos。systick结论总结如下:
1、systick是一个24位的定时器,故重装值最大值为2的24次方 = 16 777 215,要注意不要超出这个值。
2、systick是cortex_m3的标配,不是外设,不需要在RCC寄存器组打开它的时钟。
3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。
4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法。
定时原理:SysTick定时器的计数器是向下递减计数的,计数一次的时间当寄存器中的值LOAD减到0时,产生中断,可得中断一次的时间为:其中
比如在STM32F103x中SystemCoreClock是固件中定义的系统内核时钟,一般为78MHZ
即:=78MHZ,假如LOAD为78则,定时时间为
库函数SysTick_Config()函数的形参表示内核时钟有多少个周期触发一次systick定时中断
- SystemCoreClock / 1000 表示定时频率为 1000Hz, 也就是定时周期为 1ms
- SystemCoreClock / 500 表示定时频率为 500Hz, 也就是定时周期为 2ms
- SystemCoreClock / 2000 表示定时频率为 2000Hz, 也就是定时周期为 500us
在delay.c中第18行中SystemCoreClock/1000000)就是定时1us,当然也可以直接传递72,但是若是换个单片机时钟不是72MHZ则会定时错误,所以使用SystemCoreClock/1000000)更方便移植程序。
delay.c
- //使用时记得将stm3210x_it.c中
- //void SysTick_Handler(void)
- //{
- //}
- //注销掉
-
- #include "delay.h"
- /*******************************************************************************
- *函数的原型:void Sys_Delay_Init(void)
- *函数的功能:系统滴答定时器初始化
- *函数的参数:None
- *函数返回值:None
- *函数的说明:
- SysTick_Config():系统滴答定时器初始化 返回1,说明初始化不成功
- ********************************************************************************/
- void Sys_Delay_Init(void)
- {
- if(SysTick_Config(SystemCoreClock/1000000) == 1)//1微秒
- {
- while(1);
- }
- }
-
- u32 sys_time = 0;
- void SysTick_Handler(void)
- {
- sys_time++;
- }
-
- /*******************************************************************************
- *函数的原型:void delay_us(u32 us)
- *函数的功能:微秒延时函数
- *函数的参数:
- @ u32 us:微秒 [1,4294967296]
- *函数返回值:None
- *函数的说明:
- 系统滴答定时器
- ********************************************************************************/
- void delay_us(u32 us)
- {
- sys_time = 0;
- while(sys_time != us);
- }
-
- /*******************************************************************************
- *函数的原型:void delay_ms(u32 ms)
- *函数的功能:微秒延时函数
- *函数的参数:
- @ u32 ms:毫秒 [1,4294967]
- *函数返回值:None
- *函数的说明:
- 系统滴答定时器
- ********************************************************************************/
- void delay_ms(u32 ms)
- {
- delay_us(ms*1000);
- }
-
-
delay.h
- #ifndef _DELAY_H
- #define _DELAY_H
-
- #include "stm32f10x.h"
-
-
- void Sys_Delay_Init(void);
- void delay_us(u32 us);
- void delay_ms(u32 ms);
-
- #endif
若要在函数中使用则应先在主函数(main.c)中进行初始化
- #include "sys.h"//我把所以的.h都放sys.h中了所以是#include "sys.h"
-
- int main(void)
- {
- Sys_Delay_Init(); //初始化定时器
- //下面就可以直接调用delay_ms();delay_us();来进行定时了,比如若定时50ms则
- delay_ms(50);
- //若定时30us则
- delay_us(30);
-
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。