STM32 Nucleo初级例程2:Systick延时方式点亮LED灯

作者: fengye5340
上传时间为: 2014-12-08 05:15 PM
2014-12-08
阅读:

在cotex-m0/m3/m4内核中,都有一个系统定时器模块systick,它可以实现精确定时,在MCU加载RTOS时,提供运行时间基准。这篇文章讲一下利用systick定时器来实现精确延时去点亮LED灯。

一、systick定时器

在STM32-NUCLEO-072RB开发平台中,Systick定时器是M0内核自带的一个24位倒计时定时器,它一共有4个寄存SYST_CSR、SYST_RVR、SYST_CVR、SYST_CALIB,定义如下:

4个寄存器中,校准寄存器SYST_CALIB不用我们考虑,出厂前就配置好了。 主要考虑其它三个寄存器。

1、 SYST_CSR寄存器:控制和状态寄存器

CSR寄存器用到4位,bit0用于是否开启定时器,bit1用于是否产生中断,bit2用于选择定时器的时钟源是等于主时钟还是等于主时钟的一半,bit16是定时器的状态。

2、SYST_RVR寄存器:重装值寄存器

SYST_RVR设定了加载到SYST_CVR的起始值,24位有效

3、 SYST_CVR寄存器:当前值寄存器

对systick定时器正确的配置过程:设置重装值,清除当前值,设置控制和状态寄存器。在STM32软件包自带的CMSIS软件库中已经对systick使用做了库函数封装,直接进行调用即可。下面看一下在KEIL-MDK中如何来使用这个systick定时器。

二、Keil-mdk中使用systick定时器

1、调用SysTick_Config()库函数进行定时器配置

SysTick_Config()这个库函数在cotex-m0.h文件里面定义

2、实现中断服务函数SysTick_Handler()内容

SysTick_Handler() 在stm32f0xx_it.c 文件里面定义,在 startup_stm32f072.s里面声明并调用。

三、Keil-mdk工程软件代码实现:

1、在Keil-mdk工程模板/driver中增加SYSTICK.C文件,在includes.h文件中加入SYSTICK.C.h头文件,工程截图:

2、在SYSTICK.C文件里面实现Systick_Init()函数,这里就是调用SysTick_Config()这个函数了。

这里,主要涉及定时时间,在ST的库文件中,定义了SystemCoreClock这个变量,这里是48MHZ,根据这个变量,只要设定好频率系数,就可以实现任意ms的定时。这里要定时1ms(1kHZ)的话,只要除以1000。

3、在中断服务函数里面实现100ms延时

定义一个 unsigned short int 型变量 systick_num 用于对systick中断次数进行计数,因为定时1ms,所以1ms会产生一次中断, systick_num 会增加1,实现一次时间计数。达到100次时,就是延时100ms了,清零计数器重新计数就可以。

4、在主函数main.c里面调用Systick_Init(),开启定时器

这样,LED严格按照100ms延时去闪烁了。采用定时器延时要比软件延时精确度高。当然,也可以采用MCU本身的定时器来实现。

看着是不是很简单呢,有板子的话,可以试验一下。

代码地址链接

http://www.eeboard.com/bbs/thread-39696-1-1.html

摩尔吧视频地址链接

http://www.moore8.com/courses/306

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示