五、定时器
1. 定时器介绍
STM32F103C8T6微控制器内部集成了多种类型的定时器,这些定时器在嵌入式系统中扮演着重要角色,用 于计时、延时、事件触发以及PWM波形生成、脉冲捕获等应用。下面是对STM32F103C8T6中几个定时器的
简单介绍:
1. TIM1:这是一个高级定时器,不仅具备基本的定时中断功能,还拥有内外时钟源选择、输入捕获、输 出比较、编码器接口以及主从触发模式等多种功能。这使得TIM1能够适用于各种复杂的应用场景,为 开发者提供强大的时间控制和信号处理能力。
2. TIM2、TIM3和TIM4:这些是通用定时器,同样具有定时功能,但在功能上与高级定时器有所区别。通 用定时器通常用于实现一些基本的定时任务,如LED闪烁、脉冲宽度测量等。
每个定时器都由一个16位计数器、预分频器和自动重装寄存器的时基单元组成。预分频器可以对时钟进行分 频,计数器则对预分频后的时钟进行计数。当计数器的值达到设定值时,会触发中断,从而执行相应的定时 任务。
2. 定时器工作原理
定时器的核心就是计数器
3. 三种定时器介绍
4. 定时器框图--时基单元
5. 定时器计数模式
6. 定时器溢出时间计算
7. 定时器中断实验配置步骤
msp 函数是对 MCU 相关的硬件进行初始化设置,通常被设计用于处理特定硬件外设或功能的底层初始化工 作
定时器的初始化函数
TIM_HandleTypeDef timer_handle = {0};//其他函数也要用到所以用全局
//给定的中断函数直接复制的
void timer_init(uint16_t arr,uint16_t psc)//调用arr和psc,调用时更方便
{
timer_handle.Instance = TIM3; //选择通用定时器3
timer_handle.Init.Prescaler = psc; //分频器
timer_handle.Init.Period = arr; //自动重装
timer_handle.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数
timer_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE //自动重装载开不开启
//1. auto-reload preload=Disable:自动重装载寄存器写入新值后,计数器立即产生计数溢出,然后开始新的计数周期
//失能预装载,当定时器更新事件发生时,新的自动重装载值会立即加载到 ARR 寄存器中
//流程图三四步
HAL_TIM_Base_Init(&timer_handle);
//使能更新中断,启动定时器
HAL_TIM_Base_Start_IT(&timer_handle);
}
//msp函数 GPIO在led中就已经初始化,所以可以忽略//一个回调函数会自己调用自己
//判断自己是否属于
//一个回调函数会自己调用自己
//判断自己是否属于
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)//判断是否为定时器2
{
__HAL_RCC_TIM2_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//抢占优先级和响应优先级
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
}
中断服务函数
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&timer_handle);
}
更新中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//要判断是否被其他定时器调用
if(htim->Instance == TIM2)
{
led1_toggle();
}
}
主函数
int main(void)
{
HAL_Init();
stm32_clock_init(RCC_PLL_MUL9);
led_init();
timer_init(5000 - 1,7200 - 1);//为达到500ms的效果
while(1)
{ }
}