一、問題描述
(一)定時(shí)器實(shí)現(xiàn)LED燈的周期閃爍
- 通過定時(shí)器Timer方式實(shí)現(xiàn)時(shí)間的精準(zhǔn)控制,相當(dāng)于給CPU上了一個(gè)鬧鐘,CPU平時(shí)處理其它任務(wù),當(dāng)定時(shí)時(shí)間到了以后,處理定時(shí)相關(guān)的任務(wù)。請(qǐng)?jiān)O(shè)置一個(gè)5秒的定時(shí)器,每隔5秒從串口發(fā)送“hello windows!”;同時(shí)設(shè)置一個(gè)2秒的定時(shí)器,讓LED等周期性地閃爍。
(二)輸出PWM波形實(shí)現(xiàn)流水燈
- 使用TIM3和TIM4,分別輸出一個(gè)PWM波形,PWM的占空比隨時(shí)間變化,去驅(qū)動(dòng)你外接的一個(gè)LED以及最小開發(fā)板上已焊接的LED(固定接在 PC13 GPIO端口),實(shí)現(xiàn)2個(gè) LED呼吸燈的效果。
二、定時(shí)器實(shí)現(xiàn)LED燈的周期閃爍
(一)STM32定時(shí)器介紹
1.簡介
STM32f103系列一共有8個(gè)16位的定時(shí)器;其中TIM6、TIM7是基本定時(shí)器,TIM2、3、4、5是通用定時(shí)器,TIM1、8是高級(jí)定時(shí)器;這些定時(shí)器使STM32具有定時(shí)、信號(hào)的頻率測(cè)量、信號(hào)的PWM測(cè)量、PWM輸出、三相6步電機(jī)控制及編碼器接口等功能,適用于工業(yè)控制領(lǐng)域。
2.定時(shí)器分類
STM32F1 系列中,除了互聯(lián)型的產(chǎn)品,共有 8 個(gè)定時(shí)器,分為基本定時(shí)器,通用定時(shí)器和高級(jí)定時(shí)器?;径〞r(shí)器 TIM6 和 TIM7 是一個(gè) 16 位的只能向上計(jì)數(shù)的定時(shí)器,只能定時(shí),沒有外部 IO。通用定時(shí)器 TIM2/3/4/5 是一個(gè) 16 位的可以向上/下計(jì)數(shù)的定時(shí)器,可以定時(shí),可以輸出比較,可以輸入捕捉,每個(gè)定時(shí)器有四個(gè)外部 IO。高級(jí)定時(shí)器 TIM1/8是一個(gè) 16 位的可以向上/下計(jì)數(shù)的定時(shí)器,可以定時(shí),可以輸出比較,可以輸入捕捉,還可以有三相電機(jī)互補(bǔ)輸出信號(hào),每個(gè)定時(shí)器有 8 個(gè)外部 IO。
2.1基本定時(shí)器
基本定時(shí)器只具備最基本的定時(shí)功能,就是累加的時(shí)鐘脈沖數(shù)超過預(yù)定值時(shí),能觸發(fā)中斷或觸發(fā)DMA請(qǐng)求;
芯片內(nèi)部與DAC外設(shè)相連,可通過觸發(fā)輸出驅(qū)動(dòng)DAC,也可以作為其他通用定時(shí)器的時(shí)鐘基準(zhǔn);
使用的時(shí)鐘源都是TIMxCLK,時(shí)鐘源經(jīng)過預(yù)分頻器輸入至脈沖計(jì)數(shù)器TIMx_CNT,基本定時(shí)器只能工作在向上計(jì)數(shù)模式,在重載寄存器TIMx_ARR中保存的是定時(shí)器的溢出值;
工作時(shí),脈沖計(jì)數(shù)器TIMx_CNT由時(shí)鐘觸發(fā)進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)器的值x等于重載寄存器中保存的數(shù)值N時(shí),產(chǎn)生溢出事件,可觸發(fā)中斷或DMA請(qǐng)求,然后計(jì)數(shù)器重新置0,重新向上計(jì)數(shù);
①時(shí)鐘源
定時(shí)器時(shí)鐘 TIMxCLK,即內(nèi)部時(shí)鐘 CK_INT,經(jīng) APB1 預(yù)分頻器后分頻提供,如果APB1 預(yù)分頻系數(shù)等于 1,則頻率不變,否則頻率乘以 2,庫函數(shù)中 APB1 預(yù)分頻的系數(shù)是 2,即 PCLK1=36M,所以定時(shí)器時(shí)鐘TIMxCLK=36*2=72M。
②計(jì)數(shù)器時(shí)鐘
定時(shí)器時(shí)鐘經(jīng)過 PSC 預(yù)分頻器之后,即 CK_CNT,用來驅(qū)動(dòng)計(jì)數(shù)器計(jì)數(shù)。PSC 是一個(gè)16 位的預(yù)分頻器,可以對(duì)定時(shí)器時(shí)鐘 TIMxCLK 進(jìn)行 1~65536 之間的任何一個(gè)數(shù)進(jìn)行分頻。具體計(jì)算方式為:CK_CNT=TIMxCLK/(PSC+1)。
③計(jì)數(shù)器
計(jì)數(shù)器 CNT 是一個(gè) 16 位的計(jì)數(shù)器,只能往上計(jì)數(shù),最大計(jì)數(shù)值為 65535。當(dāng)計(jì)數(shù)達(dá)到自動(dòng)重裝載寄存器的時(shí)候產(chǎn)生更新事件,并清零從頭開始計(jì)數(shù)。
④自動(dòng)重裝載寄存器
自動(dòng)重裝載寄存器 ARR 是一個(gè) 16 位的寄存器,這里面裝著計(jì)數(shù)器能計(jì)數(shù)的最大數(shù)值。當(dāng)計(jì)數(shù)到這個(gè)值的時(shí)候,如果使能了中斷的話,定時(shí)器就產(chǎn)生溢出中斷。
5. 定時(shí)時(shí)間的計(jì)算
定時(shí)器的定時(shí)時(shí)間等于計(jì)數(shù)器的中斷周期乘以中斷的次數(shù)。計(jì)數(shù)器在 CK_CNT 的驅(qū)動(dòng)下,計(jì)一個(gè)數(shù)的時(shí)間則是 CK_CLK 的倒數(shù),等于:1/(TIMxCLK/(PSC+1)),產(chǎn)生一次中斷的時(shí)間則等于:1/(CK_CLK * ARR)。如果在中斷服務(wù)程序里面設(shè)置一個(gè)變量 time,用來 記 錄 中斷 的 次 數(shù),那 么 就 可以 計(jì) 算 出我們 需 要 的定 時(shí) 時(shí) 間等于 :1/CK_CLK * (ARR+1)*time。
2.2通用定時(shí)器
通用定時(shí)器除了基本的定時(shí),它主要用在測(cè)量輸入脈沖的頻率、脈寬與輸出PEM脈沖的場合,還具有編碼器的接口,如下圖所示:
1.捕獲/比較寄存器
它在輸入時(shí)被用于捕獲(存儲(chǔ))輸入脈沖在電平發(fā)生翻轉(zhuǎn)時(shí)脈沖計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值,從而實(shí)現(xiàn)脈沖的頻率測(cè)量;
在輸出時(shí)被用來存儲(chǔ)一個(gè)脈沖數(shù)值,把這個(gè)數(shù)值用于與脈沖計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值進(jìn)行比較,根據(jù)比較結(jié)果進(jìn)行不同的電平輸出。
2.PWM輸出過程分析
若配置脈沖計(jì)數(shù)器為向上計(jì)數(shù),而重載寄存器被配置為N,即計(jì)數(shù)器的當(dāng)前值x在時(shí)鐘源的驅(qū)動(dòng)下不斷累加,當(dāng)計(jì)數(shù)器的值大于N時(shí),回充值計(jì)數(shù)器的數(shù)值為0并重新計(jì)數(shù);
在計(jì)數(shù)器計(jì)數(shù)的同時(shí),計(jì)數(shù)器的計(jì)數(shù)值x會(huì)與比較寄存器TIMx_CCR預(yù)先存儲(chǔ)的數(shù)值A(chǔ)進(jìn)行比較。當(dāng)計(jì)數(shù)器的值小于A時(shí),輸出高電平(或低電平),相反則反之;
循環(huán)下去即得到的輸出脈沖周期就為重載寄存器TIMx_ARR存儲(chǔ)的數(shù)值(N+1)乘以觸發(fā)脈沖的時(shí)鐘周期,其脈寬則為比較寄存器的值A(chǔ)乘以觸發(fā)脈沖的時(shí)鐘周期,即輸出PEM的占空比為A/(N+1).
3.PWM輸入過程分析
當(dāng)定時(shí)器被配置為輸入功能時(shí),可以用于檢測(cè)輸入到GPIO引腳的信號(hào),此時(shí)捕獲/比較寄存器TIMx_CRR被用作捕獲功能,簡稱捕獲寄存器。
下圖為PWM輸入時(shí)的脈沖寬度檢測(cè)時(shí)序圖;
工作過程:要測(cè)量的PWM脈沖通過GPIO引腳輸入到定時(shí)器的脈沖檢測(cè)通道,為圖中的TI1;
在輸入脈沖TI1的上升沿到達(dá)時(shí),觸發(fā)IC1和IC2輸入捕獲中斷,這時(shí)把脈沖計(jì)數(shù)器的計(jì)數(shù)值復(fù)位為0,于是計(jì)數(shù)器的計(jì)數(shù)值X在時(shí)鐘源的驅(qū)動(dòng)下從0開始不斷累加,直到TI1出現(xiàn)下降沿,觸發(fā)IC2捕獲事件,此時(shí)TIMx_CCR2把計(jì)數(shù)器的當(dāng)前值2存儲(chǔ)起來,計(jì)數(shù)器繼續(xù)累加,直到TI1出現(xiàn)第二個(gè)上升沿,出發(fā)了IC1捕獲事件,得到的當(dāng)前計(jì)數(shù)值被保存到TIMX_CCR1中。
根據(jù)保存的數(shù)值很容易得到占空比和周期。
4.定時(shí)器的時(shí)鐘源
通用定時(shí)器可以使用外部脈沖作為定時(shí)器的時(shí)鐘源;
使用外部時(shí)鐘源時(shí),要使用寄存器進(jìn)行觸發(fā)邊沿、濾波器帶寬的配置。
2.3高級(jí)定時(shí)器
此類定時(shí)器除了具有基本、通用定時(shí)器的所有功能外,還具有三相6步電機(jī)的接口、剎車功能及用于PWM驅(qū)動(dòng)電路的死區(qū)時(shí)間控制,使其非常使用于電機(jī)控制。
高級(jí)定時(shí)器結(jié)構(gòu)如下圖所示:
相比較另外兩種定時(shí)器,主要多出了BRK、DTG兩個(gè)結(jié)構(gòu),具有了控制死區(qū)時(shí)間的控制功能;
死區(qū)時(shí)間:在三相橋的PWM驅(qū)動(dòng)電路中,上下兩個(gè)橋臂的PWM驅(qū)動(dòng)信號(hào)是互補(bǔ)的,即上下橋臂輪流導(dǎo)通,但實(shí)際上為了防止出現(xiàn)上下兩個(gè)臂同時(shí)導(dǎo)通(會(huì)造成短路),在上下兩臂切換時(shí)留一小段時(shí)間,上下臂都施加關(guān)斷信號(hào)。
在保證不出現(xiàn)短路的情況下,死區(qū)時(shí)間越短越好,時(shí)間太長會(huì)導(dǎo)致OCx或OCxN輸出不正常.
3.定時(shí)器時(shí)基
內(nèi)部時(shí)鐘(CK_INT)
外部時(shí)鐘模式 1:外部輸入腳(TIx)
外部時(shí)鐘模式 2:外部觸發(fā)輸入(ETR)
內(nèi)部觸發(fā)輸入(ITRx):使用 A 定時(shí)器作為 B 定時(shí)器的預(yù)分頻器(A 為 B 提供時(shí)鐘)。 這些時(shí)鐘,具體選擇哪個(gè)可以通過 TIMx_SMCR 寄存器的相關(guān)位來設(shè)置。
4.計(jì)數(shù)器模式
向上計(jì)數(shù)模式:計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR),然后重新從0開始計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件
向下計(jì)數(shù)模式:計(jì)數(shù)器從自動(dòng)裝入的值(TIMx_ARR)開始向下計(jì)數(shù)到0,然后從自動(dòng)裝入的值重新開始,并產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件
中央對(duì)齊模式(向上/向下計(jì)數(shù)):計(jì)數(shù)器從0開始計(jì)數(shù)到自動(dòng)裝入的值-1,產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后向下計(jì)數(shù)到1并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件;然后再從0開始重新計(jì)數(shù)
(二)新建工程
1.創(chuàng)建項(xiàng)目
選擇目的芯片,本文選用STM32F103C8T6
2.相關(guān)設(shè)置
-
RCC設(shè)置
-
SYS設(shè)置
-
端口設(shè)置
選擇PA4為LED端口,設(shè)置為GPIO_Output -
定時(shí)器設(shè)置
這里使用TIM2定時(shí)器2和TIM3定時(shí)器3來實(shí)現(xiàn)定時(shí)的功能。選中定時(shí)器2;配置定時(shí)器2的時(shí)鐘源為內(nèi)部時(shí)鐘;設(shè)置分頻系數(shù)為71,向上計(jì)數(shù)模式,計(jì)數(shù)周期為5000,實(shí)現(xiàn)2秒
分頻系數(shù)那里雖然寫的是71,但系統(tǒng)處理的時(shí)候會(huì)自動(dòng)加上1,所以實(shí)際進(jìn)行的是72分頻。由于時(shí)鐘我們一般會(huì)配置為72MHZ,所以72分頻后得到1MHZ的時(shí)鐘。1MHZ的時(shí)鐘,計(jì)數(shù)5000次,得到時(shí)間5000/1000000=0.005秒。也就是每隔0.005秒定時(shí)器2會(huì)產(chǎn)生一次定時(shí)中斷。 -
中斷設(shè)置
-
USART1設(shè)置
-
時(shí)鐘設(shè)置
-
其他
注意路徑中不要含有中文
(三)代碼編寫
- 直接打開上步生成的工程文件,在main.c添加定時(shí)器啟動(dòng)代碼
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
- 添加串口輸出hello windows代碼
uint8_t hello[20]="hello windows!\r\n";
3.定時(shí)器中斷回調(diào)函數(shù)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt3 =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 400)
{
time_cnt =0;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
}
}
if(htim->Instance == TIM3)
{
if(++time_cnt3 >= 1000)
{
time_cnt3 =0;
HAL_UART_Transmit(&huart1,hello,20,100000);
}
}
}
編譯一下
(四)線路連接
1.USB to TTL ——STM32F103C8T6
3V3 —— 3V3
GND—— GND
RXD——A9
TXD ——A10
2.STM32F103C8T6——LED
LED燈短腳 —— A4
LED燈長腳 —— 3V3
(五)實(shí)現(xiàn)效果
1.燒錄
2.效果展示
LED周期閃爍
LED閃爍
串口輸出
串口輸出hello windows
三、輸出PWM波形實(shí)現(xiàn)流水燈
(一)PWM簡介
1.PWM含義
PWM(Pulse Width Modulation)即脈沖寬度調(diào)制,簡稱脈寬調(diào)制。它是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù);它是一種模擬控制方式,根據(jù)相應(yīng)載荷的變化來調(diào)制晶體管基極或MOS管柵極的偏置,來實(shí)現(xiàn)晶體管或MOS管導(dǎo)通時(shí)間的改變,從而實(shí)現(xiàn)開關(guān)穩(wěn)壓電源輸出的改變。
2.基本原理
PWM就是對(duì)逆變電路開關(guān)器件的通斷進(jìn)行控制,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替正弦波或所需要的波形。也可以這樣理解,PWM是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。PWM信號(hào)仍然是數(shù)字的,因?yàn)樵诮o定的任何時(shí)刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。只要帶寬足夠,任何模擬值都可以使用 PWM 進(jìn)行編碼。
3.優(yōu)點(diǎn)及應(yīng)用范圍
由于其控制簡單、靈活和動(dòng)態(tài)響應(yīng)好等優(yōu)點(diǎn)而成為電力電子技術(shù)應(yīng)用最廣泛的控制方式,其應(yīng)用領(lǐng)域包括測(cè)量,通信, 功率控制與變換,電動(dòng)機(jī)控制、伺服控制、調(diào)光、開關(guān)電源,甚至某些音頻放大器,因此學(xué)習(xí)PWM具有十分重要的現(xiàn)實(shí)意義。
4.PWM配置介紹
在上步中介紹了STM32的定時(shí)器,并提到PWM輸出是STM32的定時(shí)器的功能之一,為了實(shí)現(xiàn)PWM功能,需要使用定時(shí)器中的比較寄存器(TIMx_CCRx)。
捕獲/比較模式寄存器總共2個(gè),TIMx_CCMR1和TIMx_CCMR2
TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。該寄存器的某些位在不同模式下功能不一樣,上面一層對(duì)應(yīng)輸出而下面一層對(duì)應(yīng)輸入;
其中模式設(shè)置位OCxM位,此位由3位組成,一共可以配置成7種模式,我們使用的是PWM模式,所以這三位必須為110/111。
當(dāng)定時(shí)器以PWM模式工作時(shí),會(huì)自動(dòng)將TIMx_CCRx的值與TIMx_CNT(計(jì)數(shù)寄存器)中的值做比較,當(dāng)TIMx_CNT中的值小于TIMx_CCRx的值時(shí),PWM輸出引腳輸出高電平,大于時(shí)則輸出低電平。因此知道了PWM信號(hào)的周期和占空比可以通過設(shè)置比較寄存器TIMx_CCRx和定時(shí)器重載寄存器TIMx_ARR來控制。PWM的占空比可以通過下圖公式計(jì)算:
4.1 PWM輸出的模式區(qū)別
PWM模式1:在向上計(jì)數(shù)時(shí),一旦
TIMx_CNT<TIMx_CCR1時(shí)通道1為有效電平,否則為無效電平;
在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)
PWM模式2:在向上計(jì)數(shù)時(shí),一旦TIMx_CNT<TIMx_CCR1時(shí)通道1為無效電平,否則為有效電平;
在向下計(jì)數(shù)時(shí),一旦TIMx_CNT>TIMx_CCR1時(shí)通道1為有效電平,否則為無效電平
注意:PWM的模式只是區(qū)別什么時(shí)候是有效電平,但并沒有確定是高電平有效還是低電平有效。這需要結(jié)合CCER寄存器的CCxP位的值來確定
例如:若PWM模式1,且CCER寄存器的CCxP位為0,則當(dāng)TIMx_CNT<TIMx_CCR1時(shí),輸出高電平;同樣的,若PWM模式1,且CCER寄存器的CCxP位為2,則當(dāng)TIMx_CNT<TIMx_CCR1時(shí),輸出低電平
4.2. PWM的計(jì)數(shù)模式
向上計(jì)數(shù)模式:
下面是一個(gè)PWM模式1的例子。當(dāng)TIMx_CNT<TIMx_CCRx時(shí)PWM信號(hào)參考OCxREF為高,否則為低。如果TIMx_CCRx中的比較值大于自動(dòng)重裝載值(TIMx_ARR),則OCxREF保持為’1’。如果比較值為0,則OCxREF保持為’0’。
向下計(jì)數(shù)模式:
在PWM模式1,當(dāng)TIMx_CNT>TIMx_CCRx時(shí)參考信號(hào)OCxREF為低,否則為高。如果TIMx_CCRx中的比較值大于TIMx_ARR中的自動(dòng)重裝載值,則OCxREF保持為’1’。該模式下不能產(chǎn)生0%的PWM波形。
中央對(duì)齊模式:
當(dāng)TIMx_CR1寄存器中的CMS位不為’00’時(shí),為中央對(duì)齊模式(所有其他的配置對(duì)OCxREF/OCx信號(hào)都有相同的作用)。根據(jù)不同的CMS位設(shè)置,比較標(biāo)志可以在計(jì)數(shù)器向上計(jì)數(shù)時(shí)被置’1’、在計(jì)數(shù)器向下計(jì)數(shù)時(shí)被置’1’、或在計(jì)數(shù)器向上和向下計(jì)數(shù)時(shí)被置’1’。TIMx_CR1寄存器中的計(jì)數(shù)方向位(DIR)由硬件更新,不要用軟件修改它。
5.PWM的一般步驟
-
使能定時(shí)器和相關(guān)IO口時(shí)鐘。調(diào)用函數(shù):
RCC_APB1PeriphClockCmd()
RCC_APB2PeriphClockCmd(); -
初始化IO口為復(fù)用功能輸出。調(diào)用函數(shù):GPIO_Init();
這里是要把PB5用作定時(shí)器的PWM輸出引腳,所以要重映射配置,所以需要開啟AFIO時(shí)鐘,同時(shí)設(shè)置重映射;調(diào)用函數(shù):RCC_APB2PeriphClockCmd(); GPIO_PinRemapConfig();
-
初始化定時(shí)器。調(diào)用函數(shù):ARR,PSC等:TIM_TimeBaseInit();
-
初始化輸出比較參數(shù)。調(diào)用函數(shù):TIM_OC2Init();
-
使能預(yù)裝載寄存器。調(diào)用函數(shù):TIM_OC2PreloadConfig();
-
使能定時(shí)器。調(diào)用函數(shù):TIM_Cmd();
-
不斷改變比較值CCRx,達(dá)到不同的占空比效果;調(diào)用函TIM_SetCompare2()
(二)STM32上的PWM
1.PWM產(chǎn)生
STM32的定時(shí)器除了TIM6和7,其他的定時(shí)器都可以用來產(chǎn)生PWM輸出。其中高級(jí)定時(shí)器TIM1和TIM8可以同時(shí)產(chǎn)生多達(dá) 7 路的 PWM 輸出。而通用定時(shí)器也能同時(shí)產(chǎn)生多達(dá) 4路的 PWM 輸出,這樣,STM32 最多可以同時(shí)產(chǎn)生 30 路 PWM 輸出。
普通IO也可以輸出PWM,只是產(chǎn)生PWM一般用轉(zhuǎn)用芯片(開關(guān)電源上用的較多)或者單片機(jī)的PWM內(nèi)置模塊如定時(shí)器,很小直接用MCU的IO口線直接輸出因?yàn)槟菢犹腗CU資源了。
脈沖寬度調(diào)制模式可以產(chǎn)生一個(gè)由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號(hào)。通用定時(shí)器產(chǎn)生PWM 的定時(shí)器框圖如下:(其他定時(shí)器框圖類似)
1.1PWM相關(guān)寄存器
包含三個(gè)寄存器:捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。設(shè)置TIMx_CCMRx寄存器OCxPE位以使能相應(yīng)的預(yù)裝載寄存器,最后還要設(shè)置TIMx_CR1寄存器的ARPE位,(在向上計(jì)數(shù)或中心對(duì)稱模式中)使能自動(dòng)重裝載的預(yù)裝載寄存器。在TIMx_CCMRx寄存器中的OCxM位寫入110(PWM模式1)或111(PWM模式2),能夠獨(dú)立地設(shè)置每個(gè)OCx輸出通道產(chǎn)生一路PWM。
捕獲/比較模式寄存器(TIMx_CCMRx)
下圖為TIMx_CCMR1寄存器的各位描述:這里需要使用的是模式設(shè)置位OCxM,總共有兩種PWM模式,這兩種PWM 模式的區(qū)別就是輸出電平的極性相反。
捕獲/比較使能寄存器(TIMx_CCER)
下圖為TIMx_CCER寄存器的各位描述:
該寄存器控制著各個(gè)輸入輸出通道的開關(guān)。這里只用到了CC2E位,該位是輸入/捕獲 2 輸出使能位,要想PWM 從 I/O 口輸出,這個(gè)位必須設(shè)置為 1。
捕獲/比較寄存器(TIMx_CCRx)
下圖為TIMx_CCR1寄存器的各位描述
在輸出模式下,該寄存器的值與 CNT 的值比較,根據(jù)比較結(jié)果在OC1端口上產(chǎn)生輸出信號(hào)。利用這點(diǎn),我們通過修改這個(gè)寄存器的值實(shí)現(xiàn)控制 PWM 的輸出脈寬。
2.STM32f103c8t6的PWM口
詳細(xì)配置如下:
TIM1_CH1->PA8;
TIM1_CH2->PA9;
TIM1_CH3->PA10;
TIM1_CH4->PA11;
TIM2_CH1->PA0;
TIM2_CH2->PA1;
TIM2_CH3->PA2;
TIM2_CH4->PA3;
TIM3_CH1->PA6;
TIM3_CH2->PA7;
TIM3_CH3->PB0;
TIM3_CH4->PB1;
TIM4_CH1->PB6;
TIM4_CH1->PB7;
TIM4_CH1->PB8;
TIM4_CH1->PB9;
(三)新建工程
1.新建項(xiàng)目
步驟與上部分新建項(xiàng)目一致
2.相關(guān)設(shè)置
-
RCC設(shè)置
-
SYS設(shè)置
-
TIM3設(shè)置
-
TIM4設(shè)置
-
時(shí)鐘設(shè)置
-
其他
注意路徑中不要含有中文
(四) 代碼編寫
- 打開工程文件
- main.c文件添加變量
uint16_t pwm=0; //占空比
- 開啟TIM3和TIM4的PWM的通道1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
- while中寫入調(diào)用代碼
while (pwm< 500)
{
pwm++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
while (pwm)
{
pwm--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
HAL_Delay(200);
- 編譯一下
(五) 線路連接
3V3 —3V3
GND —GND
RXD —A9
TXD —A10
LED燈短腳 —A6
LED燈長腳 —3V3
PB6 —PC13
(六)實(shí)現(xiàn)效果
1.燒錄
2.效果展示
呼吸燈
四、總結(jié)
本文章介紹了STM32F103C8T6定時(shí)器實(shí)現(xiàn)led的周期閃爍及PWM實(shí)現(xiàn)流水燈,學(xué)習(xí)了有關(guān)定時(shí)器的知識(shí),相較上幾個(gè)實(shí)驗(yàn),這個(gè)更加簡單,當(dāng)結(jié)果出來與預(yù)期一致時(shí),也會(huì)感到欣喜,雖然比上幾個(gè)實(shí)驗(yàn)簡單,但是也包含了許多的知識(shí),受益匪淺。文章來源:http://www.zghlxwxcb.cn/news/detail-818748.html
五、參考資料
https://blog.csdn.net/XMJYever/article/details/105843993
https://blog.csdn.net/qq_45237293/article/details/111997424
https://blog.csdn.net/weixin_50438937/article/details/118881923
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
《零死角玩轉(zhuǎn) STM32F103—指南者》文章來源地址http://www.zghlxwxcb.cn/news/detail-818748.html
到了這里,關(guān)于STM32F103C8T6定時(shí)器實(shí)現(xiàn)led的周期閃爍及PWM實(shí)現(xiàn)流水燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!