STM32CUBEIDE-F407(2)-定时器中断

概述

本章通过STM32CUBEIDE配置STM32F407的定时器中断

 原理

本文选用的定时器为高级定时器TIM1,可生成上溢中断、下溢中断,其内部定时器原理如下图所示

其生成PWM波最主要的模块为其时基单元,时基单元主要包括:计数器寄存器 (TIMx_CNT)、预分频器寄存器 (TIMx_PSC)、自动重载寄存器 (TIMx_ARR)、重复计数器寄存器 (TIMx_RCR)。

预分频器可对计数器时钟频率进行分频,分频系数介于 1 和 65536 之间。

在递增计数模式下,计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新

从 0 开始计数并生成计数器上溢事件。如下图所示

在递减计数模式下,计数器从自动重载值(TIMx_ARR 寄存器的内容)开始递减计数到 0,

然后重新从自动重载值开始计数并生成计数器下溢事件。如下图所示

在中心对齐模式下,计数器从 0 开始计数到自动重载值(TIMx_ARR 寄存器的内容)— 1,

生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从

0 开始重新计数。

将通道配置为输出模 式时,其输出比较中断标志将在以下模式下置 1,即:计数器递减计数(中心对齐模式 1, CMS =“01”)、计数器递增计数(中心对齐模式 2,CMS =“10”)以及计数器递增/递 减计数(中心对齐模式 3,CMS =“11”)。

在中心对齐模式下,如果 RCR 值为奇数,更新事件将在上溢或下溢时发生,这取决于何时

写入 RCR 寄存器以及何时启动计数器。如果在启动计数器前写入 RCR,则 UEV 在上溢时

发生。如果在启动计数器后写入 RCR,则 UEV 在下溢时发生。例如,如果 RCR = 3,UEV

将在每个周期的第四个上溢或下溢事件时生成(取决于何时写入 RCR)。

IDE操作

中断频率 f=定时器时钟频率/(PSC+1)*(ARR+1)

上溢/下溢中断:中断频率=f(RCR=0)

中心对齐模式1:中断频率=f(RCR=0)

定时器1对应的时钟为168M,故中断频率为20k。

 

生成代码如下所示,

void TIM1_UP_TIM10_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */

  /* USER CODE END TIM1_UP_TIM10_IRQn 0 */
  HAL_TIM_IRQHandler(&htim1);
  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */

}

在main.c文件里进行初始化以及中断开启函数使能

  MX_TIM1_Init();

  HAL_TIM_Base_Start_IT(&htim1);

需要注意的是控制算法需在定时器中断回调函数里进行编写

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim == (&htim1))
    {

//中断函数编写

    }

}

采用GPIO口输出翻转模式来测量中断频率是否正确


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim == (&htim1))
    {
        HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_4);

}

}

可以看到,其频率为10k,因为是在每次上升沿和下降沿的时候发生中断,故中断频率为20k,绿色波形为PWM波,其频率为10k,后续会讲到。

### 配置STM32F407定时器 #### 使用STM32CubeMX初始化定时器设置 为了在STM32CubeIDE中配置STM32F407定时器,首先需要通过STM32CubeMX完成初步硬件抽象层(HAL)库的配置。启动STM32CubeMX并加载目标板型号STM32F407VGT6。 选择项目所需的时钟频率和其他外设参数之后,在中间面板找到TIMx (其中x代表具体的定时器编号),点击进入其配置界面[^1]。 在此界面上可以调整多个选项来满足特定需求: - **Mode**: 设置操作模式为向上计数、向下计数或中央对齐PWM等。 - **Prescaler**: 定义预分频系数,用于降低输入到自动重装载寄存器ARR之前的时钟速度。 - **Period**: 设定周期值即最大计数值,当计数达到此值会触发更新事件。 - **Clock Division(CKD)**: 控制死区时间生成机制以及决定捕获/比较单元的工作方式。 - **Repetition Counter**: 对于高级控制定时器而言非常重要,它允许重复执行一系列动作直到计数结束。 保存这些更改并将代码自动生成至STM32CubeIDE环境中以便进一步编辑和编译链接过程[^2]。 #### 编写C/C++源文件实现功能逻辑 接下来是在`main.c`或其他适当位置加入如下所示的基础框架代码片段,该部分展示了如何开启中断服务例程(ISR), 并利用回调函数处理定时溢出事件: ```c /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f4xx_hal.h" /* Private variables -----------*/ TIM_HandleTypeDef htim2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void){ /* Reset of all peripherals, Initializes the Flash interface and Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); // 开启全局中断 __HAL_RCC_TIM2_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1); HAL_NVIC_EnableIRQ(TIM2_IRQn); while (1){ // 主循环体 } } // TIM2 中断服务程序定义 void TIM2_IRQHandler(void){ if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET && __HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET){ // 清除标志位 __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE); // 用户自定义响应行为... } } ``` 上述代码实现了基本的功能模块化设计思路,并提供了简单的ISR入口点供后续扩展使用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值