历史上的今天

今天是:2024年09月28日(星期六)

2019年09月28日 | stm32的TIM定时器HAL库函数的使用

发布者:technology1 来源: eefocus关键字:stm32  TIM定时器  HAL库函数 手机看文章 扫描二维码
随时随地手机看文章

相关具体内容参考 stm32f4xx_hal_time.h
几种模式函数的类型都差不多,包括基本类型(Base),输出比较(OC),输入捕获(IC),pwm(PWM),单脉冲(One_Pulse)和编码器(Encoder)。

/****** xxx使用上述几种模式的英文替换即可*******/
HAL_TIM_xxx_Init
HAL_TIM_xxx_DeInit

HAL_TIM_xxx_MspInit
HAL_TIM_xxx_MspDeInit
/***轮询方式启动/停止/
HAL_TIM_xxx_Start
HAL_TIM_xxx_Stop
/***中断方式启动/停止/
HAL_TIM_xxx_Start_IT
HAL_TIM_xxx_Stop_IT
/****DMA方式启动/停止/
HAL_TIM_xxx_Start_DMA
HAL_TIM_xxx_Stop_DMA

定时器基本函数:

/* Time Base functions ********************************************************/
HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef htim);
/ Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef htim);
/ Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim);

输出比较模式:

/* Timer Output Compare functions **********************************************/
HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_OC_MspInit(TIM_HandleTypeDef htim);
void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling 轮询模式/

HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: Interrupt 中断模式 */

HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: DMA DMA模式/

HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

PWM模式:
/* Timer PWM functions *********************************************************/
HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

输入捕获模式:
/* Timer Input Capture functions ***********************************************/
HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
单脉冲模式:

/* Timer One Pulse functions ***************************************************/
HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode);
HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel);
HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel);
HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

编码器模式

/* Timer Encoder functions *****************************************************/
HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef htim, TIM_Encoder_InitTypeDef sConfig);
HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
中断处理函数:

/* Interrupt Handler functions **********************************************/
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);

控制函数:
/* Control functions *********************************************************/
HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef htim, TIM_OC_InitTypeDef sConfig, uint32_t Channel);//配置输出比较通道
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef htim, TIM_OC_InitTypeDef sConfig, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef htim, TIM_IC_InitTypeDef sConfig, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef htim, TIM_OnePulse_InitTypeDef sConfig, uint32_t OutputChannel, uint32_t InputChannel);

HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef * sClearInputConfig, uint32_t Channel);
//时钟源配置函数
HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef * sClockSourceConfig);

HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection);
HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef * sSlaveConfig);
HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef * sSlaveConfig);
HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength);
HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc);
HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength);
HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc);

HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource);
uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel);

回调函数:

/* Callback in non blocking modes (Interrupt and DMA) *************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//周期结束时调用。
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); //CCR匹配即翻转时,发生调用。
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim);

状态函数:

/* Peripheral State functions 就是获取相应TIM_HandleTypeDef句柄结构的state成员**************************************************/
HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim);
HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim);
HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim);
HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim);
HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim);
HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim);
还有几个宏定义是为了获取和设置计时器相关的寄存器的值(CCR ,CNT,ARR )

Capture Compare Register(CCR):
#define __HAL_TIM_SET_COMPARE(HANDLE, CHANNEL, COMPARE) 
(*(__IO uint32_t *)(&((HANDLE)->Instance->CCR1) + ((CHANNEL) >> 2U)) = (COMPARE))

#define __HAL_TIM_GET_COMPARE(HANDLE, CHANNEL) 
(*(__IO uint32_t *)(&((HANDLE)->Instance->CCR1) + ((CHANNEL) >> 2U)))
Counter Register(CNT):
#define __HAL_TIM_SET_COUNTER(HANDLE, COUNTER) ((HANDLE)->Instance->CNT = (COUNTER))
#define __HAL_TIM_GET_COUNTER(HANDLE) ((HANDLE)->Instance->CNT)
Autoreload Register(ARR):
#define __HAL_TIM_SET_AUTORELOAD(HANDLE, AUTORELOAD) 
do{ 
(HANDLE)->Instance->ARR = (AUTORELOAD); 
(HANDLE)->Init.Period = (AUTORELOAD); 
} while(0U)
#define __HAL_TIM_GET_AUTORELOAD(HANDLE) ((HANDLE)->Instance->ARR)
TIM Clock Division value:
#define __HAL_TIM_GET_CLOCKDIVISION(HANDLE) ((HANDLE)->Instance->CR1 & TIM_CR1_CKD)

#define __HAL_TIM_SET_CLOCKDIVISION(HANDLE, CKD) 
do{ 
(HANDLE)->Instance->CR1 &= (uint16_t)(~TIM_CR1_CKD); 
(HANDLE)->Instance->CR1 |= (CKD); 
(HANDLE)->Init.ClockDivision = (CKD); 
} while(0U)
TIM Input Capture prescaler:

[1] [2] [3] [4] [5]
关键字:stm32  TIM定时器  HAL库函数 引用地址:stm32的TIM定时器HAL库函数的使用

上一篇:STM32 TIM定时器 库函数学习笔记
下一篇:STM32F1库函数初始化系列:定时器中断

推荐阅读

横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM),近日宣布入选道琼斯全球和欧洲可持续发展(DJSI)指数。道琼斯全球和欧洲可持续发展指数是由标准普尔的道琼斯指数与RobecoSAM公司联合计算,用于表彰全球最负责任的企业。该评价体系的满分为100分,意法半导体总分81分,名列全球半导体...
据科技博客网站9to5Google的消息称,小米正在开发一款智能手表,运行谷歌Wear OS操作系统。在谷歌日前推出的Wear OS应用2.28版中,出现了名为“Mi Wear”的配套应用。据了解,谷歌WearOS允许设备制造商在Android系统上提供他们自己的配套应用。WearOS在最近的2.28版本更新中,新支持“Mi Wear”设备,除了Mi Wear,在相关代码中还出现Mi Watch名称...
9月10日,华为2020开发者大会上,华为消费者业务CEO余承东表示,鸿蒙OS 2.0全面使能全场景生态,正式面向应用开发者发布Beta版本,2020年12月将发布手机版本,明年华为智能手机将全面升级支持鸿蒙2.0。2018年5月,鸿蒙内核2.0用于终端TEE。近日,华为消费者业务软件部总裁王成录接受媒体采访时表示,如果从纯技术的角度,鸿蒙系统当时就已经满足了上手机...
  本章介绍ARM处理器的基础特性,包括寄存器、工作模式和指令集的细节。我们也会涉及一些处理器实现细节,包括指令流水线和分支预测。  ARMv7架构是一个32位处理器架构。它是一种load/store架构,意味着数据处理指令操作通用寄存器中的值。只有加载(load)和存储(store)指令访问存储器。通用存储器也是32位的。本书中,字(word)代表32位,双字(doublewo...

史海拾趣

问答坊 | AI 解惑

讨论一种8051的bootloader的实现方式

大虾网上的一个想法,觉得不错,设想了一种8051的bootloader实现方式,欢迎大家讨论 前提:单片机的所有FLASH可通过程序修改 FLASH内存划分: 0x0000-0x0fff:Bootloader 0x1000-0xffff:用户程序 Bootloader处理方式: 在startup.a51里,加入 ...…

查看全部问答∨

Windows CE驱动程序开发04.pdf

Windows CE驱动程序开发04.pdf…

查看全部问答∨

请教一个关于RAM_HIGH_ADRS的问题

我现在用的是vxworks平台 cpu是powerpc的MPC8248 原来我的bootrom程序中RAM_LOW_ADRS、RAM_HIGH_ADRS分别设置的为0x00010000和0x01e00000,现在我的vxworks映像过大,修改了RAM_HIGH_ADRS的值(config.h和makefile中),结果机器会不断重启,请问 ...…

查看全部问答∨

can学习整个一个月纪念,高兴,散分!!

大家还记得一个月前,我在这问了一个关于CAN-BUS学习的问题,整整一个月过去了,现在已经掌握BASSIC CAN 和PELI CAN的原理,并把两种模式的程序调试成功(两个节点),总结这一个月,收获很多,从ARM到51,对单片机的理解又有了新的认识...非常的开心,与大家 ...…

查看全部问答∨

接口技术模拟试题

简答题 1.什么是接口?外设为什么一定要通过接口电路与主机相连? 2.计算机系统中,为了节省I/O端口地址,常为I/O接口芯片中的多个寄存器分配一个端口地址,为了区分同一端口地址对应的多个寄存器,接口芯片常采用的三种方法是什么? 3. 80x86 ...…

查看全部问答∨

最近我看到有人反对淘宝有的赞成淘宝唉不说了大家看下

本帖最后由 ddllxxrr 于 2016-1-7 17:11 编辑 这个东西是,仁者见仁智者见智的东西, 我觉得在淘宝买东西很有必要:   1,当地有些件买不到,比如LPC1114,STM32你去电子市场长买吧,怕八辈子也买不到. 2,方便,对与我这样大门不出二门紧闭的人, ...…

查看全部问答∨

2011年全国电子设计竞赛赛题专家预测(权威版)

本帖最后由 paulhyde 于 2014-9-15 09:14 编辑  …

查看全部问答∨

嵌入式底层软件开发思想

我刚毕业没多久,希望未来是从事平台、底层软件、BSP等方面工作。 1.嵌入式软件如何分层?    芯片厂商做哪部分?平台开发做哪部分?应用开发又做哪部分?   怎么样区分才能做到通用性? 2.如何做好API? 3.开发前期,考虑换以 ...…

查看全部问答∨

stm8无复位从用户代码跳转到UBC代码?

公司要我做stm8单片机的相关的技术研发,提出要求从用户代码不通过复位直接跳转到UBC(用户启动代码)模式下;在UBC模式下要跳转到用户代码是很简单的,几条语句就解决了,例如:typedef @far void (*TFUNCTION)(void); const TFUNCTION  M ...…

查看全部问答∨

图像采集

想用ARM+Linux实现图像采集和传输,用ARM的哪款处理器比较好实现呢??各位大侠给推荐一下~~…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved