iot-fan

联系: iotfan123#163.com
注意:
1,本博客之内容来源于网上收集以及相关技术人员提供,如果有侵犯到您的权益,请电邮我沟通;
2,本博客之内容乃分享,交流,学习,研究之目的,作者不对内容的真实性,有效性,及时性负责,也不对因本博客的任何内容导致的任何后果负责;
3,本博客之内容禁止转发到CSDN网站,转到别的网站请保留出处.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

待编辑

适用芯片

  • 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

  1. 周期 (priod):
    • 使用寄存器 R32_TMR0_CNT_END
    • 系统时钟直接做timer时钟,所以记录主频的次数就是1s时,比如这里我们设置60e6就是1s
    • 频率=1/周期
  2. 占空比(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);
    }
}

计数

``
posted on 2022-07-07 10:24  iot-fan  阅读(1358)  评论(0编辑  收藏  举报