STM32CubeMX与HAL库学习--TIM生成PWM的简单练习
前言
最近看了STM32F407的TIM的PWM生成功能,打算简单的用一下,本文是学习过程的一点记录。
使用到的工具及版本: STM32CubeMX版本:6.3.0 HAL:STM32CubeF4 Firmware Package V1.26.1 MDK-ARM:V5.32.0.0 开发板:野火的霸天虎V2(主控芯片是STM32F407ZG)
STM32CubeMX生成初始化代码
硬件连接
了解硬件连接可以知道有哪些外设与IO需要设置。 硬件连接都摘自野火霸天虎开发板的原理图 LED灯 红灯连的TIM10的输出通道1,绿灯是TIM11的输出通道1(原理图上面这里打错了),蓝灯是TIM13的输出通道1。
ADC采集(PB0可作为ADC1的通道8输入) 按键
逻辑框图
STM32CubeMX配置
打开STM32CubeMX,选择MCU型号,新建工程,配置时钟树,配置之前要在RCC的HSE那里选择外部谐振器作为时钟来源,根据自己的需要配置时钟树。 我打算10us开启一次AD转换,所以需要用到定时器,我用的基本定时器TIM7。TIM7设置如下:
开发板的可调电阻连的PB0引脚,可作为ADC1或ADC2的输入,我这里用的ADC1,配置如图: 按键
在NVIC这里打开中断允许,并自己设定一下优先级
PWM的周期被设为2560us(LED灯:只要我闪得够快你就感觉不到我闪了),低电平占的时间越多人眼感觉亮度越大。 TIM10、TIM11的配置 TIM13的配置 然后就可以生成代码了
在MDK-ARM里编辑代码
打开工程,打开main.c,我在USER CODE BEGIN PV区域添加了如下代码:
enum{
RED,
GREEN,
BLUE
}current_led=RED;
}
这里定义了一个枚举变量,用来指示当前ADC采集的值是更改哪个LED灯的PWM波的。
然后在main.c里的USER CODE BEGIN 0区域加了如下代码:
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)
{
HAL_ADC_Start_IT (&hadc1);
}
void HAL_ADC_ConvCpltCallback (ADC_HandleTypeDef *hadc)
{
switch(current_led)
{
case RED:
TIM10->CCR1=HAL_ADC_GetValue(&hadc1)*10;break;
case GREEN:
TIM11->CCR1=HAL_ADC_GetValue(&hadc1)*10;break;
case BLUE:
TIM13->CCR1=HAL_ADC_GetValue(&hadc1)*10;break;
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case KEY1_Pin:
{
if(current_led<=1)
current_led++;
else
current_led=RED;
}break;
case KEY2_Pin:
current_led=RED;break;
}
}
ADC1中断里我是直接对比较寄存器赋值的,这种简单操作就不用结构体和库函数了。
然后再main函数中对外设初始化完成后的USER CODE BEGIN 2区域添加代码开启定时器7和PWM生成功能。
HAL_TIM_Base_Start_IT(&htim7);
HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim11,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim13,TIM_CHANNEL_1);
效果
编译、下载程序,给开发板上电,用螺丝刀调电阻可改变亮度,按下按键换颜色,颜色可以混合成各种各样的。
|