stm32 定时器

定时器的基本计数功能和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输出模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32定时器STM32微控制器中的一个非常重要的模块,它可以用来生成精确的时钟信号,并且可以实现很多不同的功能。 STM32定时器主要分为两种类型:基本定时器和通用定时器。基本定时器只有一个计数器,而通用定时器则有多个计数器,并且支持更多的功能。具体可以根据实际需要选择使用哪种类型的定时器。 在STM32中使用定时器可以通过以下步骤完成: 1. 配置定时器的时钟源和分频系数; 2. 设置定时器计数器的初始值和自动重载值; 3. 开启定时器中断(可选); 4. 启动定时器。 例如,以下是使用STM32的基本定时器TIM6进行定时中断的代码: ```c #include "stm32f10x.h" void TIM6_IRQHandler(void) { // 定时器中断处理函数 } int main(void) { // 使能TIM6的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 配置TIM6的时钟源为内部时钟,分频系数为72 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct); // 开启TIM6的更新中断 TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); // 启动TIM6 TIM_Cmd(TIM6, ENABLE); while (1) { // 程序主循环 } } ``` 在上面的代码中,我们使用了STM32的库函数来配置和控制定时器,首先通过RCC_APB1PeriphClockCmd函数使能了TIM6的时钟,然后使用了TIM_TimeBaseInit函数来配置了定时器的时钟源、分频系数、计数器自动重载值等参数,然后开启了定时器的更新中断,并且最后启动了定时器。在定时器中断处理函数中可以编写需要定时执行的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值