STM32——定时器中断

 一  定时器工作及步骤

1 RCC开启时钟,打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开

2.选择时基单元的时钟源,由于是内部中断所以选择内部时钟源,

3 配置时基单元

4.配置NVIC

定时器初始化:

总结:时钟源选择用下面6个函数,时基单元用TimeBaseInit 函数,中断输出控制用ITConfig函数,NVIC用NVI_Init函数,运行控制用TIM_Cmd函数

函数介绍

void TIM_DeInit(TIM_TypeDef* TIMx);    //恢复缺省配置

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//时基单元初始化,用来配置时基单元

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//可以把结构体变量赋一个默认值

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//用来是能计数器对应图中的运行控制
//TIM_TypeDef* TIMx  选择定时器
//FunctionalState NewState使能或者失能

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
//用来使能中断输出信号,对应中断输出控制
//TIM_TypeDef* TIMx      选择要配置的定时器
//TIMx, uint16_t TIM_IT    选择要配置哪个中断输出
//FunctionalState NewState     使能或者失能


//下面6个函数对应时基单元的时钟选择部分  时钟源选择
//可以选择RCC内部时钟,ETR外部时钟,ITRx其他定时器,TIx捕获通道

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
//选择内部时钟,


void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
//选择ITRx其他定时器时钟
//TIM_TypeDef* TIMx      选择要配置的定时器
/uint16_t TIM_InputTriggerSource      选择要接入哪个其他定时器


void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);
//选择TIx捕获通道时钟
//uint16_t TIM_TIxExternalCLKSource     选择TIx具体某个引脚
//uint16_t TIM_ICPolarity, uint16_t ICFilter  输入极性和滤波器   对于外部引脚的波形一般会有极性选择和滤波器,这样更灵活



void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,             uint16_t    TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
//选择ETR通过外部时钟模式1输入的时钟
//uint16_t TIM_ExtTRGPrescaler    外部触发预分频器,可以对ETR外部时钟再提前做一个分频
//TIM_ExtTRGPolarity, uint16_t ExtTRGFilter    输入极性和滤波器


void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
//选择ETR通过外部时钟模式2输入的时钟
//和1一样,如果不需要触发外部输入功能,这两个时钟是一样的


void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
//单独用来配置ETR引脚的预分频器,极性,滤波器这些参数

二 其他参数

因为在初始化结构体里有很多关键的参数,比如自动重装值和预分频值,这些参数可能在初始化之后还需要更改,为了更改方便,可以使用以下函数更改关键参数。

使用方法:调用函数,给参数,使能或失能

1.void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

2.void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
//给计数器写入一个值,想手动给值就用这个函数

3.void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
//给自动重装写入一个值


4.uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
//获取当前计数器的值
//可以看到当前计数器计算到哪里了,返回值就是当前计数器的值

5.uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
//获取当前预分频器的值

下面4个函数用来获取中断标志位和清除标志位
6.FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);


7.void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);


8.ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);


9.void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

定时器配置步骤:

1.开启时钟  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE);

2.选择时基单元时钟
    void TIM_InternalClockConfig(TIM2);
//选择TIM2作为时基单元内部时钟

3.配置时基单元
void TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
第二个是配置结构体
1 typedef struct {
2 uint16_t TIM_Prescaler; // 预分频器
3 uint16_t TIM_CounterMode; // 计数模式
4 uint32_t TIM_Period; // 定时器周期 ARR自动重装器的值
5 uint16_t TIM_ClockDivision; // 时钟分频
6 uint8_t TIM_RepetitionCounter; // 重复计算器
7 } TIM_TimeBaseInitTypeDef;

4.使能更新中断
void TIM_ITConfig(TIM2, uint16_t TIM_IT, FunctionalState NewState);
//
  * @param  TIM_IT: specifies the TIM interrupts sources to be enabled or disabled.
  *   This parameter can be any combination of the following values:
  *     @arg TIM_IT_Update: TIM update Interrupt source
//更新中断
  *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source

  *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source

  *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source

  *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source

5.配置NVIC 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup2)
//选择NVIC优先级分组2

NVIC_InitTypeDef 
配置NVIC参数

6.启动定时器

TIM_Cmd(TIM2,ENABLE)

TIM_TimeBaseInitTypeDef  结构体介绍 
1 typedef struct {
2 uint16_t TIM_Prescaler; // 预分频器
3 uint16_t TIM_CounterMode; // 计数模式
4 uint32_t TIM_Period; // 定时器周期 ARR自动重装器的值
5 uint16_t TIM_ClockDivision; // 时钟分频
6 uint8_t TIM_RepetitionCounter; // 重复计算器
7 } TIM_TimeBaseInitTypeDef;
(1) TIM_Prescaler 定时器预分频器设置 ,时钟源经该预分频器才是定时器时钟,它设定
TIMx_PSC 寄存器的值。可设置范围为 0 65535 ,实现 1 65536 分频。
(2) TIM_CounterMode 定时器计数方式 ,可是在为向上计数、向下计数以及三种中心对
齐模式。基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初
始化。
(3) TIM_Period :定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到
影子寄存器。可设置范围为 0 65535
(4) TIM_ClockDivision :时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟
频率分频比,基本定时器没有此功能,不用设置。
(5) TIM_RepetitionCounter :重复计数器,属于高级控制寄存器专用寄存器位,利用它可
以非常容易控制输出 PWM 的个数。这里不用设置。
虽然定时器基本初始化结构体有 5 个成员,但对于基本定时器只需设置其中两个就可
以,想想使用基本定时器就是简单。

定时频率=72MHz/(PSC+1)/(ARR+1),定时1s,也就是定时频率为1Hz,PSC就给7200,ARR给70000然后两个参数-1,因为预分频器和计数器有偏差所以要-1,PSC和ARR的值为0-65535之间,他们给的值不是唯一的可以预分频器给少点,自动重装器给多点

这里就是给72M进行7200的分频,得到10K的计数频率,在10K的频率下计10000个数就是1s的时间

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32G431系列中,定时器中断的配置需要通过STM32CubeMX软件进行参数配置。首先,需要在定时器模块中选择所需的定时器(如高级定时器TIM1、TIM8、通用定时器TIM2、TIM3、TIM4等)。然后,在KEIL5软件中编写定时器中断函数,该函数会在定时器中断发生时被调用。接下来,启动定时器,使其开始计时并触发定时器中断。 请注意,根据网络上的资料来看,蓝桥杯嵌入式竞赛好像不考察外部中断,因此在学习蓝桥杯嵌入式开发板时,可以跳过外部中断的学习,重点关注定时器的应用。在STM32G431系列中,定时器通常分为高级定时器、通用定时器和基本定时器三种,它们分别具有不同的功能和使用方式。高级定时器具有完整的三种定时器模式(向上、向下、向上/向下),可以用于各种目的,如测量输入脉冲长度信号(输入捕获)或产生输出波形(输出比较、PWM、带死区插入的互补PWM)。通用定时器与高级定时器类似,但无法输出互补PWM波。基本定时器一般用于驱动DAC,在其他情况下较少使用。 总之,要实现STM32G431定时器中断,需要使用STM32CubeMX软件配置定时器参数,编写定时器中断函数,并启动定时器。具体的定时器选择和配置取决于所需的功能和应用场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [蓝桥杯--嵌入431RBT6(定时器中断篇)](https://blog.csdn.net/weixin_57089671/article/details/129093658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [蓝桥杯STM32G431RBT6学习——定时器中断](https://blog.csdn.net/weixin_44098974/article/details/128729412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值