STM32F103有两个高级定时器,分别是TIM1和TIM8;高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。
适用场合:
测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等);
使用方法
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
接下来以TIM1为例子,结合蜂鸣器来说明如何使用高级定时器,本次主要使用它的计数模式,实现精确的计数功能。
蜂鸣器原理图
解析:
U8A为蜂鸣器,正极连接3.3V电压,负极与PNP三极管相连,当三极管基极为低电平时导通,蜂鸣器鸣叫;故给Buzzer引脚不同时间的脉宽,就可以实现蜂鸣器鸣叫的频率(Buzzer与单片机的PB9引脚相连)
本次实验使用的是有源蜂鸣器,它内部带震荡体,通电就会鸣叫。
TIM1定时器程序的编写
1.创建TIM函数
void TIM1_UserConfig(u16 Period,u16 Prescaler)
//第一个形参用来设置自动重载计数周期值
//第二个形参是用来设置分频系数
//之后计算脉宽会用到
2.定义TIM结构体和中断结构体
TIM_TimeBaseInitTypeDef TIM_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
3.选择TIM1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
4.结构体参数配置
在库文件中,我们可以看到TIM1结构体的定义,包括两个u16类型的重装载值和预分频值、时钟分割、计数模式、u8类型的重复计数次数
TIM_InitStructure.TIM_Period = Period;//重装载值
TIM_InitStructure.TIM_Prescaler = Prescaler;//分频系数
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分割
TIM_InitStructure