目录

  • 介绍
  • 定时器的时钟
  • 模式 0 计数定时器功能
  • 与定时器0模式0有关的寄存器及相应位
  • 定时器时间计算
  • 配置流程
    • 定时器0配置初始化代码
    • 定时器0中断服务函数
    • 主程序中调用调用定时器0并运行
  • 简便计算

介绍

定时器是现代单片机的标配,顾名思义它的最基本作用就是定时。华大单片机HC32L136这颗芯片中包含了多个可以用来实现定时功能的外设,分别是通用定时器(TIM0/1/2/3)、低功耗定时器(LPTIM)、可编程计数阵列(PCA)、高级定时器(TIM4/5/6)、实时时钟(RTC)、看门狗定时器(WDT)和时钟校准模块(CLKTRIM)。由上可知HC32L136实现定时功能是非常灵活的,工程师们可以根据自己的项目实际使用到的模块而决定采用哪种方式来定时。下面先讲解下最最基本的定时方式–通用定时器(TIM0/1/2/3)模式0的定时功能。

定时器的时钟

使用 PCLK 做为 Timer 定时器时钟时,可以使用预分频。预分频设置如下:

预分频器没有预装载缓存,因此对预分频进行更改,预分频将会立刻生效。

模式 0 计数定时器功能

定时功能用于产生间隔定时。在定时功能中,定时器有预除频,定时器在每个预除频的一个时钟累加一次,计数到最大值会溢出并且产生中断。中断标志需要软件清除。这种模式下,计数器向上计数。计数器支持两种计数模式,16位重载模式与32位自由计数模式,计数到最大值溢出产生中断。16位重载模式计数范围从 ARR 向上计数到 0xFFFF 溢出,然后从 ARR 再开始计数,计数周期为 0Xffff-ARR+1,16位重载模式的框图与波形如下图所示:


32位自由计数模式从设置计数值计数到 0xFFFFFFFF 后溢出,溢出后计数值从 0x0 重新开始计数。其框图与波形如下图所示:


门控功能
定时器可用通过外部门控功能控制定时器是否计数。控制关系如下

与定时器0模式0有关的寄存器及相应位

寄存器 符号 描述 说明
TIMx_ARR 15:0 ARR 16位重载定时器重载值寄存器
TIMx_CNT 15:0 CNT 16位重载定时器 计数值寄存器
TIMx_CNT32 31:0 CNT32 32位定时器 计数值寄存器 注:仅在模式0 32位定时器自由计数模式下有效,
其他模式禁止写该寄存器
TIMx_M0CR 13:12 MODE 工作模式 00 定时器模式0
10 UIE 中断使能控制 写1后使能中断
9 GATEP 端口 GATE 极性控制 0:端口GATE高电平有效
1:端口GATE低电平有效
8 GATE 定时器门控使能 0:无门控,CTEN=1 时定时器工作;
1:门控使能,端口 GATE 有效并且CTEN=1时定时器才工作;
6:4 PRS 内部时钟分频选择 000 : 1; 001 : 2; 010 : 4; 011 : 8;
100 : 16; 101 : 32; 110 : 64; 111 : 256;
2 CT 计数时钟选择 0: 内部计数时钟PCLK
1: 外部计数时钟ETR;
1 MD 模式选择32定时/16定时模式选择 0: 32位自由计数
1: 16位重载计数
0 CTEN 定时器使能 0: 定时器停止;
1: 定时器使能
TIMx_IFR 0 UIF 溢出中断
TIMx_ICLR 0 UIF 溢出中断清除 写0清除

定时器时间计算

毋庸置疑使用定时器功能都是希望实现定时功能。这个定时定多长时间是由用户自己来设定的。现在就介绍下如何来设定定时值。

其实定时器是个很简单的外设模块。它的原理就是每执行一个定时器的机器周期,定时器的计数值TIMx_CNT和TIMx_CNT32就会加1,直到加到定时器计数器最大值(16位模式时为0XFFFF,32位模式时为0XFFFFFFFF),之后再执行一个定时器周期则定时器计数值会溢出,溢出时会产生举出中断标志位TIMx_IFR寄存器中的UIF置1。如果设置为重载模式,定时器溢出后会把TIMx_ARR值装入TIMx_CNT寄存器,继续计数。如果是32位计数模式,溢出后TIMx_CNT和TIMx_CNT32的值都会变为0,继续进行计数。

下面以16位重载计数模式来说明,具体如何计算,32位自由计数模式原理一样,大家可以自行理解 。
定时器的机器频率就是通过TIMx_M0CR寄存器中PRS的设定完成对PCLK时钟的分频。假如系统时钟为4M(系统上电时候默认的时钟),HCLK和PCLK的分频系数为1,则PCLK的时钟频率同样为4M。TIMx_M0CR中的PRS设置为111,即对PCLK进行256分频,此种设置情况下定时器的频率为 4M / 256 = 15625 Hz,定时器计数器执行一个加1周期的需要的时间为 1 / 15625 = 0.000064秒。如果定时器想要实现0.6秒的定时需要执行的周期数为 0.6/ 0.000064 = 9375。是不是直接把9375写到TIMx_CNT和TIMx_ARR的寄存器中就可以了实现定时0.6秒呢?当然不是。因为定时器是加到溢出才会产生中断,所以写入到寄存器中的值应该是溢出的值减出我们计算出来的值(0X10000 - 9375)。

计算的原理就是这些,大家写程序的时候也可以根据自己的使用习惯进行相关数据的封装。

配置流程

重载定时器设置

  1. 设置定时器模式 M0CR.MODE=0
  2. 设置装载值 ARR
  3. 设置计数器初值 CNT
  4. 清除中断标志
  5. 使能中断 M0CR.UIE=1
  6. 使能重载模式 M0CR.MD=1
  7. 开启定时器 M0CR.CTEN=1

定时器0配置初始化代码

void App_Timer0Cfg(uint16_t u16Period)
{uint16_t                  u16ArrValue;uint16_t                  u16CntValue;stc_bt_mode0_cfg_t     stcBtBaseCfg;DDL_ZERO_STRUCT(stcBtBaseCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); //Base Timer外设时钟使能stcBtBaseCfg.enWorkMode = BtWorkMode0;                     //定时器模式stcBtBaseCfg.enCT       = BtTimer;                         //定时器功能,计数时钟为内部PCLKstcBtBaseCfg.enPRS      = BtPCLKDiv256;                    //PCLK/256stcBtBaseCfg.enCntMode  = Bt16bitArrMode;                  //自动重载16位计数器/定时器stcBtBaseCfg.bEnTog     = FALSE;                           //禁止翻转输出stcBtBaseCfg.bEnGate    = FALSE;                           //不使能门控stcBtBaseCfg.enGateP    = BtGatePositive;     Bt_Mode0_Init(TIM0, &stcBtBaseCfg);                        //TIM0 的模式0功能初始化u16ArrValue = 0x10000 - u16Period;Bt_M0_ARRSet(TIM0, u16ArrValue);                           //设置重载值(ARR = 0x10000 - 周期)u16CntValue = 0x10000 - u16Period;Bt_M0_Cnt16Set(TIM0, u16CntValue);                         //设置计数初值Bt_ClearIntFlag(TIM0,BtUevIrq);                            //清中断标志   Bt_Mode0_EnableIrq(TIM0);                                  //使能TIM0中断(模式0时只有一个中断)EnableNvic(TIM0_IRQn, IrqLevel3, TRUE);                    //TIM0中断使能
}

定时器0中断服务函数

void Tim0_IRQHandler(void)
{    //Timer0 模式0 溢出中断if(TRUE == Bt_GetIntFlag(TIM0, BtUevIrq))
{
//............
//用户程序
//............   Bt_ClearIntFlag(TIM0,BtUevIrq); //中断标志清零}
}

主程序中调用调用定时器0并运行

 App_Timer0Cfg(9375);   //Timer0配置初始化(周期 = 9375*(1/4M)*256 = 0.6s) //上电后系统初始时钟为4MBt_M0_Run(TIM0);       //TIM0 运行。

简便计算

需要计数个数 = 目标时间 * 系统时钟 / HCLK分频 / PCLK分频 / 定时器分频
写入的CNT值 = 定时器溢出时间 - 需要计数个数


关注微信公众号『芯缘意码』,查看更多内容,回复“加群”加入技术交流群。
淘宝 店铺 搜索 『芯缘意码』,购买开发学习板仿真器。


华大单片机HC32L136定时器时间如何计算相关推荐

  1. 国产超低功耗华大单片机HC32L136开发板上手入门

    今天介绍下国产超低功耗华大单片机HC32L136开发板上手后的入门操作(开发板可以在华大MCU应用交流群:164973950 免费申请).HC32L136开发板(如下图所示)分为板载调试模块(左半部分 ...

  2. 华大单片机HC32L136笔段式段码LCD显示

    目录 华大单片机LCD简介 LCD 主要特性 LCD 框图 LCD 驱动波形 LCD Bias 产生电路 内部电阻模式 外部电容模式 外部电阻模式 LCD三种驱动方式对比 LCD显示模式 LCD 显示 ...

  3. 华大单片机HC32L136如何做printf串口打印格式化输出

    目录 写在前面 半主机模式介绍(可以跳过) 串口接收初始化 串口发送重定向 主程序 连好开发板 运行效果 写在前面 通常工程师在做产品开发和程序调试的时候会通过仿真器进入仿真模式来获得芯片运行的结果, ...

  4. 华大单片机如何实现软件复位重启

    工程师朋友在做产品的时候,有些特殊的场合对单片机有重启(复位)的需要,以达到保证产品的功能可以正常的实现.重启可以通过硬件和软件两种方法来实现.对于华大单片机大家都知道硬件的重启,只要把RESET引脚 ...

  5. 单片机定时器_51单片机的定时器如何计算初值?

    在学习单片机的时候,我们发现很多功能都是通过中断来实现的.之前也举过烧水的例子来阐述中断,今天就讲解一下定时器赋初值的方法.8位的定时器最大可计数2的8次方为256,16位的定时器最大可计数2的16次 ...

  6. 华大单片机HC32L130/HC32L136红外端口配置

    华大单片机HC32L130/HC32L136红外端口配置 HC32L130一共有三个引脚可以配置成红外38.4KHZ输出引脚 #define PIN_PWM_IR GpioPortB, GpioPin ...

  7. 华大单片机HC32L130/HC32L136从机IIC通信

    从机IIC理论知识 主机IIC的做法比较多,从机IIC的就相对比较难一点. 先补充一下从机IIC的思路: 先看IIC时序图,然后根据时序图理清IIC从机需要做哪些判断: 从机发送: ·判断IIC ST ...

  8. 华大单片机HC32L130 / HC32L136 / HC32F030 系列硬件开发指南

    适用对象 系列 产品型号 HC32L130 HC32L130E8PA / HC32L130F8UA / HC32L130J8TA / HC32L130J8UA HC32L136 HC32L136J8T ...

  9. 单片机笔记十一:华大单片机

    最近在用华大的芯片做开发,因为某些芯片涨价太厉害,而且太难买了,专门买了华大的开发板回来用,这是一款国产的芯片,用的ARM公司的"Cortex-M0"内核,以前用过stm32f10 ...

最新文章

  1. 表贴电阻尺寸与什么有关_PCB板上为什么要“贴黄金”?
  2. Java 并发编程AQS基本介绍
  3. idea中jar包依赖了但还是找不到类的解决方案
  4. Java学习笔记1.2.1 使用Java集成开发环境 - Eclipse
  5. 迭代最近点算法Iterative Closest Point(ICP)以及c++实现代码
  6. 【jQuery笔记Part1】03-jQuery加载模式对比JS
  7. 中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
  8. C# 线程thread
  9. 网络安全系列之四十九 IIS6.0权限设置
  10. 2022-2028年中国飞机电子飞行包(EFB)行业市场竞争状况及发展趋向分析报告
  11. Java学习博客第一篇
  12. 编程-----相反数求解算法
  13. HEVC学习(五) —— 帧内预测系列之三
  14. Global Illumination_Screen-Space Directional Occlusion(SSDO)
  15. 按键精灵 官方废了 , 不更新了
  16. 卷积神经网络与全连接神经网络
  17. css3禅意花园脚本_如何创建无脚本CSS3工具提示
  18. java浏览器无界面后台截屏工具
  19. syn c 语言程序,C语言实现SYN Flood
  20. iOS--中文排序、全拼音排序

热门文章

  1. 40页PPT学会从0到1建设数据仓库
  2. 内网穿透-----ngrok服务器搭建
  3. Win10磁盘占用达到100%,优化一下就解决了
  4. python编程语言与html5-派森(Python)编程有什么用?
  5. C#使用iTextSharp将多张图片转一个PDF(图片页面大小一致)
  6. WebMagic Java爬虫框架初探
  7. 决策易医药CRM系统,实现医药代表、公司以及医生三者闭环
  8. Bosun监控告警系统
  9. 刚体运动学公式_哈尔滨工业大学理论力学--第六章--刚体简单运动.ppt
  10. 数据集(casia,msu,replay,oulu)的详细信息