7 Timer

1简介

Timer即定时器,与SysTick定时器不同的是,并非ARM Cortex-M3/M4处理器都有,而是某一些开发板特有的,且数量和类别存在一定差别。

GD32450i-EVAL开发板共有14个定时器,分别为TIMER0-TIMER13,其中有2个高级定时器,10个通用定时器,2个基本定时器,具体如表1所示。

表1 GD32450i-EVAL开发板定时器

定时器编号0、71、2、3、48、119、10、12、135、6

类型高级通用L0通用L1通用L2基本

预分频数16位16位16位16位16位

计数器位数16位32位(1、4)

16位(2、3)16位16位16位

捕获/比较通道数44210

计数模式向上、

中央对齐、

向下、向上、

中央对齐、

向下、向上向上向上

2 定时器分类

定时器按照分类分为基本定时器、通用定时器、高级定时器,其中通用定时器包括通用定时器L0、L1、L2。

定时器都具有16位可编程预分频器、16位无符号计数器、自动重载计数器。

2.1基本定时器

基本定时器结构较为简单,主要包括两个功能,(1)基本定时功能,生成时基;(2)用于驱动数模转换器,定时器5和定时器6,功能完全一样,但是所用资源彼此完全独立,可以同时使用。

基本定时器具有以下特性:

时钟源:内部时钟;

可产生DMA请求,TRGO连接到DAC;

触发DAC的同步电路;

中断/DMA请求:更新事件;

其结构框图如图1所示。

图1基本定时器结构框图

2.2通用定时器

通用定时器可被同步形成一个更大的定时器。通用定时器包括通用定时器L0、通用定时器L1、通用定时器L2。除上述表1中提到的,三者存在相同之处也存在一定区别。

2.2.1通用寄存器共同特性

时钟源可选:内部时钟、内部触发、外部输入、外部触发。

每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式。

2.2.1通用寄存器特性差异

(1)通用定时器L0

4通道定时器,支持输入捕获、输出比较、产生PWM信号控制电机和电源管理;

正交编码器接口:被用来追踪运动和分辨旋转方向和位置;

霍尔传感器接口:用来做三相电机控制;

中断输出和DMA请求:更新事件,触发事件,比较/捕获事件;

多个定时器的菊链使得一个定时器可以同时启动多个定时器。

图2通用计时器L0结构框图

(2)通用定时器L1

中断输出:更新事件,触发事件,比较/捕获事件和中止事件;

多个定时器的菊链使得一个定时器可以同时启动多个定时器;

定时器的同步允许被选择的定时器在同一个时钟周期开始计数;

定时器主/从模式控制器。

图3通用计时器L1结构框图

(3)通用定时器L2

中断输出:更新事件,触发事件,比较/捕获事件和中止事件。

图4通用计时器L2结构框图

2.3高级定时器

高级寄存器相对于基本定时器以及高级定时器具有更强大的功能。具体如下所示:

正交编码器接口:被用来追踪运动和分辨旋转方向和位置;

霍尔传感器接口:用来做三相电机控制;

每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式;

可编程的死区时间;

可编程的计数器重复功能;

中止输入功能使定时器按照用户的配置输出;

中断输出和DMA请求:更新事件,触发事件,比较/捕获事件和中止事件;

多个定时器的菊链使得一个定时器可以同时启动多个定时器;

定时器的同步允许被选择的定时器在同一个时钟周期开始计数;

定时器主/从模式控制器。

其结构如图5所示。

图5高级定时器结构框图

3功能描述

可见定时器具有很多功能,下面仅对几个常见的基础功能加以介绍。

3.1时基

时基即时间基准,就是一个时间显示的基本单位。时基单元包括计数器寄存器,预分频器寄存器,自动重载寄存器。计数器、自动重载寄存器和预分频器寄存器都可以通过软件进行读写,即使在计数器运行时。

3.2时钟源

对于基本定时器时钟源有内部时钟源提供,对于通用定时器和高级寄存器,其时钟源可以有内部时钟源或者由从模式寄存器(SMC)控制复用的时钟源驱动。包括内部时钟源、外部时钟模式0和外部时钟模式1。

3.3预分频器

计数器的时钟可以通过预分频器进行1到65536之间任意值分频,分频后的时钟驱动计数器计数,分频系数受预分频寄存器控制,其带有缓冲器,可以在运行时被改变。新的预分频器的参数在下一次更新事件到来时被使用。

3.4计数模式

计数模式共分为三种,包括向上计数模式、向下计数模式、中央对齐模式,对于不同类别的计数器,其具有的计数器模式各不相同,具体如表1所示。

(1)向上计数模式

向上计数模式即计数器从0开始向上连续计数到自动加载值(定义在自动重载寄存器中),并生成计数器上溢事件,当计数到自动重载值时,会重新从0开始计数。每次计数器上溢时会生成更新事件。但是如果设置了重复计数器,在(TIMERx_CREP+1)次上溢后产生更新事件。当产生更新事件时,所有寄存器都将被更新。

(2)向下计数模式

与向上计数方式相反,该模式下,计数器从自动重载值向下连续计数到0(倒计时),并生成计数器下溢事件,当计数器到0时,会重新开始计数,每次计数器下溢时会产生更新事件。但是如果设置了重复计数器,在(TIMERx_CREP+1)次上溢后产生更新事件。当产生更新事件时,所有寄存器都将被更新。

(3)中央对齐模式

与前两者不同,该模式下,计数器交替的从0开始向上计数到自动加载值,然后在向下计数到0。向上计数时,定时器模块在计数器计数到自动加载值-1时产生一个上溢事件;向下计数时定时器在计数器计数到1时产生一个下溢事件。在中央计数模式中,寄存器中的计数方向控制位设置为只读。计数方向被硬件自动更新。将SWEVG寄存器的UPG位置1时可以初始化计数值为0,并产生一个更新事件。

3.5重复计数器

重复计数器是用来在N+1个计数器周期之后产生更新事件,更新定时器的寄存器。向上计数模式下,重复计数器在每次计数器上溢时递减;向下计数模式下,冲反复计数器在每次计数器下溢时递减;中央对齐模式下,重复计数器在计数器上溢和下溢时递减。

3.6捕获/比较输出通道

定时器的通道用于捕获输入或比较输出是否匹配,通道围绕一个通道捕获比较寄存器简历,包括一个输入级、通道控制器和输出级。

捕获模式允许通道测量一个波形时序、频率、周期、占空比等,输入级包括一个数字滤波器、一个通道极性选择、边沿检测和一个通道预分频器。如果在输入引脚上出现被选择的边沿,TIMERx_CHxCV寄存器会捕获计数器当前的值,同时CHxIF位被置1,如果CHxIE = 1则产生通道中断。

通道输入信号CIx先被TIMER_CK信号同步,然后经过数字滤波器采样,产生一个被滤波后的信号。通过边沿检测器,可以选择检测上升沿或者下降沿。通过配置CHxP选择使用上升沿或者下降沿。配置CHxMS.,可以选择其他通道的输入信号,内部触发信号。配置IC预分频器,使得若干个输入事件后才产生一个有效的捕获事件。捕获事件发生,CxC存储计数器的值。

配置主要包括5步:滤波器配置、边沿选择、捕获源选择、中断使能、捕获使能。

在输出比较模式,TIMERx可以产生时控脉冲,其位置,极性,持续时间和频率都是可编程的。当一个输出通道的CxCV寄存器与计数器的值匹配时,根据CHxCOMCTL的配置,这个通道的输出可以被置高电平,被置低电平或者反转。当计数器的值与CxCV寄存器的值匹配时,CHxIF位被置1,如果CHxIE = 1则会产生中断,如果CxCDE=1则会产生DMA请求。

配置过程主要包括5步:时钟配置、比价模式配置、中断或DMA使能、使能定时器。

3.7 PWM模式

在PWM输出模式下,根据TIMERx_CAR寄存器和TIMERx_CHxCV寄存器的值,输出PWM波形。根据计数模式,我们可以分为两种PWM波:EAPWM(边沿对齐PWM)和CAPWM(中央对齐PWM)。EAPWM的周期由TIMERx_CAR寄存器值决定,占空比由TIMERx_CHxCV寄存器值决定。CAPWM的周期由(2*TIMERx_CAR寄存器值)决定,占空比由(2*TIMERx_CHxCV寄存器值)决定。

3.8调试模式

与SysTick定时器不同的是,当MCU进入调试模式时,计数器会根据DBG模块中的DBG_CTL2寄存器TIMERx_HOLD配置位选择继续工作与否,而不是直接伴随着内核的停止而终止,该位置1计数停止。

4示例

4.1 程序

主函数主要包括GPIO配置和时钟配置,以及延时函数用到的SysTick配置,之后就是对于呼吸灯的循环变量控制。下面主要对定时器配置加以介绍,主要包括对于两个结构体的初始化,定时器比较输出结构体以及定时器捕获输入。实现对于PWM模式0的配置,最终对于通道2实现PWM模式0,占空比为25%。

void timer_config(void)

{

timer_oc_parameter_struct timer_ocintpara; //定时器比较输出初始化结构体

timer_parameter_struct timer_initpara;    // 定时器捕获输入初始化结构体

rcu_periph_clock_enable(RCU_TIMER1);  // 使用TIM1时钟

rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); //配置定时器时钟和预分频器选择

timer_deinit(TIMER1);

timer_initpara.prescaler         = 119;   //时钟预分频器

timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  //计数器触发方式

timer_initpara.counterdirection  = TIMER_COUNTER_UP;  //计数器模式选择向上计数

timer_initpara.period            = 500;  // 定时器周期个数 自动重载值

timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;  //时钟分频因子

timer_initpara.repetitioncounter = 0;  //重复计数值

timer_init(TIMER1,&timer_initpara);  //初始化计数器

timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;  // 有效电平的极性,可以将有效电平设置成高电平或者低电平

timer_ocintpara.outputstate = TIMER_CCX_ENABLE;    //配置比较输出模式状态(使能或禁止输出)

timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;  //互补输出有效极性

timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;  //互补比较输出状态

timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;  //空闲状态下定时器输出引脚状态

timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;  //空闲状态定时器互补输出引脚状态

timer_channel_output_config(TIMER1,TIMER_CH_2,&timer_ocintpara);  //配置定时器通道输出功能

timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,0);  //配置定时器通道输出脉冲值

timer_channel_output_mode_config(TIMER1,TIMER_CH_2,TIMER_OC_MODE_PWM0);  //配置定时器通道输出比较模式

timer_channel_output_shadow_config(TIMER1,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);  //配置定时器通道输出影子寄存器

timer_auto_reload_shadow_enable(TIMER1);

timer_enable(TIMER1);

}

4.2 硬件操作

首先使用杜邦线将Timer_CH2(PB10)和LED 1(PE2)连接到一起,然后将程序下载到开发板,按复位键后可见LED灯由暗变亮,往复循环,如人的呼吸一样,因此称为呼吸灯。通过本实验可以学习到如何使用定时器输出PWM波,以及更新定时器通道寄存器的值。具体实验效果如图6以及附件视频所示。

图6 呼吸灯效果

gd32 定时器时钟_漫谈LiteOS之开发板-Timer(基于GD32450i-EVAL)相关推荐

  1. 漫谈LiteOS之开发板-串口(基于GD32450i-EVAL)

    [摘要] ​主要讲解物联网的技术积累,本期我们先带领大家学习漫谈LiteOS之漫谈开发板第一集-串口,本文基于GD32450i-EVAL对串口以及其通信做了一个简要的分析,以及开发过程中遇到的一些技术 ...

  2. 漫谈LiteOS之开发板-GPIO(基于GD32450i-EVAL)

    [摘要] 本文主要从GPIO的定义.工作模式.特色.工作场合.以及GD32450i-EVAL开发板的引脚.对应的寄存器以及GPIO的流水灯示例对GPIO加以介绍,希望对你有所帮助. 1定义 GPIO( ...

  3. 华为发布鸿蒙开发版,华为发布首款鸿蒙开发板,基于RISC-V架构,软硬生态一起抓?...

    原标题:华为发布首款鸿蒙开发板,基于RISC-V架构,软硬生态一起抓? 华为已经官宣了,6月2日将鸿蒙OS将正式转正,面向普通消费者正式升级体验,到时候华为的手机可以升级成鸿蒙了,同时华为还会带来基于 ...

  4. python 物联网开发板_物联网学什么开发板好?

    可以试试我们的三明治开发板呀!比较容易上手,你可以使用它轻松创建一款通过智能音箱语音或者手机App控制的智能硬件产品,喜欢玩DIY的知友可以体验下. 配合我们的IoT开发平台,即可快速完成智能产品de ...

  5. fpga供电电压偏低会怎样_[走近FPGA]之开发板介绍篇

    开发板概述 在走近FPGA预告篇中,我们已经提到了系列文章使用的开发平台,硬木课堂Xilinx Artix 7 FPGA板,如下图所示.它使用的FPGA芯片型号为Xilinx Artix-7 XC7A ...

  6. c语言头文件格式图片_阿波罗 STM32F767 开发板资料连载第四十九章 图片显示实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第四十九章 图片显示实验 ...

  7. nodemcu引脚_一、ESP32开发板NodeMCU-32S简介

    目录 NodeMCU-32S 引脚功能 板上资源 总结功能特点 NodeMCU-32S NodeMCU-32S是基于 ESP32-32S 模组设计的一款较为经典的ESP32开发板,个人认为较为适合初学 ...

  8. 选择的串口 _ 不存在或开发板没有连接_PC 和开发板之间传输文件

    8.1 传输文件的多种方法 在嵌入式开发中,涉及交叉编译:在 PC 上编译,在开发板上运行.所以就涉及 PC 和开发板之间的文件 传输,方法有多种:网络传输.串口传输.USB 传输,当然,还有最笨的方 ...

  9. arduino继电器控制风扇_如何使用Arduino开发板制作温度控制的风扇

    在本篇文章中,我们将主要介绍如何使用DHT22传感器和继电器制作一款Arduino温控风扇.使用DHT22传感器获取温度值,然后将在LCD显示屏上打印此温度值.我们将检查温度值是否大于35,如果温度大 ...

最新文章

  1. V8 JavaScript引擎研究(三)垃圾回收器的实现
  2. [Java] 02 String的常用方法
  3. RH124 章1 访问命令行 笔记
  4. 【2021年度训练联盟热身训练赛第四场】Happy Number(python)
  5. HDU 3973 AC's String 字符串哈希
  6. SIFT(Scale-invariant feature transform, 尺度不变特征转换)特征
  7. homework1: 印象深刻的错误
  8. u-boot移植随笔:终于解决Nor Flash的问题了
  9. opencv一些常用的操作
  10. 卫星轨道的估计问题(Matlab)(二):扩展卡尔曼滤波(EKF)对新问题的尝试
  11. 修改鼠标手形 闪烁 在填写文字内容后也一直在闪烁
  12. 怎么找到安装在Linux系统中的Windows软件的文件
  13. 计算机网络专业的论文题目,计算机网络技术专业毕业论文题目(3)
  14. linux下使用screen和ping命令对网络质量进行监控
  15. 10-93 spj-查找在同一个城市的所有工程项目
  16. PDF阅读器和编辑器选择
  17. 计算机病毒发展趋势论文,计算机病毒的发展趋势及对策
  18. 【不就是java设计模式吗】设计模式七大原则,用代码对比方式,化抽象为具体,实打实的教会你
  19. centos7 磁盘分区
  20. Nvidia-docker2 for ubuntu18.04初试!

热门文章

  1. bzoj5248(洛谷4363)(2018九省联考)一双木棋
  2. python爬虫系列:做一个简单的动态代理池
  3. python3.X出现关于模块(i18n)的不能使用的解决方法
  4. 大话存储系列3——磁盘原理
  5. shell习题第22题:
  6. 苹果笔记本调整 pycharm 字体大小的地方
  7. iPhone手机更换自定义铃声
  8. Codeforces Round #249 (Div. 2) (模拟)
  9. AC日记——约瑟夫问题 codevs 1282
  10. JMeter二次开发(1)-eclipse环境配置及源码编译