• STM8S自学笔记-008 定时器


    STM8S自学笔记-009.定时器


    【修订记录】
    1、20231010,第一版,双十节快乐
    2、20231021,第二版,表述修正

    配置方法

    STM8S的定时器有多种配置方法,但今天只讨论定时中断的配置。

    底层

    以定时器TIM4为例,我们希望能用一个函数初始化定时器并起动它。
    TIM4的情况如下:
    TIM4是一个8bit的计时器,时钟源是F_master。TIM4的分频系数DIVx有8种:1、2、4、8、16、32、64、128。在计数器溢出(即计数值TIM4_CNT等于计数上限TIM4_ARR)时,能够产生计数器溢出中断。

    函数功能要求:

    1. 入口参数1:中断频率,单位Hz。
      这里暗含一个数值的限制条件,因为计时频率绝无可能大于CPU频率F_Master。
    2. 入口参数2:中断优先级。
      同样,这个参数是有范围的,即LV0~LV4。LV0表示没有中断
    3. 如果入口参数正确,函数内部要能根据这些参数,自动配置分频系数DIVx、计数上限TIM4_ARR和中断优先级。
      分频系数配置原则:在分频系数尽可能小的情况下,使相应的计数上限的值刚好不超过TIM4_ARR的最大值(255)——这样做的目的是保证计时分辨率尽可能大,也就是保证计时精度尽可能高。

    定时器初始化函数:

    /**
      * @brief  按照指定的参数初始化TIM4
      * @param  frequency - 中断频率
      * @param  priority - 中断优先级
      * @retval None
      */
    void TIM4_PeriodicPriority(uint32_t frequency, uint8_t priority)
    {
        uint8_t i;
        const uint8_t div_tim4[8]   = { 1, 2, 4, 8, 16, 32, 64, 128};
        const uint8_t div_cfg[8]    = { TIM4_PRESCALER_1, TIM4_PRESCALER_2, 
                                        TIM4_PRESCALER_4, TIM4_PRESCALER_8,
                                        TIM4_PRESCALER_16, TIM4_PRESCALER_32, 
                                        TIM4_PRESCALER_64, TIM4_PRESCALER_128};
        uint32_t arr_tim4 = 0;
        uint8_t check = NG;
        //中断优先级参数检查
        if (priority != ITC_PRIORITYLEVEL_0
            && priority != ITC_PRIORITYLEVEL_1
                && priority != ITC_PRIORITYLEVEL_2
                    && priority != ITC_PRIORITYLEVEL_3){
            check = NG;
            return;
        }
        //中断频率参数检查
        if (frequency > CLK_GetClockFreq())
        {
            check = NG;
            return;
        }
        //分频系数越大,计时分辨率越低,但频率范围变大
        for (i = 0; i < sizeof(div_tim4); i++)
        {
            arr_tim4 = (CLK_GetClockFreq() / div_tim4[i]) / frequency;  //t = 1/f, t/1 = ARR/(SYSCLK/TIM4DIV)
            if (arr_tim4 <= 255)
            {
                check = OK;
                break;
            }
        }
        if (check != OK)
        {
            return;
        }
        TIM4_DeInit();
        TIM4_TimeBaseInit((TIM4_Prescaler_TypeDef)div_cfg[i], arr_tim4);
        TIM4_ClearFlag(TIM4_FLAG_UPDATE);
        //TIM4_ARRPreloadConfig(ENABLE);
        ITC_SetSoftwarePriority(ITC_IRQ_TIM4_OVF, (ITC_PriorityLevel_TypeDef)priority);
        TIM4_ITConfig (TIM4_IT_UPDATE, ENABLE);
        enableInterrupts();
        TIM4_Cmd(ENABLE);
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    实际上,可以为上述函数增加1个返回值:只在 参数都正确 & 分频器配置成功 时才返回OK,其他情况一律返回NG。

    至于中断服务函数,一般都在stm8s_it.c中,TIM4的中断服务函数也不例外,下面给出示例

    /**
      * @brief Timer4 Update/Overflow Interrupt routine.
      * @param  None
      * @retval None
      */
     INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
     {
      /* In order to detect unexpected events during development,
         it is recommended to set a breakpoint on the following instruction.
      */
         if (TIM4_GetFlagStatus(TIM4_FLAG_UPDATE) == SET)
         {
             TIM4_ClearFlag(TIM4_FLAG_UPDATE);
             tim_ms[0] ++;		//当计时频率1000Hz能够配置成功时,每次累加刚好表示时间经过了1ms
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    games101-3 BRDF101
    Linux 学习笔记 2022-11-12---------Linux基础
    java计算机毕业设计中小型超市管理系统录像补源程序+mysql+系统+lw文档+远程调试
    Python框架篇(1):FastApi-快速入门
    532.数组中的k-diff数对 Python&Java 哈希表、双指针双解
    java计算机毕业设计销售管理系统演示录像源码+系统+数据库+lw文档
    AI定义汽车,长城画了个看得见的“饼”
    文心一言 VS 讯飞星火 VS chatgpt (121)-- 算法导论10.4 2题
    Android-Room使用和迁移
    【奇想星球】重磅!我们的AIGC共创社区平台上线了!
  • 原文地址:https://blog.csdn.net/weixin_43572492/article/details/133758641