• STM32F10xxx 之 System tick Timer(SYSTICK Timer)


    背景

    研究STM32F10xxx定时器的时候,无意间看到了System tick Timer,于是比较深入的了解下,在此做个记录。

    正文

    System tick Timer是Cotex-M内核的24位计数的系统定时器。它的自动重载值可被随时配置更改,并且如果配置了系统定时器,那么它的中断也即被跟着使能。需要强调的是,在STM3210xxx的用户手册里,基本上找不到关于系统定时器的信息,所以想要深入了解配置该定时器,得去看内核相关文档,不过好在有了库函数,可以暂时不去深究内核文档,即可利用ST提供的库函数来进行配置。本文即记录了利用ST的库函数将该定时器的时钟配置为“AHB Clock”8分频并实现微妙(us)延时的方法。

    首先是配置系统定时器的时钟源,库函数如下:

    /**
      * @brief  Configures the SysTick clock source.
      * @param  SysTick_CLKSource: specifies the SysTick clock source.
      *     This parameter can be one of the following values:
      *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
      *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
      * @retval None
      */
    void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
    {
      /* Check the parameters */
      assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
      if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
      {
        SysTick->CTRL |= SysTick_CLKSource_HCLK;
      }
      else
      {
        SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
      }
    }  
    

    从以上的说明可以看出,系统定时器可被选择为AHB时钟或者AHB 8分频。本例则配置为 AHB 8分频:

    /**
      * SysTick时钟源由HCLK/8提供,当系统频率为72MHz时,最小计数周期为1/9MHz,计满9次为1us,
      * tick_us以9为单位,在此为基础实现us延时。
      */
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    tick_us = sysclk/8;    // sysyclk = 72		    
    tick_ms=(u16)tick_us*1000;
    

    接着实现Delay_us(uint us)函数

    void Delay_us(uint us)
    {		
    	uint temp;	    	 
    	SysTick->LOAD = us * tick_us;  // 滴答9次就是1us
    	SysTick->VAL  = 0x00;           // 赋初值为"0"
    	SysTick->CTRL = 0x01 ;          // 开启定时器
    	do
    	{
                temp = SysTick->CTRL;
    	}
    	while( (temp&0x01) && (!(temp&(1<<16))) );
    	SysTick->CTRL = 0x00;          // 停止计数器
    	SysTick->VAL  = 0x00;          // 清空计数器
    }
    

    以上函数则实现了us定时。
    当然也可以使用它的中断函数:

    /**
      * @brief  This function handles SysTick Handler.
      * @param  None
      * @retval None
      */
    void SysTick_Handler(void)
    {
        // 要做什么,自行发挥。
    }
    

    参考链接

    此文章参考借鉴了"ARM KEIL"官方文档:"System Tick Timer" 。

    至此,记录完毕

    记录时间:2016-12-29
    记录地点:深圳WZ

  • 相关阅读:
    Linux 如何在镜像文件里面创建分区
    PostgreSQL主从配置
    nginx跨域配置2022
    小程序 canvas 拼接图片 下载图片 海报 新版 旧版 版本库2.9
    Invalid Host header nginx vue
    springboot使用@Async注解时异步方法不生效原因分析及解决方案
    Java stream().map()将对象转换为其他对象
    java Synchonized 锁的特性
    Springboot tomcat 多线程 模型 web容器 模型 并发模型 Java
    mysql 8.0 绿色版 在windows上的使用
  • 原文地址:https://www.cnblogs.com/ChYQ/p/6232603.html
Copyright © 2020-2023  润新知