STM32学习5——定时器

本文详细介绍了STM32的定时器应用,包括通用定时器的定时中断、PWM输出、输入捕获以及电容按键输入捕获。通过实例展示了如何配置TIM2、TIM3进行定时中断和PWM输出,讲解了输入捕获用于脉冲宽度和频率测量的方法,并探讨了电容按键的捕获原理。实验中涉及中断处理、PWM占空比控制和串口通信。
摘要由CSDN通过智能技术生成

一、概述

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方面,一是脉冲宽度测量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值