STM32F407 SysTick

//定时器分类:
    内核定时器(系统滴答定时器):
        延时、定时中断、给操作系统提供时基
    基本定时器:
        延时、定时中断、时间片
    通用定时器:
        延时、定时中断、输出比较(PWM)、输入捕获(捕获高/低电平时间、红外信号解码(解NEC)、按键时长、超声波测距、逻辑分析仪(IIC  SPI)、示波器
    高级定时器
        延时、定时中断、输出比较、输入捕获、电机死区 刹车
    其他定时器:
        看门狗 --- 产生复位
        RTC  --- 1s定时期 ---- 实时时钟(RTC显示时间)
        
//系统滴答定时器(SysTick):
    属于内核部分,是NVIC的一部分;作用:为系统提供时基,作为定时器使用延时和定时中断。
    //延时与定时中断的区别:
        通过while();这种语法延时会阻塞主程序的运行。而定时中断具有实时性,时间没到的时候,CPU继续进行主程序,时间到进入中断

//STM32的时钟树:
    中文参考手册 RCC章节
//STM32的时钟源:
    LSI:低速内部时钟      看门狗、RTC
    LSE:低速外部时钟       RTC
    HSI:高速内部时钟      系统、PLL锁相环
    HSE:高速外部时钟      25Mhz  -->168Mhz

//系统滴答定时器的相关寄存器
    1.SysTick->CTRL(控制及状态寄存器)
        位16:标志位: 进入中断标志位置一,需手动清零,可以通过向里面写任意值清零
        位2:选择时钟源: 0:选用参考时钟源  1:选用内核时钟源
        位1:使能定时中断: 1:使能
        位0:滴答定时器使能 1:使能
    2.SysTick->LOAD(重装载寄存器)
        向其中写入值,数数到0时,将值填入当前值寄存器
    3.SysTick->VAL(当前值寄存器)
        重装填的值倒数到0(递减的过程)
    4.SysTick->CALIB(校准寄存器)

//系统滴答定时器框图:


    
//使用系统滴答定时器延时
    延时时间的确定:
    时间T = ARR(重装载值)/ Fck(时钟源频率)
    //以参考时钟源为例,编写一个以毫秒为单位延时函数:
    Void systick_delay_ms(u16 nms)
    {
        //选择时钟源
        SysTick->CTRL &=~ (1 << 2);
        
        SysTick->LOAD = nms * 21000 - 1 ; // 必须减一,因为当前值寄存器数到0;
        
        //通过向当前值寄存器写入值,将重装载寄存器值写入当前值寄存器
        SysTick->VAL = 0;
        
        //使能系统滴答定时器,开始递减计数
        SysTick->CTRL |= 1 << 0;
        
        //等待系统标志位置一,关闭定时器使能
        while(!(SysTick->CTRL & 1 << 16));
        SysTick->CTRL &=~ (1 << 0);
    }
    
    
//滴答定时器的定时中断
    //定时器初始化思路:
        1.选择时钟源;
        2.使能系统滴答定时器;
        3.配置重装载寄存器;
        4.向当前值寄存器写入一个值,将重装载寄存器的值加载到当前值寄存器
        5.使能系统滴答定时器(开始递减)
        
    //中断服务函数的名字:
    ctrl + f 搜索SysTick
    初始化例程:
    /*
    函数功能:系统滴答定时中断
    返回值:void
    形参:u16 nms
    函数功能:nms定时中断
    */
    void SysTick_Interrupt(u16 nms)
    {
        //选择时钟源
        SysTick->CTRL &=~ (1 << 0);
        
        //使能滴答定时器中断
        SysTick->CTRL |= 1 << 1;
        
        //重装载值
        SysTick->LOAD = nms * 21000 - 1;
        
        //通过向当前值寄存器写入值,将重装载寄存器值写入当前值寄存器
        SysTick->VAL = 0;
        
        //使能系统滴答定时器,开始递减计数
        SysTick->CTRL |= 1 << 0;
    }
    
    //后面加上对应的中断服务函数(无返回值,无形参)
    //注意:在服务函数中加入清标志位,以便结束中断

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值