STM32G474xx HAL用户手册
stm32g4xx_hal_tim_ex.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_tim_ex.c
00004   * @author  MCD Application Team
00005   * @brief   TIM HAL模块驱动程序。
00006   *          此文件提供固件函数,用于管理定时器扩展外设的以下功能:
00007   *           + 时间霍尔传感器接口初始化
00008   *           + 时间霍尔传感器接口启动
00009   *           + 时间互补信号断开和死区时间配置
00010   *           + 时间主从同步配置
00011   *           + 时间输出比较/PWM通道配置(用于通道5和6)
00012   *           + 时间OCRef清除配置
00013   *           + 定时器重映射功能配置
00014   *           + 定时器编码器索引配置
00015   ******************************************************************************
00016   * @attention
00017   *
00018   * Copyright (c) 2019 STMicroelectronics.
00019   * 保留所有权利。
00020   *
00021   * 本软件根据可在本软件组件根目录中的LICENSE文件中找到的条款进行许可。
00022   * 如果本软件未附带LICENSE文件,则按原样提供。
00023   *
00024   ******************************************************************************
00025   @verbatim
00026   ==============================================================================
00027                       ##### 定时器扩展功能 #####
00028   ==============================================================================
00029   [..]
00030     定时器扩展功能包括:
00031     (#) 用于以下功能的可编程死区时间互补输出:
00032         (++) 输出比较
00033         (++) PWM生成(边沿和中心对齐模式)
00034         (++) 单脉冲模式输出
00035     (#) 用于使用外部信号控制定时器并互连多个定时器的同步电路。
00036     (#) 断开输入,将定时器输出信号置于复位状态或已知状态。
00037     (#) 支持用于定位目的的增量(正交)编码器和霍尔传感器电路。
00038     (#) 在脉冲比较的情况下,配置脉冲长度和延迟。
00039     (#) 编码器索引配置。
00040 
00041             ##### 如何使用此驱动程序 #####
00042   ==============================================================================
00043     [..]
00044      (#) 通过实现以下函数来初始化TIM底层资源,具体取决于所选功能:
00045            (++) 霍尔传感器输出:HAL_TIMEx_HallSensor_MspInit()
00046 
00047      (#) 初始化TIM底层资源:
00048         (##) 使用 __HAL_RCC_TIMx_CLK_ENABLE(); 使能TIM接口时钟。
00049         (##) TIM引脚配置
00050             (+++) 使用以下函数使能TIM GPIO的时钟:
00051               __HAL_RCC_GPIOx_CLK_ENABLE();
00052             (+++) 使用HAL_GPIO_Init()将这些TIM引脚配置为复用功能模式;
00053 
00054      (#) 如果需要,可以配置外部时钟(默认时钟是来自APBx的内部时钟),
00055          使用以下函数:HAL_TIM_ConfigClockSource,时钟配置应在任何启动函数之前完成。
00056 
00057      (#) 使用此驱动程序的初始化函数之一将TIM配置为所需的工作模式:
00058           (++) HAL_TIMEx_HallSensor_Init() 和 HAL_TIMEx_ConfigCommutEvent():用于使用
00059                定时器霍尔传感器接口和换向事件,以及相应的中断和DMA请求(如果需要)
00060                (注意,一个定时器用于与霍尔传感器接口,另一个定时器用于使用换向事件)。
00061      (#) 在脉冲比较的情况下:
00062            (++) HAL_TIMEx_OC_ConfigPulseOnCompare():配置脉冲宽度和预分频器
00063 
00064 
00065      (#) 使用启动函数之一激活TIM外设:
00066            (++) 互补输出比较:HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(),
00067                 HAL_TIMEx_OCN_Start_IT()
00068            (++) 互补PWM生成:HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(),
00069                 HAL_TIMEx_PWMN_Start_IT()
00070            (++) 互补单脉冲模式输出:HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT()
00071            (++) 霍尔传感器输出:HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(),
00072                 HAL_TIMEx_HallSensor_Start_IT().
00073 
00074   @endverbatim
00075   ******************************************************************************
00076   */
00077 
00078 /* 包含文件 ------------------------------------------------------------------*/
00079 #include "stm32g4xx_hal.h"
00080 
00081 /** @addtogroup STM32G4xx_HAL_Driver
00082   * @{
00083   */
00084 
00085 /** @defgroup TIMEx TIMEx
00086   * @brief TIM扩展HAL模块驱动程序
00087   * @{
00088   */
00089 
00090 #ifdef HAL_TIM_MODULE_ENABLED
00091 
00092 /* 私有类型定义 -----------------------------------------------------------*/
00093 /* 私有定义 ------------------------------------------------------------*/
00094 /* 私有常量 ---------------------------------------------------------*/
00095 /** @defgroup TIMEx_Private_Constants TIM扩展私有常量
00096   * @{
00097   */
00098 /* 断开输入重新启动的超时时间 */
00099 #define TIM_BREAKINPUT_REARM_TIMEOUT    5UL /* 5毫秒 */
00100 /**
00101   * @}
00102   */
00103 /* 私有常量结束 --------------------------------------------------*/
00104 
00105 /* 私有宏 ------------------------------------------------------------*/
00106 /* 私有变量 ---------------------------------------------------------*/
00107 /* 私有函数原型 -----------------------------------------------*/
00108 static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma);
00109 static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma);
00110 static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState);
00111 
00112 /* 导出函数 --------------------------------------------------------*/
00113 /** @defgroup TIMEx_Exported_Functions TIM扩展导出函数
00114   * @{
00115   */
00116 
00117 /** @defgroup TIMEx_Exported_Functions_Group1 扩展定时器霍尔传感器函数
00118   * @brief    定时器霍尔传感器函数
00119   *
00120 @verbatim
00121   ==============================================================================
00122                       ##### 定时器霍尔传感器函数 #####
00123   ==============================================================================
00124   [..]
00125     本节提供允许以下操作的函数:
00126     (+) 初始化并配置TIM霍尔传感器。
00127     (+) 反初始化TIM霍尔传感器。
00128     (+) 启动霍尔传感器接口。
00129     (+) 停止霍尔传感器接口。
00130     (+) 启动霍尔传感器接口并使能中断。
00131     (+) 停止霍尔传感器接口并禁用中断。
00132     (+) 启动霍尔传感器接口并使能DMA传输。
00133     (+) 停止霍尔传感器接口并禁用DMA传输。
00134 
00135 @endverbatim
00136   * @{
00137   */
00138 /**
00139   * @brief  初始化TIM霍尔传感器接口并初始化关联的句柄。
00140   * @note   当定时器实例在霍尔传感器接口模式下初始化时,
00141   *         定时器通道1和通道2被保留,不能用于其他目的。
00142   * @param  htim TIM霍尔传感器接口句柄
00143   * @param  sConfig TIM霍尔传感器配置结构
00144   * @retval HAL状态
00145   */
00146 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig)
00147 {
00148   TIM_OC_InitTypeDef OC_Config;
00149 
00150   /* 检查TIM句柄分配 */
00151   if (htim == NULL)
00152   {
00153     return HAL_ERROR;
00154   }
00155 
00156   /* 检查参数 */
00157   assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));
00158   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
00159   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->