HAL库定时器(基本定时和中断功能)

HAL库-定时器(基本定时功能)

基本原理和概念

本文章只涉及定时器中断HAL库函数总结
原文notion链接

1.初始化

使用内部时钟-基本配置如下

HAL库定时器(基本定时和中断功能)_第1张图片

具体时基单元配置和定时器更新中断配置

HAL库定时器(基本定时和中断功能)_第2张图片

HAL库定时器(基本定时和中断功能)_第3张图片

  • PSC预分频值
  • 计数模式
  • ARR自动重装载值

我使用的单片机的内部时钟频率为72MHz

然后通过这三个值来实现定时器的频率

那根据这里图片里面的讲解

72000000/720(PSC)/10000(ARR)=10Hz-也就是0.1s,所以这个定时器就是每0.1s一次

2.HAL库定时器函数(基本定时功能)

这些函数的定义都在**stm32f1xx_hal_tim.c**这个文件中,但是使用在上面地方根据实际情况来定

还有很多函数这里没有提出来,但是功能都是相通的理解这些,其他的函数自己理解也不废劲

初始化函数(这部分是可以通过CubeMx配置自动生成的,也可以自己去用这些函数书写)

  • 定时器基本配置初始化函数HAL_TIM_Base_Init

    全写: HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);

    功能:是HAL库中用于初始化定时器的基本配置的函数之一。它用于对定时器进行基本参数的配置,包括时钟分频、计数模式、自动重载值等。

    位置: 这个函数在使用的时候,是直接就在配置好的文件中出现的,当你已经通过CubeMx进行配置之后,他会自己在tim.c文件中调用实现相关的初始化。

  • 关闭定时器基本配置初始化函数HAL_TIM_Base_DeInit

    全写: HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim);

    功能:关闭关闭定时器基本配置的初始化

  • 定时器基本配置初始化回调函数HAL_TIM_Base_MspInit

    全写:void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);

    功能:是一个回调函数,用于初始化定时器的时钟和GPIO引脚的配置

    位置: 这个函数会被 HAL_TIM_Base_Init函数进行调用,同样在初始化的时候就会配置好

  • 关闭定时器基本配置初始化回调函数HAL_TIM_Base_MspDeInit

    全写:void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim);

    也是关闭的功能,这里就不多介绍了

工作函数

  • 定时器基本模式启动函数HAL_TIM_Base_Start

    全写:HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);

    功能: 用于启动定时器基本模式

    运行流程: 当使用了HAL_TIM_Base_Start函数后,定时器将开始计数,并在达到预设的计数值时就会重新开始计数

  • 定时器基本模式中断启动函数HAL_TIM_Base_Start_IT

    全写: HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

    功能: 用于启动定时器的基本模式并使能定时器中断

    运行流程: 就是当使用这个功能来启动定时器的时候,和上面的定时器基本模式启动函数不同 的是,开始计数后,在达到预设的计数值时会触发中断,进入中断处理函数,在中断处理函数中根据不同的中断源来选择回调函数,在回调函数中进一步处理

  • 定时器中断处理函数HAL_TIM_IRQHandler

    全写:void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)

    功能: This function handles TIMx global interrupt

    运行流程: 进入中断处理函数,在中断处理函数中根据不同的中断源来选择回调函数

    使用实例:

    **/**
      * @brief This function handles TIM2 global interrupt.
      */
    void TIM2_IRQHandler(void)//定时器2的中断处理函数
    {
      /* USER CODE BEGIN TIM2_IRQn 0 */
    
      /* USER CODE END TIM2_IRQn 0 */
      HAL_TIM_IRQHandler(&htim2);
      /* USER CODE BEGIN TIM2_IRQn 1 */
    
      /* USER CODE END TIM2_IRQn 1 */
    }
    这部分代码是在stm32f1xx_it.c文件中截取的,是CubeMx生成的
    意思就是定时器2的中断处理函数内部其实就是使用了
    中断处理函数(参数是定时器2**
    
  • 定时器周期到达回调函数HAL_TIM_PeriodElapsedCallback

    全写: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

    功能: 定时器中断的回调函数。

    运行流程: 当中断源是定时器周期到达的情况下,在中断处理函数中会据此进入到**定时器周期到达回调函数(这个函数HAL_TIM_PeriodElapsedCallback)**中进行进一步的操作

3.定时器函数程序编写和运行流程

编写流程

首先在CubeMx中配置好之后,前面写的初始化函数就自动配置好了,可以不用管

然后在main.c文件中使用 HAL_TIM_Base_Start或者HAL_TIM_Base_Start_IT 来启动定时器(根据程序要求来)

如果是使用 HAL_TIM_Base_Start 那就去调用计数值这类数值去分析。。。

如果是使用 HAL_TIM_Base_Start_IT 那就去编写 HAL_TIM_PeriodElapsedCallback 在这个函数里面去写一些操作(建议这个函数再开一个源文件去编写,后面别的程序也可以直接复制)

运行流程(以中断模式例)

这部分对于理解很重要哦

程序运行初始化-启动定时器基本模式并使能定时器中断-主程序运行并且定时器计数-达到自动重装载值(达到周期)-产生中断-主程序被打断进入到 HAL_TIM_IRQHandler -根据中断来源是周期达到选择定时器周期到达回调函数HAL_TIM_PeriodElapsedCallback-运行回调函数的内容-运行完之后再继续回到主程序且继续重新计数

4.训练实例

实现效果和程序运行流程:

实现效果

使用定时器来实现1s的定时

然后每秒钟发送一句Hello,World给串口助手

程序运行流程

HAL库定时器(基本定时和中断功能)_第4张图片

配置的串口中断和定时器的中断的响应优先级相同

程序运行初始化-启动定时器基本模式并使能定时器中断-主程序运行并且定时器计数-达到自动重装载值(达到周期)-产生中断-主程序被打断进入到 HAL_TIM_IRQHandler -根据中断来源定时器更新时间选择跳转到定时器周期到达回调函数HAL_TIM_PeriodElapsedCallback-在回调函数中开启串口发送中断函数-然后定时器周期到达回调函数运行结束退出-回到主程序-这时候程序会有3条时间线(主程序线;定时器;串口发送中断)-然后会根据后面两条线的中断优先级来打断主程序

对于加粗的地方举个例子讲解一下具体的过程:

具体就是使用串口发送中断函数并且回到主程序之后,串口的发送数据寄存器空中断会被使能,程序会在每发送一个字节的数据之后产生一次串口的中断信号,主程序会被打断进入到串口中断处理函数中处理,在处理的过程中如果定时器的更新中断信号出现,由于中断优先级相同,不会被打断可以实现数据的成功传输,传输结束之后在进行定时器的更新中断的处理,保证了数据的传输,同时由于串口发送数据的速度很快,所以对时间的影响很微小。这里面的关键就是使用这个串口发送中断函数并没有进行中断处理,只是将串口的发送数据寄存器空中断会使能,所以没有出现中断嵌套,因此在配置中断优先级的时候怎么配置程序都是可以运行的。

部分代码:

**/**
  * @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. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

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

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}**
**/* Private defines -----------------------------------------------------------*/
/* USER CODE BEGIN Private defines */
extern uint8_t tratest[];
/* USER CODE END Private defines */**
**#include "main.h"
#include "ittim.h"
#include "tim.h"
#include "usart.h"
#include "stdio.h"

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
	{
		if (htim == &htim1)
		{
			HAL_UART_Transmit_IT(&huart1,tratest,11);
		}
		
	}**

你可能感兴趣的:(STM32HAL库,单片机,嵌入式硬件,stm32,c语言)