stm32 Hal库SysTick延时程序

SysTick是CM3内核的一个24位向下计数的系统定时器,常用于生成时基,支持操作系统的延迟功能。在72MHz的系统时钟下,它每10us递减一次。HAL_Delay和Delay_us函数利用SysTick实现不同级别的延迟,中断处理函数SysTick_Handler负责递减TimingDelay计数器。
摘要由CSDN通过智能技术生成

SysTick 简介

SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
函数 Delay_us() 中我们等待 TimingDelay 为 0,当 TimingDelay 为 0 的时候表示延时时间到。变量TimingDelay 在中断函数中递减,即 SysTick 每进一次中断即 10us 的时间 TimingDelay 递减一次。
TimingDelay 的值等于延时函数中传进去的 nTime 的值,比如 nTime=100000,则延时的时间等于100000*10us=1s。

//main.c使用HAL_Delay
/* 系统时钟初始化成72MHz */  
SystemClock_Config();
SysTick_Init();
HAL_Delay(1000);    // 1000 * 1ms = 1000ms
void SysTick_Init(void)
{
if (HAL_SYSTICK_Config(SystemCoreClock / 1000))    //SystemCoreClock=72M
{ while (1);}
}
//main.c使用Delay_us
/* 系统时钟初始化成72MHz */  
SystemClock_Config();
SysTick_Init();
Delay_us(100000);        // 10000 * 10us = 1000ms
//SysTick.c
#define Delay_ms(x) Delay_us(100*x)
static __IO u32 TimingDelay;
void SysTick_Init(void)
{
if (HAL_SYSTICK_Config(SystemCoreClock / 1000))    
{ while (1);}
}
void Delay_us(__IO u32 nTime)
{     TimingDelay = nTime;        
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{    if (TimingDelay != 0x00)
   {    TimingDelay--;      }
}
//中断
void SysTick_Handler(void)
{  HAL_IncTick();  }//调用TimingDelay_Decrement

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微信公众号:数模0error

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值