用CM3/4内核自带的SysTick定时器实现基本延时
时间:10-02
整理:3721RD
点击:
用CM3/4内核自带的SysTick定时器实现基本延时http://bbs.edu118.com/forum.php?mod=viewthread&tid=440&fromuid=203
(出处: 信盈达IT技术社区)
当stm32中不加载操作系统的时候,我们可以用其内核自带的SysTick定时器实现基本延时,但是在延时的时候有几个基本的问题要解决。
1)SysTick定时器要独占式操作;------用一个变量表示其被占用情况
2)能否正常延时要有一个反馈;------用返回值表示延时是否正常
(出处: 信盈达IT技术社区)
当stm32中不加载操作系统的时候,我们可以用其内核自带的SysTick定时器实现基本延时,但是在延时的时候有几个基本的问题要解决。
1)SysTick定时器要独占式操作;------用一个变量表示其被占用情况
2)能否正常延时要有一个反馈;------用返回值表示延时是否正常
- #include "stm32f4xx.h"
- #define SYSTICK 168
- u8 SYSTICK_USER_OR=0; //systick是否被占用
- //用systick定时器实现延时nus微秒
- //参数nus: 延时nus微秒
- //返回值: 0 正常延时 1定时器被占用
- u8 delay_us(u32 nus)
- {
- if(SYSTICK_USER_OR==0) //systick可用
- {
- SYSTICK_USER_OR=1; //占用systick
- //选择时钟源
- SysTick->CTRL &=~(0X01<<2); //选择系统时钟8分频做为systick的时钟源
- SysTick->LOAD =nus *SYSTICK/8;//设定计数初值
- SysTick->VAL =0; //重装载计数初值
- SysTick->CTRL |=0x01<<0; //开始定时
- while((SysTick->CTRL &(0x01<<16))==0);//等待定时时间到
- SysTick->CTRL &=~(0x01<<0); //关闭定时器
- SYSTICK_USER_OR=0; //释放systick
- return 0;
- }
- return 1;
- }
- /////////////////////////////////////////////////////////////////////////////////////////
- //用systick定时器实现延时nms毫秒
- //参数nus: 延时nus毫秒
- //返回值: 0 正常延时 1定时器被占用
- //最大计数798.9ms
- u8 delay_ms(u32 nms)
- {
- if(nms>798) //超过范围
- return 1;
- if(SYSTICK_USER_OR==0) //systick可用
- {
- SYSTICK_USER_OR=1; //占用systick
- //选择时钟源
- SysTick->CTRL &=~(0X01<<2); //选择系统时钟8分频做为systick的时钟源
- SysTick->LOAD =nms *SYSTICK*1000/8;//设定计数初值
- SysTick->VAL =0; //重装载计数初值
- SysTick->CTRL |=0x01<<0; //开始定时
- while((SysTick->CTRL &(0x01<<16))==0);//等待定时时间到
- SysTick->CTRL &=~(0x01<<0); //关闭定时器
- SYSTICK_USER_OR=0; //释放systick
- return 0;
- }
- return 2;
- }
有兴趣的童鞋可以多交流交流qq:3208919269.
高深的样子 不懂
多学学就好了。
好吧 继续努力