STM32学习(四) SyxTick 实验

5 篇文章 0 订阅
5 篇文章 0 订阅

STM32学习(四) SyxTick 实验

Systick 简介

  • SYSTick 系统定时器是 CM4 内核的一个外设(所有 CM4 内核的单片机都有),内嵌在 NVIC 中;
  • 24bit 的向下递减计数器,计数器每计数一次的时间是 1/SYSCLK,一般设置 SYSTICK 为168MHz(以STM32F407为例);
  • 当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复;
  • 一般用于产生时基,维持系统心跳

SysTick 寄存器讲解

寄存器功能
CTRL控制及状态寄存器
LOAD重装载数值寄存器
VAL当前数值寄存器
CALIB校准数值寄存器

CTRL 寄存器

bit[2]			CLKSOURCE, 时钟源选择,0-AHB/81-AHB
bit[1]			TICKINIT, 1-SysTick倒计数到0时产生异常请求(即中断)
bit[0]			ENABLE,1-使能

RELOAD 重装载值寄存器

  • 当计数到0时,重新装载到数值寄存器的值
bit[23~0]24位有效

VAL 当前数值寄存器

SysTick 配置库函数

  • SysTick 属于内核外设,跟普通外设的中断优先级有些区别,并没有抢占优先级和子优先级的说法;
    用库函数编程时,我们只需要使用 SysTick_Config() 进行配置即可,函数如下,在 cm4.h 文件中:
// System Tick Configuration, The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
// param [in]  ticks  Number of ticks between two interrupts.

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
	// 参数检查,重载值最大是24位
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); }

	/* set reload register */
  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);

	/* Load the SysTick Counter Value */
  SysTick->VAL   = 0UL;

	// 时钟源选择 AHB 168MHz,计数到0时产生中断,使能系统定时器                                             
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;

  return (0UL);
}

SysTick 初始化函数

如下代码,配置 ticks 为 SystemCoreClock / 1000,即 168K,即计数168K次时,产生一次中断;

而计数一次的时间是:1/CLKAHB,即 1/168M 秒,所以计数168K次用时 1ms,意即 每ms产生一次 SysTick 中断;

在 SysTick 中断处理函数中可以累加经过的 毫秒值,从而达到记录时间的目的;

void SysTick_Init(void)
{
	/* SystemFrequency / 1000    1ms中断一次
	 * SystemFrequency / 100000  10us中断一次
	 * SystemFrequency / 1000000 1us中断一次
	 */
	if (SysTick_Config(SystemCoreClock / 1000))
	{
		/* Capture error */
		while (1);
	}
}

延时函数 和 SysTick 中断处理函数

static __IO u32 TimingDelay;

void delay_ms(__IO u32 nTime)
{
	TimingDelay = nTime;

	while (TimingDelay != 0);
}

void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{
		TimingDelay--;
	}
}

void SysTick_Handler(void)
{
	TimingDelay_Decrement();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值