STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解

这篇具有很好参考价值的文章主要介绍了STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以STM32G030C8T6中的HAL_TIM_Base_Start_IT()函数为例,进行解释;

一、函数原型和源代码

函数原型:

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

二、函数用法详解:

函数原型:

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

该函数用于启动定时器的中断模式。在使用该函数之前,需要先初始化好定时器的配置,并将相关的中断处理函数注册到对应的中断向量中。

2.1 参数

  • htim:指向TIM_HandleTypeDef结构体的指针,包含了定时器的实例和配置信息。

返回值:

  • HAL_OK:函数执行成功。
  • 其他值:函数执行失败。

2.1.1 TIM_HandleTypeDef结构体详解

TIM_HandleTypeDef结构体是用于配置和管理定时器的HAL库结构体之一。它包含了定时器的实例和配置信息,用于对定时器进行初始化和操作。

TIM_HandleTypeDef结构体定义如下:

typedef struct
{
  TIM_TypeDef                 *Instance;      // 定时器实例
  TIM_Base_InitTypeDef        Init;           // 定时器基本配置
  HAL_TIM_ActiveChannel       Channel;        // 定时器活动通道
  DMA_HandleTypeDef          *hdma[TIM_DMA_ID_CC1];  // 定时器DMA句柄数组
  HAL_LockTypeDef             Lock;           // 定时器锁
  __IO HAL_TIM_StateTypeDef   State;          // 定时器状态
} TIM_HandleTypeDef;

结构体成员解释如下:

  • Instance:指向TIM_TypeDef的指针,表示定时器的实例。TIM_TypeDef是一个包含了定时器寄存器的结构体,用于对寄存器进行配置和操作。
  • Init:定时器基本配置,是一个TIM_Base_InitTypeDef类型的结构体变量,包含了定时器的时钟分频系数、计数模式、自动重装载值等信息。
  • Channel:定时器活动通道,用于指示当前活动的通道。在定时器的输入捕获和输出比较等功能中使用。
  • hdma[TIM_DMA_ID_CC1]:定时器DMA句柄数组,用于配置和管理定时器的DMA传输。在使用DMA传输时,可以将DMA句柄与定时器关联。
  • Lock:定时器锁,用于保护对定时器的并发访问。在多线程或中断环境中使用。
  • State:定时器状态,表示定时器的当前状态。是一个HAL_TIM_StateTypeDef类型的枚举变量,包括以下值:
    • HAL_TIM_STATE_RESET:定时器已复位。
    • HAL_TIM_STATE_READY:定时器准备好并且未启动。
    • HAL_TIM_STATE_BUSY:定时器正在进行配置或操作。
    • HAL_TIM_STATE_TIMEOUT:定时器操作超时。
    • HAL_TIM_STATE_ERROR:定时器操作错误。

使用TIM_HandleTypeDef结构体的步骤如下:

  1. 创建一个TIM_HandleTypeDef结构体的变量。
  2. 初始化结构体的成员,特别是Instance和Init成员。
  3. 调用HAL库提供的定时器初始化函数,并将TIM_HandleTypeDef结构体的地址作为参数传入。

例如,在使用HAL_TIM_Base_Start_IT()函数的示例中,就使用了TIM_HandleTypeDef结构体来配置定时器2的初始化信息。

注意事项:

  • 在使用TIM_HandleTypeDef结构体时,需要根据具体的定时器实例和功能进行适当的配置和初始化。
  • 需要根据定时器的特性和要求,正确设置Init成员的各个参数,以满足实际需求。
  • 在使用DMA传输时,可以关联DMA句柄到hdma数组中的对应位置,以实现定时器与DMA的协同工作。
  • 注意在多线程或中断环境中使用定时器时,使用锁机制保护对定时器的并发访问。

2.2 使用场景:

  • 当需要定时器以中断模式工作时,可以使用该函数启动定时器的中断功能。

2.3 使用方法:

  1. 首先,需要创建一个TIM_HandleTypeDef结构体的变量,并初始化其中的成员,包括定时器的实例、时钟分频系数、自动重装载值等。
  2. 调用HAL_TIM_Base_Start_IT()函数,将上述结构体变量的地址作为参数传入。

三、函数使用示例:

#include "stm32g0xx_hal.h"

TIM_HandleTypeDef htim2;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM2)
  {
    // 在此处理定时器2中断事件
  }
}

int main(void)
{
  // 初始化定时器2的配置
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1000;

  // 初始化HAL库
  HAL_Init();

  // 配置定时器2
  HAL_TIM_Base_Init(&htim2);

  // 启动定时器2的中断模式
  HAL_TIM_Base_Start_IT(&htim2);

  while (1)
  {
    // 主循环
  }
}

四、函数源代码

函数源代码:

/**
  * @brief  Starts the TIM Base generation in interrupt mode.
  * @param  htim TIM Base handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
{
  uint32_t tmpsmcr;

  /* Check the parameters */
  assert_param(IS_TIM_INSTANCE(htim->Instance));

  /* Check the TIM state */
  if (htim->State != HAL_TIM_STATE_READY)
  {
    return HAL_ERROR;
  }

  /* Set the TIM state */
  htim->State = HAL_TIM_STATE_BUSY;

  /* Enable the TIM Update interrupt */
  __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);

  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
  if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
  {
    tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
    if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
    {
      __HAL_TIM_ENABLE(htim);
    }
  }
  else
  {
    __HAL_TIM_ENABLE(htim);
  }

  /* Return function status */
  return HAL_OK;
}

五、函数逐行解释

逐行解释该函数的代码:

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
{
  uint32_t tmpsmcr;

  /* Check the parameters */
  assert_param(IS_TIM_INSTANCE(htim->Instance));
  • 该行代码检查传入的参数是否合法,确保传入的定时器实例是一个有效的TIM实例。
  /* Check the TIM state */
  if (htim->State != HAL_TIM_STATE_READY)
  {
    return HAL_ERROR;
  }
  • 该行代码检查定时器的状态,如果定时器的状态不是HAL_TIM_STATE_READY(准备就绪)状态,则返回错误状态HAL_ERROR。
  /* Set the TIM state */
  htim->State = HAL_TIM_STATE_BUSY;
  • 该行代码将定时器的状态设置为HAL_TIM_STATE_BUSY(忙碌)状态,表示定时器正在进行配置或操作。
  /* Enable the TIM Update interrupt */
  __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);
  • 该行代码使能定时器的更新中断,即使能定时器的溢出中断。
  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
  if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
  {
    tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
    if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
    {
      __HAL_TIM_ENABLE(htim);
    }
  }
  else
  {
    __HAL_TIM_ENABLE(htim);
  }
  • 该段代码根据定时器的类型(主定时器或从定时器)来使能定时器。
    • 如果是从定时器,会进一步判断是否处于触发模式,并根据触发模式的使能状态来决定是否使能定时器。
    • 如果是主定时器,直接使能定时器。
  /* Return function status */
  return HAL_OK;
}
  • 该行代码表示函数执行成功,返回HAL_OK状态。

该函数的作用是启动定时器的中断模式,具体步骤包括:

  • 检查传入的参数是否合法。
  • 检查定时器的状态,确保定时器处于准备就绪状态。
  • 设置定时器的状态为忙碌状态。
  • 使能定时器的更新中断。
  • 根据定时器的类型和触发模式的使能状态,使能定时器。
  • 返回函数执行成功的状态HAL_OK。

六、函数使用注意事项

在使用HAL_TIM_Base_Start_IT函数时,需要注意以下事项:

  1. 参数合法性检查:在调用函数之前,需要确保传入的TIM_HandleTypeDef结构体指针(htim)是有效的,并且对应的定时器实例(htim->Instance)是一个合法的TIM实例。

  2. 定时器状态检查:在调用函数之前,需要确保定时器的状态(htim->State)处于HAL_TIM_STATE_READY(准备就绪)状态。如果定时器状态不正确,调用函数可能会返回错误状态HAL_ERROR。

  3. 定时器中断处理函数:在启用定时器中断模式后,需要编写相应的定时器中断处理函数。在中断处理函数中,可以执行特定的操作或任务,以响应定时器的中断事件。

  4. 定时器配置:在调用HAL_TIM_Base_Start_IT函数之前,需要先对定时器进行正确的初始化和配置。这包括设置定时器的时钟分频系数、计数模式、自动重装载值等。根据实际需求,还可以配置其他定时器功能,如输入捕获、输出比较等。

  5. 定时器使能:在启用定时器中断模式之前,需要确保定时器已经使能。在函数内部,会根据定时器的类型(主定时器或从定时器)和触发模式的使能状态来决定是否使能定时器。

  6. 中断优先级设置:如果系统中存在多个中断,需要根据优先级要求设置定时器中断的优先级。确保定时器中断的优先级不会被其他中断抢占,以保证定时器中断的及时响应。

  7. 适当的修改和调整:示例代码中的超时时间为5秒,可以根据实际需求和任务完成条件进行适当的修改和调整。例如,可以修改自动重装载值、时钟分频系数等参数,以满足特定的超时要求。

  8. 定时器资源冲突:在使用多个定时器的情况下,需要注意定时器资源的冲突问题。确保不同的定时器实例使用不同的资源,避免冲突和干扰。

  9. 可重入性:在多线程或中断环境中使用定时器时,需要注意保护对定时器的并发访问。可以使用适当的锁机制或其他同步手段,保证对定时器的操作是线程安全的。

  10. HAL库版本兼容性:注意确保使用的HAL库版本与目标芯片和开发环境兼容,并且具备所需的功能和修复的问题。文章来源地址https://www.toymoban.com/news/detail-756941.html

到了这里,关于STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

    输入捕获可以对 输入的信号的上升沿、下降沿或者双边沿进行捕获 ,常用的有 测量输入信号的脉宽 和 测量PWM 输入信号的频率 和 占空比 这两种。 输入捕获的原理 就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存

    2023年04月14日
    浏览(96)
  • STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

    本文主要讲解定时器触发ADC去采集交流信号,DMA把数据搬移到内存。 所需工具: 开发板:STM32F103C8T6 STM32CubeMX IDE: Keil-MDK 相关文章: STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx(二) STM32cubemx ADC+TIM+DMA超频采样 ADC+TIM+DMA采集交流信号是电赛中使用范围最为广泛的一个技术。这个模

    2024年02月03日
    浏览(42)
  • STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)

    STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 示波器或者逻辑分析仪 通过定时器TIM的输出比较模式得到预定频率与占空比的PWM波形;其中定时器输出比较模式与PWM模式的区别在于!!! PWM模式在同一个TIM下所有输出口的频率一致不能单独控制单个的频率 ,而输出比较模式

    2024年02月03日
    浏览(46)
  • STM32 HAL库的HAL_UART_Transmit_IT使用方法

    是STM32 HAL库中非阻塞的串口发送函数。 用法:1. 调用HAL_UART_Transmit_IT()发送数据            2. 在HAL_UART_TxCpltCallback()里写上发送完成后的处理 注意: HAL_UART_Transmit_IT()要等待上次发送完成后再发送,否则返回HAL_BUSY。用huart-gState == HAL_UART_STATE_READY判断上次是否发送完成。 官方

    2024年02月16日
    浏览(32)
  • STM32(HAL)--使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数

    目录 一 旋钮编码器相关知识 二 STM32CubeMx配置 三 程序编写 3.1 相关函数介绍 3.2 程序编写 四 实验结果 旋转编码器是一种位置传感器,输出脉冲信号可以用来确定编码器的旋转角度和旋转方向。 编码器中有两个开关,当旋钮旋转后,开关会依次导通,开关结构图如下图所示

    2024年02月15日
    浏览(44)
  • STM32 串口接收不定长数据 HAL_UART_Receive_IT (帧头帧尾)

    最近使用sw4stm32调试串口时发现串口接收不定长数据很不方便,这里是帧头帧尾的接收方式,欢迎大佬指导。 这里要用串口中断接收的数据帧帧头为0xEB,帧尾为0XBE 这里是其中定义的变量  主函数里打开串口接收中断 然后串口接收处理部分全都写在的回调函数中。

    2024年01月19日
    浏览(40)
  • STM32 TIM输入捕获测频率占空比库函数

    目录 一、输入捕获初始化函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit 二、主从触发模式对应函数 TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 三、配置分频器函数 TIM_SetIC1Prescaler TIM_SetIC2Prescaler TIM_SetIC3Prescaler TIM_SetIC4Prescaler 四、读取CCR函数 TIM_GetCapture1 TIM_GetCapture2 TIM_GetCap

    2024年02月20日
    浏览(28)
  • STM32HAL库常用库函数说明

    函数原型: 参数 说明 Delay 延时时间 数据类型:unsigned int 32位 返回值 无返回值 函数原型: 参数 说明 *GPIOx 引脚选泽,参数范围:GPIOA~GPIOC等 GPIO_Pin 引脚编号选择,参数范围:GPIO_PIN_0~GPIO_PIN_15等 PinState 引脚状态设置,参数范围:GPIO_PIN_SET:高电平 GPIO_PIN_RESET:低电平 返回值

    2023年04月08日
    浏览(28)
  • STM32 HAL库函数——HAL_UART_RxCpltCallback()详解

    HAL_UART_RxCpltCallback 是一个回调函数,用于在使用 HAL 库进行串口接收时处理接收完成事件。当使用 HAL_UART_Receive_IT 函数启动串口接收并且接收到指定数量的数据后,HAL 库会自动调用 HAL_UART_RxCpltCallback 函数。 回调函数是一种特殊的函数,它在特定事件发生时由系统或库调用,

    2024年02月13日
    浏览(30)
  • STM32cubeIDE HAL库中断服务函数解读

    以stm32f103为例 在开启一个中断后,首先会在stm32f1xx_it.c找到自动生成的中断处理函数,这里是TIM1产生的定时器中断:  这个函数又调用了 stm32f1xx_hal_tim.c 中的 HAL_TIM_IRQHandler(htim1),这个htim1是通用定时器的结构体,其定义为 这个结构体的意义可以参考第25章 STM32F429的TIM定时器

    2024年02月02日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包