【stm32】hal库学习笔记--定时器输出PWM波
PWM波原理

输出比较

输入捕获

驱动函数
定时器驱动函数

PWM波驱动函数

定时器基本不使用DMA方式
定时器中断处理通用函数
HAL_TIM_IRQHandler
实验一:输出固定占空比PWM波
时钟树配置
PF9 改为tim14CH1
tim14配置
开启tim14全局中断 更改中断优先级
/* USER CODE BEGIN 2 */
lcd_init();
HAL_TIM_Base_Start_IT(&htim14);
HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1);
/* USER CODE END 2 */
输出可变占空比PWM波

编写tim.c程序
/* USER CODE BEGIN 0 */
uint8_t pulseChangeDirection = 1;
uint16_t pulseWidth = 50;
/* USER CODE END 0 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance != TIM14) {
return;
}
if (pulseChangeDirection) {
pulseWidth++;
if (pulseWidth >= 95) {
pulseWidth = 95;
pulseChangeDirection = 0;
}
} else {
pulseWidth--;
if (pulseWidth <= 5) {
pulseWidth = 5;
pulseChangeDirection = 1;
}
}
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, pulseWidth);
}
实验二:输出比较

定时器配置

测量PWM波的脉宽和周期
时钟树配置
定时器tim14设置
定时器tim9设置
打开tim9中断

程序编写
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "keyled.h"
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */
lcd_init();
lcd_show_str(0, 0, 16, "Demo10_3:PWM Input", RED);
lcd_show_str(0, 20, 16, "TIM14 generate PWM on PF9(LED1)", RED);
lcd_show_str(0, 40, 16, "TIM9 measure PWM on PE5", RED);
lcd_show_str(0, 60, 16, "Please connect PE5 and PF9 by line", RED);
lcd_show_str(0, 80, 16, "[1]KeyLeft to decrease pulse width", RED);
lcd_show_str(0, 100, 16, "[2]KeyRight to increase pulse width", RED);
HAL_TIM_Base_Start(&htim14);
HAL_TIM_Base_Start(&htim9);
HAL_TIM_IC_Start_IT(&htim9, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim9, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim14, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
KEYS curKey = ScanPressedKey(KEY_WAIT_ALWAYS);
uint32_t CCR = __HAL_TIM_GET_COMPARE(&htim14, TIM_CHANNEL_1);
if (curKey == KEY_LEFT) {
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, CCR - 5);
} else if (curKey == KEY_RIGHT) {
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, CCR + 5);
}
HAL_Delay(300);
/* USER CODE END WHILE */
/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
uint16_t IC1_Width = __HAL_TIM_GET_COMPARE(&htim9, TIM_CHANNEL_1);
uint16_t IC2_Pulse = __HAL_TIM_GET_COMPARE(&htim9, TIM_CHANNEL_2);
if ((IC1_Width == 0) || (IC2_Pulse == 0)) {
return;
}
char str[40];
sprintf(str, "PWM width = %d", IC1_Width);
lcd_show_str(0, 120, 16, str, RED);
sprintf(str, "Pulse width = %d", IC2_Pulse);
lcd_show_str(0, 140, 16, str, RED);
}
/* USER CODE END 4 */