STM32CubeMX 实战教程:定时器中断实验(LL 库)

1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取;
2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章;

博主分享不易,请给三连哦(关注 + 点赞 + 收藏),你的鼓励是博主分享的动力。

STM32CubeMX 实战教程:定时器中断实验(LL 库)

  • 1 前言
    • 1.1 STM32CubeMX
    • 1.2 教程介绍
    • 1.3 准备工作
    • 1.4 硬件资源
  • 2 配置项目
    • 2.1 项目导入
    • 2.2 TIM2 & NVIC 配置
    • 2.3 Clock 配置
    • 2.4 生成代码
  • 3 代码测试
  • 4 结束
  • 附录
    • 附录1 相关教程

1 前言

1.1 STM32CubeMX

2.1_1.STM32CubeMX_20200803

点击图片进入 ST 官网 STM32CubeMX 介绍页面

1.2 教程介绍

    STM32CubeMX 实战教程 基于正点原子 STM32F1 精英板(STM32F103ZET6)平台,旨在通过对板载资源的使用将各种外设的配置方法讲述清楚。更多教程请订阅 [专栏]STM32CubeMX 。
    本教程是 STM32CubeMX 实战教程中的第六篇,主要通过 定时器中断实验,将 STM32CubeMX TIM2 定时中断 的配置方法讲述清楚。

1.3 准备工作

    系统版本:Windows 10 专业版 64 位
    软件版本:STM32CubeMX V6.0.0 ( STM32CubeMX 下载及安装教程 )
    硬件平台:正点原子 STM32F1 精英板
    编译环境:MDK_ARM V5.29 ( MDK_ARM 下载及安装教程 )
    调试工具:ST-LINK/V2

1.4 硬件资源

    本节教程使用的硬件资源分配:

序号 引脚 引脚功能 硬件连接 备注
01 PB5 Output LED 灯(DS0) 低电平亮
02 PE5 Output LED 灯(DS1) 低电平亮

2 配置项目

2.1 项目导入

    将第三篇的 USART_Test 的项目另存作为 Timer_Test 的项目初始模板。
    工程模板修改及项目导入,请参考:STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验。这里就不重复了,项目目录如下:
STM32CubeMX 实战教程:定时器中断实验(LL 库)_第1张图片

2.2 TIM2 & NVIC 配置

  1. 点击 TIM2,选择 Internal Clock 使能 TIM2 时钟,配置所需的分频系数、计数器重装载值及相应参数;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第2张图片
TIM2 配置相关参数介绍
参数 描述 取值范围 备注
Prescaler(PSC - 16 bits value) 计数器时钟预分频器 0-65535 定时器时钟频率 = 定时器所在总线频率/(PSC + 1)
Counter Mode 计数模式(向上/向下) Up/Down -
Counter Period 计数器重装载值 0-65535 -
Internal Clock Division(CKD) 时钟分频因子 0,2,4 表示定时器时钟与数字滤波器采样时钟之间的分频比
auto-reload preload 自动重装载值预加载器(缓存器) 0,1 -
TIM2 配置相关时钟及时间介绍
参数 描述 计数器值 备注
定时器频率 计数器计数时钟频率 - 100KHz 72MHz/(719 + 1)
计数器计数时间 计数器加/减 1 时间 - 10us 1/100KHz
中断时间 计数器重加载后至溢出的时间 19999 200ms 10us*(19999 + 1)
  1. 点击 NVIC,使能 TIM2 global interrupt 中断,优先级设置为 3,0;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第3张图片
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第4张图片
    (PS:在 TIM2 配置窗口的 NVIC Swttings 也可以使能 TIM2 中断,但不可以修改中断优先级)
  2. 点击 Code generation,勾选 Generate IRQ handler 生成中断服务函数,勾选 Call HAL handler
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第5张图片
    (关于 Code generation 窗口具体介绍,请参考:STM32CubeMX 实战教程:外部中断实验 > 附录2 NVIC Code generation 配置窗口介绍 )

2.3 Clock 配置

    Clock 不需要配置,可直接继续使用。可参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程STM32CubeMX 实战教程:SysTick 实验
STM32CubeMX 实战教程:定时器中断实验(LL 库)_第6张图片

TIM2 时钟分配
外设 描述 时钟来源 备注
TIM2 通用定时器 2 APB1 72MHz

2.4 生成代码

    项目管理配置及生成代码请参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程STM32CubeMX 项目配置窗口介绍(一)STM32CubeMX 项目配置窗口介绍(二)
    点击 GENERATE CODE 生成代码。
STM32CubeMX 实战教程:定时器中断实验(LL 库)_第7张图片

3 代码测试

  1. 打开 MDK_ARM 工程;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第8张图片

  2. 查看 MX_TIM2_Init() 函数源码;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第9张图片
    分析 MX_TIM2_Init() 函数:
    a. 开启时钟,开启中断及分配中断优先级;
    b. 设置定时器参数:分频系数、计数模式、自动重装载值、时钟分频因子(时钟分割);
    c. 关闭自动重装载值缓存器;
    d. 相比于标准库配置,未开启更新中断:TIM_DIER_UIE = 1
      标准库函数语句:TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    e. 相比于标准库配置,未使能定时器计数器:TIM_CR1_CEN = 1
      标准库函数语句:TIM_Cmd(TIM2, ENABLE);

  3. main 函数的用户代码区域 2 使能更新中断并开启 TIM2 计数器;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第10张图片
    (PS:后面有 main 函数完整代码)

  4. tim.c 文件的用户代码区域 0 加入中断处理回调函数 TIM2_IRQ() 源码;(请自行在头文件中进行函数声明)
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第11张图片
    TIM2_IRQ() 函数代码如下:

/* USER CODE BEGIN 0 */

void TIM2_IRQ(void)
{
  if(LL_TIM_IsActiveFlag_UPDATE(TIM2) == SET)
  {
    LL_TIM_ClearFlag_UPDATE(TIM2);
    
    LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin);
  }
}

/* USER CODE END 0 */
  1. stm32f1xx_it.c 文件的中断处理函数 TIM2_IRQHandler 用户代码区域 0 加入中断处理回调函数 TIM2_IRQ();(请自行在头文件 main.h 中包含头文件 tim.h
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第12张图片
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第13张图片
  2. main 函数中 while 循环中加入程序运行指示灯代码;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第14张图片
    main 函数代码如下:
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);

  NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* System interrupt init*/

  /** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST
  */
  LL_GPIO_AF_Remap_SWJ_NONJTRST();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  SysTick->CTRL  = SysTick_CTRL_ENABLE_Msk |  // SysTick Timer clock source = HCLK_DIV8 (HCLK/8 = 9MHz)
                   SysTick_CTRL_TICKINT_Msk;  // SysTick Timer ENABLE | SysTick Timer Interrupt ENABLE
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  LL_RCC_GetSystemClocksFreq(&get_rcc_clock);
  
  LL_GPIO_SetOutputPin(DS0_GPIO_Port, DS0_Pin);
  LL_GPIO_SetOutputPin(DS1_GPIO_Port, DS1_Pin);
	
  LL_USART_EnableIT_RXNE(USART1);  // ENABLE USART1 RXNE Interrupt
  LL_USART_EnableIT_IDLE(USART1);  // ENABLE USART1 IDLE Interrupt

  LL_TIM_EnableIT_UPDATE(TIM2);    // ENABLE TIM2 IT Update Interrupt <=> TIM_DIER_UIE = 1
  LL_TIM_EnableCounter(TIM2);      // ENABLE TIM2 Counter             <=> TIM_CR1_CEN  = 1
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    LL_mDelay(400);
    LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin);
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	}
  /* USER CODE END 3 */
}
  1. 编译工程;
    STM32CubeMX 实战教程:定时器中断实验(LL 库)_第15张图片
  2. 使用 ST-LINK/V2 下载程序,按下复位按键,若按照下面操作看到正常现象,则说明程序正常运行,定时器中断配置成功。
Steps 操作 正常现象 备注
1 按下 复位 按键,松开 程序运行指示灯 DS0 每 0.8s 亮 0.4s,定时器中断指示灯 DS1 每 0.4s 亮 0.2s -

4 结束

    本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途, 禁止商用, 转载或公开使用请联系作者授权。
    此教程由本人独立整理,如有不当之处,欢迎指正。

附录

附录1 相关教程

    STM32Cube 系列软件教程总目录请参考文章:STM32Cube 生态系统之网站、视频、文档及教程汇总
    该文章还提供:

  • STM32Cube 生态系统相关文章
  • STM32Cube 生态系统相关软件更新介绍
  • STM32Cube 生态系统相关教程汇总
  • STM32Cube 生态系统相关网站汇总
  • 该文章会不定期修改更新,更多信息请进入文章查看

你可能感兴趣的:(#,STM32CubeMX,STM32,STM32Cube,STM32CubeMX,LL库,定时器中断)