这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【CW32F030C8T6】:定时器的调试过程

共1条 1/1 1 跳转至

【CW32F030C8T6】:定时器的调试过程

高工
2026-09-17 20:56:06     打赏

一: 定时器分类

CW32F030 的定时器资源分为以下五类:

高级控制定时器 ATIM:1 个,16 位;

通用定时器 GTIM1~GTIM4:4 个,16 位;

基本定时器 BTIM1~BTIM3:3 个,16 位;

看门狗定时器:独立看门狗 IWDT + 窗口看门狗 WWDT;

内核 SysTick 定时器:24 位递减计数器。

另外,RTC 实时时钟(日历、闹钟、时间戳、自动唤醒)也属于定时类资源,但通常单独归类。

二:定时器特点

ATIM(高级定时器):16 位自动重载计数器加 7 个比较单元,可编程预分频器(2^N,N=0~7);支持向上、向下、中央对齐三种计数方式;6 路独立捕获/比较通道,可输出 6 路独立 PWM 或 3 对带死区的互补 PWM,也可做 6 路输入捕获;支持刹车(BK)功能、单脉冲输出、外部触发(ETR)与同步功能;支持 DMA 请求。

GTIM(通用定时器):4 个完全独立且功能相同的 16 位自动重载计数器,预分频 2^N(N=0~15);支持上/下/上下计数;具备定时器、计数器、触发启动、门控 4 种工作模式;每组 4 路捕获/比较通道,可做输入捕获、输出比较、PWM 输出;支持 DMA 请求,带 TOGP/TOGN 互补输出对。

BTIM(基本定时器):3 个完全独立且功能相同的 16 位自动重载计数器,预分频 2^N(N=0~15);仅向上计数,无捕获/比较通道;同样支持定时器、计数器、触发启动、门控 4 种模式;溢出事件可触发中断和 DMA 请求;触发信号支持硬件自动滤波。

看门狗与 SysTick:IWDT 使用专用内部 RC10K 时钟,溢出触发复位或中断,关键寄存器有键值锁定保护,DeepSleep 下可保持运行或暂停;WWDT 必须在设定时间窗口内刷新,否则溢出复位;SysTick 为 24 位递减计数器,自动重载,归零产生可屏蔽中断。

三:定时器用途

ATIM:电机控制、电源与逆变器、三相桥 PWM 等要求互补输出、死区与刹车的场合,也可做频率、周期、脉宽测量;

GTIM:通用定时/计数、输入捕获测脉宽和周期、输出比较、PWM 输出(LED 调光、蜂鸣器、舵机等);

BTIM:纯定时中断(如周期调度、按键扫描节拍)、外部信号计数、触发启动/门控测量、溢出触发 DMA 搬运;

IWDT/WWDT:程序跑飞、死循环保护;

SysTick:RTOS 时基、系统 tick、软件延时。

四: 使用注意事项

先使能外设时钟:各定时器挂在不同 APB 总线上(GTIM1/2 在 APB1,ATIM、GTIM3/4 在 APB3/APB4,BTIM1~3 在 APB4),用前必须打开对应时钟使能位,计数时钟来自 PCLK。

分频与周期计算:计数器为 16 位(最大 65535),溢出周期 = 分频系数 ×(重载值+1)/ 计数时钟频率,注意 PCLK 实际频率;预分频寄存器带缓冲,运行时修改需到更新事件后才生效。

计数模式差异:BTIM 只能向上计数;GTIM/ATIM 可选向上、向下、中央对齐,对称 PWM 用中央对齐。

互补 PWM 必须配置死区:ATIM 的 3 对互补输出要按上下桥臂器件特性设置死区时间,防止直通;电机/电源类应用务必配置并验证刹车(BK)输入。

引脚复用要查表:定时器通道信号需通过 GPIO 复用功能(AFR 寄存器)映射到引脚,不同封装引出的通道数量不同,选型时确认所需通道可用。

中断与 DMA 管理:及时清除对应中断标志;按需使能各事件中断;NVIC 支持 4 级优先级。

触发模式细节:触发启动/门控模式下注意触发源和边沿极性选择,BTIM 触发信号带硬件滤波,滤波参数影响响应延迟。

看门狗纪律:IWDT 启动后必须周期性喂狗(键值寄存器写入顺序不能错),否则复位;WWDT 只在窗口内刷新,过早过晚都复位;DeepSleep 下 IWDT 可配置为暂停或继续。

低功耗影响:DeepSleep 时高速时钟关闭,依赖 PCLK 的定时器停摆,只有 RTC、IWDT 等低功耗时钟源驱动的模块继续工作;唤醒后系统时钟回到默认 HSI 8MHz,需重新评估定时精度。

初始化顺序:按“时钟使能 → 分频/计数模式/周期 → 通道配置 → 中断使能 → 启动计数”的顺序初始化,避免启动瞬间产生意外中断或输出毛刺。

五:软件代码

5.1 ATIME定时器的初始化

void ATIMER_init(void)
{
        ATIM_InitTypeDef ATIM_InitStruct;
        
        __RCC_ATIM_CLK_ENABLE();
        
        __disable_irq(); 
  NVIC_EnableIRQ(ATIM_IRQn); 
  __enable_irq();
        
        ATIM_InitStruct.BufferState = ENABLE;                               //使能缓存寄存器   
  ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK;                      //选择PCLK时钟计数
  ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN;    //边沿对齐
  ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;                //向上计数;
  ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;            //连续运行模式
  ATIM_InitStruct.OverFlowMask = DISABLE;                             //重复计数器上溢出不屏蔽
  ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV8;                    // 8分频,8MHZ
  ATIM_InitStruct.ReloadValue = 8000;                                 // 重载周期 1MS TIMER
  ATIM_InitStruct.RepetitionCounter = 0;                              // 重复周期0
  ATIM_InitStruct.UnderFlowMask = DISABLE;                            // 重复计数下溢出不屏蔽
  ATIM_Init(&ATIM_InitStruct);
  ATIM_ITConfig(ATIM_CR_IT_OVE, ENABLE);                              // 有重复计数器溢出产生进入中断
  ATIM_Cmd(ENABLE);           
}

5.2 ATIME定时器的回调函数

void ATIM_IRQHandler(void)
{
 static unsigned int count=0;
  if (ATIM_GetITStatus(ATIM_IT_OVF))
  {
    ATIM_ClearITPendingBit(ATIM_IT_OVF);
                count++;
                if(count>=500)//0.5S
                {
                    count=0; 
                    PA07_TOG();
                }
  }
}





关键词: CW32F030C8T6     定时器     调试    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]