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

第五十四章:CH32V103应用教程——TIM-时钟输入选择

[复制链接]

  离线 

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

    [LV.4]

    发表于 2021-4-30 11:37:54 | 显示全部楼层 |阅读模式

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

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

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

    本章教程通过高级定时器TIM1选择时钟输入,并通过两种外部时钟源进行演示。


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

    时钟输入选择
    CH32V CH573单片机芯片-第五十四章:CH32V103应用教程——TIM-时钟输入选择risc-v单片机中文社区(1)

    由上图可知,定时器TIM的CK_PSC(预分频器时钟)的时钟来源具有以下4种:

    1、内部时钟源(CK_INT)
    如果将定时器从模式控制寄存器(TIMx_SMCFGR)SMS域设置为000时,由内部时钟CK_INT驱动,即选定内部时钟源(CK_INT)为时钟,此时时钟CK_INT就是CK_PSC。

    2、外部时钟源模式1
    如果将定时器从模式控制寄存器(TIMx_SMCFGR)SMS域设置为111时,就会启用外部时钟源模式1。启用外部时钟源模式1时,TRGI 被选定为CK_PSC的来源,值得注意的,还需要通过配置 TS 域来选择 TRGI 的来源。TS 域可选择以下几种脉冲作为时钟来源:
    1)内部触发(ITRx,x 为 0,1,2,3);
    2)比较捕获通道 1 经过边缘检测器后的信号(TI1F_ED);
    3)比较捕获通道的信号 TI1FP1、TI2FP2;
    4)来自外部时钟引脚输入的信号 ETRF。

    3、外部时钟源模式2
    如果将定时器从模式控制寄存器(TIMx_SMCFGR)SMS域设置为111且将ECE位置1时,将会启用外部时钟源模式2,。使用外部触发模式 2 能在外部时钟引脚输入的每一个上升沿或者下降沿计数。使用外部时钟源模式2时,ETRF被选定为CK_PSC。ETR引脚经过可选的反相器(ETP),分频器(ETPS)后成为ETRP,再经过滤波器(ETF)后即成为ETRF。

    4、编码器模式
    如果将定时器从模式控制寄存器(TIMx_SMCFGR)SMS域设置为001、010、011时将会启用编码器模式。启用编码器模式可以选择在 TI1FP1 和 TI2FP2中某一个特定的电平下以另一个跳变沿作为信号进行信号输出。此模式用于外接编码器使用的情况下。具体功能可参考CH32V103应用手册14.3.9节。

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


    2、硬件设计

    本章教程主要进行时钟输入选择,将两种外部时钟源作为时钟输入选择,需用到PA8引脚和PA12引脚。实验时只需将外部时钟分别于PA8引脚和PA12引脚连接即可。


    3、软件设计

    本章教程主要进行时钟选择实验,具体程序如下:
    tim.h文件
    1. #ifndef __TIM_H
    2. #define __TIM_H

    3. #include "ch32v10x_conf.h"


    4. /* External Clock Mode Definition */
    5. #define ETR_CLK_MODE1   0
    6. #define ETR_CLK_MODE2   1

    7. /*  External Clock Mode Selection */
    8. #define ETR_CLK ETR_CLK_MODE1
    9. //#define ETR_CLK ETR_CLK_MODE2

    10. void TIM1_ETRClockMode1_Init(void);
    11. void TIM1_ETRClockMode2_Init(void);

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

    1. #include "tim.h"

    2. /*******************************************************************************
    3. * Function Name  : TIM1_ETRClockMode1_Init
    4. * Description    : Configures the External clock Mode1.
    5. * Input          : None
    6. * Return         : None
    7. *******************************************************************************/
    8. void TIM1_ETRClockMode1_Init(void)
    9. {
    10.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );

    11.     TIM_CounterModeConfig( TIM1, TIM_CounterMode_Up );  //设置计数模式为向上计数

    12.     TIM_SetAutoreload( TIM1, 0x3EB );  //设置计数器重装载值

    13.     //配置外部时钟源模式1
    14.     TIM_ETRClockMode1Config( TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0x0 );

    15.     /* GPIOA8 Input as TIM Clock Source */
    16.     TIM_TIxExternalClockConfig( TIM1, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0x00);
    17.     TIM_Cmd( TIM1, ENABLE );
    18. }


    19. /*******************************************************************************
    20. * Function Name  : TIM1_ETRClockMode2_Init
    21. * Description    : Configures the External clock Mode2.
    22. * Input          : None
    23. * Return         : None
    24. *******************************************************************************/
    25. void TIM1_ETRClockMode2_Init(void)
    26. {
    27.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );

    28.     TIM_CounterModeConfig( TIM1, TIM_CounterMode_Up );
    29.     TIM_SetAutoreload( TIM1, 0x3EB );

    30.     /* GPIOA12 Input as TIM Clock Source */
    31.     TIM_ETRClockMode2Config( TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0x0 );
    32.     TIM_SelectInputTrigger( TIM1, TIM_TS_ETRF );
    33.     TIM_Cmd( TIM1, ENABLE );
    34. }
    复制代码
    tim.c文件主要进行两种外部时钟的配置。
    TIM1_ETRClockMode1_Init函数为外部时钟源模式1配置函数,具体如下:
    1. void TIM1_ETRClockMode1_Init(void)
    2. {
    3.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );

    4.     TIM_CounterModeConfig( TIM1, TIM_CounterMode_Up );  //设置计数模式为向上计数

    5.     TIM_SetAutoreload( TIM1, 0x3EB );  //设置计数器重装载值

    6.     //配置外部时钟源模式1
    7.     TIM_ETRClockMode1Config( TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0x0 );

    8.     /* GPIOA8 Input as TIM Clock Source */
    9.     TIM_TIxExternalClockConfig( TIM1, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0x00);
    10.     TIM_Cmd( TIM1, ENABLE );
    11. }
    复制代码
    • 首先对定时器计数模式和重装载值进行配置,向上计数模式,重装载值为0x3EB;
    • TIM_ETRClockMode1Config函数为外部时钟源模式1初始化配置函数,其有4个输入,分别为TIMx:指定定时器外设,此处为TIM1;
    • TIM_ExtTRGPrescaler:外部触发信号分频,此处为TIM_ExtTRGPSC_OFF,即关闭预分频;
    • TIM_ExtTRGPolarity:ETR触发极性选择,此处为TIM_ExtTRGPolarity_Inverted,即ETR,高电平或上升沿有效;
    • ExtTRGFilter:外部触发滤波,此处为0x0,即为无滤波器。

    TIM_ETRClockMode1Config函数具体函数如下:

    1. void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
    2.                              uint16_t ExtTRGFilter)
    3. {
    4.   uint16_t tmpsmcr = 0;

    5.   //配置TIMx外部触发器(ETR)。
    6.   TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);

    7.   tmpsmcr = TIMx->SMCFGR;

    8.   //TIM_SMS值为0x0007,取反后&上 从模式控制寄存器(TIMx_SMCFGR),即将从模式控制寄存器(TIMx_SMCFGR)SMS域清0;
    9.   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS));

    10.   //TIM_SlaveMode_External1值为0x0007,| 上 从模式控制寄存器(TIMx_SMCFGR),即即将 从模式控制寄存器(TIMx_SMCFGR)SMS域设置为111,即选择外部时钟模式1
    11.   tmpsmcr |= TIM_SlaveMode_External1;

    12.   //TIM_TS值为0x0070,取反后&上 从模式控制寄存器(TIMx_SMCFGR),即将从模式控制寄存器(TIMx_SMCFGR)TS域清0;
    13.   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS));

    14.   //TIM_TS_ETRF值为0x0070,| 上 从模式控制寄存器(TIMx_SMCFGR),即即将 从模式控制寄存器(TIMx_SMCFGR)TS域设置为111,即选择外部触发输入(ETRF)
    15.   tmpsmcr |= TIM_TS_ETRF;

    16.   TIMx->SMCFGR = tmpsmcr;   //从模式控制寄存器配置
    17. }
    复制代码
    其主要针对从模式控制寄存器(TIMx_SMCFGR)各个位进行配置,其中TIM_ETRConfig函数主要针对从模式控制寄存器(TIMx_SMCFGR)高8位进行配置,具体如下:
    1. void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
    2.                    uint16_t ExtTRGFilter)
    3. {
    4.   uint16_t tmpsmcr = 0;

    5.   tmpsmcr = TIMx->SMCFGR;

    6.   //SMCFGR_ETR_Mask值为0x00FF,即清除从模式控制寄存器(TIMx_SMCFGR)高8位,高8位置0,低8位保持不变
    7.   tmpsmcr &= SMCFGR_ETR_Mask;

    8.   //对从模式控制寄存器(TIMx_SMCFGR)高8位外部触发滤波、ETR触发极性选择、外部触发信号分频进行配置
    9.   tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8)));

    10.   TIMx->SMCFGR = tmpsmcr;
    11. }
    复制代码
    TIM1_ETRClockMode2_Init函数与TIM1_ETRClockMode1_Init函数类似,在此不再介绍;
    main.c文件
    1. int main(void)
    2. {
    3.     USART_Printf_Init(115200);
    4.     printf("SystemClk:%d\r\n",SystemCoreClock);

    5. #if (ETR_CLK == ETR_CLK_MODE1)
    6.     TIM1_ETRClockMode1_Init( );

    7. #elif (ETR_CLK == ETR_CLK_MODE2)
    8.     TIM1_ETRClockMode2_Init( );

    9. #endif

    10.     while(1)
    11.     {
    12.         if( TIM_GetFlagStatus( TIM1, TIM_FLAG_CC1 ) != RESET )
    13.         {
    14.             TIM_ClearFlag( TIM1, TIM_FLAG_CC1 );
    15.         }

    16.         if( TIM_GetFlagStatus( TIM1, TIM_FLAG_Update ) != RESET )
    17.         {
    18.             printf("Count Update\r\n");

    19.             TIM_ClearFlag( TIM1, TIM_FLAG_Update );
    20.         }

    21.     }
    22. }
    复制代码
    main.c文件主要进行两种外部时钟源模式的选择以及初始化。


    4、下载验证

    将编译好的程序下载到开发版,并将PA8引脚或PA12与外部时钟进行连接,开发板上电后,串口打印如下:

    CH32V CH573单片机芯片-第五十四章:CH32V103应用教程——TIM-时钟输入选择risc-v单片机中文社区(2)

    53、TIM-时钟选择.rar
    CH32V CH573单片机芯片-第五十四章:CH32V103应用教程——TIM-时钟输入选择risc-v单片机中文社区(3) 53、TIM-时钟选择.rar (474.87 KB, 下载次数: 12)
    链接:https://pan.baidu.com/s/1NhY-YuZIG0VYnFhYDrPX9A
    提取码:u4ha
    复制这段内容后打开百度网盘手机App,操作更方便哦





    上一篇:五十三章:CH32V103应用教程——SPI-DMA
    下一篇:第五十五章:CH32V103应用教程——TIM-互补输出和死区插入
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-4-16 16:47 , Processed in 0.788205 second(s), 48 queries .

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