參考:
【【正點原子】手把手教你學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);
實現簡單的呼吸效果。