待编辑
适用芯片
- CH579/CH578/CH577
- CH573/CH571
定时器概述
- 26bit
- 支持 定时/PWM/捕获/计数
- 不支持预分频
- 每个timer pwm模式只支持1路
使用
下面我们在ch582上以timer1来做说明,主频60Mhz
定时
//初始化
TMR0_TimerInit(6e6); //6M = 0.1s
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); //enable peripheral interrupt
PFIC_EnableIRQ(TMR0_IRQn); //enable timer0 core interrupt
__INTERRUPT //interrupt flag
__HIGH_CODE //put in ram
void TMR0_IRQHandler(void) { //timer0 interrupt handler
if(TMR0_GetITFlag(TMR0_3_IT_CYC_END)){ //check flag
TMR0_ClearITFlag(TMR0_3_IT_CYC_END); //clear flag
#if 0
R32_TMR0_CNT_END = 6000; //manual reload if needed
#endif
}
}
PWM
- 周期 (priod):
- 使用寄存器 R32_TMR0_CNT_END
- 系统时钟直接做timer时钟,所以记录主频的次数就是1s时,比如这里我们设置60e6就是1s
- 频率=1/周期
- 占空比(duty) :
- 使用寄存器 R32_TMR0_FIFO(写的太快可能溢出,导致后面的写不进入,这种情况下需要结合判断R8_TMR_FIFO_COUNT的值)
- 支持高有效或者低有效
- 不能大于R32_TMR0_CNT_END的值
- 占空比计算 pwm_duty = R32_TMR0_FIFO/R32_TMR0_CNT_END*100%
关于PWM 更多用法也可参考文章:CH579/573/582, 使用PWM播放WAV语音和音乐
捕获
- 支持单双边沿
- 支持超时中断
- 支持电平指示(第26bit)
//初始化
TMR0_CapInit( Edge_To_Edge );
TMR0_CAPTimeoutCfg( 0xFFFFFFFF ); // cupture timeout
TMR0_ITCfg( ENABLE, TMR0_3_IT_DATA_ACT ); // capture update interrupt
PFIC_EnableIRQ(TMR0_IRQn); //enable timer0 core interrupt
__INTERRUPT //interrupt flag
__HIGH_CODE //put in ram
void TMR0_IRQHandler( void ) {
uint32_t capture_data,capture_level;
if ( TMR0_GetITFlag( TMR0_3_IT_DATA_ACT ) ) {
TMR0_ClearITFlag( TMR0_3_IT_DATA_ACT );
capture_data = TMR0_CAPGetData();
capture_level =capture_data&(0x1<<25)?1:0
capture_data = capture_data&((1<<25)-1);
}
}
计数
``