一: 定时器分类
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();
}
}
}
我要赚赏金
