STM32f103 —— timer

本文详细介绍了STM32微控制器中四个定时器(LED、PWM、重发及按键定时器)的配置过程,包括中断优先级设置、时钟预分频、周期配置等,并提供了具体的初始化和使能函数。

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

#ifndef _TIMER_H_
#define _TIMER_H_

#include "stm32f10x.h"
#include "type.h"

// LED定时器,按键定时器,重发定时器
#define LED_TIMER           TIM1
#define LED_TIMER_DIV       7200
#define LED_TIMER_PERIOD    2500

#define PWM_TIMER           TIM2

#define RESEND_TIMER        TIM3
#define RESEND_TIMER_DIV    7200  
#define RESEND_TIMER_PERIOD 2500

#define KEY_TIMER           TIM4
#define KEY_TIMER_DIV       7200
#define KEY_TIMER_PERIOD    200

void TimerNvicConfig(void);
void TimerConfig(TIM_TypeDef *timer, uint16_t div, uint16_t period);
void TimerEnable(TIM_TypeDef *timer);
void TimerDisable(TIM_TypeDef *timer);

#endif /* _TIMER_H_ */


#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "timer.h"

/*
*  三个定时器: 1 灯色   2 按键  3 重发
*/
void TimerNvicConfig(void)
{
  NVIC_InitTypeDef NVIC_StructInit;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_StructInit.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
  NVIC_StructInit.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_StructInit.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&NVIC_StructInit);

  NVIC_StructInit.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
  NVIC_StructInit.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_StructInit.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&NVIC_StructInit);

  NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
  NVIC_StructInit.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_StructInit.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&NVIC_StructInit);

  NVIC_StructInit.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
  NVIC_StructInit.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_StructInit.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&NVIC_StructInit);
}

void TimerConfig(TIM_TypeDef *timer, uint16_t div, uint16_t period)
{
  TIM_TimeBaseInitTypeDef TIM_StructInit;

  if(LED_TIMER == timer)
  {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  }
  else if(RESEND_TIMER == timer)
  {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  }
  else if(KEY_TIMER == timer)
  {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  }

  TIM_StructInit.TIM_Period = period;
  TIM_StructInit.TIM_Prescaler = div;
  TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; /* 数字滤波器采样频率 */
  TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; /* 向上计数 */
  TIM_StructInit.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(timer, &TIM_StructInit);
  TIM_ITConfig(timer, TIM_IT_Update, ENABLE); /* 允许中断 */
  TIM_ClearFlag(timer, TIM_FLAG_Update); /* 更新定时器会产生更新时间,清除标志位 */
}

void TimerEnable(TIM_TypeDef *timer)
{
  TIM_Cmd(timer, ENABLE);
}

void TimerDisable(TIM_TypeDef *timer)
{
  TIM_Cmd(timer, DISABLE);
}

### STM32F103C8T6 定时器4 使用教程 #### 配置方法概述 对于STM32F103C8T6中的定时器4,这是一种通用定时器,可以用于多种功能如输入捕获、输出比较、PWM生成等。配置此定时器涉及初始化设置及时钟源的选择。 为了启动TIM4,在RCC_APB1ENR寄存器中使能其外设时钟[^1]。接着通过修改相应的自动重装载寄存器(ARR)、计数器寄存器(CNT)以及捕捉/比较寄存器来定义时间间隔和其他参数[^2]。 #### 初始化代码示例 下面是一个简单的初始化函数例子: ```c void TIM4_Init(void){ // 使能GPIOA与时基设施TIM4的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 设置分频系数为72-1,即APB1频率除以72 TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Period = 99; // 自动重载值 TIM_InitStruct.TIM_Prescaler = 72 - 1; // 分频系数 TIM_InitStruct.TIM_ClockDivision = 0; // 不使用时钟分割 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM4,&TIM_InitStruct); // 根据指定参数初始化TIMx的时间基数单位 // 开启TIM4中断请求并允许全局中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); // 使能溢出中断 TIM_Cmd(TIM4, ENABLE); // 使能TIM4 } ``` 上述代码展示了如何启用定时器及其相关资源,并设置了基本的工作方式——向上计数模式下的周期性事件触发机制[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值