赞
踩
基本原理和概念
本文章只涉及定时器中断HAL库函数总结
原文notion链接
使用内部时钟-基本配置如下
具体时基单元配置和定时器更新中断配置
我使用的单片机的内部时钟频率为72MHz
然后通过这三个值来实现定时器的频率
那根据这里图片里面的讲解
72000000/720(PSC)/10000(ARR)=10Hz-也就是0.1s,所以这个定时器就是每0.1s一次
这些函数的定义都在**stm32f1xx_hal_tim.c
**这个文件中,但是使用在上面地方根据实际情况来定
还有很多函数这里没有提出来,但是功能都是相通的理解这些,其他的函数自己理解也不废劲
定时器基本配置初始化函数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
)**中进行进一步的操作
首先在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
-运行回调函数的内容-运行完之后再继续回到主程序且继续重新计数
使用定时器来实现1s的定时
然后每秒钟发送一句Hello,World给串口助手
配置的串口中断和定时器的中断的响应优先级相同
程序运行初始化-启动定时器基本模式并使能定时器中断-主程序运行并且定时器计数-达到自动重装载值(达到周期)-产生中断-主程序被打断进入到 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);
}
}**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。