【STM32】HAL库-系统滴答定时器SysTick

发布者:幸福如意最新更新时间:2022-06-16 来源: eefocus关键字:STM32  HAL库  系统滴答定时器  SysTick 手机看文章 扫描二维码
随时随地手机看文章

SysTick定时器被捆绑在NVIC中,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。


Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。


系统滴答定时器有4个寄存器

image.png

时钟源

该定时器的时钟源可以是


内部时钟(FCLK,CM3上的自由运行时钟)

外部时钟( CM3处理器上的STCLK信号)

通过SysTick控制及状态寄存器的第2位来确定

在这里插入图片描述

STM32的时钟树

在这里插入图片描述

RCC通过AHB时钟(HCLK)8分频或者不分频作为Cortex系统定时器(SysTick)的外部时钟。CLKSOURCE = 0

FCLK是Cortex™-M3的自由运行时钟。详情见ARM的Cortex™-M3技术参考手册。CLKSOURCE = 1


SysTick控制及状态寄存器

在这里插入图片描述

SysTick重装载数值寄存器

24位的倒计数器

在这里插入图片描述

SysTick当前数值寄存器

在这里插入图片描述

SysTick校准数值寄存器

在这里插入图片描述

系统滴答定时器中断优先级设置

通过系统异常优先级寄存器来设置系统滴答定时器的优先级

在设置优先级之前得确定优先级分组,几位是抢占式优先级,几位是子优先级。

在这里插入图片描述

系统异常优先级寄存器在C文件中的代码

core_cm3.h

在这里插入图片描述

直接操作寄存器配置系统滴答定时器demo

采用STM32F103C8T6单片机,KeilMDK5.32版本


时钟配置如下图

在这里插入图片描述

选用外部时钟源(STCLK)即Cortex System timer 频率为9MHz作为系统滴答定时器的时钟源


系统滴答定时器定时时间为1ms,也就是1KHz,根据时钟源频率 9MHz/1KHz = 9000;

即系统滴答定时器重载值为9000-1=8999。


SysTick->LOAD  = 8999; /* 设置重载值 */

NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* 设置中断优先级 15(最低优先级) */

SysTick->VAL   = 0UL; /* 当前计数值 */

SysTick->CTRL  |= 0 << 2; /* 选择外部时钟源 */

SCB->SHP[11] = 0xF0; /* 设置抢占式优先级为15 */

SysTick->CTRL  |= 1 << 1; /* SysTick倒数计数到0时产生SysTick异常(中断)请求 */

SysTick->CTRL  |= 1 << 0; /* 使能SysTick */


HAL库配置系统滴答定时器demo

采用STM32F103C8T6单片机,KeilMDK5.32版本


HAL库默认采用FCLK作为系统滴答定时器的时钟源72MHz

定时的时间为1ms,也就是1KHz,重载值为72000-1=71999

优先级为15

PC13控制LED灯,LED的亮灭指示程序运行状态


STM32CubeMX配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

主要代码

在这里插入图片描述

先看序号1

函数HAL_Init()调用HAL_InitTick()来配置系统滴答定时器,


HAL_Init()

在这里插入图片描述

HAL_InitTick()调用HAL_SYSTICK_Config()配置系统滴答定时器,和设置系统滴答定时器的优先级(优先级为15)。


HAL_InitTick()

在这里插入图片描述

HAL_SYSTICK_Config()调用SysTick_Config()来进行配送系统滴答定时器


SysTick_Config()

在这里插入图片描述

SysTick_Config()根据参数ticks来设置重载值,清除当前计数值,选择FCLK(72MHz)作为时钟源,设置中断优先级为15,并使能系统滴答定时器。


注意以下:此时FCLK还不是72MHz,因为STM32的时钟树相关的寄存器还未被设置。


序号2

SystemClock_Config()调用了HAL_RCC_ClockConfig()。

HAL_RCC_ClockConfig()配置STM32的时钟树,将FCLK的频率设置为72MHz,再次调用HAL_InitTick()配置系统滴答定时器


此时才是真正的配置好了系统滴答定时器


HAL_RCC_ClockConfig()

在这里插入图片描述

关键字:STM32  HAL库  系统滴答定时器  SysTick 引用地址:【STM32】HAL库-系统滴答定时器SysTick

上一篇:【STM32】HAL库-嵌套向量中断控制器NVIC
下一篇:【STM32】HAL库-电源控制(低功耗模式)

推荐阅读最新更新时间:2024-11-10 11:17

STM32 GPIO模式理解
stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入; 2. 浮空输入; 3. 上拉输入; 4. 下拉输入; 5. 开漏输出; 6. 推挽输出; 7. 复用开漏输出; 8. 复用推挽输出 如图是GPIO的结构原理图: 1.模拟输入 从上图我们可以看到,我觉得模拟输入最重要的一点就是,他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我觉得这一点也是很好理解的,因为输入数据寄存器中存放的不是0就是1,而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们可以获得外部的模拟信号。 2.浮空输入 该输入状态,我的理解是,它的输入完全由外部决定
[单片机]
<font color='red'>STM32</font> GPIO模式理解
STM32 PA6引脚输出低电平不正常的问题
1、软件环境:Keil uv5.15 2、硬件环境:STM32F103C8T6 最小系统 在一个项目中需要用到STM32 的PA6引脚,发现工作异常。由于是自己做的最小系统,所以检查了芯片引脚,并没有发现虚焊、或者跟其他引脚连在一起的情况,初步判断是单片机或者程序的问题,硬件电路应该没有问题,硬件电路如下所示。 手工做的板子,电路还在调试,还没来得及清洁,所以有点脏。拿出示波器观察波形输出 从示波器可以看出,PA6引脚输出低电平无法到0v,而是2.1v左右。查看引脚初始化代码如下 void gpioInit() { GPIO_InitTypeDef g; RCC_APB2PeriphClockCmd(R
[单片机]
<font color='red'>STM32</font> PA6引脚输出低电平不正常的问题
STM32掌机教程6,电子琴
  本节原来是想讲一讲无源蜂鸣器发声的原理,用于添加BGM功能。为了讲原理,就写了一些通俗的代码,没想到越写越多,后来,干脆就形成了一个小小的项目吧——基于STM32与无源蜂鸣器的电子琴。 灯光效果   首先想到的是做一个灯光的效果,按下哪个按键,哪个按键的灯要亮;松手后,灯灭掉。顺带,检测一下带松手检测的按键功能好不好用。后续还可以做成通过亮灯提示需要按下那个按键,类似于节奏大师的功能——哪里要响点哪里。   我去掉了无关的代码,主函数里通过死循环,来确保按键按下的时候,灯是亮起来的 : //main.c while(1) { AllLED_OFF(); while(!SKEY1) { SLED1
[单片机]
<font color='red'>STM32</font>掌机教程6,电子琴
STM32学习笔记5:通用定时器PWM输出
1. TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文 Pulse Width Modulation 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的( 110 为模式1, 111 为模式2)。模式
[单片机]
KST-STM32学习之W25Q128
1、W25Q128 是华邦公司推出的一款 SPI 接口的 NOR Flash 芯片,其存储空间为 128Mbit,相当于 16M 字节。 W25Q128 可以支持 SPI 的模式 0 和模式 3,也就是 CPOL=0/CPHA=0 和CPOL=1/CPHA=1 这两种模式。 2、写入数据时,需要注意以下两个重要问题: ①、Flash 写入数据时和 EEPROM 类似,不能跨页写入,一次最多写入一页,W25Q128的一页是 256 字节。 写入数据一旦跨页,必须在写满上一页的时候,等待 Flash 将数据从缓存搬移到非易失区,重新再次往里写。 ②、Flash 有一个特点,就是可以将 1 写成 0,但是不能将 0
[单片机]
KST-STM32学习之W25Q128
STM32 在keil 下进行 atoi 函数功能测试
STM32 在keil 下进行 atoi 函数功能测试: 源码: void test_str2num(void) { int a; printf( rnrn0x1234 = %d, ,atoi( 0x1234 )); printf( rn0x1234 = %d, ,atoi( 0x1234 )); printf( rn1234 = %d, ,atoi( 1234 )); printf( rn0 = %d, ,atoi( 0 )); printf( rn01234 = %d, ,atoi( 01234 )); printf( rn0.1234 = %d, ,atoi( 0.1234 )); pri
[单片机]
STM32学习笔记——GPIO之从库函数到寄存器
例子为单片机的“Hello World”级的流水灯实验——虽然只有一个,其中并不是将完整的代码给出,只是给出关键部分来说明“如何调用ST公司的的库来完成对硬件的控制,以及对库文件代码进行跟踪和分析至寄存器级”。所以从第一段代码往下看就可以了,要用到的函数和变量大部分会说明,至于寄存器级的,那就只能翻手册了。 GPIO(General Purpose Input/Output) - 通用输入/输出 main.c :此函数为主函数,控制LED,亮1s,灭1s int main(void) { //LED初始化 LED_Configuration(); while(1) { GPIO_SetBits(GP
[单片机]
<font color='red'>STM32</font>学习笔记——GPIO之从库函数到寄存器
什么是FMSC_STM32_FMSC使用理解
  什么是FSMC   FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。   STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。   fsmc就是为了扩展内存的,如我们在STM32芯片外添加一
[单片机]
什么是FMSC_STM32_FMSC使用理解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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