STM32-基本知识梳理5-滴答定时器配置与使用

一、滴答定时器简述

1,滴答定时器是24位的系统定时器,属于系统内核的定时器,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。和外设部分的定时器模块不一样;

2,滴答定时器的模型

逻辑:STK_CLK提供时钟,输入给到递减计数器中,收到一个时钟后,则计数值减少1,当减少到0时刻,则置一次标志位,并且数值调整到重装值;

 3,计数值计算逻辑

一个计数循环t = 重装数值reload * ( 1/配置时钟clk )

即配置时钟(72M或者9M)后,配置对应的重装值,就可以计算出完成一次计数循环的时间;

4,几个重要的寄存器描述:

①COUNTFALG:当计数值到达0时刻,读取一次,硬件上会自动清0;

②CLKSOURCE:时钟源,可以是72M或者9M

③ENABLE:使能计数器

④RELOAD:重装计数器的值

 

 二、滴答定时器系统源码解析及建立一个毫秒的延时模块

1,源码解析

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 检测数据是否溢出,重装能小于2^24 */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* LOAD寄存器存放重装值 */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* 配置优先级,为15,最低中断优先级 */
  SysTick->VAL   = 0;                                          /* 设置初始值 */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* 时钟源、使能中断、使能开启*/
  return (0);                                                  /* Function successful */
}

2,建立一个ms延时模块

void mysystick_config(uint32_t ms)
{
	uint32_t i=0;
	//系统滴答定时器函数,配置1ms产生一次异常中断
	SysTick_Config(72000);
	
	for(i=0;i<ms;i++)//
	{
		//在COUNTFLAG=1时刻,读取后COUNTFLAG会自动置为0
		while(((SysTick->CTRL)&(1<<16))==0);
	}
	//关闭滴答定时器使能
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您解答关于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系统滴答定时器的应用。如果您还有其他问题,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值