【STM32】TIM定时器
TIM定时器(TIM3为例)
初始化:
A:结构体TIM_HandleTypeDef的成员:
1、*Instance:类型为TIM_TypeDef,即对TIM的寄存器的映射,通过这个成员可以操作寄存器
2、Init:类型为TIM_Base_InitTypeDef,对定时器特性进行配置,成员有
Prescaler:定时器预分频
CounterMode:向上计数、向下计数、中间对齐
Period:周期
ClockDivision:
RepetitionCounter:
AutoReloadPreload:自动重装立即有效/中断更新有效
故Tout=(Period+1) * ((Prescaler+1)/Ft) us:Ft步长,即TIM依赖的时钟频率
3、Channel:类型为HAL_TIM_ActiveChannel,设置定时器通道
4、*hdma[7]:DMA相关
5、Lock:定时器锁,为HAL_LOCK和HAL_UNLOCK一般和State搭配用
6、State:定时器状态,常用HAL_TIM_STATE_BUSY和HAL_TIM_STATE_READY
上述参数配置后通过HAL_TIM_Base_Init(&htim3)传入完成配置
B:结构体TIM_ClockConfigTypeDef与TIM_MasterConfigTypeDef
1、TIM_ClockConfigTypeDef是对TIM依赖的时钟进行配置,默认情况下TIM 挂在APB时钟上,若需要使用外部时钟,可对成员ClockSource进行配置
2、TIM_MasterConfigTypeDef是当需要使用到定时器的级联时内部输出通道及SlaveMode的配置,默认都是否
TIM_HandleTypeDef htim3; void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim3.Instance = TIM3; htim3.Init.Prescaler = 8999; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 4999; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } }
C:HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
1、使能TIM时钟,设置并使能中断NVIC
2、如果有输出的话,配置对应GPIO输出
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM3) { __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } }
启动并触发:
启动:HAL_TIM_Base_Start_IT(&htim3):主函数中直接调用启动定时器或直接htim->State = HAL_TIM_STATE_READY
触发:同样的有中断服务函数TIM3_IRQHandler(void),内调用公用的HAL_TIM_IRQHandler(&htim3)在这将htim3的参数传入
回调:
重写weak函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),在Callback里判断定时器类型以及写需要执行的内容,实际上从这个Callback的命名可以看出,TIM有很多种Callback
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步