
STM32F103 定時(shí)器與 PWM 呼吸燈實(shí)驗(yàn)CubeMX HAL 庫(kù)文章目錄STM32F103 定時(shí)器與 PWM 呼吸燈實(shí)驗(yàn)CubeMX HAL 庫(kù)一、實(shí)驗(yàn)要求二、硬件接線三、CubeMX 配置1. 新建工程和選芯片2. RCC 和 SYS3. 時(shí)鐘樹4. 任務(wù)一的 TIM3 配置5. 生成工程四、任務(wù)一定時(shí)器中斷控制 LED1. 思路2. 主要代碼3. 定時(shí)時(shí)間4. 現(xiàn)象五、任務(wù)二PWM 呼吸燈1. 思路2. 主要代碼3. PWM 頻率和占空比4. 現(xiàn)象六、Keil 仿真和 Logic Analyzer1. 設(shè)置 Use Simulator2. 進(jìn)入仿真3. 打開 Logic Analyzer4. 看 PWM 波形5. 看任務(wù)一的波形七、實(shí)驗(yàn)總結(jié)八、參考資料一、實(shí)驗(yàn)要求使用 TIM2TIM5 中的一個(gè)定時(shí)器通道連接 LED用定時(shí)器計(jì)數(shù)方式控制 LED 以 2 s 的周期亮滅。使用定時(shí)器 PWM 模式讓 LED 漸亮漸滅呼吸周期 12 s并調(diào)整占空比到比較舒服的效果。使用 Keil 的 Logic Analyzer 觀察 PWM 輸出波形。二、硬件接線LED 采用高電平點(diǎn)亮接法PA6 ── LED 陽(yáng)極 ── LED 陰極 ── GND三、CubeMX 配置1. 新建工程和選芯片打開 STM32CubeMX點(diǎn)File → New Project在Part Number里輸入STM32F103C8選擇STM32F103C8Tx然后點(diǎn)Start Project。2. RCC 和 SYS在System Core → RCC里把High Speed Clock (HSE)選成Crystal/Ceramic Resonator。板子上是 8 MHz 外部晶振。在System Core → SYS里把Debug選成Serial Wire保留 SWD 下載口。3. 時(shí)鐘樹點(diǎn)上面的Clock Configuration主要設(shè)置如下PLL Source 選 HSEPLLMul 選 ×9System Clock Mux 選 PLLCLKAHB 不分頻APB1 選 /2APB2 選 /1這樣 SYSCLK 就是 8 MHz × 9 72 MHzHCLK 和 APB2 是 72 MHzAPB1 是 36 MHz。4. 任務(wù)一的 TIM3 配置任務(wù)一只需要 TIM3 定時(shí)不需要它控制引腳所以 PA6 還是普通 GPIO 輸出。在Timers → TIM3里這樣設(shè)置Clock SourceInternal ClockPrescaler7199Counter ModeUpCounter Period9999Auto-reload PreloadEnable打開TIM3 global interruptNVIC 里 TIM3 的優(yōu)先級(jí)保持默認(rèn)或者設(shè)成 2 都可以然后回到引腳圖把 PA6 設(shè)成GPIO_Output輸出電平先設(shè)成 Low速度 Low 就行。5. 生成工程在Project Manager里把工程名寫成STM32F103C8T6_TIM3_PWMToolchain/IDE 選MDK-ARM V5然后點(diǎn)GENERATE CODE。四、任務(wù)一定時(shí)器中斷控制 LED1. 思路TIM3 每 1 s 產(chǎn)生一次更新中斷在中斷回調(diào)里翻轉(zhuǎn) PA6。PA6 高電平 LED 亮低電平 LED 滅所以 LED 亮 1 s、滅 1 s一個(gè)完整周期是 2 s。2. 主要代碼任務(wù)一的初始化staticvoidMX_TIM3_TimeBase_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig{0};TIM_MasterConfigTypeDef sMasterConfig{0};__HAL_RCC_TIM3_CLK_ENABLE();htim3.InstanceTIM3;htim3.Init.Prescaler7199U;htim3.Init.CounterModeTIM_COUNTERMODE_UP;htim3.Init.Period9999U;htim3.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreloadTIM_AUTORELOAD_PRELOAD_ENABLE;HAL_TIM_Base_Init(htim3);sClockSourceConfig.ClockSourceTIM_CLOCKSOURCE_INTERNAL;HAL_TIM_ConfigClockSource(htim3,sClockSourceConfig);sMasterConfig.MasterOutputTriggerTIM_TRGO_RESET;sMasterConfig.MasterSlaveModeTIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(htim3,sMasterConfig);HAL_NVIC_SetPriority(TIM3_IRQn,2U,0U);HAL_NVIC_EnableIRQ(TIM3_IRQn);}主函數(shù)里啟動(dòng)更新中斷if(HAL_TIM_Base_Start_IT(htim3)!HAL_OK){Error_Handler();}中斷服務(wù)函數(shù)在stm32f1xx_it.c里voidTIM3_IRQHandler(void){HAL_TIM_IRQHandler(htim3);}翻轉(zhuǎn) LED 的回調(diào)voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim-InstanceTIM3){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);}}3. 定時(shí)時(shí)間TIM3 的時(shí)鐘是 72 MHzPSC7199所以計(jì)數(shù)頻率是 10 kHz。ARR9999計(jì)數(shù)器從 0 計(jì)到 9999 是 10000 個(gè)數(shù)10 kHz 計(jì) 10000 個(gè)數(shù) 1 s中斷里每 1 s 翻轉(zhuǎn)一次 PA6所以 LED 亮 1 s、滅 1 s完整周期 2 s。4. 現(xiàn)象燒進(jìn)去以后PA6 上的 LED 會(huì)穩(wěn)定地亮 1 s、滅 1 s。這個(gè)時(shí)間由定時(shí)器決定不受主循環(huán)里其他代碼影響。五、任務(wù)二PWM 呼吸燈1. 思路PSC71ARR999PWM 頻率就是 1 kHz。CCR1 從 0 增加到 1000再減小回 0LED 就會(huì)從滅逐漸變亮再逐漸變滅。每 10 ms 改一次 CCR1上升 100 次、下降 100 次共 200 次呼吸周期大約是 2 s。2. 主要代碼PWM 初始化staticvoidMX_TIM3_PWM_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig{0};TIM_MasterConfigTypeDef sMasterConfig{0};TIM_OC_InitTypeDef sConfigOC{0};__HAL_RCC_TIM3_CLK_ENABLE();htim3.InstanceTIM3;htim3.Init.Prescaler71U;htim3.Init.CounterModeTIM_COUNTERMODE_UP;htim3.Init.Period999U;htim3.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreloadTIM_AUTORELOAD_PRELOAD_ENABLE;HAL_TIM_Base_Init(htim3);sClockSourceConfig.ClockSourceTIM_CLOCKSOURCE_INTERNAL;HAL_TIM_ConfigClockSource(htim3,sClockSourceConfig);HAL_TIM_PWM_Init(htim3);sMasterConfig.MasterOutputTriggerTIM_TRGO_RESET;sMasterConfig.MasterSlaveModeTIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(htim3,sMasterConfig);sConfigOC.OCModeTIM_OCMODE_PWM1;sConfigOC.Pulse0U;sConfigOC.OCPolarityTIM_OCPOLARITY_HIGH;sConfigOC.OCFastModeTIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(htim3,sConfigOC,TIM_CHANNEL_1);}啟動(dòng) PWM__HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_1,0U);HAL_TIM_PWM_Start(htim3,TIM_CHANNEL_1);呼吸燈循環(huán)#defineBREATH_STEP_MS10U#defineBREATH_STEPS100U#definePWM_FULL_SCALE1000Uuint32_tn;uint32_tphase;uint32_tduty;while(1){for(n0U;n(2U*BREATH_STEPS);n){if(nBREATH_STEPS){phasen;}else{phase(2U*BREATH_STEPS)-n;}/* 平方映射低亮度區(qū)停留更久看起來(lái)更柔和 */duty(phase*phase*PWM_FULL_SCALE)/(BREATH_STEPS*BREATH_STEPS);__HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_1,duty);HAL_Delay(BREATH_STEP_MS);}}3. PWM 頻率和占空比計(jì)數(shù)頻率72 MHz / (71 1) 1 MHzPWM 頻率1 MHz / (999 1) 1 kHz占空比D CCR1 / (ARR 1) CCR1 / 1000所以 CCR10 是 0%CCR1500 是 50%CCR11000 是 100%。PWM 周期是 1 ms。4. 現(xiàn)象LED 會(huì)慢慢變亮再慢慢變暗周期大約 2 s。因?yàn)?PWM 是 1 kHz正常看的時(shí)候看不到燈在閃只能看到平均亮度在變。六、Keil 仿真和 Logic Analyzer1. 設(shè)置 Use Simulator打開 Keil 工程點(diǎn)Options for Target進(jìn)Debug頁(yè)左邊選Use SimulatorDialog DLL填DARMSTM.DLLParameter填-pSTM32F103C82. 進(jìn)入仿真按CtrlF5進(jìn)入調(diào)試。進(jìn)入后Keil 左下角會(huì)顯示Simulation左邊能看到寄存器在變化。3. 打開 Logic Analyzer在仿真狀態(tài)下點(diǎn)View → Analysis Windows → Logic Analyzer4. 看 PWM 波形按F5全速跑一會(huì)兒再按Esc停下來(lái)。把時(shí)間軸縮到 03 ms 左右就能看到 1 ms 一個(gè)周期的 PWM 波形。測(cè)量的時(shí)候看兩點(diǎn)TIM3_CNT從 0 計(jì)到 999一個(gè)鋸齒波是 1 ms。PA6的高電平時(shí)間除以 1 ms就是占空比。比如高電平 0.5 ms就是 50%。前兩張圖片放大看出PA6占空比一直在變化后兩張圖可看出整體變化。5. 看任務(wù)一的波形把main.c里的DEMO_MODE改成1U重新編譯再按CtrlF5進(jìn)仿真。把 Logic Analyzer 的時(shí)間軸調(diào)到 3 s 左右添加TIM3_CNT、TIM3_SR、GPIOA_ODR就能看到 PA6 每 1 s 翻轉(zhuǎn)一次。從第二張圖紅色圓圈部分不難看出 PA6 每 1 s 翻轉(zhuǎn)一次七、實(shí)驗(yàn)總結(jié)這次實(shí)驗(yàn)主要是把定時(shí)器的 PSC、ARR 和 CCR 弄明白。任務(wù)一里 TIM3 只負(fù)責(zé)定時(shí)中斷里翻轉(zhuǎn) PA6任務(wù)二里 TIM3_CH1 直接輸出 PWMCCR1 決定高電平時(shí)間。我一開始把 APB1 的 36 MHz 當(dāng)成 TIM3 的時(shí)鐘算出來(lái)時(shí)間差了一倍后來(lái)才注意到 APB1 分頻不為 1 時(shí)定時(shí)器時(shí)鐘會(huì)自動(dòng)倍頻到 72 MHz。還有 PA6 在任務(wù)一里要設(shè)成普通 GPIO 輸出任務(wù)二里要設(shè)成復(fù)用推挽這兩個(gè)地方不能配錯(cuò)。呼吸燈部分線性改占空比也能亮但低亮度變化有點(diǎn)快改成平方映射以后看著更順一點(diǎn)。整體上用 Keil 的邏輯分析儀把 CNT、CCR1 和輸出波形對(duì)起來(lái)看比只看燈的現(xiàn)象直觀很多。八、參考資料STM32F103C8T6 數(shù)據(jù)手冊(cè)PA6/TIM3_CH1 引腳復(fù)用表?!禨TM32F10xxx 參考手冊(cè)》V10第 13 章通用定時(shí)器PWM 模式部分。STM32CubeMX Keil——STM32F103C8T6PWM 控制 LED 燈https://blog.csdn.net/Morzart/article/details/134123197STM32CubeMX PWM 輸出實(shí)驗(yàn)https://blog.csdn.net/Xkccsdn147/article/details/134191212STM32 定時(shí)器 PWM 呼吸燈實(shí)驗(yàn)https://blog.csdn.net/weixin_52345779/article/details/135313203