stm32中用Systick做延时函数

Systick简介:

The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads (wraps to) the value in the LOAD register on the next clock edge, then counts down on subsequent clocks.(在STMF10xx编程手册中摘抄,大概意思是它是24位的系统定时器,它的计数方式是向下计数的,根据写入重装载值载LOAD寄存器,自动进行下一轮计数)。

24位的系统定时器、向下计数、重装载值载LOAD寄存器、当计数到0的时候自动将LOAD寄存器的值装入VAL寄存器中。

寄存器:

 第0位: 系统定时器使能位

 第1位: 系统定时器中断使能位

第2位: 系统定时器时钟源选择位(0:systick时钟为AHB时钟8分频,1:systick时钟为AHB时钟)

第16位:系统定时器计数到0时此位置位。

系统定时器重装载寄存器,写入值后当系统定时器计数到0时,自动将此寄存器值写入VAL寄存器中。

 系统定时器计数寄存器,当计数到0时,自动将LOAD寄存器的值写入到此寄存器中。

代码:

/*定时器时钟以72MHz为例*/

/*延时ms,注意:系统定时器最大的计数范围为0~0xFFFFFF-1*/

/*毫秒的重装载值为:每秒跳动的次数为72000000,ms就为72000-1,同理us为72-1*/

void Delay_ms(uint16_t ms)
{
    SysTick->CTRL = 0;                                     //清空之前的配置
    SysTick->LOAD = 72000 * ms - 1;              //设置事件为ms级别的定时
    SysTick->VAL = 0;                                        //将VAL值清零
    SysTick->CTRL = 5;                                   //启动systick定时器和配置时钟分频
    while(!(SysTick->CTRL & (1<<16)));         //判断systick定时器到达
    SysTick->CTRL = 0;                                   //关闭systick
}

/*延时us,注意:系统定时器最大的计数范围为0~0xFFFFFF-1*/

void Delay_us(uint16_t us)
{
    SysTick->CTRL = 0;                                   //清空之前的配置
    SysTick->LOAD = 72 * us - 1;                 //设置事件为us级别的定时
    SysTick->VAL = 0;                                      //将VAL值清零
    SysTick->CTRL = 5;                                    //启动systick定时器和配置时钟分频
    while(!(SysTick->CTRL & (1<<16)));         //判断systick定时器到达
    SysTick->CTRL = 0;                                    //关闭systick
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值