×

STM32入门系列教程之Systick的编程资料说明

消耗积分:0 | 格式:rar | 大小:0.34 MB | 2020-07-17

分享资料个

  提到systick 不得不抱怨以下STM32 的用户手册,既然提供了systick 的功能,为啥手册里却只提了一下?后来笔者上网搜的时候,才发现,抱怨的不仅仅是我一个人。闲话不说,下面将笔者搜集的资料进行总结。

  1. systick介绍

  Systick 就是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。没有学过操作系统的同学,可能会很郁闷,啥叫滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳”是不允许任何人来随意地访问和修改的。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。知道systick 在系统中的地位后,我们来了解systick 的实现。注意,本期教程并没有讲述systick 如何在操作系统中的运行,因为这对初学者来说比较复杂。我们这里只是举例说明systick 的使用。它有四个寄存器,笔者把它列出来:

  STK_CSR, 0xE000E010 -- 控制寄存器

  STK_LOAD, 0xE000E014 -- 重载寄存器

  STK_VAL, 0xE000E018 -- 当前值寄存器

  STK_CALRB, 0xE000E01C -- 校准值寄存器

  现在我们想通过Systick 定时器做一个精确的延迟函数,比如让LED 精确延迟1 秒钟闪亮一次。

  思路:利用systick 定时器为递减计数器,设定初值并使能它后,它会每个系统时钟周期计数器减1,计数到0 时,SysTick 计数器自动重装初值并继续计数,同时触发中断。

  那么每次计数器减到0,时间经过了:系统时钟周期* 计数器初值。我们使用72M 作为系统时钟,那么每次计数器减1 所用的时间是1/72M,计数器的初值如果是72000,那么每次计数器减到0,时间经过(1/72M) * 72000 =0.001,即1ms。

  现在我们做出来的Delay(1),就是1 毫秒延迟。Delay(1000)就是1 秒。有了以上的思路后,systick 的编程非常简单。首先,我们需要有一个72M 的systick 系统时钟,那么,使用下面这个时钟就OK!SystemInit();

  这个函数可以让主频运行到72M。可以把它作为systick 的时钟源。为了配合演示,可以使用LED 显示来做,于是我们设置了GPIO_Config();初始化函数,初始化了芯达STM32 开发板上的LED4 灯。

  接着开始配置systick,实际上配置systick 的严格过程如下:使用ST 的函数库使用systick 的方法:

  1、调用SysTick_CounterCmd() -- 失能SysTick 计数器

  2、调用SysTick_ITConfig () -- 失能SysTick 中断

  3、调用SysTick_CLKSourceConfig() -- 设置SysTick 时钟源。

  4、调用SysTick_SetReload() -- 设置SysTick 重装载值。

  5、调用SysTick_ITConfig () -- 使能SysTick 中断

  6、调用SysTick_CounterCmd() -- 开启SysTick 计数器

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !