参考:
【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p=13&share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3
《嵌入式系统基础与实践》刘黎明等编著,第九章定时器,PWM从P289开始。
【【STM32教程】入门教程(基于HAL库+CubeMX+MDK-ARM)】 https://www.bilibili.com/video/BV1y7411m7gg/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3
定时器引脚映射
https://blog.csdn.net/weixin_54015326/article/details/135920496
参看上面的文章或者查看手册(8.3.7):
实验内容
2、PWM 输出设计。时钟频率为 72Mhz,采用定时器,PWM 输出。
(1)设计 0.1 毫秒延时,设计占空比 50%,全彩灯 RGB_R.
RGB_R引脚PB13,根据上图,使用TIM1_CH1N通道。
下面的CH polarity选择LOW,pulse设为50,表示占空比为50%(50%=50/(100-1+1))
注意要确认时PB13作为通道复用的引脚
无需写其他代码。
(2)设置 KB1 调整占空比,5 级调整,循环按键。
KB1对应引脚PE0,设置内部上拉,按下为低电平,设置为下降沿触发中断:
勾选该通道的中断,抢占优先级设为1:
中断回调函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{HAL_Delay(10);//延时,用来消抖if(GPIO_Pin==GPIO_PIN_0) {if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==RESET){pwm_val=levels[mindex];mindex=(mindex+1)%5;HAL_Delay(1);}}flag=1;}
主函数:注意开启CH1N的PWM输出跟一般定时器写法不一样,请看:
https://www.bilibili.com/read/cv22069045/
普通的启动:
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
//定时器 PWM 输出启动函数
/* USER CODE BEGIN 2 *//* 定时1互补输出PWM */HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(flag==1){__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_val);HAL_Delay(1);flag=0;}/* USER CODE END WHILE */}
(3)设计全彩灯 RGB_R 呼吸渐变效果。
大部分和(2)一样,注释掉(2)在while里的部分,添加:
while(pwm_val<100){pwm_val++;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_val);HAL_Delay(1);}while(pwm_val){pwm_val--;__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_val);HAL_Delay(1);}HAL_Delay(200);
实现简单的呼吸效果。