基于stm32的定时器点灯实验程序分析

五、定时器

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)
    {   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值