定时器
定时器是一种硬件模块,通常用于生成各种精确的时间延迟和周期性信号,如PWM信号和脉冲信号。它们是由STM32系列微控制器内部提供的,可用于处理各种计时和计数任务,可以通过程序控制其功能和参数。
STM32通用定时器(General Purpose Timer)是STM32系列微控制器中重要的外设之一,主要用于产生定时、脉冲、PWM等功能,可用于各种应用场合,如时钟、测量、控制等。
STM32通用定时器有4个,分别为TIM1、TIM2、TIM3、TIM4,它们的主要功能和特点如下:
-
TIM1:具有更高级别的功能,可以用作高级控制,比如PWM控制、编码器接口、中断控制等;
-
TIM2、TIM3、TIM4:用于基本的计时和PWM输出控制,功能相似,但区别在于它们的时钟源不同,TIM2的时钟源是APB1总线时钟的2倍,而TIM3和TIM4的时钟源是APB1总线时钟。
通用定时器的主要寄存器包括:
1.计数器寄存器(CNT):用于存放计数器的值;
2.自动重载寄存器(ARR):用于设置计数器溢出的值;
3.预分频器寄存器(PSC):用于设置计数器时钟的分频系数;
4.控制寄存器(CR1、CR2、CR3):用于控制定时器的各种功能,如启用定时器、使能定时器中断、设置定时器的计数模式等;
5.事件寄存器(EGR):用于产生各种事件,如软件触发更新事件、触发捕获/比较事件等。
通用定时器的操作步骤如下:
1.设置预分频器和自动重载寄存器,以确定定时器的计数周期;
2.使能计数器和定时器中断(可选);
3.启动定时器;
4.根据需要,处理定时器中断和事件。
在应用中,通用定时器可以用来控制LED的闪烁、驱动蜂鸣器发出声音、产生PWM控制电机转速等功能。
PWM
定时器PWM模式是基于定时器的脉冲宽度调制技术,它利用定时器生成一定频率的周期性信号,并通过调整脉冲宽度来控制输出电平的占空比。在此模式下,定时器通过一系列的寄存器配置,可以实现不同的PWM输出特性,如占空比、周期、极性等等。定时器PWM模式广泛应用于模拟变量频率控制、电机控制、LED调光等领域。
串口通信与点灯
创建新项目
选择合适的芯片,配置rcc
配置sys
配置io口输出
配置定时器2
意思72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。
配置定时器3
开启定时器中断
生成定时器2和定时器3中断优先级配置代码。
配置USART1
配置时钟
配置项目
生成项目
定义上位机发送的
uint8_t hello[20]="hello windows!\r\n";
在main函数添加
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt3 =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 400)
{
time_cnt =0;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
}
}
if(htim->Instance == TIM3)
{
if(++time_cnt3 >= 1000)
{
time_cnt3 =0;
HAL_UART_Transmit(&huart1,hello,20,100000);
}
}
}
烧录实现
1a94
STM32配置PWM输出
创建新项目
选好芯片后进行配置
配置rcc
配置sys
配置定时器3和定时器4两个定时器
时钟配置
配置文件
定义定时器3和4的占空比初始值
uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;
开启定时器3和4并输出PWM
开启定时器并输出
在while函数中设置每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0。(即灯会从亮倒暗,逐渐变化)定时中断回调函数。
编译烧录
1a94
波形如下(查看过程不再赘述)
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/acc13a4f47d1d34d2d7f36d7a50bcab8.png)
定时器pwm完成呼吸灯和对于pwm输出信号的采集与捕获
跟上述建立工程一样
RCC和SYS配置不变
选择端口
USART1配置
定时器配置
PWM波形捕获
其他端口一样配置
main函数如下
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
uint8_t i = 0;
float Duty = 0;
float Frequency = 0;
uint16_t Cap_val1 = 0;
uint16_t Cap_val2 = 0;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
/* USER CODE BEGIN WHILE */
printf("串口通信测试\r\n");
HAL_TIM_Base_Start_IT(&htim2); // 使能定时器及其更新中断
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 使能定时器及其PWM输出
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1); // 使能定时器及其输入捕获
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2); // 使能定时器及其输入捕获
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 10); // 设置一个PWM波形进行测量
while (1)
{
// 串口发送 频率 占空比
printf("Cap_val1 is :%d , Cap_val2 is : %d \r\n", Cap_val1, Cap_val2);
printf("Duty is :%0.2f%% Frequency is : %0.2f ms\r\n", Duty, Frequency);
HAL_Delay(1000);
}
}
// 定时TIM2 定时亮灯的中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *tim)
{
if (tim == &htim2)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
// 定时输入捕获回调函数 计算占空比和频率
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
Cap_val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
Cap_val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
Duty = 100 - (float)Cap_val2 / (float)Cap_val1 * 100;
Frequency = 0.001 * Cap_val1;
}
}
}
串口显示
ccc1
总结
这次试验是定时器&PWM应用编程,旨在让我们了解定时器的原理和PWM的工作模式,定时器的基础是寄存器和计数器,pwm是通过改变占空比来控制电路运作,在本次实验中使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin,连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭,总的来说这次试验让我更深的了解stm32定时器原理和pwm生成方法