要使 CW32L010 的定时器尽可能准确,关键在于优化时钟源选择、减少中断延迟、合理配置定时器参数,并注意硬件设计细节。以下是具体步骤和注意事项:
RCC_HSEConfig(RCC_HSE_ON); // 开启 HSE
while (RCC_WaitForHSEStartUp() != SUCCESS); // 等待 HSE 稳定
RCC_SYSCLKConfig(RCC_SYSCLKSOURCE_HSE); // 设置 HSE 为系统时钟TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.Prescaler = 47; // 分频系数 = 48-1 (48MHz / 48 = 1MHz)
TIM_InitStruct.Period = 999; // 自动重装载值 (1000 次计数 = 1ms)TIM_InitStruct.CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.AutoReload = TIM_AutoReload_Enable;NVIC_SetPriority(TIM1_IRQn, 0); // 设为最高优先级
NVIC_EnableIRQ(TIM1_IRQn); // 使能中断void TIM1_IRQHandler(void) {
if (TIM_GetITStatus(TIM1, TIM_IT_Update)) {
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
g_timer_flag = 1; // 仅设置标志
}
}RCC_HSITrim() 根据实际环境校准(需外部参考时钟)。#include "cw32l010_rcc.h"
#include "cw32l010_tim.h"
void TIM1_Init(void) {
// 1. 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_TIM1, ENABLE);
// 2. 配置定时器
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_InitStruct.Prescaler = 47; // 48分频 (48MHz -> 1MHz)
TIM_InitStruct.Period = 999; // 1000 计数 = 1ms
TIM_InitStruct.CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_InitStruct);
// 3. 使能中断
TIM_INTConfig(TIM1, TIM_INT_Update, ENABLE);
NVIC_SetPriority(TIM1_IRQn, 0);
NVIC_EnableIRQ(TIM1_IRQn);
// 4. 启动定时器
TIM_Cmd(TIM1, ENABLE);
}
// 中断服务函数
void TIM1_IRQHandler(void) {
if (TIM_GetITStatus(TIM1, TIM_IT_Update)) {
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
// 此处执行关键操作
}
}通过以上措施,可显著提升 CW32L010 定时器的精度(典型误差 < 0.01%)。若需更高精度(如 μs 级),可结合硬件 PWM 或捕获单元实现。
举报
更多回帖