查看: 1304|回复: 0
收起左侧

第五十八章:TIM-定时器和外部触发的同步

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-30 12:43:59 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 17:48 编辑

    CH32V103应用教程——TIM-定时器和外部触发的同步

    本章教程演示当TIM1_CH1(即PA8引脚)检测到上升沿时,在不同从模式下,TIM1的不同工作方式。具体如下:
    复位模式:TIM1->CNT 复位重新计数
    门控模式:PA8引脚输入低电平,TIM1->CNT 正常计数,否则停止计数。
    触发模式:TIM1->CNT 继续计数。


    1、TIM简介及相关函数介绍

    定时器TIM能够在复位模式、门控模式和触发模式三种模式下和一个外部的触发同步。三种模式下和外部触发同步的具体介绍如下:

    1、从模式:复位模式
    在发生一个触发输入事件时,计数器和预分频器可以被重新初始化;同时,如果控制寄存器1(TIMx_CTLR1)的URS位置0,则会产生一个更新事件UEV;此外,自动重装值寄存器(TIMx_ATRLR)和比较/捕获寄存器(TIMx_CHxCVR)也会被更新。

    下述配置例程中, TI1输入端的上升沿导致向上计数器被清零:

    ● 配置通道1检测TI1的上升沿。配置输入滤波器的带宽(本章例程不需要任何滤波器,因此设置比较/捕获控制寄存器1(TIM1_CHCTLR1)IC1F域为0000)。在触发操作中不使用捕获预分频器,因此不需要进行配置。设置比较/捕获控制寄存器1(TIM1_CHCTLR1)CC1S域值为01,只选择输入捕获源。设置比较/捕获使能寄存器中位CC1P值为0确定极性,即只检测上升沿。
    ● 设置从模式控制寄存器(TIM1_SMCFGR)中SMS域值为100,即选择从模式为复位模式,触发输入(TRGI)的上升沿将初始化计数器,并且产生一个更新寄存器的信号;设置从模式控制寄存器(TIM1_SMCFGR)中TS域值为101,即选择滤波后的定时器输入1(TI1FP1)用于同步计数器的触发输入源。
    ● 设置控制寄存器1(TIM1_CTLR1)的CEN位值为1,使能计数器。计数器开始依据内部时钟计数,然后正常运转直到TI1出现一个上升沿;此时,计数器被清零然后从0重新开始计数。同时,中断状态寄存器(TIM1_INTFR)中的TIF位被置1,即触发器事件产生,然后根据DMA/中断使能寄存器(TIM1_DMAINTENR)中的TIE位的值和TDE位的值产生一个中断请求或一个DMA请求。

    下图显示当自动重装值寄存器(TIMx_ATRLR)的值为0x36时的动作。在TI1上升沿和计数器的实际复位之间的延时取决于TI1输入端的重同步电路。
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(1)

    2、从模式:门控模式
    根据选中的输入端电平使能计数器。
    在下面配置例程中,当TI1为低电平时,计数器向上计数:

    ● 配置通道1检测TI1的低电平。配置输入滤波器的带宽(本章例程不需要任何滤波器,因此设置比较/捕获控制寄存器1(TIM1_CHCTLR1)IC1F域为0000)。在触发操作中不使用捕获预分频器,因此不需要进行配置。设置比较/捕获控制寄存器1(TIM1_CHCTLR1)CC1S域值为01,只选择输入捕获源。设置比较/捕获使能寄存器中位CC1P值为1确定极性,即只检测低电平。
    ● 设置从模式控制寄存器(TIM1_SMCFGR)中SMS域值为101,即选择从模式为门控模式,当触发输入(TRGI)为高时,计数器的时钟开启;在触发输入变为低,计数器停止,计数器的启停都是受控的。设置从模式控制寄存器(TIM1_SMCFGR)中TS域值为101,即选择滤波后的定时器输入1(TI1FP1)用于同步计数器的触发输入源。
    ● 设置控制寄存器1(TIM1_CTLR1)的CEN位值为1,使能计数器。在门控模式下,如果CEN=0,则计数器不能启动,不论触发输入电平如何。一旦使能计数器,只要TI1为低,计数器开始依据内部时钟计数,一旦TI1变高则停止计数。当计数器开始或停止时中断状态寄存器(TIM1_INTFR)中的TIF位被置1。

    TI1上升沿和计数器实际停止之间的延时取决于TI1输入端的重同步电路。
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(2)

    3、从模式:触发模式
    根据输入端上选中的事件使能计数器。
    在下面配置例程中,计数器在TI2输入的上升沿开始向上计数:

    ● 配置通道2检测TI2的上升沿。配置输入滤波器的带宽(本章例程不需要任何滤波器,因此设置比较/捕获控制寄存器1(TIM1_CHCTLR1)IC2F域为0000)。在触发操作中不使用捕获预分频器,因此不需要进行配置。设置比较/捕获控制寄存器1(TIM1_CHCTLR1)CC2S域值为01,只选择输入捕获源。设置比较/捕获使能寄存器中位CC2P值为1确定极性,即只检测低电平。
    ● 设置从模式控制寄存器(TIM1_SMCFGR)中SMS域值为110,即选择从模式为触发模式,即计数器在触发输入TRGI的上升沿启动,只有计数器的启动是受控的。设置从模式控制寄存器(TIM1_SMCFGR)中TS域值为110,即选择滤波后的定时器输入2(TI2FP2)用于同步计数器的触发输入源。当TI2出现一个上升沿时,计数器开始在内部时钟驱动下计数,同时中断状态寄存器(TIM1_INTFR)中的TIF位被置1,即触发器事件产生。
    TI2上升沿和计数器启动计数之间的延时,取决于TI2输入端的重同步电路。
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(3)

    4、从模式:外部模式2+触发模式
    外部时钟模式2可以与另一种从模式(外部时钟模式1和编码器模式除外)一起使用。此时,外部时钟引脚(ETR)信号被用作外部时钟的输入,在复位模式、门控模式或触发模式时可以选择另一个输入作为触发输入。不建议通过设置从模式控制寄存器(TIM1_SMCFGR)中TS域的值选择外部触发输入(ETRF)作为同步计数器的触发输入源。

    在下面配置例程中,一旦在TI1上出现一个上升沿,计数器即在ETR的每一个上升沿向上计数一次:

    1)通过设置从模式控制寄存器(TIM1_SMCFGR)配置外部触发输入电路:
    ─ ETF=0000:没有滤波
    ─ ETPS=00:不用预分频器
    ─ ETP=0:检测ETR的上升沿,置ECE=1使能外部时钟模式2。
    2)按如下配置通道1,检测TI的上升沿:
    ─ 设置比较/捕获控制寄存器1(TIM1_CHCTLR1)IC1F域值为0000,即没有滤波
    ─ 触发操作中不使用捕获预分频器,不需要配置
    ─ 设置比较/捕获控制寄存器1(TIM1_CHCTLR1)中CC1S域的值为01,选择对应输入捕获源
    ─ 设置比较/捕获使能寄存器(TIM1_CCER)中位CC1P的值为0确定极性(只检测上升沿)
    3)设置从模式控制寄存器(TIM1_SMCFGR)中SMS域值为110,即选择从模式为触发模式,即计数器在触发输入TRGI的上升沿启动,只有计数器的启动是受控的。设置从模式控制寄存器(TIM1_SMCFGR)中TS域值为101,即选择滤波后的定时器输入1(TI2FP1)用于同步计数器的触发输入源。当TI1上出现一个上升沿时,中断状态寄存器(TIM1_INTFR)中的TIF位被置1,计数器开始在ETR的上升沿计数。

    ETR信号的上升沿和计数器实际复位间的延时,取决于外部触发信号(ETRP)输入端的重同步电路。
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(4)

    关于CH32V103 TIM具体信息,可参考CH32V103应用手册。TIM标准库函数在第七章节已介绍,在此不再赘述。


    2、硬件设计

    本章教程演示当TIM_CH1(PA8)引脚检测到上升沿时,在不同从模式下,TIM1的不同工作方式。因此需要将PA8引脚外部触发输入源所在引脚进行连接。


    3、软件设计

    本章教程演示当TIM_CH1(PA8)引脚检测到上升沿时,在不同从模式下,TIM1的不同工作方式。具体程序如下:
    tim.h文件
    1. #ifndef __TIM_H
    2. #define __TIM_H

    3. #include "ch32v10x_conf.h"

    4. /* Slave Mode Definition */
    5. #define RESET_MODE      0
    6. #define GATED_MODE      1
    7. #define TRIGGER__MODE   2

    8. /*  Slave Mode Selection */
    9. //#define SLAVE_MODE   RESET_MODE
    10. //#define SLAVE_MODE   GATED_MODE
    11. #define SLAVE_MODE   TRIGGER__MODE

    12. void TIM1_Synchro_ExtTrigger_Init( u16 arr, u16 psc );

    13. #endif
    复制代码
    tim.h文件主要进行相关宏定义和函数声明;
    tim.c文件
    1. #include "tim.h"

    2. /*******************************************************************************
    3. * Function Name  : TIM1_Synchro_ExtTrigger_Init
    4. * Description    : Initializes TIM1 external trigger synchronization.
    5. * Input          : arr: the period value.
    6. *                  psc: the prescaler value.
    7. * Return         : None
    8. *******************************************************************************/
    9. void TIM1_Synchro_ExtTrigger_Init( u16 arr, u16 psc )
    10. {
    11.     GPIO_InitTypeDef GPIO_InitStructure;
    12.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    13.     TIM_ICInitTypeDef TIM_ICInitStructure;

    14.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE );

    15.     //GPIO初始化配置
    16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  //输入下拉
    18.     GPIO_Init( GPIOA, &GPIO_InitStructure);
    19.     GPIO_ResetBits( GPIOA, GPIO_Pin_8 );  //将PA8引脚拉低

    20.     //时基结构体初始化配置
    21.     TIM_TimeBaseInitStructure.TIM_Period = arr;  //设置自动重装载寄存器的值
    22.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;  //设置定时器预分频器值
    23.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //设置时钟分频因子,配置死区时间时需要用到
    24.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //设置计数器计数模式,向上计数
    25.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter =  0x00;  //设置重复计数器的值,没用到不用管
    26.     TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);  //初始化定时器

    27.     //输入捕获结构体初始化
    28.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;  //配置输入捕获通道,根据具体GPIO配置
    29.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //设置输入的需要被捕获的信号的分频系数
    30.     TIM_ICInitStructure.TIM_ICFilter = 0x00;  //设置输入的需要被捕获的信号的滤波系数
    31.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //配置输入捕获信号的极性
    32.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  //设置输入通道和捕获通道的映射关系
    33.     TIM_ICInit( TIM1, &TIM_ICInitStructure );  //定时器输入捕获初始化

    34.     TIM_SelectInputTrigger( TIM1, TIM_TS_TI1FP1 );  //选择输入触发源

    35. #if (SLAVE_MODE == RESET_MODE)
    36.     TIM_SelectSlaveMode( TIM1, TIM_SlaveMode_Reset );  //复位模式

    37. #elif (SLAVE_MODE == GATED_MODE)
    38.     TIM_SelectSlaveMode( TIM1, TIM_SlaveMode_Gated );  //门控模式

    39. #elif (SLAVE_MODE == TRIGGER__MODE)
    40.     TIM_SelectSlaveMode( TIM1, TIM_SlaveMode_Trigger );  //触发模式

    41. #endif

    42.     TIM_SelectMasterSlaveMode( TIM1, TIM_MasterSlaveMode_Enable );  //使能开启定时器1与其从机之间的同步(通过TRGO)

    43. #if (SLAVE_MODE != TRIGGER__MODE)
    44.     TIM_Cmd( TIM1, ENABLE );  //使能开启TIM1

    45. #endif
    46. }<span style="font-family: 宋体; font-size: large; text-indent: 24pt; background-color: rgb(255, 255, 255);"> </span>
    复制代码
    tim.c文件主要进行定时器相关初始化配置以及各种从模式的选择。其中在模式选择中,TIM_SelectSlaveMode函数主要进行对从模式的选择,TIM_SelectSlaveMode函数具体如下:
    1. void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)
    2. {
    3.   TIMx->SMCFGR &= (uint16_t)~((uint16_t)TIM_SMS);
    4.   TIMx->SMCFGR |= TIM_SlaveMode;
    5. }
    复制代码
    TIM_SelectSlaveMode函数主要对从模式控制寄存器(TIM1_SMCFGR)进行配置。

    由函数可知,首先第一步对TIM_SMS值进行取反,TIM_SMS 值为0x0007,取反之后值为0xFFF8,从模式控制寄存器&上0xFFF8之后对从模式控制寄存器(TIM1_SMCFGR)SMS域进行清0,然后根据所选择模式对SMS域进行配置。

    比如:当所选模式为复位模式,复位模式TIM_SlaveMode_Reset的值为0x0004,即SMS域值为100,即为复位模式,触发输入(TRGI)的上升沿将初始化计数器,并且产生一个更新寄存器的信号。其他模式与复位模式类似,在此不再介绍。

    main.c文件
    1. int main(void)
    2. {
    3.     USART_Printf_Init(115200);
    4.     printf("SystemClk:%d\r\n",SystemCoreClock);

    5.     TIM1_Synchro_ExtTrigger_Init( 0xFFFF, 48000-1);

    6.     while(1)
    7.     {
    8.         printf("cnt:%d\r\n", TIM1->CNT);
    9.     }
    10. }
    复制代码
    main.c文件主要进行函数初始化以及打印输出计数器的值。


    4、下载验证

    将编译好的程序下载到开发版并复位,在不同模式下,串口打印如下:
    1、复位模式:当PA8引脚检测到上升沿,计数器复位重新计数;
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(5)
    2、门控模式:当PA8引脚输入高电平时,计数器正常计数,否则停止计数
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(6)
    3、触发模式:当PA8引脚检测到上升沿,计数器继续计数;
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(7)

    57、TIM-从模式.rar
    CH32V CH573单片机芯片-第五十八章:TIM-定时器和外部触发的同步risc-v单片机中文社区(8) 57、TIM-从模式.rar (466.54 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/1oQ-grziISLa22BljQnWfXQ
    提取码:584l
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第五十七章:CH32V103应用教程——TIM-输出比较
    下一篇:第五十九章:CH32V103应用教程——TIM-定时器同步
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-25 03:10 , Processed in 1.239711 second(s), 48 queries .

    快速回复 返回顶部 返回列表