目录

1 TIM定时器基础函数

HAL_TIM_Base_Start_IT

HAL_TIM_PeriodElapsedCallback

HAL_TIM_IRQHandler

HAL_TIM_Base_MspInit

HAL_TIM_Base_MspDeInit

2 驱动步进电机

__HAL_TIM_SET_COMPARE

HAL_TIM_PWM_Start

__HAL_TIM_SET_AUTORELOAD


推荐阅读:4.基于STM32CubeMX使用TIM定时器_tao_sc的博客-CSDN博客_cubemx tim设置

1 TIM定时器基础函数

HAL_TIM_Base_Start_IT

开启定时器中断功能。

/**
  *@brief 在中断模式启动TIM Base生成。
  * @param htim TIM Base handle
  * @retval HAL状态
  */

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;
}

eg:  HAL_TIM_Base_Start_IT(&htim1);

HAL_TIM_PeriodElapsedCallback

/**
  * @brief 在非阻塞模式下的周期过期回调
  * @param htim TIM handle
  * @retval 无
  */

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function should not be modified, when the callback is needed,the HAL_TIM_PeriodElapsedCallback could be implemented in the user file*/
}

HAL_TIM_IRQHandler

/**
  *@brief 这个函数处理TIM中断请求。
  * @param htim TIM handle
  * @retval 无
  */

void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
{/* Capture compare 1 event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET){{__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;/* Input capture event */if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U){
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->IC_CaptureCallback(htim);
#elseHAL_TIM_IC_CaptureCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}/* Output compare event */else{
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->OC_DelayElapsedCallback(htim);htim->PWM_PulseFinishedCallback(htim);
#elseHAL_TIM_OC_DelayElapsedCallback(htim);HAL_TIM_PWM_PulseFinishedCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;}}}/* Capture compare 2 event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;/* Input capture event */if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U){
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->IC_CaptureCallback(htim);
#elseHAL_TIM_IC_CaptureCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}/* Output compare event */else{
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->OC_DelayElapsedCallback(htim);htim->PWM_PulseFinishedCallback(htim);
#elseHAL_TIM_OC_DelayElapsedCallback(htim);HAL_TIM_PWM_PulseFinishedCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;}}/* Capture compare 3 event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3);htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;/* Input capture event */if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U){
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->IC_CaptureCallback(htim);
#elseHAL_TIM_IC_CaptureCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}/* Output compare event */else{
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->OC_DelayElapsedCallback(htim);htim->PWM_PulseFinishedCallback(htim);
#elseHAL_TIM_OC_DelayElapsedCallback(htim);HAL_TIM_PWM_PulseFinishedCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;}}/* Capture compare 4 event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4);htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;/* Input capture event */if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U){
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->IC_CaptureCallback(htim);
#elseHAL_TIM_IC_CaptureCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}/* Output compare event */else{
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->OC_DelayElapsedCallback(htim);htim->PWM_PulseFinishedCallback(htim);
#elseHAL_TIM_OC_DelayElapsedCallback(htim);HAL_TIM_PWM_PulseFinishedCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;}}/* TIM Update event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->PeriodElapsedCallback(htim);
#elseHAL_TIM_PeriodElapsedCallback(htim);               //HAL_TIM_PeriodElapsedCallback
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}}/* TIM Break input event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->BreakCallback(htim);
#elseHAL_TIMEx_BreakCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}}/* TIM Trigger detection event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->TriggerCallback(htim);
#elseHAL_TIM_TriggerCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}}/* TIM commutation event */if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET){if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET){__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)htim->CommutationCallback(htim);
#elseHAL_TIMEx_CommutCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */}}
}

HAL_TIM_Base_MspInit

/**
  * @brief  对TIM Base MSP进行初始化.
  * @param  htim TIM Base handle
  * @retval None
  */

__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function should not be modified, when the callback is needed,the HAL_TIM_Base_MspInit could be implemented in the user file*/
}

HAL_TIM_Base_MspDeInit

/**
  * @brief  对TIM Base MSP进行去初始化.
  * @param  htim TIM Base handle
  * @retval None
  */

__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function should not be modified, when the callback is needed,the HAL_TIM_Base_MspDeInit could be implemented in the user file*/
}

2 驱动步进电机

__HAL_TIM_SET_COMPARE

/**
  * @brief 在运行时设置TIM捕获比较寄存器的值,而不需要调用另一个time ConfigChannel函数。
  * @param __HANDLE__ TIM handle.
  * @param __CHANNEL__ 要配置的TIM通道。
  *该参数可以是以下值之一。
  * @arg TIM_CHANNEL_1: 选择的TIM通道1。
  * @arg TIM_CHANNEL_2: 选择的TIM通道2
  * @arg TIM_CHANNEL_3:选择的TIM通道3。
  * @arg TIM_CHANNEL_4: 选择的TIM通道4。
  * @param __COMPARE__指定捕获比较寄存器的新值。
  * @retval 无
  */

#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))

HAL_TIM_PWM_Start

/**
  * @brief 启动PWM信号的生成。
  * @param htim TIM handle
  * @param Channel 要启用的TIM通道
  *该参数可以是以下值之一。
  * @arg TIM_CHANNEL_1: 选择的TIM通道1
  * @arg TIM_CHANNEL_2: 选择的TIM通道2
  * @arg TIM_CHANNEL_3: 选择的TIM通道3。
  * @arg TIM_CHANNEL_4: 选择的TIM通道4
  * @retval HAL status
  */

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
{uint32_t tmpsmcr;/* Check the parameters */assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));/* Check the TIM channel state */if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY){return HAL_ERROR;}/* Set the TIM channel state */TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);/* Enable the Capture compare channel */TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET){/* Enable the main output */__HAL_TIM_MOE_ENABLE(htim);}/* 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_TIM_SET_AUTORELOAD

/**
* @brief 在运行时设置TIM自动加载寄存器的值,不需要再调用任何Init函数。
* @param __HANDLE__ TIM handle.
* @param __AUTORELOAD__指定计数器寄存器的新值。
* @retval 无
*/

#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \do{                                                    \(__HANDLE__)->Instance->ARR = (__AUTORELOAD__);  \(__HANDLE__)->Init.Period = (__AUTORELOAD__);    \} while(0)

【STM32】HAL库学习 3—hal_time相关推荐

  1. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  2. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  3. STM32 HAL库学习笔记2 HAL库介绍

    STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...

  4. STM32 HAL库学习系列第13篇---串口重定向配置--printf

    我的首发平台是公众号[CodeAllen],学习交流QQ群:736386324,本文版权归作者所有,转载请注明出处 发送函数重定向 之后就可以使用输入输出函数 /******************* ...

  5. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...

  6. STM32CubeMX与HAL库学习--简单的CAN回环测试

    STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...

  7. STM32 HAL库串口同时收发,接收卡死?

    STM32 使用 HAL库串口同时收发,使用踩坑史 = =!......by 矜辰所致 目录 前言 一. HAL 库串口收发 1.1 串口发送 1.2 串口接收 1.2.1 标准库接收 1.2.1 H ...

  8. [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备

    序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...

  9. STM32 HAL库 串口DMA接收不定长数据

    STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...

最新文章

  1. 2021已去,2022未来
  2. Visual Studio的奇淫技巧,你知道多少?
  3. 为什么 Linux 上的 Asp.NET 5 需要 Kestrel ?
  4. LeetCode 319. 灯泡开关(找规律)
  5. 4.swift 知识点积累 as 闭包和函数类型
  6. 第八届蓝桥杯java b组第十题
  7. 【渝粤教育】国家开放大学2018年春季 0605-22T中国古代文学(2) 参考试题
  8. VS2022编译项目出现““csc.exe”已退出,代码为 -1073741819”的错误解决办法
  9. ASP.NET MVC4 IN ACTION学习笔记-第六波[Ajax in ASP.NET MVC][3/3]
  10. 斯坦福和伯克利都在用的线性代数教材,现在可以免费下载了
  11. Java全系列教程:『Java学习指南』
  12. Python基础:68 个 Python 内置函数介绍(超级详细版本)
  13. sparksql 与flinksql 建表 与 连表记录
  14. img 加载 svg占位符_SVG组件可创建占位符加载,例如Facebook卡加载
  15. 3G0众测靶场-0407 WriteUp
  16. unity ui界面 鼠标变图片移动
  17. 今天早上跑通了 PF-AFN!
  18. Googlenbsp;Calendarnbsp;与amp;nbs…
  19. Matlab AppDesigner编程教程第1章——面向对象编程
  20. python图像拉伸

热门文章

  1. Qt中parent的作用
  2. ATBroker正确玩法
  3. linux堡垒机日志,Linux堡垒机实现原理
  4. Javac编译器详解
  5. 实验送样、数据分析样品、组名命名规范
  6. 关于buffer overrun
  7. divide(除法)
  8. mysql 开仓函数,量化投资_TB交易开拓者A函数和Q函数常见组合应用
  9. 【WSN定位】基于matlab磷虾群算法求解WSN定位优化问题【含Matlab源码 448期】
  10. OFBIZ-定时任务配置详解