STM32 systick做为系统时间使用(非简单延时)
来源:互联网 发布:m123软件 编辑:程序博客网 时间:2024/05/21 22:32
转自:http://bruce.is-programmer.com/posts/36012.html
基本能搜到的systick 都是作为延时使用的,因为设计需求我更多实用的是系统时间判断。
假如我有个LED 需要每10s 闪一下,并且单片机还需要做其他的工作,用延时工作效率太低了,开个定时器又太浪费了。因此系统时钟就体现出了由为重要的应用场合。只需要检测到系统时间为10s 的倍数就可以做动作了,当然前提保证程序的大体循环能在1s 内完成,这个基本没问题如果一个大体循环1s 内完成不了 那这个程序要么就是大到无法形容,要么就是无止境的运行。
首先进入while(1) 大循环前初始化systick,进入主体程序就在计数了,计数分毫秒,秒,这样能在特点的时间进入指定的程序中运行。
初始化systick
void
TimeCount_Init(
void
)
{
SysTick->LOAD=72000000/1000;
//系统频率为72MH
SysTick->VAL=0x00;
SysTick->CTRL=0xFFFFFFFF;
MilliS=0;
Second=0;
Min=0;
}
当然如果用库函数也行的
void
TimeCount_Init(
void
)
{
if
(SysTick_Config (SystemCoreClock / 1000))
{
while
(1); }
MilliS=0;
Second=0;
Min=0;
}
中断函数
void
SysTick_Handler(
void
)
{
MilliS++;
if
(MilliS>=10000) MilliS=0;
//此处10000ms 主要方便延时函数使用
if
(MilliS%1000==0) {Second++;}
if
(Second>=60) {Second=0;min++;}
}
如果我们要想5秒去做一次计算某组数据只需要写入秒判断即可
if(Second%5 == 0)
{ 需要间隔运行的程序…… }
毫秒也是可以的,换成MilliS 即可,甚至分钟都行。
好了,那延时怎么办?是的特殊场合我们可能还是可能有需要延时函数的。当然这个也是可以做到的,不过相对运算多一点点。
延时函数如下:
u8 delayms(u16 nCount)
{
u16 CurTim=MilliS;
u16 i=0;
if
(nCount<60000)
{
if
(CurTim+nCount<10000)
{
while
(MilliS-CurTim<nCount);
return
1;
}
i=nCount-(10000-CurTim);
while
(MilliS<9998);
while
(MilliS>=9998||MilliS<i);
return
1;
}
delayS(nCount/1000);
delayms(nCount%1000);
//while()
return
1;
}
u8 delayS(u16 nCount)
{
u16 CurTim=Second;
u16 i=0;
if
(nCount<6000)
{
if
(CurTim+nCount<60)
{
while
(Second-CurTim<nCount);
return
1;}
i=nCount-(60-CurTim);
while
(Second<59);
while
(Second>=59||Second<i);
return
1;
}
return
0;
}
这里我做的毫秒延时中实际最长的只能计算60000ms 即60s的延时 再长的延时就会先调用秒延时,运行完后再把剩下的毫秒延时运行掉。所以超出部分将计算越出计数器最大计算值多少来计算i=nCount-(10000-CurTim);而中断中定义的技术最大值10000 原因是一般我们使用延时都不会太长,最长一般也就数秒而已,更多的是毫秒级的,所以这里放宽至10S 的长度,直接等待值到了就推出,所以10S内的延时延时还是非常精确的,但如果大于就会有几个微秒的差距了,中间插入了好几条运算和指令,非精确定时就别用这个定时器了。
- STM32 systick做为系统时间使用(非简单延时)
- stm32使用systick精确延时
- STM32 SysTick 精确延时(非中断方式)
- STM32中,systick具体延时时间计算
- STM32 SysTick 精准延时 简单分析
- STM32使用systick实现精确延时
- stm32 软件精确延时非systick 非中断
- stm32 软件精确延时非systick 非中断
- 【STM32】新手折腾笔记--03 系统级延时(Systick定时器)
- STM32学习笔记——使用SysTick定时器做延时
- STM32---系统滴答定时器(systick)应用
- STM32-------系统滴答定时器(systick)应用
- STM32---系统滴答定时器(systick)应用
- stm32之Cortex系统定时器(SysTick)
- STM32之SysTick(系统滴答定时器)
- stm32的systick(系统滴答定时器)
- STM32系统定时器SysTick
- stm32 SysTick系统定时器
- 堆的优先队列2
- RedHat Linux6 系统硬盘换到其他机器后,无法认到网卡问题
- PuppetDB安装指南
- SVN的分支、主干合并的使用说明
- 无线模块 RXB12-315m TXB12-315M 应用
- STM32 systick做为系统时间使用(非简单延时)
- 自动识别手势
- epoll详解
- 整理Linux (以Ubuntu 为例) 基本命令 apt-get
- 创建虚拟设备(缓冲读写方式)-模拟文件读写操作
- CocoaPods
- 单链表
- Oracle基本表操作
- 屏蔽掉返回键,menu键,Home键