1. 频率和周期之间的关系可以用以下公式表示
频率(f)=周期(T)/1
周期(T)=频率(f)/1
示例:
-
示例1:
假设一个信号的频率是5 Hz,那么它的周期是:T=1/f=1/5=0.2秒。这意味着信号每0.2秒重复一次。 -
示例2:
假设一个信号的周期是0.01秒,那么它的频率是:f=1/T=1/0.01=100Hz。这意味着信号每秒重复100次。
2.在单片机中将84MHz的系统时钟配置为1ms定时周期的步骤如下
1. 定时器参数计算
-
系统时钟频率:84MHz
-
目标定时周期:1ms
步骤1:确定分频后的计数频率
-
选择预分频器(Prescaler, PSC)将84MHz分频至1MHz:
分频后频率=84 MHz/PSC+1=1 MHz ⟹ PSC=83
步骤2:计算自动重装值(ARR)
-
1MHz的计数频率下,1ms需要计数次数为:
计数次数=1 ms×1 MHz=1000 -
因此,自动重装值(ARR)设置为:
ARR=1000−1=999(计数器从0开始计数)
2. 验证定时周期
-
计算公式:
定时周期=(PSC+1)×(ARR+1)/系统时钟频率定时周期 -
代入数值:
定时周期=(83+1)×(999+1)/84 MHz=84×1000/84,000,000=0.001 秒=1 ms
3. 注意事项
-
定时器位数
若使用16位定时器(ARR最大值为65535),需确保计算值不超过限制。本例中ARR=999,符合要求。 -
时钟源配置
确认系统时钟正确配置为84MHz(通过RCC配置)。检查APB总线分频系数(如APB1分频可能影响定时器时钟)。 -
中断优先级
-
若使用中断,需在NVIC中配置优先级
-
4. 扩展应用
-
调整定时周期:
-
若需其他周期(如500μs),可修改PSC或ARR的值。例如:
ARR=500−1=499(PSC仍为83)
-
-
高精度需求:
-
若需更高精度,可减少分频(如PSC=0,ARR=83999),但需注意定时器溢出风险。
-
5.代码实现
// 定时器句柄定义
TIM_HandleTypeDef htimx; // 替换为实际定时器(如TIM2、TIM3等)
void TIMx_Init(void) {
// 定时器基础配置
htimx.Instance = TIMx; // 选择定时器(如TIM2)
htimx.Init.Prescaler = 83; // 预分频器PSC=83
htimx.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
htimx.Init.Period = 999; // ARR=999
htimx.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频(通常为1)
HAL_TIM_Base_Init(&htimx); // 初始化定时器
// 启用定时器中断(可选)
HAL_TIM_Base_Start_IT(&htimx); // 启动定时器并开启中断
}
// 定时器中断服务函数(在stm32xx_it.c中实现)
void TIMx_IRQHandler(void) {
HAL_TIM_IRQHandler(&htimx); // HAL库中断处理
}
// 定时器中断回调函数(用户实现)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIMx) {
// 此处执行1ms定时任务(如翻转LED、更新数据等)
}
}