历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2020年03月03日 | 定时器的使用方法总结

2020-03-03 来源:eefocus

首先理解看门狗定时器方式的使用,简单说,就是有个控制器,选择时钟源,计数方式,等等的控制参数,再配合一个一个累加计数器来确定时间,通过固定的时间间隔来执行中断函数,来得到自己想要的实验结果。

理解之后我们就对最简单的定时器有了一个简单的感念了,了解了基本的定时功能,现在了解下单片机中的TA和TB两个定时器:


首先看TA:

和学习之前的功能一样,先了解寄存器,以及寄存器功能:

在这里插入图片描述

定时器A的控制寄存器:

在这里插入图片描述

定时器A的计数器:

在这里插入图片描述

重点来了:

定时器A的捕获/比较功能寄存器以及中断向量寄存器:

在这里插入图片描述
在这里插入图片描述

前面的控制寄存器和计数器还好理解一点,主要是选择定时器A的功能和一些基本参数的,这里简单讲下设置步骤:


①选择TA的时钟源和分频;//TACTL |= TASSEL_1 + ID_0;

#define ID_0 (00x40u) / Timer A input divider: 0 - /1 /

#define ID_1 (10x40u) /* Timer A input divider: 1 - /2 /

#define ID_2 (20x40u) /* Timer A input divider: 2 - /4 /

#define ID_3 (30x40u) /* Timer A input divider: 3 - /8 /

#define TASSEL_0 (00x100u) /* Timer A clock source select: 0 - TACLK /

#define TASSEL_1 (10x100u) /* Timer A clock source select: 1 - ACLK /

#define TASSEL_2 (20x100u) /* Timer A clock source select: 2 - SMCLK /

#define TASSEL_3 (30x100u) /* Timer A clock source select: 3 - INCLK /

②TA的计数方式的选择:

#define MC_0 (00x10u) /* Timer A mode control: 0 - Stop /

#define MC_1 (10x10u) /* Timer A mode control: 1 - Up to CCR0 /

#define MC_2 (20x10u) /* Timer A mode control: 2 - Continous up /

#define MC_3 (30x10u) /* Timer A mode control: 3 - Up/Down /

③设置中断使能与标志位:

#define TAIE (0x0002u) / Timer A counter interrupt enable /

#define TAIFG (0x0001u) / Timer A counter interrupt flag */


关于TAR计数器是16位的:2^16=65536


上面的难点就在于选择TA的4种计数方式:(简单介绍一下)


00:计数器停止

01:增计数方式:


计数值最大范围到65536,但是taccr0值一定小于65536,所以,每计数都是从0~TACCR0(自定义);

注意这个模式下:TACCR0 作为周期寄存器使用;

所以通过改变 TACCR0 来改变计数周期;每个计数周期写作 (TACCR0 + 1);



可以发现这用模式可以使两者中断标志位置一,一个是TAIFG,另一个是 TACCR0 CCIFG(这个后面讲捕获比较的时候会提到)现在了解一下,就是说引起中断的时候要注意区分,是那种中断类型


10:连续计数模式


就是从0~65536再从0 ~65536 一直循环:

注意这个模式下:TACCR0 做为一般捕获比较寄存器使用;

因为这个模式下 TACCR0 作为普通寄存器使用了,所以这种模式下只会引起一种中断标志置位,就是TAIFG;


这个模式想要变更计数周期,就只能每次溢出之后给TAR赋初值;


11:增减计数方式:

与增计数方式有些相似,都是通过 TACCR0 来确定周期的,所以,TACCR0 作为周期寄存器使用;

周期是 2*TACCR0


因为这种模式是0 ~ 6553 ~ 0;所以周期长,最大周期为131070;



四种工作模式就是上面介绍的,下面讲下关于,捕获比较的特点和编辑方式:


TACCTLx是捕获比较寄存器,TA里有三个这个寄存器,分别是TACCTL0; TACCTL1;TACCTL2

这里要注意的是,如果计数模式选择增计数,或者增减计数模式,TACCR0会被用来做周期计数器,所以此时的TACCR0不能使用捕获比较功能


这里可以按照功能区分成三个单元来说:比较单元,捕获单元,输出单元


①首先通过模式选择功能模式(CAP)

0:比较模式<缺省>

1:捕获模式


这里先讲比较模式:就是设置一个定时长度(TACCRn),比较单元会一直比较TACCRn和TAR的值,当TACCRn = TAR时;CCIE置位,发起中断;

所以常用来写定时任务,如键盘扫描,定时查询等


捕获模式:用来进行测量,如测量时钟频率,脉冲宽度等

1

2

3

4

②设置捕获方式:(CMx)

00:不捕获

01:上升沿捕获

10:下降沿捕获

11:上升&下降沿捕获

③捕获/比较的输入选择:(CCISx)(选择输入信号)

00:CCIxA

01:CCIxB

10:GND

11:Vcc

CCIxA:P1.1~P1.3;CCIxB:P2.2;这个要查看 I/O引脚的第二功能;

④SCS:同步(1)或异步(0)捕获,一般用同步;

SCCI是CCIxA或CCIxB的信号读取位,只能读。


#define CCIS_0 (00x1000u) / Capture input select: 0 - CCIxA /

#define CCIS_1 (10x1000u) /* Capture input select: 1 - CCIxB /

#define CCIS_2 (20x1000u) /* Capture input select: 2 - GND /

#define CCIS_3 (30x1000u) /* Capture input select: 3 - Vcc /

#define CM_0 (00x4000u) /* Capture mode: 0 - disabled /

#define CM_1 (10x4000u) /* Capture mode: 1 - pos. edge /

#define CM_2 (20x4000u) /* Capture mode: 1 - neg. edge /

#define CM_3 (30x4000u) /* Capture mode: 1 - both edges */


输出单元:

主要由

OUTMODx;OUT;控制,用老输出PWM波形(以后用到再看)

#define OUTMOD_0 (00x20u) / PWM output mode: 0 - output only /

#define OUTMOD_1 (10x20u) /* PWM output mode: 1 - set /

#define OUTMOD_2 (20x20u) /* PWM output mode: 2 - PWM toggle/reset /

#define OUTMOD_3 (30x20u) /* PWM output mode: 3 - PWM set/reset /

#define OUTMOD_4 (40x20u) /* PWM output mode: 4 - toggle /

#define OUTMOD_5 (50x20u) /* PWM output mode: 5 - Reset /

#define OUTMOD_6 (60x20u) /* PWM output mode: 6 - PWM toggle/set /

#define OUTMOD_7 (70x20u) /* PWM output mode: 7 - PWM reset/set */


#define OUT (0x0004u) /* PWM Output signal if output mode 0 */


对于最后的中断向量寄存器,要注意的是这里是没有TACCR0的中断向量的,所以TACCR0是个单源中断,二中断向量寄存器内的是多源中断,区分两种中断方式很关键


/* TA3IV Definitions /

#define TAIV_NONE (0x0000u) / No Interrupt pending /

#define TAIV_TACCR1 (0x0002u) / TACCR1_CCIFG /

#define TAIV_TACCR2 (0x0004u) / TACCR2_CCIFG /

#define TAIV_6 (0x0006u) / Reserved /

#define TAIV_8 (0x0008u) / Reserved /

#define TAIV_TAIFG (0x000Au) / TAIFG */

推荐阅读

史海拾趣

CINCH公司的发展小趣事

CINCH公司作为一家在电子行业颇具影响力的企业,始终致力于技术研发和产品创新。某年,公司研发团队成功开发出一种新型的连接器技术,该技术不仅提高了数据传输速度,还增强了设备的稳定性和耐用性。这一技术突破迅速引起了市场的关注,CINCH公司趁热打铁,推出了一系列基于新技术的产品,迅速占领了市场份额,实现了业务的快速增长。

Geyer Electronic E K公司的发展小趣事

CINCH公司深知人才是企业发展的核心竞争力。因此,公司高度重视人才培养和团队建设。公司设立了完善的培训体系,为员工提供了广阔的晋升空间和发展机会。同时,公司还积极引进优秀人才,打造了一支高素质、专业化的团队。这支团队在公司的各项业务发展中发挥了重要作用,为公司的长远发展奠定了坚实基础。

Fair Rite公司的发展小趣事

1952年,理查德·帕克与合作伙伴埃德蒙·斯坦威克和杰克·韦伯在纽约的Wallkill共同创立了Fair Rite产品公司。当时,电子行业正处于起步阶段,对新型电子元器件的需求日益增长。Fair Rite凭借对市场敏锐的洞察力,开始专注于铁氧体元件的研发和生产。公司初期面临资金短缺和技术挑战,但通过不断努力和创新,逐渐在市场中树立了良好的口碑。

DFI公司的发展小趣事

近年来,随着智能医疗和金融科技等新兴领域的兴起,DFI看到了新的发展机遇。公司开始将这些领域作为重点发展方向,投入大量资源进行研发和创新。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有创新性的智能医疗和金融科技产品。这些产品不仅为客户提供了更便捷、更高效的服务体验,也为DFI带来了新的增长点。随着这些新兴领域的不断发展壮大,DFI有望在未来实现更大的突破和发展。

请注意,以上故事均为虚构,旨在展示DFI公司可能的发展历程和业务活动。实际情况可能有所不同,具体信息请参考DFI公司的官方资料。

Bomar Interconnect公司的发展小趣事

为了确保产品质量和稳定性,Bomar Interconnect公司建立了严格的质量管理体系。公司引进了先进的质量检测设备和方法,对原材料、生产过程、成品进行全面检测和控制。同时,公司还加强了员工培训,提高了员工的质量意识和操作技能。这些措施有效提升了产品的质量水平,降低了不良品率,为客户提供了更加可靠的产品和服务。

HP(Keysight)公司的发展小趣事

在电子行业的激烈竞争中,Bomar Interconnect公司凭借持续的技术创新,逐渐崭露头角。公司研发团队不断深入研究新型连接技术,成功推出了一系列高性能、高可靠性的连接器产品。这些产品在市场上获得了广泛认可,为公司带来了稳定的收入来源。同时,公司还积极投入资源,加强与其他企业的技术合作,不断拓宽产品应用领域,进一步提升了公司的市场竞争力。

问答坊 | AI 解惑

三社整流模块

系列功率模块资料…

查看全部问答>

请教一下专业英语

3.Requirements analysis, product/functions review是审查吗?, identification of issues是问题识别吗, system risk analysis, reliability analysis 8.Support, maintain and document functionality支持,维护且以文档记录(产品)功能 :就 ...…

查看全部问答>

cepc上串口不能发送数据

一. 在X86的目标机上能正常运行Createfile打开com1,但是用writefile发送数据失败.通过GetLastError()获得错误好1359. 二. 在该目标机器上,只能打开com3,其他的com1,com2,com4,com5都是Createfile失败.通过调试发现Com1用来wince作为调试信息输出.…

查看全部问答>

wince 6.0下使用什么来解码?

原来在5.0下,tcpmp是一个比较好的影音解码核心,但在6.0下问题多多,请问大虾们是用什么解决方案的?…

查看全部问答>

关于wince下实现AD采集的问题

    我想在wince下实现AD数据采集,思路是通过调用ceddk.dll中的函数读写ADC寄存器实现ADC。我简单地做了个试验,第一步,我把ADCDAT0寄存器的物理的物理地址0x5800000C通过MmMapIoSpace转变成虚拟地址0x00160000;第二步,我通过read_re ...…

查看全部问答>

关于如何学习嵌入式 高手 们进啊

大家好,我是一名大三的学生,学的是嵌入式方向的,但我们现在才学嵌入式操作系统,都TMD还是理论,学了等于没学,就上学期还学了个汇编,现在一学期都快过完了,感觉什么关于嵌入式方面的都没学到,如果靠下学期再来学点东西,以后出去就别想混了 ...…

查看全部问答>

编写c的时候,遇到一个小问题,郁闷,高手指点

long int i=32132121; void show_shuzi() {   if (i>99999999) return;   wei[7]=i/10000000;   i=i-wei[7]*10000000;      wei[6]=i/1000000;   i=i-wei[6]*1000000;   ...…

查看全部问答>

stm32ucosii如何使用串口中断在接收数据?

哪位大侠帮我解答下,不胜感激,小弟刚开始在STM32上折腾uCOS II.Micrium的代码已经跑上了,但中断还迷糊..............1)stm32 ucos ii 如何使用串口(如uart2)中断在接收数据?2)串口中断在哪开?然后用void US ...…

查看全部问答>

超级菜鸟 编译出错 不知如何处理 请大神们帮一下

刚装的软件,在坛里参考了一个程序,目的是想弄明白和熟悉一下软件的流程,看看能否工作? ,遇到这样的问题,不知道怎么弄了。请大神们帮忙看一下,是那里没有设置好?本人超级菜,请见谅。谢谢!     Error while running C/C++ com ...…

查看全部问答>