4504|5

381

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

systick做为系统时间使用(非延时) [复制链接]

基本能搜到的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/stm8论坛

最新回复

诶,楼主不是已经在玩操作系统了么? stm32上linux有点费劲,上ucos啥的应该很没问题了吧?  详情 回复 发表于 2012-10-26 10:06
点赞 关注
 

回复
举报

1634

帖子

0

TA的资源

裸片初长成(高级)

沙发
 
这是基于何种mcu的?
此帖出自stm32/stm8论坛

点评

STM32……  详情 回复 发表于 2012-10-22 17:00
 
 

回复

381

帖子

0

TA的资源

纯净的硅(高级)

板凳
 

回复 沙发 xu__changhua 的帖子

STM32……
此帖出自stm32/stm8论坛
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

4
 
上操作系统什么都不成问题了,别在自己摸索前后台程序了。
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

5
 
诶,楼主不是已经在玩操作系统了么?
stm32上linux有点费劲,上ucos啥的应该很没问题了吧?
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

381

帖子

0

TA的资源

纯净的硅(高级)

6
 
非也 非也,主要设计都是用外部触发中断事件的,没必要用操作系统,如果用uCos  中断后还要任务优先级处理,这样实时性就低了,没必要上系统,用不用系统还是对整体设计而言,不是上了系统就是NB 就是正确的
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 6

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表