• 最详细STM32,cubeMX 定时器


    这篇文章将详细介绍 STM32,cubeMX 定时器的配置和使用。


    前言

    • 实验开发板:STM32F103C8T6。
    • 所需软件:keil5 , cubeMX 。
    • 实验目的:了解 cubeMX 定时器 的配置和使用。
    • 实验:使用定时器控制 led 闪烁。

    一、定时器基础知识

    STM32的定时器是用于时间测量和事件生成的复杂工具。可以使用内部或外部时钟源。时钟源和分频设置将决定定时器计数的速度。

    定时器可以配置为在特定事件(如溢出或匹配特定值)上触发中断。这使得它能够周期性地执行代码片段,例如读取传感器数据或刷新显示。

    定时器的主要组件:

    • 计数器:定时器的核心部分,可以配置向上/向下 计数。
    • 预分频器:分频定时器的输入时钟改变计数器的计数速率。如果时钟速度是72MHz,并使用预分频值为7199,那么计数器的计数速度将是10kHz。(72MHz / 7199)
    • 自动重载寄存器(ARR, Auto-reload register):定义了计数器重置的值。

    二、cubeMX 配置

    1. 选择芯片。
      在这里插入图片描述

    2. 配置仿真。
      在这里插入图片描述

    3. 配置时钟,选择 HSE, 高速时钟。
      在这里插入图片描述

    4. 配置时钟树。选择最大 72 MHZ, 然后双击 enter 即可。系统会自动配置最合适的时钟。
      在这里插入图片描述

    5. 设置工程名,路径和工具链。
      在这里插入图片描述

    6. 自动生成 .c / .h 文件。
      在这里插入图片描述

    7. 将 led 引脚设置输出。
      在这里插入图片描述

    8. 让 led 引脚默认输出高电平。因为 根据实际电路当引脚是低电平时,led 点亮。
      在这里插入图片描述

    9. 这里我使用 定时器2 , 并使用 内部时钟源。
      在这里插入图片描述

    10. 使能定时器中断
      在这里插入图片描述

    11. 设置 定时器参数(分频系数,向上计数,自动重装载值)。
      在这里插入图片描述

    12. 创建工程。
      在这里插入图片描述

    三、定时时长

    定时时长 = (计数器自动重载值 + 1 )*( 分频系数 + 1 )/ 定时器时钟频率

    (为什么重装载值和分频系数不置为整数? 原因:精越定时)

    这里 我想要设置 定时时长为 1ms ,那么首先设置相关参数:

    • 定时器时钟频率 : 72 MHZ。
    • 分频系数 (PSC): 选择 72 分频。
    • 计数器自动重载值(ARR):可控制定时器的定时时间,改变定时时长。

    因为 分频系数 / 定时器时钟频率 = 计数器的计数速率, 所以 72 / 72MHZ = 1us 。则每 1 us 计数一次。当计数到 1000 (ARR) 时, 发生定时器的溢出中断. 即 ARR 从 0 增加到 1000 ,每 1 us 增加一次,则 定时时长为 1000 * 1 us = 1 ms .
    在这里插入图片描述

    四、自动生成代码讲解

    自动生成的 定时器的代码在 tim.c 文件中。

    1. 首先还是 先定义一个 定时器对象,这是一个结构体。
    2. 初始化这个结构体中的相关参数。
    3. 调用 HAL_TIM_Base_Init(&htim2) 对其初始化。
    4. 之后自动调转到HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) 执行。
      5. __HAL_RCC_TIM2_CLK_ENABLE( ); 开启定时器 2
    5. HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); 设置优先级
      HAL_NVIC_EnableIRQ(TIM2_IRQn); 使能中断
      在这里插入图片描述
      在这里插入图片描述

    五、实验程序

    开启定时器中断:

    HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
    
    • 1

    定时器中断回调函数:

    /* 发生定时器中断后调用定时器中断回调函数 */
    
    HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
    
    • 1
    • 2
    • 3

    定时器控制 led 闪烁:

    static int i=0;
    
    
    /* 根据cubeMX 配置的参数确定多久触发定时器中断,这里 是每 1 ms 触发一次中断即调用该函数 */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	if(htim == &htim2)
    	{
    		if(++i == 1000)					// 当 i 加到 1000 时,则时间到达 1 s, 翻转 led 电平
    		{
    			i=0;
    			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结

    下篇文章为大家介绍 串口 的相关知识。

  • 相关阅读:
    程序员们保住自己饭碗
    678. 有效的括号字符串
    MySQL 如何避免 RC 隔离级别下的 INSERT 死锁?
    Go中的有限状态机FSM的详细介绍
    逆向-还原代码之split (Intel 32)
    基于图像形态学处理的路面裂缝检测算法matlab仿真
    面试逻辑题,有8个小球和一个天平,一个小球偏重,其它小球一样重,问最少称几次可以找出那个重球?
    【操作系统】2009年408真题第 46 题
    bash-4.2# 解决办法
    【560. 和为 K 的子数组】
  • 原文地址:https://blog.csdn.net/wuyiyu_/article/details/133969768