一、概述
STM32F1系列共有8定时器,2个高级定时器(TIM1/8),4个通用定时器(TIM2/3/4/5),2个基本定时器(TIM6/7)。如图
基本定时器是16位只可向上计数的定时器,只能定时,无外部IO。
通用定时器是16位可向上、向下计数的定时器,可定时、输入捕获、输出比较,每个定时器有4个外部输出。
高级定时器是16位可向上、向下计数的定时器,可定时、输入捕获、输出比较、互补输出信号等,每个定时器有8个外部输出。
二、通用定时器定时中断
我选用了TIM2,通道3,查表知对应引脚位PB10
记得把定时器TIM2打开,时钟源是内部时钟,定时器中断也要配置。
时钟预分频器71,自动重装载寄存器ARR为1000,这样中断一次的时间为1ms。
定义一个全局变量
uint16_t time=0;//计数,time加到1000,我们翻转一次灯。1ms*1000=1s
main函数中开启中断
HAL_TIM_Base_Start_IT(&htim2);//开定时器中断,函数原型在tm32f1xx_hal_tim.c中
其他的操作在中断处理函数中,重写中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim2)//判断是定时器2产生的中断
{
time++;
if(time==1000){
time=0;//1ms*1000=1s,时间到,翻转灯
HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);
}
}
}
实验现象是:绿灯1s闪烁一次.
三、PWM输出
脉冲宽度调制PWM。除了基本定时器6、7,其他定时器都可以产生PWM输出。且高级定时器可产生7路,通用定时器可产生4路,STM最多同时可产生30路PWM输出。
一路输出实验:
TIM3通道2,映射到PB5,产生PWM输出,改变占空比,生成呼吸灯。
全局变量
unsigned int ledpwmval=0;//控制占空比;
unsigned char dir=1;//控制方向,1:暗->亮,2:亮->暗
main中,while前
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2);
while中
HAL_Delay(10);
if(dir){
ledpwmval+=2;
}
else{
ledpwmval-=2;
}
if(ledpwmval>300){
dir=0;
}
if(ledpwmval==0){
dir=1;
}
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,ledpwmval);
用ledpwmval来控制占空比,dir为1时,从暗到亮,0时从亮到灭。ledpwmval不断增加到300,在从300减少到0,灯也跟着从暗到亮再从亮到暗。取300是因为往后的led亮度变化就不大了,最大可以到899(前边设置的自动重装值)。
四路输出实验
还是用TIM3,同时开启四路PWM输出,产生呼吸灯。
通道1、2、3、4都开启
main中,while前(开启PWM)
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_3);
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_4);
while中
int i;
for(i=0;i<1600;i+=4)
{
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,i);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,i);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,i);
HAL_Delay(10);
}
for(i=1600;i>0;i-=4)
{
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,i);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,i);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,i);
HAL_Delay(10);
}
HAL_Delay(1000);
四、输入捕获
输入捕获一般用在2方面,一是脉冲宽度测量