参考:
【【正点原子】手把手教你学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);
实现简单的呼吸效果。