时钟一般分为外部晶振时钟和内部时钟,相对而说,外部晶振时钟的精准度比内部系统时钟高,时间计算的更准。除非产品需要一般都不会用外部晶振时钟,因为好的东西贵啊,成本高。
本文主要介绍如何利用时钟设置Timer0/1(RTC、PWM中断、ADC),中断时间如何设置。
基本知识 1 MHz=1000 kHz=1000 000 Hz 1s = 1 000ms
选择定时器功能之前都要选择时钟,然后选择分频,才能确定中断时间。
目录
一、时钟结构
二、设置Timer0/1时钟
2.1、RC32K(低功耗时钟)
2.2、RC1M (系统时钟)
2.2.1 PLL分频配置
2.2.2 TIMER0/1 Get分频选择
三、计算中断时间
3.1 RC_32KHz 计算中断时间
3.2 RC_1MHz计算中断时间
一、时钟结构
如下图所示:
RC32KHz(RC128KHz4分频)为低速时钟(低功耗模式)、
RC1MHz 为系统时钟(能连接各个模块)、
XOSC为外部晶振时钟
二、设置Timer0/1时钟
根据芯片手册选择时钟可选
2.1、RC32K(低功耗时钟)
低功耗时钟,RC_128K,128kHZ 4分频后就是RC_32K
2.2、RC1M (系统时钟)
2.2.1 PLL分频配置
RC1M 输入到PLL1MHz,输出32MHZ
RC 1MHz →PLL 32MHz 选择如图所示,如果没有勾选就要配置寄存器。
我们看到PLL寄存器中没有外部时钟的分频就证明该芯片无外部晶振时钟。
2.2.2 TIMER0/1 Get分频选择
PLL输出32MHz 到G,然后选择2分频 到TIMER0/1。
初始化勾选或者寄存器选择
三、计算中断时间
3.1 RC_32KHz 计算中断时间
32KHz = 32 000 Hz ,则1 S 为 32 000 Hz (0x7D00) ,1ms 为32 Hz(0x20)
3.2 RC_1MHz计算中断时间
RC_1MHZ →1MHZ→PLL(32MHz)→G(2分频)→16MHz
1S 为 16MHz 16MHz = 16 000 000Hz 1ms 为 16 000Hz(0X3E80)
/*!\brief timer0/1 initialize\param[in] timerx: TIMERx(0,1)\param[in] timer_cfg: timer0/1 config\param[in] timer_mod: timer0/1 mod count\param[out] none\retval none
*/
void timer_init(uint32_t timerx,uint8_t timer_cfg,uint16_t timer_mod)
{TIMER_CFG(timerx) = timer_cfg;TIMER_MOD(timerx) = timer_mod;if(timerx == (uint32_t)TIMER0){if((timer_cfg & TIMER_CFG_IE) != 0U){NVIC_EnableIRQ(TIMER0_IRQn);}else{NVIC_DisableIRQ(TIMER0_IRQn);}}else{if((timer_cfg & TIMER_CFG_IE) != 0U){NVIC_EnableIRQ(TIMER1_IRQn);}else{NVIC_DisableIRQ(TIMER1_IRQn);}}
}
timer_init(TIMER0,0x2B,0x3E80); 0X2B 为各个寄存器配置,0x3E80为1ms产生一次中断。
其他的中断事件基本与之一样,模仿即可。