stm32的学习——SysTick定时器的使用

一、Systick定时器

1、SysTick定时器简介

SysTick定时器也称为滴答定时器,SysTick定时器是内核中的一个外设,内嵌在NVIC(嵌套向量中断控制器)里面,在cortex M3、M4中都存在,很方便用户移植。

虽然我用的是cortex M4的内核,但是他的内核文档在这方面和Cortex M3的相似。

所以我这里参考了M3的内核中文文档。M3和M4内核文档——密码:0423。

注意:因为Systick定时器是内核外设,所以在STM32F4中文参考手册是找不到的,可以参考Cortex M3权威指南(第8章) + M3/M4内核权威指南(9.5章节)。

 Systick定时器是一个24bit的倒计时(向下计数)定时器,功能就是实现简单的延时。

24位向下计数定时器。

2、SysTick时钟源

SysTick定时器有两个时钟源可以选择,具体可以参考下图中的中文手册的时钟树。(stm32f4xx中文手册)密码同上。

 我们主要看粉色虚线框中的内容,从左往右看,首先是AHBPRESC/1,...,512这一个输出的AHB频率为168MHz,向上分为两个方向,一个是到Cortex 系统定时器,一个是FCLK Cortex自由运行时钟,这两个时钟源都可以作为SysTick定时器的时钟源。这两个的频率分别是8分频:21MHz和没有分频的168MHz。

也可以参考stm32CubeMX中的图片:

 让我们思考一下为什么要分频呢?为什么有不同频率的时钟源?

因为选择不同频率的时钟源会影响延时的长短。

如果选择168MHz的时钟源作为SysTick的时钟源,168MHz:1s震荡168 000 000次,也就是1us(1s == 1 000 000 us)震荡168次,而我们的SysTick定时器是一个24位的向下计数定时器。所以最多计数2^24-1(从零开始计数,所以要减一),所以可以算出最大延时时间:99.864ms

计算过程:2^24/168 = 99864.380952380952380952380952381us = 99.864ms

如果选择21MHz作为时钟源,则1s震荡21 000 000次,所以1us 震荡 21次,最大延时时间:

2^24/21 = 798,915.04761904761904761904761905 us = 798.915 ms

关于Systick定时器的寄存器说明以及函数接口都存储在内核文件misc.c以及misc.h,同时在core_cm4.h页定了关于Systick定时器的内容。

内核中提供了一个函数接口可以去修改Systick的时钟源  函数为 SysTick_CLKSourceConfig()

我们来讲一下 SysTick_CLKSourceConfig()这个函数:

函数原型

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)

函数参数

参数一:SysTick_CLKSource   选择时钟源  一般选SysTick_CLKSource_HCLK_Div8   21MHZ

@brief配置SysTick时钟源。

@param SysTick_CLKsource: SysTick时钟源。该参数可以是以下值之一:

        @arg SysTick_CLKSource_HCLK_Div8:选择AHB时钟除以8作为SysTick时钟源

        @arg SysTick_CLKSource_HCLK:选择AHB时钟作为SysTick时钟源。

@retval 无

3、SysTick定时器的应用

内核提供两种方案来使用systick定时器,分别是 中断方式 + 非中断方式

①中断方式:

 第一步:设置Systick的中断周期(SysTick_Config函数)

 让我们分析一下这个SysTick_Config函数:

函数原型:__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

函数参数分析:

 ticks是两个中断中的滴答数,我们回头看内核文档:

滴答数 = 时钟源 / 时间,假如中断周期为1us,时钟源为168MHz,则ticks = 168 000 000 / 1 000 000 = 168

第二步:编写延时函数

 

第三步:在Systick中断服务函数中修改中断次数

 

 ②非中断方式:

直接操作Systick定时器的4个寄存器,使用流程如下

 

 

 

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值