笔记(STM32篇)day11——SysTick系统滴答定时器介绍与应用

目录

一、SysTick系统滴答定时器

二、SysTick应用实验

1、SysTick定时时间计算

2、中断优先级配置

3、编程流程

参考


一、SysTick系统滴答定时器

1、SysTick简介

        SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。

2、SysTick寄存器介绍

        SysTick—系统定时器有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。以下是SysTick四个寄存器介绍,图片参考系统滴答定时器_花开半朵ོ的博客-CSDN博客_系统滴答定时器

二、SysTick应用实验

        利用 SysTick 产生 1s 的时基,LED 以 1s 的频率闪烁

1、SysTick定时时间计算

        LOAD寄存器中的reload值就是systick滴答的次数,从重载到倒计时结束的时间

        t=reload*(1/clk),当AHB作为clk时,clk=72M,t=72*(1/72M)=1us,也即通过调整reload值来设定计数时间t。 

2、中断优先级配置

        优先级配置要区分内核外设和普通外设的优先级配置,内核外设优先级如SysTick优先级配置是在SCB的SHPRX寄存器,普通外设优先级如上一篇按键中断使用的EXTI,是在NVIC的IPRX寄存器配置。

        注释:

        (1)这里容易混淆优先级分组和优先级配置。上一篇按键中断实验中,优先级的分组是在SCB的AIRCR寄存器进行配置;而主次优先级配置是在NVIC的IP寄存器配置。

        (2)内核外设的优先级没有分组,只有0-15的十六个优先级,通过寄存器中的四个位控制,而普通外设的优先级在分组后,这四位有抢占优先级和子优先级的区分,因此在比较这两个优先级的时候,需要人为将内核外设的优先级自行分组来比较,若相同则比较硬件编号优先级。

3、编程流程

(1)创建及库包含

        同上一篇,在USER文件夹中创建systick文件夹,保证一个外设一个文件夹以便管理,在bsp_systick.h文件中宏定义#ifndef防止重复包含,因为systick不同于前面的普通外设,普通外设的函数都在stm32f10x.h文件中声明,而内核外设在core_cm3.h文件中声明,因此需要include这个core_cm3.h,而后在bsp_systick.c中include这个bsp_systick.h。

(2)编写延时函数

        在core_cm3.h中,已经有systick的配置函数,此函数对SysTick的寄存器进行配置,函数的参数是reload值,根据上述公式,若要1ms的systick计数,则赋72000,若需要0.5s的延时,则用for循环500次,内循环用while,while退出的条件就是systick完成一次计数后ctrl寄存器第16位置1,也即1ms。如此外循环退出时就延时了500ms。延时函数的最后需要停止使能systick。

void SysTick_Delay_ms(uint32_t ms)
{
	uint32_t i;
	SysTick_Config(72000);
	
	for(i=0; i<ms; i++)
	{
		while( !((SysTick->CTRL) & (1<<16)) );
	}
	
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}

参考

[野火®]STM32库开发实战指南——基于野火指南者开发板 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档

系统滴答定时器_花开半朵ོ的博客-CSDN博客_系统滴答定时器

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于STM32系统滴答定时器systick应用的问题。 系统滴答定时器systick)是STM32中一个非常重要的计时器,它是一个24位的递减计数器,每当计数器减为0时,会触发一个中断。它通常用于操作系统的时间片轮转、延时函数的实现等。 在STM32中,我们可以通过如下代码使能系统滴答定时器: ```c // 使能系统滴答定时器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; ``` 然后,我们可以通过如下代码设置系统滴答定时器的时钟源和计数器值: ```c // 设置系统滴答定时器的时钟源和计数器值 SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 使用处理器时钟作为时钟源 SysTick->LOAD = SystemCoreClock / 1000 - 1; // 设置计数器值为1ms ``` 在这段代码中,我们将系统滴答定时器的时钟源设置为处理器时钟,每次计数器减1代表1个处理器时钟周期的时间。然后我们将计数器的初值设置为`SystemCoreClock / 1000 - 1`,这里的`1000`代表我们希望系统滴答定时器每1ms中断一次。 最后,我们需要在中断服务函数中处理系统滴答定时器中断: ```c void SysTick_Handler(void) { // 处理系统滴答定时器中断 } ``` 在中断服务函数中,我们可以编写自己的代码来处理系统滴答定时器中断。例如,可以实现一个简单的延时函数: ```c void delay_ms(uint32_t ms) { uint32_t i; for (i = 0; i < ms; i++) { while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数器减为0 } } ``` 这个函数可以让程序在执行到它的时候暂停一段时间,等待系统滴答定时器中断触发一定次数后再继续执行。 希望这些代码可以帮助您更好地理解STM32系统滴答定时器应用。如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值