利用滴答定时器Systick封装一个延时函数

注:适用于stm32f10x系列

滴答定时器说明

  • 系统/滴答定时器,24位的倒计数定时器
  • 寄存器:

寄存器

定义与解释

CTRL

控制和状态寄存器

RELOAD

自动重装载寄存器

VAL

当前值寄存器

CALIB

校准值寄存器

(1)状态寄存器CTRL:

第16位:可作为一个判断时间的标志位,该位为1时,表示滴答定时器的一个周期结束,注意,该位的读取清零特性

第2位:配置滴答定时器时钟源,即频率,0--外部时钟源--HCLK/8--9000 000--跳9下为1us;1--内核时钟--HCLK--72000 000--跳72下为1us。

第0位:使能位

(2)当前值寄存器(val):

(3)重装载数值寄存器-RELOAD

库函数

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

作用:选择时钟源,即设置滴答定时器的状态寄存器CTRL的CLKSOURCE(第2位)的值,在库中的具体实现如下:

可以看出库函数中的实现也是直接对CTRL寄存器进行操作的

实例

void Sys_Clock_Config(void){
    
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
//封装延时为1微妙的延时函数,参数us范围<186万
void delay_us(u32 us){

    u32 time;
    SysTick->VAL=0;//清除【当前值寄存器val】,使其置0,同时清除【CTRL】标志位,防止干扰
    SysTick->LOAD=9*us;//【重装载数值寄存器】赋初始值,从此值开始倒数
    SysTick->CTRL |= 0x1<<0;//第0位置1,使能,开启定时器
    do{
        time = SysTick->CTRL;
    }while((!(time& 0x1<<16))&&(time & 0x1) );
    
    SysTick->CTRL &=~(0x1<<0);
    SysTick->VAL=0;
}

注:Systick通常用于中断方面的定时,故而与【NVIC嵌套向量中断配置器】绑定,所以其相关库函数在misc.h中查找


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值