stm32 定时器

本文介绍了STM32定时器的计数器功能及其配置方法,包括如何设置定时器频率和周期来实现精确的计数间隔,并展示了1ms中断周期的具体实现代码。此外,还涉及了PWM输出模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器的基本计数功能和PWM输出模式。

1. 计数器功能

    计数器功能是定时器提供的最基本的功能,最典型的应用是内部任务的周期性管理。
    计数器功能支持定时器的向上,向下和中央对齐方式。
    通过预分频寄存器TIMx_PSC设置timer的频率,f(timer) = 系统频率/(TIMx_PSC+1)
    通过自动重装载寄存器TIMx_ARR设置timer的触发周期,即多少个计数器周期产生timer中断,在中断里可以设置内部任务的基准计数值(定时周期),定时周期 = f(timer)/TIMx_ARR.

以下是计数器频率为10KHz,1ms产生一次timer中断,即计数精度为1ms的参考代码。

1. hal_timer.c

#include "includes.h"
void hal_timer_func_config(TIM_TypeDef* TIMx)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

    TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;   //timer1的频率 = 72000000/7200 = 10KHz
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上,向下还是中央计时模式
    TIM_TimeBaseInitStructure.TIM_Period = 9;   // 中断1ms发生一次.
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);
}

//2. timer nvic config
void hal_timer_nvic_config()
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
}
//3. timer init
void hal_timer_init(TIM_TypeDef* TIMx)
{
    hal_timer_func_config(TIM1);

    hal_timer_nvic_config();

    TIM_ClearITPendingBit(TIM1,TIM_IT_Update);  //清中断
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);  //中断使能

    //enable timer
    TIM_Cmd(TIM1,ENABLE);
}

2. stm32f10x_it.c
中断函数中,timer的配置。其中gTimer1_ms_counter和gTimer1_s_counter 供应用程序调用。

uint32_t gTimer1_ms_counter = 0;
uint32_t gTimer1_s_counter = 0;
void TIM1_UP_IRQHandler()
{
    //
    if(TIM_GetITStatus(TIM1,TIM_IT_Update) == SET){
        TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
        gTimer1_ms_counter++;
        if(gTimer1_ms_counter%1000 == 0){
            gTimer1_s_counter++;
        }
    }
}

2. PWM输出模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值