TIM的设置
时间:10-02
整理:3721RD
点击:
定时器很丰富,主要在以下章节
![](../imgqa/ele/mcu/mcu-3721rd.com-23184fc3kqfvubvp.png)
对应STM32CubeMx
![](../imgqa/ele/mcu/mcu-3721rd.com-231853x3iqlevnkd.png)
其设置也是相对简单
![](../imgqa/ele/mcu/mcu-3721rd.com-23186falxlkuohtl.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-23187sgqbjdsv1wa.png)
不过我感觉在这里的设置就不够人性化,一个时钟源,一个溢出方式这两个至少要查看资料,为什么不直接给个要设定的计数周期,然后就自动算出来
定时器多,时钟源也是多的,主要以下
![](../imgqa/ele/mcu/mcu-3721rd.com-23188grrd2mgyu1v.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-23189ifsardwwzpc.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-23190wxu2ifgqunw.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-231925bqkn40szyz.png)
溢出方式
![](../imgqa/ele/mcu/mcu-3721rd.com-23193wm34cvbmqx0.png)
可以推出定时器溢出时间计算方法:Tout=((Counter Period +1)*(Prescaler+1))/(Ft/Internal Clock Division) us.
生成代码后,注意添加中断函数
但它们最终时通过调用回调函数来实现的,所以添加以下代码即可:
设置好了,但并不是定时器就能运行,还需要以下的代码
![](../imgqa/ele/mcu/mcu-3721rd.com-23184fc3kqfvubvp.png)
对应STM32CubeMx
![](../imgqa/ele/mcu/mcu-3721rd.com-231853x3iqlevnkd.png)
其设置也是相对简单
![](../imgqa/ele/mcu/mcu-3721rd.com-23186falxlkuohtl.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-23187sgqbjdsv1wa.png)
不过我感觉在这里的设置就不够人性化,一个时钟源,一个溢出方式这两个至少要查看资料,为什么不直接给个要设定的计数周期,然后就自动算出来
定时器多,时钟源也是多的,主要以下
![](../imgqa/ele/mcu/mcu-3721rd.com-23188grrd2mgyu1v.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-23189ifsardwwzpc.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-23190wxu2ifgqunw.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-231925bqkn40szyz.png)
溢出方式
![](../imgqa/ele/mcu/mcu-3721rd.com-23193wm34cvbmqx0.png)
可以推出定时器溢出时间计算方法:Tout=((Counter Period +1)*(Prescaler+1))/(Ft/Internal Clock Division) us.
生成代码后,注意添加中断函数
- /**
- * @brief This function handles TIM3 global interrupt.
- */
- void TIM3_IRQHandler(void)
- {
- /* USER CODE BEGIN TIM3_IRQn 0 */
- /* USER CODE END TIM3_IRQn 0 */
- HAL_TIM_IRQHandler(&htim3);
- /* USER CODE BEGIN TIM3_IRQn 1 */
- /* USER CODE END TIM3_IRQn 1 */
- }
- /**
- * @brief This function handles TIM4 global interrupt.
- */
- void TIM4_IRQHandler(void)
- {
- /* USER CODE BEGIN TIM4_IRQn 0 */
- /* USER CODE END TIM4_IRQn 0 */
- HAL_TIM_IRQHandler(&htim4);
- /* USER CODE BEGIN TIM4_IRQn 1 */
- /* USER CODE END TIM4_IRQn 1 */
- }
但它们最终时通过调用回调函数来实现的,所以添加以下代码即可:
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- extern __IO int32_t OS_TimeMS; //GUI_X.c
- if(htim==(&htim3))
- {//定时器3中断服务函数调用
- OS_TimeMS++;
- }
- else if(htim==(&htim4))
- {//定时器4中断服务函数调用
- GUI_TOUCH_Exec();
- }
- }
设置好了,但并不是定时器就能运行,还需要以下的代码
- void HAL_TIM_Start(void)
- {
- HAL_TIM_Base_Start_IT(&htim3);
- HAL_TIM_Base_Start_IT(&htim4);
- }