敏矽微电子Cortex-M0学习笔记08——基本定时器详解

电子说

1.3w人已加入

描述

1、ME32F030基本定时器简介

ME32F030内置 4 个基本功能的 16 位定时器/计数器。 定时器/计数器工作时钟由 SYSAHBCLKDIV 寄存器控制。关闭 SYSAHBCLKDIV 寄存器中定时器/计数器的时钟供给可节省系统功耗。主要功能如下:

• 可预置分频的 16 位定时器/计数器

• 1 个 16 位匹配寄存器:

–可产生中断

–停止定时器

–对定时器复位

16 位基本型定时器/计数器模块框图如下图所示:

计数器

图1 基本定时器结构图

为了便于理解,可以将基本定时器框图分为4个功能单元。

①:预分频计数单元,由PRESCALE COUNTER (PC) 和 PRESCALE REGISTER (PR)组成,预分频计数器(PC)会在每个 PCLK 时钟上递增计数。达到设定的预分频值后,定时器计数器就会加1,而预分频值就是由PR寄存器决定的。

②:定时器计数单元,由TIMER COUNTER (TC) 和 TIMER CONTROL REGISTER (TCR)组成,定时器控制寄存器TCR决定计数器TC是否启用。预分频计数器(PC)溢出后,定时器计数器(TC)加1,达到设定的匹配值MR0之后可以根据设置产生中断等行为。

③:定时器匹配单元:该单元只有一个MATCH REGISTER0(MR0),它决定着定时器计数器TC的匹配值。

④:定时器控制单元,由MATCH CONTROL REGISTER (MCR) 和 INTERRUPT REGISTER (IR)组成,二者共同作用,控制着定时器的主要功能和参数。

2、ME32F030基本定时器寄存器

在简介中,我们介绍了基本定时器的模块框图,其实每个功能模块都有对应的寄存器来实现其功能。基本定时器的寄存器列表如图所示:

计数器

2-1 中断寄存器

中断寄存器包含用于匹配中断的位。如果有中断产生, IR 中的相应位为高电平。否则,该位为低电平。向对应的 IR 位写逻 辑 1 会使中断复位。写 0 无效。

2-2 定时器控制寄存器

定时器控制寄存器用于控制计数器/定时器的操作。它主要控制着计数器的使能和复位,具体的操作如图所示:

计数器

图3 控制寄存器

2-3 定时器计数寄存器

当预分频器计数器达到其 PC 数值时, 16 位定时器计数器会递增计数。如果 TC 在到达计数器上限之前没有复位,它将一直 计数到 0x0000 FFFF 然后翻转到 0x0000 0000。该事件不会产生中断,如果需要,可使用匹配寄存器检测溢出。

2-4 预分频寄存器

16 位预分频寄存器指定预分频计数器的最大值。当预分频计数器计数到此值后,会从0开始重新计数。

2-5 预分频计数寄存器

16 位预分频计数器用某个常量来控制 PCLK 的分频,再使其输入到定时器计数器。它所控制的是定时器分辨率与最大时间之间的关系,从而能防止定时器溢流。预分频计数器会在每个 PCLK 时钟上递增计数。当预分频计数器的计数达到预分频寄存器中存储的值时,定时器计数器将递增计数,并且在下一个 PCLK 时钟上对预分频计数器复位。这将使得 TC 当 PR = 0 时在每个 PCLK 上递增计数,当 PR = 1 时,在每 2 个 PCLK 上递增计数,依次类推。.

2-6 匹配控制寄存器

匹配控制寄存器用于控制当其中一个匹配寄存器的值与定时器计数器的值匹配时应执行的操作。功能如下所示。

位0:决定着计数器TC与匹配值相等后,中断是否使能。

位1:MR0与TC匹配时,决定TC是否复位。如果选择复位,TC则会清0重新计数,这样就会形成一个固定时间的计数周期。

位2:MR0与TC匹配时,决定TC是否停止。如果置1选择使能,TC则不再会计数。这样就是个单次周期的计数了。如果想要周期性循环计数,那么就需要置0(默认)禁止。

计数器

图4 匹配控制寄存器

2-7 匹配寄存器

匹配寄存器的值会不断地与定时器计数器值进行比较。当两个值相等时,自动触发相应操作。这些操作包括产生中断、复位定时器计数器或停止定时器。所有操作均由 MCR 寄存器中的设置控制。

3、基本定时器驱动函数

在例程LIB->common->Drivers->Source文件夹内有timer.c文件,这个就是提供的定时器库程序,里面除了基本定时器的驱动函数,还包括高级定时器、PWM输出等功能函数,本章节先对基本定时器的函数进行讲解。

3-1 基本定时器初始化

ct:要初始化的定时器模块,可选TIM0、TIM1、TIM2、TIM3。

tickpersecond:预分频系数。

 

 void TIM0_Init(TIM0_Type *ct, uint32_t tickpersecond)
{
if (ct == TIM0)
{
SYSCON->SYSAHBCLKCTRL_b.TIM0_CLK=1;//使能定时器时钟
SYSCON->PRESETCTRL_b.TIM0_RST_N=0; //复位定时器
SYSCON->PRESETCTRL_b.TIM0_RST_N=1;
}

else if (ct == TIM1)
{

SYSCON->SYSAHBCLKCTRL_b.TIM1_CLK=1;

SYSCON->PRESETCTRL_b.TIM1_RST_N=0;

SYSCON->PRESETCTRL_b.TIM1_RST_N=1;
}

else if (ct == TIM2)
{
SYSCON->SYSAHBCLKCTRL_b.TIM2_CLK=1;

SYSCON->PRESETCTRL_b.TIM2_RST_N=0;

SYSCON->PRESETCTRL_b.TIM2_RST_N=1;
}

else if (ct == TIM3)
{

SYSCON->SYSAHBCLKCTRL_b.TIM3_CLK=1;

SYSCON->PRESETCTRL_b.TIM3_RST_N=0;

SYSCON->PRESETCTRL_b.TIM3_RST_N=1;

} else return;

//设置预分频系数
if (tickpersecond>SystemCoreClock)
tickpersecond=SystemCoreClock;
ct->PR_b.PRVAL=SystemCoreClock/tickpersecond-1;
return;
}

 

3-2 设置匹配寄存器

这个函数用于设置定时器的匹配值,以及达到匹配值之后的行为。

Ct:要设置的定时器模块,可选TIM0、TIM1、TIM2、TIM3。

Ticks:要写入的计数器匹配值。

Action: 触发中断 TIM_MATCH_TRIGGER_INT

复位计数器 TIM_MATCH_RESET_COUNTER

停止计数器 TIM_MATCH_STOP_COUNTER

 

void TIM0_ConfigMatch(TIM0_Type *ct, uint16_t ticks, uint8_t action)
{
ct->MR0_b.MATCH=ticks-1;
ct->MCR=action;
return;
}

 

3-3 设置预分频计数器值

 

void TIM0_SetTimerCounter(TIM0_Type *ct, uint16_t tick)
{
ct->PC_b.PCVAL=tick;
return;
}

 

3-4 复位预分频计数器值

 

void TIM0_ResetTimerCounter(TIM0_Type *ct)
{
ct->PC_b.PCVAL=0;
return;
}

 

来源:敏矽MCU

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分