zoukankan      html  css  js  c++  java
  • STM32F103 SystemTick和delay的应用

    24位的倒计数定时器,计数到0,产生一次中断,从LOAD寄存器中自动重装载,就这样永不停息。

    与之相关的四个寄存器:

    LOAD自动重装载值

    VAL当前值寄存器

    CALIB校准值寄存器

    CTRL控制和状态

     外部时钟源是HCLK(AHB时钟总线)的1/8.

    内核时钟是HCLK时钟。

    配置函数SysTick_CLKSourceConfig();

     SysTick_Config(uint32_t ticks);

    中断服务函数

    void SysTick_Handler();

    无OS的情况下,delay相关函数的说明

    首先定义2个全局变量

    static u8 fac_us=0; //
    static u16 fac_ms=0;

    含义是延时1个us或者ms需要的tick数

    因为AHB时钟频率是72MHz,意味着1秒钟有72M个节拍,一个节拍的时间为1/72M 秒

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

    fac_us=SystemCoreClock/8000000;

    fac_ms=(u16)fac_us*1000;

    system tick时钟源为HCLK的1/8分频,意味着时钟频率是9MHz。一个tick时间1/9M 秒=1/9 us

    所以一个us需要9个tick,一个ms需要9×1000个tick。

    void delay_us(u32 nus)
    {        
        u32 temp;             
        SysTick->LOAD=nus*fac_us; 
        SysTick->VAL=0x00;                
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;    
        do
        {
            temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));        //
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;    //
        SysTick->VAL =0X00;                           //
    }

     注意:倒计时为0的时候,SysTick->CTRL的COUNTFLAG(第16位)就会为1

    dowhile循环终止。

  • 相关阅读:
    线程池的优雅关闭实践
    InheritableThreadLocal原理解析
    线程池踩坑
    两个线程通讯(生产-卖面包问题)
    谈谈redis的热key问题如何解决
    中国软件杯选题A1数据智能分析报告系统
    《程序员的思维修炼》读后感
    《算法导论》读后感
    《重构》读后感
    《代码整洁之道》读后感
  • 原文地址:https://www.cnblogs.com/legion/p/8022792.html
Copyright © 2011-2022 走看看