TIM的使用是MCU使用中非常重要的一部分,可以实现定时的操作,相较于普通的HAL_Delay()
的时序实现方法,TIM的实现有以下的几个优点
- 定时精度高
- CPU资源利用率高
但是如何配置TIM一直是我没整明白的问题,终于在今天(date:2020年2月15日)调试成功,将调试的过程记录以下开发平台
- HAL on CubeIDE
- STM32F103C8T6,based on ARM
- CH340,USB-TTL
CubeIDE配置
时钟的配置
首先我们配置RCC时钟,由于我们只需要HSE时钟,因此我们只需要配置板载的8MHz高速晶振即可.
RCC配置如下:
之后我们配置时钟树如下:
UART1的配置
为了方便使用,配置UART1用于和电脑的通信(此步骤可以跳过),我们使用UART1,配置为115200-8n1
在完成了这些配置之后我们开始正事TIM3的配置
我们先来描述下TIM3的中断方式使用.
在定时器被初始化并启动之后,在每一个时钟周期内,TIM的计数器会自动增加,当计数器计数达到设定值之后,会触发一个中断,而我们要做的就是在中断的回调函数当中写明我们需要进行的操作.
首先来看TIM3的配置
我们来针对每一个参数进行解析
TIM3的时钟来源仅能够选择Internal Clock
,也就是内部的信号时钟,其他的定时器有可以选用外部时钟的版本,在此我们不详细说明.Prescaler
在Configuration选项当中,我们首先配置了
Prescaler
,这个参数是TIM的预分频,也就是输入的时钟我们首先要进行一个分频.我们的输入时钟是72MHz的一个时钟,我们首先将他分频7200这样就生成了一个10KHz的时钟.Counter Mode
这个参数意味着发生中断的时间,有Up,Down和Center Aligned三种大的分类,主要表示中断是在计数器累加计满时发生中断还是计数器在向下递减时减空时发生中断或者均发生中断信号.
Counter Period
这个就是计数器在加到多少时发生中断,在这里我们设定他为10K,其实就是在加到10K+1次的时候发生中断,这样就可以近似实现1S一次的中断事件
auto-reload Preload
这个参数表明了TIM的自动重装载是否启用,大部分条件下选的Enable即可
TRGO Parameters
关于这部分的讲解将会在TIM+ADC的文章当中进行介绍.
完成配置之后,我们需要到NVIC Settings当中使能TIM3的全局中断
在这个实验当中,由于我们仅使用了这一个中断,所以我们使用默认的中断优先级即可.TIM3的代码使用
使用TIM3,首先需要启动定时器并使能中断,使用函数
HAL_TIM_Base_Start_IT(&htim3);
即可使能中断
之后,我们需要在定时器的中断函数当中编写中断处理代码.
这里需要我们在代码当中定义一个新的函数,这个函数的参量和函数名必须与weak的函数一致.void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==(&htim3)) { HAL_UART_Transmit(&huart1,data,sizeof(data)/sizeof(data[1]),1000); } }
在main.c当中加入上面的函数,就可以实现在中断发生的时候调用中断进行处理了.