- 使用標準庫實現本次功能的源代碼已上傳:
- https://github.com/yzmj0986/STM32_Std.lib_PWM.git
Tips:預分頻係數和自動重裝值的理解(二.2中)
MCU:STM32F103ZET6
IDE: MDK-ARM V5 +STM32CubeMX5.0.0
功能描述:將定時器TIM3全映射到外部端口PC6和PC7,設置輸出模式爲PWM輸出,通過改變佔空比的值實現LED7/LED8的呼吸燈效果。
需要配置的有:PC6設置爲TIM3_CH1,PC7設置爲TIM3_CH2,設置預分頻係數與自動重載值,設置PWM的輸出極性。
一. 在 Pinout&Configuration---System Core中:
- 1. 首先設置時鐘RCC的HSE(外部高速時鐘)爲晶振模式:Crystal/ceramic Resonator
- 2. 設置系統SYS的Debug爲Serial Wire:
- 3. 設置外部端口PC6與PC7的模式:
二. 在 Pinout&Configuration---Timers中:
- 1. 打開TIM3,在TIM3 Mode and Configuration中設置CH1與CH2的模式爲PWM輸出模式:
- 2. 在Configuration中設置預分頻係數爲72-1,自動重裝值爲500-1,則PWM的輸出頻率爲72000000/72/500=2000Hz。且根據原理圖可知LED是低電平有效,所以將PWM有效極性設置爲Low:
Tips:預分頻係數和自動重裝值的理解
時鐘頻率爲72MHz,即控制器每秒會計數72M次,預分頻係數的作用是將頻率分割;若設置爲72-1,則頻率分割爲1MHz,即控制器每秒會計數1M次,意味着每1us計數1次。若要定時1ms,由於1ms=1us*1000,那麼預裝載值就是1000-1。要將兩個值均減一的原因是控制器計數均從0開始。
三.在 Clock Configuration中:
配置時鐘爲72 Mhz。
四.在 Project Manager---Project中:
- 1.設置項目的名稱以及保存的位置,選擇Toolchain/IDE爲MDK-ARM V5,
Tips:最好把Linker Settings中的Minimum Heap Size設置爲0x600。
- 2.在Code Generator選項中如下勾選:
最後點Generate Code生成代碼,並選擇“Open Project”:
五.代碼分析與改寫:
- 1. 在主程序main.c中首先定義16位的變量dutycycle用於存儲佔空比的值:
/* USER CODE BEGIN 1 */
uint16_t dutycycle=0;
/* USER CODE END 1 */
- 2. 開啓定時器3通道1和通道2輸出PWM波:
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */
- 3.在While(1)中,修改定時器3通道1和通道2的比較寄存器的值(佔空比):
/* USER CODE BEGIN 3 */
while(dutycycle<500)
{
dutycycle++;
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutycycle);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
HAL_Delay(1);
}
while(dutycycle)
{
dutycycle--;
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutycycle);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutycycle);
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
至此,編譯後無錯並下載到開發板中,就完成了通過STM32CubeMX調用HAL庫實現PWM呼吸燈的效果程序。