STM32F030 Nucleo-做个准确的延时SysTick(一)

写过单片机程序的人都知道,软件延时是不准确的,当然,当在我们可接受的情况下,很多地方还是用软件延时的!但是在情况允许的条件下,我们还是希望延时越准确越好,这样可以保证我们Demo的一些精度或者时候准确性。

在所以的ST32位MCU中,基本上都存在这么一个定时器,很多人都叫它“滴答定时器”,也就是SysTick,在我移植过的好几个实时操作系统中,这个滴答定时器都用来作为操作系统调度的定时器了。其实这个定时器的使用非常简单,但是基本上很多人又觉得它是神秘的!为毛呢??打开MCU的DadaSheet,参考手册,都很少提到SysTick,并且提到的地方也就是一句话带过,库手册也就是说明一下操作它的接口!然后!然后!然后就没有然后了。

那么我们怎么样使用它呢??有可能我们根本就不了解这个定时器,就算它再简单,没资料,呵呵!玩起来也是很费劲的啊!这个疑问先放起来!看看下一个疑问??

文章的开头不是“做个准确的延时”么??那么它和SysTick有毛关系呢??(可能多远单片机程序员来说,延时就是:delay_ms(x)这种),其实我就想用SysTick来给我做延时,因为MCU的运行时钟在配置好之后,就基本上是稳定的了!稳定的时钟数山羊,那就可以计算出每数一次山羊所用的时间,更可以算出在一定时间内能数多少只山羊了(还记得小时候的数山羊游戏吗?)。所以就是利用这么个思想来干这种事。

当然,问题又来了,STM32有那么多个通用定时器和特殊定时器,干嘛非得用SysTick啊??我个人给的答案就是:(1)只要你开心,想怎么样都好。(2)对于通用定时器和特殊定时器而言,他们除了定时功能之外,还有其他的很多特殊复用功能,比如说PWM的输出等等,非得这么干的话你这是在浪费资源(当然,你若开心,便是晴天),然而,SysTick据我本人所知,它就是ARM核用来数山羊的,就这么个定时计时功能,不用它用谁??

回到上面的问题,我们怎么使用SysTick定时器呢??

首先,第一件事就是找到它再时钟树的位置(还是时钟树,可以想想它的地位有多重要了)。如下图:

上图还是时钟树(Clock Tree)从上图我们可以得到这么几个信息:

(1)SysTick就是内核系统定时器(不管它,咱还是叫滴答定时器)

(2)SysTick的时钟源来自HCLK

(3)SysTick的时钟为HCLK的8分频,即Fsystick = HCLK/8

(4)蓝色框表示系统时钟咱在前面的帖子已经配置好了!哈哈!

好!第一件事干完了,也得到了相应的信息,那么咱们干第二件事:

还记得在准备资料的时候,特别提示,一点要将MCU的编程手册下载下来吗???在这里就用到它了!

就是上图这个东西,名字叫STM32F0xxx Cortex-M0 programming manual ---->STM32F0xxx 系列Corte-M0编程手册。

打开这个手册,我们可以看到很多的东西,我简单介绍一下吧!

浏览整个目录,分为5章,如下:

第一章从技术角度来说,可能不是那么重要,但是对于不了解ST说明文档的布局的童鞋而言,我个人认为还是必须浏览第一章的,因为他介绍了,本文档的格式和关键词使用还有必要的说明格式等,再就是简单的介绍了文章的布局,和所包含的内容,这对于阅读文档,找到想要的资料是快速的方法。

第二章基本上就是对Cortex-M0内核的简单介绍了,比如模式,堆栈,内核寄存器,数据类型,内存,低功耗模式等等的介绍了。

第三章看到这些想都不用想,就知道这是Cortex-M0内核的汇编指令,操作指令了。

第四章,哈哈哈哈哈哈!看到标题没??Core peripherals 我想英语水平再差的人都知道这是Cortex-M0的核心外设了,那就是说这是ARM架构Cortex-M0核有的东西,并不只有ST的才有。OK!SysTick就是核心外设之一啦!这就是为毛找它的原因了啊!哈哈!!等等,还有第五章,得装完B再说。

下去!看看!就可以看到!第五章就是记录着修订历史的,如下图:

从这个图我们可以得知,第一次出这个文档的时间,而且从未修改过!哈哈 !不管了!谈谈感受些。

首先,我觉得这个手册是写给程序员看的!它不是真正的Cortex-M0手册,因为从手册的内容来看,它再教我们怎么使用,怎么写程序配置,而不是解释Cortex-M0内核(当然,从名字就知道了!哈哈!)。这一点很重要,所以它是非常重要的手册,比库函数手册重要N倍。

OK!废话了一大堆!先把滴答定时器用起来吧!

第一件事,找到库中相应的操作函数接口,所以我在keil中全工程搜索了一下,结果如下:

从上图可以看出了,只看到了两个与SysTick相关的函数(我用红框标出了),分别是:void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)函数和__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)函数,(在Linux中__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)这种类型的函数叫内联函数,不知道这是不是这样叫),其中,void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)函数的作用,是是选择SysTick的时钟和初始化SysTick(从注释和函数名就可以看出来了)。__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)函数就是“The function initializes the System Timer and its interrupt, and starts the System Tick Timer.

Counter is in free running mode to generate periodic interrupts.”初始化SysTick和中断,开启定时器。

从注释上来分析,要让SysTick跑起来使用这两函数的确足够了,但是想想哪里不对劲啊??咱的目的是做个延时程序,希望能够精确的延时,并且咱随时指定延时多久,这怎么还玩起中断来了,不对,不对,这不靠谱(我说的不靠谱是和我们的目的不靠谱,并非这个库不靠谱,哈哈!),唉!没办法,只能对ST的攻城狮说,你不给咱写好,咋就自己玩了!哈哈!那砸门就自己玩!

那么怎么玩呢???这就是为毛在开篇的时候一大堆废话谈《Cortex-M0编程手册》的原因了,咱自己玩,得靠它啊!OK!继续--0------>

看到上图,我想再不明白的人也要明白了!这就清清楚楚的介绍了SysTick的使用了哈!(翻译就算了,水平太菜了,不恶心人了)。

继续晒图:

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!

扫码进群领资料

展开阅读全文

页面更新:2024-03-09

标签:定时器   山羊   内核   时钟   函数   准确   东西   手册   简单   文档   资料

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top