www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]//======================================================//**基于學(xué)習(xí)STM32有一段時間了,特意寫下一篇關(guān)于一個簡單的跑馬燈的例程,梳理思路,也希望我自己的理解能幫到一些學(xué)習(xí)STM32的初學(xué)者/**再此,鳴謝余師傅

//======================================================//
**基于學(xué)習(xí)STM32有一段時間了,特意寫下一篇關(guān)于一個簡單的跑馬燈
的例程,梳理思路,也希望我自己的理解能幫到一些學(xué)習(xí)STM32的初學(xué)者
/**再此,鳴謝余師傅在學(xué)習(xí)上的大力幫助!!**/
//======================================================//


首先,GPIO的配置種類有8種。分別為模擬輸入、浮空輸入,上拉輸入、下拉輸入、開漏輸出、推挽輸出、復(fù)用開漏輸出、復(fù)用推挽輸出。
下面將以實例的方式講解GPIO的設(shè)置及實現(xiàn)過程。


事例1:跑馬燈實驗
跑馬燈實驗的功能:LED燈進(jìn)行有規(guī)律閃爍。(下面的LED燈的數(shù)量都為2個,所以關(guān)于寄存器的配置也將以兩組的方式進(jìn)行講解)


首先要知道普通的IO就兩種功能一個為輸入,一個為輸出。然后再以輸入和輸出細(xì)分為以哪種模式輸出、以哪種模式輸入。要設(shè)置IO的模式這時就要使用到寄存器進(jìn)行設(shè)置,STM32的IO端口一般由7個寄存器來進(jìn)行控制。
分別為
(1)配置模式的2個32位的端口配置寄存器 CRL 和 CRH;
(2)2 個 32 位的數(shù)據(jù)寄存器 IDR 和 ODR;
(3)1 個 32 位的置位/復(fù)位寄存器BSRR;
(4)1個 16 位的復(fù)位寄存器 BRR;
(5)1 個 32 位的鎖存寄存器 LCKR;
而我們常用的 IO 端口寄存器只有 4 個:CRL、CRH、IDR、ODR。


首先,一般一個程序的開始都會從入口main函數(shù)開始執(zhí)行,而一個功能的實現(xiàn)之前都需要做一些準(zhǔn)備工作,當(dāng)然跑馬燈也不例外,在程序執(zhí)行前,IO需要初始化,而初始化要做的就是對程序需要用到的GPIO的寄存器進(jìn)行配置。然后設(shè)定輸出設(shè)備的初始狀態(tài),即跑馬燈的初始狀態(tài)。一般程序在執(zhí)行前,輸出設(shè)備都會是處于關(guān)閉狀態(tài)。最后增加延時函數(shù),讓LED燈在亮與滅之間有一段時間的狀態(tài)保留,不然時間過快,人類的視覺根本捕抓它的狀態(tài)變化。


下面來講一下實現(xiàn)跑馬燈效果的IO要怎么配置。首先先說一下使用LED來進(jìn)行跑馬功能的話只需要用到RCC->APB2ENR、GPIOX->CRL、GPIOX->ODR三個寄存器(GPIOX中的X表示為GPIO的組別,例如GPIOB表示在GPIO的B組上,因為一般單片機上的GPIO一般都會有很多組的,這樣也只是為了區(qū)分這些IO罷了)
CRL 和 CRH 控制著每個 IO 口的模式及輸出速率。


這里需要注意的是在配置GPIO前,都需要先使能該GPIO的時鐘!(可能有人會問“為什么一定要是使能時鐘呢?”答案是:GPIO也是外設(shè)的一種,然后外設(shè)是需要提供時鐘信號工作,以便于設(shè)置GPIO的數(shù)據(jù)傳輸速度的高速/低速輸出,所以有關(guān)數(shù)據(jù)的傳輸都是在時鐘信號的基礎(chǔ)上的。51單片的IO口也有時鐘,只是為了方便,默認(rèn)開啟的,ST的為了更好的控制功耗,電路上做的可以選擇開關(guān)時鐘,降低功耗。補充網(wǎng)友的答案:“寄存器是基于觸發(fā)器的,觸發(fā)器的賦值是一定需要時鐘的,而寄存器的時鐘是由總線時鐘提供的,就是說沒有總線時鐘的話,你給寄存器值它是不會讀入的”)
然后設(shè)置兩個LED的GPIO的模式,因為LED是輸出設(shè)備,所以GPIO將設(shè)置成輸出模式,其中配置模式要用到的寄存器為配置寄存器CRL和CRH。其中CRH為高位寄存器,CRL為低位寄存器。(有人可能有疑問為什么用的是32位的寄存器為什么還要為兩個寄存器來管理呢?難道是32位還不夠配置嗎?答案是:是的,不夠用。配置寄存器對一個GPIO的配置要用4個位來完成。一組GPIO有16個引腳,一個引腳要4位的話,那么16個引腳就要16*4=64,那么就要2個32位的寄存器來實現(xiàn),所以就干脆把高八位給一個寄存器,低八位給另外一個寄存器,這就出現(xiàn)了CRL和CRH。也許有人還會有疑問說為什么一定要用4位來對一個引腳的配置呢?答案是肯定的,因為前面說了,對GPIO的配置首先配置為輸入模式或者輸出模式,然后再對輸入、輸出配置為哪種輸出,哪種輸入,是推挽輸出呢,還是開漏輸入呢,這都是需要至少2個位來進(jìn)行配置,而且輸入、輸出模式各有4種模式,共8中,這樣要以最少的資源來實現(xiàn)的話,用00、01、10、11這種2個位來實現(xiàn)是最省資源的,所以2*2=4,所以對于1個GPIO的模式的配置至少也就要4位了。)
接著就是查看LED的GPIO的引腳接在IC哪個引腳上。怎么查看LED的引腳到底接在哪呢?這個要看開發(fā)板的原理圖,不同的板子來說或者對于不同的商家來說在GPIO的引腳接線上會有不同,以我的開發(fā)板的原理圖可以發(fā)現(xiàn)LED燈的GPIO分別接在了GPIOB的pin5和GPIOE的pin5上,根據(jù)電路性質(zhì),一般會將LED設(shè)置為推挽輸出模式(可能這時就會有人問了,為什么就是推挽呢?為什么不是開漏呢?我的理解是:這是有電路性質(zhì)決定的,推挽顧名思義就是灌電流與拉電流都可以輸出,通俗地講就是輸出高低電平。而開漏是一直輸出低電平,當(dāng)你要輸出高電平的時候需要加上拉)
通過查閱寄存器的數(shù)據(jù)手冊可知,00位通用推挽模式,那么
//======================================================//
GPIOB->CRL |= 3 << 20;//設(shè)置模數(shù)數(shù)據(jù)傳輸速率
GPIOB->CRL &=~(3 << 22);//設(shè)置GPIO模式
//======================================================//
這樣就把GPIOB組的pin5設(shè)置成了通用推挽模式,前面說了一個引腳需要4個位來配置,查看寄存器數(shù)據(jù)手冊可看到,前面2個位是設(shè)置通用推挽模式的,后面2個位是基于這種模式的數(shù)據(jù)傳輸速率,在這里我們懸著的是“最大速度50MHz”,而GPIOB->CRL|=3<<20;就是設(shè)置數(shù)據(jù)傳輸速率為最大速度50MHz,GPIOB->CRL&=~(3<<22);為設(shè)置GPIOB的pin5為通用推挽模式。


最后就是設(shè)置LED的初始狀態(tài)了,再說之前先說一下ODR寄存器。
ODR是一個端口輸出數(shù)據(jù)寄存器,也只用了低16位。該寄存器為可讀寫,從該寄存器讀出來的數(shù)據(jù)可以用于判斷當(dāng)前IO 口的輸出狀態(tài)。而向該寄存器寫數(shù)據(jù),則可以控制某個 IO 口的輸出電平。
所以在配置LED初始化的時候就需要調(diào)用這個寄存器設(shè)置LED的初始狀態(tài)。
//======================================================//
GPIOE->ODR|=1<<5;//設(shè)置LED的初始化狀態(tài)為1(1為到電平,亮滅有其電路決定,我的開發(fā)板由于接了上拉,使得低電平才是有效的,即0為LED燈亮,1為LED燈滅)
//======================================================//
這樣初始化函數(shù)就完成了。


具體初始化代碼如下:
//=======================led.c===============================//
/**************************************************************
**為了使得程序的模塊化,所以把LED的初始化代碼獨立寫成一個源文件
**當(dāng)然這樣也使得需要寫一個頭文件進(jìn)行聲明,這樣才能讓main函數(shù)或者其他函數(shù)調(diào)用
**************************************************************/
#include "stm32f10x.h"
#include "led.h"


void led_Init(void)
{
RCC ->APB2ENR |= 1 << 3;//使能 PORTB 時鐘
RCC ->APB2ENR |= 1 << 6;//使能 PORTE 時鐘

GPIOB ->CRL |= 3 << 20;
GPIOB ->CRL &=~ (3 << 22);//PB.5 推挽輸出
GPIOB ->ODR |= 1 << 5;//PB.5 輸出高

GPIOE ->CRL |= 3 << 20;
GPIOE ->CRL &= ~(3 << 22);//PE.5 推挽輸出
GPIOE ->ODR |= 1 << 5;//PE.5 輸出高
}
//======================================================//


其頭文件如下:
//=========================led.h=============================//
#ifndef __LED_H_
#define __LED_H_


extern void led_Init(void);


#endif
//======================================================//


接下來說一下初始化好了,主函數(shù)要怎么寫。
第一需要的是點亮LED的語句,在初始化中有提到,設(shè)置LED初始化狀態(tài)即:GPIOB ->ODR |= 1 << 5;//PB.5 輸出高
那么同時也能使用這句來進(jìn)行LED的亮滅控制。代碼如下:
//==========================main.c============================//
#include "stm32f10x.h"
#include "led.h"




int main(void)
{
int i=0;
led_Init(); //LED初始化
while(1)
{

GPIOB ->ODR &= ~ (1 << 5);//PB.5輸出低電平,即點亮LED
GPIOE ->ODR &= ~(1 << 5);//PB.5輸出低電平,即點亮LED
for(i=0;i<1000000;i++);//延時


GPIOB ->ODR |= 1 << 5;//PE.5輸出高電平,即滅掉LED
GPIOE ->ODR |= 1 << 5;//PB.5輸出高電平,即滅掉LED
for(i=0;i<1000000;i++);//延時



}
}


//======================================================//
整個跑馬燈的工程就只需這三個文件,就能簡單實現(xiàn)跑馬的功能,如果你想要延時的時間是規(guī)律的,那么你就要去使用定時器了。因為定時器定時的時間是準(zhǔn)時的,軟件延時第一消耗CPU的資源,然后時間也不夠精確,所以一般在對時間要求沒有很精確的要求是才會使用軟件延時的做法。


//=======================================================================//
注釋:1、如有錯誤,跪謝大神出來指錯。
2、如這篇文章對您有些幫助,轉(zhuǎn)載請注明出處,謝謝!
//================================================================

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉