STM32F103 CubeMX 定时器输出PWM控制呼吸灯
- [1. 生成代码](#1. 生成代码)
-
- [1. 1 配置外部时钟,SWD口](#1. 1 配置外部时钟,SWD口)
- [1.2 配置定时器3](#1.2 配置定时器3)
- [1.3 配置定时器2](#1.3 配置定时器2)
- [2. 代码编写的部分](#2. 代码编写的部分)
使用的cubmx 软件的版本:6.2.0
最新版本 6.10(2024年3月11日)
1. 生成代码
1. 1 配置外部时钟,SWD口
1.2 配置定时器3
定时器的配置为500 ,所以250对应的就是50% 的占空比。
1.3 配置定时器2
使能定时器,
使能定时器的中断服务函数,这样下面就可以添加中断了。
时钟运行在72M上
下面就是配置工程,和生成代码
2. 代码编写的部分
这里启动了定时器2和定时器3,定时器2 是做为中断使用,定时器3则是直接调用的。
c
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
在while循环中对占空比进行调节,从0-499的范围。
代码中__HAL_TIM_SetCompare 这个是用来控制定时器的占空比情况
也可以使用__HAL_TIM_SET_COMPARE 这个来替换,两个完全相同
c
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
这个是定时器的中断服务函数,每次中断中翻转GPIO,
需要注意中断中不要增加比较费时的代码,
c
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
ledState = !ledState;
}
}
/* USER CODE END 4 */