赞
踩
使用纯软件(CPU死等)的方式实现定时(延时)功能
使用精准的时基,通过硬件的方式,实现定时功能
递增计数模式实例说明
中心对齐模式实例说明
TIM6 和TIM7 控制寄存器 1(TIMx_CR1)
TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
TIM6 和TIM7 状态寄存器(TIMx_SR)
TIM6 和TIM7 计数器(TIMx_CNT)
TIM6 和TIM7 预分频器(TIMx_PSC)
TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)
HAL_TIM_Base_Init()
HAL_TIM_Base_MspInit() //配置NVIC、CLOCK等
HAL_TIM_Base_Start_IT()
HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
TIMx_IRQHandler()等、HAL_TIM_IRQHandler()
HAL_TIM_PeriodElapsedCallback()
相关HAL库函数介绍
关键结构体介绍
使用定时器6,实现500ms定时器更新中断,在中断里翻转LED0
btim.c
#include "./BSP/LED/led.h" #include "./BSP/TIMER/btim.h" TIM_HandleTypeDef g_timx_handle; /* 定时器句柄 */ /** * @brief 基本定时器TIMX定时中断初始化函数 * @note * 基本定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候 * 基本定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us. * Ft=定时器工作频率,单位:Mhz * * @param arr: 自动重装值。 * @param psc: 时钟预分频数 * @retval 无 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) { g_timx_handle.Instance = BTIM_TIMX_INT; /* 通用定时器X */ g_timx_handle.Init.Prescaler = psc; /* 设置预分频系数 */ g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */ g_timx_handle.Init.Period = arr; /* 自动装载值 */ HAL_TIM_Base_Init(&g_timx_handle); HAL_TIM_Base_Start_IT(&g_timx_handle); /* 使能定时器x及其更新中断 */ } /** * @brief 定时器底层驱动,开启时钟,设置中断优先级 此函数会被HAL_TIM_Base_Init()函数调用 * @param htim:定时器句柄 * @retval 无 */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) { if (htim->Instance == BTIM_TIMX_INT) { BTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIM时钟 */ HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占1,子优先级3,组2 */ HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn); /* 开启ITM3中断 */ } } /** * @brief 定时器TIMX中断服务函数 * @param 无 * @retval 无 */ void BTIM_TIMX_INT_IRQHandler(void) { HAL_TIM_IRQHandler(&g_timx_handle); /* 定时器中断公共处理函数 */ } /** * @brief 定时器更新中断回调函数 * @param htim:定时器句柄 * @retval 无 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == BTIM_TIMX_INT) { LED1_TOGGLE(); /* LED1反转 */ } }
btim.h
#ifndef __BTIM_H #define __BTIM_H #include "./SYSTEM/sys/sys.h" /******************************************************************************************/ /* 基本定时器 定义 */ /* TIMX 中断定义 * 默认是针对TIM6/TIM7 * 注意: 通过修改这4个宏定义,可以支持TIM1~TIM8任意一个定时器. */ #define BTIM_TIMX_INT TIM6 #define BTIM_TIMX_INT_IRQn TIM6_DAC_IRQn #define BTIM_TIMX_INT_IRQHandler TIM6_DAC_IRQHandler #define BTIM_TIMX_INT_CLK_ENABLE() do{ __HAL_RCC_TIM6_CLK_ENABLE(); }while(0) /* TIM6 时钟使能 */ /******************************************************************************************/ void btim_timx_int_init(uint16_t arr, uint16_t psc); /* 基本定时器 定时中断初始化函数 */ #endif
main.c
#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/TIMER/btim.h" int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ led_init(); /* 初始化LED */ btim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */ while (1) { LED0_TOGGLE(); delay_ms(200); } }
计数器时钟源寄存器设置方法(F1为例)
外部时钟模式1
外部时钟模式2
使用一个定时器作为另一个定时器的预分频器(F1为例)
解读通用定时器中断实验
捕获/比较通道1的主电路—输出部分
捕获/比较通道的输出部分(通道1)
HAL_TIM_PWM_Init()
HAL_TIM_PWM_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_PWM_ConfigChannel()
HAL_TIM_PWM_Start()
__HAL_TIM_SET_COMPARE()
__HAL_TIM_ENABLE_OCxPRELOAD()
相关HAL库函数介绍
关键结构体介绍
捕获/比较通道的输入部分(通道1)
HAL_TIM_IC_Init()
HAL_TIM_IC_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_IC_ConfigChannel()
HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
__HAL_TIM_ENABLE_IT()
HAL_TIM_IC_Start_IT()
TIMx_IRQHandler()等、 HAL_TIM_IRQHandler()
HAL_TIM_PeriodElapsedCallback()、HAL_TIM_IC_CaptureCallback()
相关HAL库函数介绍
关键结构体介绍
通过定时器5通道1来捕获按键高电平脉宽时间,通过串口打印出来
外部时钟模式1
HAL_TIM_IC_Init()
HAL_TIM_IC_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_SlaveConfigSynchro()
HAL_TIM_IC_Start()
__HAL_TIM_GET_COUNTER()
__HAL_TIM_SET_COUNTER()
相关HAL库函数介绍
关键结构体介绍
将定时器2通道1输入的高电平脉冲作为定时器2的时钟,并通过串口打印脉冲数
计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件
如果设置RCR为N,
更新事件将在N+1
次溢出时发生
HAL_TIM_PWM_Init()
HAL_TIM_PWM_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_PWM_ConfigChannel()
HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
__HAL_TIM_ENABLE_IT()
HAL_TIM_PWM_Start()
TIMx_IRQHandler()等、HAL_TIM_IRQHandler()
HAL_TIM_PeriodElapsedCallback()
相关HAL库函数介绍
关键结构体介绍
通过定时器8通道1实现指定个数PWM输出,用于控制LED1的亮灭
HAL_TIM_OC_Init()
HAL_TIM_OC_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_OC_ConfigChannel()
__HAL_TIM_ENABLE_OCxPRELOAD()
HAL_TIM_OC_Start()
__HAL_TIM_SET_COMPARE()
相关HAL库函数介绍
关键结构体介绍
通过定时器8通道1/2/3/4输出相位分别为25%、50%、75%、100%的PWM
举个栗子(F1为例):DTG[7:0]=250
250,即二进制:1111 1010,选第四条
DT = (32+26)1655.56 ns=51.55968us
发生刹车后,会怎么样?
HAL_TIM_PWM_Init()
HAL_TIM_PWM_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_PWM_ConfigChannel()
HAL_TIMEx_ConfigBreakDeadTime()
HAL_TIM_PWM_Start()
HAL_TIMEx_PWMN_Start()
相关HAL库函数介绍
关键结构体介绍
通过定时器1通道1输出频率为1KHz,占空比为70%的PWM,使用PWM模式1
使能互补输出并设置死区时间控制:设置DTG为100(5.56us),进行验证死区时间是否正确
使能刹车功能:刹车输入信号高电平有效,配置输出空闲状态等,最后用示波器验证
HAL_TIM_IC_Init()
HAL_TIM_IC_MspInit() //配置NVIC、CLOCK、GPIO等
HAL_TIM_IC_ConfigChannel()
HAL_TIM_SlaveConfigSynchro()
HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
HAL_TIM_IC_Start_IT()、 HAL_TIM_IC_Start()
TIMx_IRQHandler()等、HAL_TIM_IRQHandler()
HAL_TIM_IC_CaptureCallback()
相关HAL库函数介绍
关键结构体介绍
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。