簡介
不同的開發(fā)板的原理圖結構也不盡相同,筆者在這里使用野火的MINI-V3(F103VET6)簡易開發(fā)板對GPIO口的設置做一個簡單的介紹,并實現(xiàn)按鍵控制LED燈的亮滅。方便讀者可以快速熟悉并靈活應用。
原理圖分析
首先我們來看一下發(fā)光二極管部分和按鍵部分的原理圖。
下面是按鍵的原理圖部分:
在這里,我們將使用KEY1(PA0)來控制紅燈PB5的亮滅。由原理圖可知,其控制LED燈的PB5引腳為低電平時,燈亮。當KEY1按下時,PA0引腳由之前的低電平轉為高電平(3V3)。明確了目的之后我們就可以分析GPIO口并進行設置了。
GPIO設置
經(jīng)過上述的功能明確之后,我們將其分為兩大類,分別是輸入類(如按鍵)和輸出類(LED燈)。
STM32系列單片機的引腳有著豐富的功能,在這里將其芯片的GPIO口部分的結構圖放出,有興趣的朋友可自行研究或在評論區(qū)留言討論。在這里筆者將不再講解時鐘樹的相關內(nèi)容,以免對初學者造成較大壓力,有興趣的朋友可自行參考官方文檔。
輸入輸出模式
GPIO的輸入、輸出種類詳見下表。
功能 | 名稱 | 簡述 |
---|---|---|
輸入 | 上拉輸入(GPIO_Mode_IPU) | 默認狀態(tài)下(引腳無輸入),讀得的數(shù)據(jù)為1,高電平 |
輸入 | 下拉輸入(GPIO_Mode_IPD) | 與上拉輸入相反,默認為0,低電平 |
輸入 | 浮空輸入(GPIO_Mode_IN_FLOATING) | 輸入不確定,無上拉和下拉。輸入阻抗較大,一般用于標準通信協(xié)議如、USART的接收端 |
輸入 | 模擬輸入模式(GPIO_Mode_AIN) | 一般由ADC采集電壓信號時將其設置為模擬輸入。 |
輸出 | 普通推挽輸出(GPIO_Mode_Out_PP) | 輸出電平為3.3V |
輸出 | 普通開漏輸出(GPIO_Mode_Out_OD) | 若要輸出5V,則需外加上拉電阻,電源為5V。輸出為高阻態(tài)時,由上拉電阻和電源向外輸出5V的高電平 |
輸出 | 復用推挽輸出(GPIO_Mode_AF_PP) | 引腳復用功能采用復用模式 |
輸出 | 復用開漏輸出(GPIO_Mode_AF_OD) | 復用模式,且加入上拉電阻 |
由上表可知,我們需要將LED燈的引腳設置為推挽輸出。按鍵部分的輸入可以是上拉輸入也可以是下拉輸入。在這里,因為我們的電路原理圖設置的是按鍵按下為高,釋放為低。所以我們使用下拉輸入的模式 。
結構體設置
STM32以高效的庫函數(shù)開發(fā)而著稱。由于其寄存器過多,不適合類似51系列單片機的寄存器操作,所以我們將直接采用庫函數(shù)開發(fā)的方法(CMSIS 3.5.0版本)。
STM32的庫函數(shù)將結構體的功效發(fā)揮到了極致,我們首先來看一下GPIO口的結構體定義:
typedef struct {
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
在這個結構體之中,主要包括三個成員:引腳設置(GPIO_Pin)、引腳最大輸出速度(GPIO_Speed)和引腳模式(GPIO_Mode)。在這之中,GPIO還有一個重要的定義,即確定組別:GPIOA~GPIOG.
他們的種類又可以分別劃分為:
GPIO_Speed:
GPIO_Speed_10MHz
GPIO_Speed_2MHz
GPIO_Speed_50MHz
GPIO_Mode:
GPIO_Mode_AIN
GPIO_Mode_IN_FLOATING
GPIO_Mode_IPD
GPIO_Mode_IPU
GPIO_Mode_Out_OD
GPIO_Mode_Out_PP
GPIO_Mode_AF_OD
GPIO_Mode_AF_PP
GPIO_Pin:
GPIO_Pin_0
GPIO_Pin_1
GPIO_Pin_2
GPIO_Pin_3
GPIO_Pin_4
GPIO_Pin_5
GPIO_Pin_6
GPIO_Pin_7
GPIO_Pin_8
GPIO_Pin_9
GPIO_Pin_10
GPIO_Pin_11
GPIO_Pin_12
GPIO_Pin_13
GPIO_Pin_14
GPIO_Pin_15
熟悉結構體類別以后我們可以進行結構體的定義以及GPIO口的初始化。由于GPIO處于APB2時鐘線下,所以我們必須要開啟相應的時鐘。代碼如下:
void key_gpio_config(void) {
GPIO_InitTypeDef key_struct; // 定義結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 開啟時鐘
key_struct.GPIO_Pin = GPIO_Pin_0; //結構體成員設置;對于按鍵初始化而言,由于GPIO是輸入模式,故不必設置最大輸出速度
key_struct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &key_struct); // 初始化引腳
}
void led_gpio_config(void) { // 同上
GPIO_InitTypeDef led_struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
led_struct.GPIO_Pin = GPIO_Pin_5;
led_struct.GPIO_Speed = GPIO_Speed_50MHz;
led_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &led_struct);
}
自此,結構體設置結束。下面進行GPIO口的操作。
GPIO操作
對于庫函數(shù)開發(fā)來說,一切硬件操作都可以使用函數(shù)來解決。如:
uint16_t GPIO_ReadInputData (GPIO_TypeDef *GPIOx)
// Reads the specified GPIO input data port.
uint8_t GPIO_ReadInputDataBit (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
// Reads the specified input port pin.
uint16_t GPIO_ReadOutputData (GPIO_TypeDef *GPIOx)
// Reads the specified GPIO output data port.
uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
// Reads the specified output data port bit.
void GPIO_ResetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
// Clears the selected data port bits.
void GPIO_SetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
// Sets the selected data port bits.
void GPIO_StructInit (GPIO_InitTypeDef *GPIO_InitStruct)
// Fills each GPIO_InitStruct member with its default value.
void GPIO_Write (GPIO_TypeDef *GPIOx, uint16_t PortVal)
// Writes data to the specified GPIO data port.
void GPIO_WriteBit (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
// Sets or clears the selected data port bit.
對于本題目而言,使用簡單的寫入操作即可。
int main()
{
led_gpio_config();
GPIO_WriteBit(GPIOB, GPIO_Pin_5, 1); //初始化,使燈為熄滅狀態(tài)
key_gpio_config();
while(1) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1) {
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
}
else {
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
}
}
}
至此,GPIO的操作完成,功能也成功實現(xiàn)。但是按鍵部分未加消抖處理,所以可能出現(xiàn)不穩(wěn)定的狀態(tài)。不過對于本示例來說,這一現(xiàn)象并不明顯。
上一篇:STM32筆記(三)GPIO的配置(用GPIO點亮LED)
下一篇:STM32 基于 CubeMX配置GPIO點亮LED燈
推薦閱讀
史海拾趣
由于AXSEM公司在電子行業(yè)的具體發(fā)展故事細節(jié)可能涉及到公司內(nèi)部資料,并且不易公開獲取,因此難以提供五個具體的故事。不過,可以依據(jù)公開信息,嘗試概述AXSEM公司的發(fā)展概況和可能的發(fā)展故事線索。
故事一:創(chuàng)立與早期發(fā)展
AXSEM公司成立于2000年,自創(chuàng)立之初,就專注于無線射頻技術的研發(fā)與創(chuàng)新。在創(chuàng)始人及團隊的共同努力下,公司成功開發(fā)了多個高容量通信射頻集成電路,如SigFox、EnOcean等,這些技術在當時的物聯(lián)網(wǎng)和無線通信領域具有前瞻性。公司憑借其技術優(yōu)勢,逐步在市場中樹立了良好的口碑,為后續(xù)的發(fā)展奠定了堅實的基礎。
故事二:技術突破與市場拓展
隨著無線通信技術的快速發(fā)展,AXSEM公司不斷突破技術瓶頸,推出了一系列具有創(chuàng)新性的產(chǎn)品。這些產(chǎn)品不僅支持物聯(lián)網(wǎng)、自動抄表、家庭自動化等領域的應用,還廣泛應用于傳感器網(wǎng)絡和衛(wèi)星通信市場。公司憑借這些產(chǎn)品,成功拓展了市場份額,實現(xiàn)了業(yè)務的快速增長。
故事三:戰(zhàn)略合作與資源整合
為了進一步提升技術實力和市場競爭力,AXSEM公司積極尋求與其他企業(yè)的戰(zhàn)略合作。通過與其他知名企業(yè)的合作,公司成功整合了資源,優(yōu)化了產(chǎn)品線,提高了生產(chǎn)效率。同時,這些合作也為公司帶來了更多的市場機會,推動了公司的持續(xù)發(fā)展。
故事四:國際化發(fā)展與品牌提升
隨著業(yè)務的不斷拓展,AXSEM公司開始將目光投向國際市場。公司積極參與國際展覽和交流活動,與全球客戶建立了廣泛的聯(lián)系。通過不斷提升產(chǎn)品質(zhì)量和服務水平,公司的品牌知名度和美譽度逐漸提升,為全球客戶提供了更加優(yōu)質(zhì)的產(chǎn)品和服務。
故事五:未來展望與創(chuàng)新驅動
面對未來電子行業(yè)的快速發(fā)展和變革,AXSEM公司將繼續(xù)堅持創(chuàng)新驅動的發(fā)展戰(zhàn)略。公司將加大研發(fā)投入,不斷推出具有創(chuàng)新性和競爭力的新產(chǎn)品。同時,公司還將積極拓展新的應用領域和市場,為全球客戶提供更加全面和高效的解決方案。
請注意,以上僅為基于公開信息的AXSEM公司發(fā)展故事的概述,并未涉及具體的事實細節(jié)。如需了解更多關于AXSEM公司的故事,建議查閱公司官方網(wǎng)站、行業(yè)報告或相關新聞報道。
隨著公司業(yè)務的不斷發(fā)展壯大,Globaltech開始著手進行全球化布局。公司在全球多個地區(qū)設立了研發(fā)中心和銷售中心,以便更好地服務全球客戶。同時,公司還注重可持續(xù)發(fā)展和社會責任,積極參與公益事業(yè)和環(huán)保活動。這些舉措不僅提升了公司的社會形象和品牌價值,也為公司的長期發(fā)展奠定了堅實的基礎。
以上五個故事展示了Globaltech Semiconductor Co., Ltd.在電子行業(yè)中的發(fā)展歷程和關鍵里程碑。通過技術創(chuàng)新、市場拓展、研發(fā)實力提升、戰(zhàn)略調(diào)整和全球化布局等措施,公司不斷壯大自身實力,并在全球半導體行業(yè)中占據(jù)了一席之地。
隨著全球電子市場的不斷擴大,API Technologies開始實施全球化戰(zhàn)略布局。公司先后在多個國家和地區(qū)設立了分支機構和研發(fā)中心,積極開拓國際市場。通過與全球客戶的緊密合作,API Technologies的產(chǎn)品和技術逐漸在全球范圍內(nèi)得到了廣泛應用和認可。
為了進一步提升自身實力和市場競爭力,杜因特積極尋求與國內(nèi)外一流芯片代工廠、封裝測試代工廠的合作。通過緊密的合作關系,杜因特不僅獲得了先進的技術支持,還實現(xiàn)了產(chǎn)品質(zhì)量的穩(wěn)步提升。同時,公司還積極與國內(nèi)外知名電子企業(yè)建立戰(zhàn)略合作關系,共同開拓市場,實現(xiàn)共贏發(fā)展。
1914年,Bussmann五兄弟在家中地下室開始了他們的創(chuàng)業(yè)之旅。那時的電子行業(yè)正處于起步階段,熔斷器作為電路保護的關鍵部件,市場需求巨大但供應不足。五兄弟憑借對電子技術的熱情和家族傳承的工匠精神,不斷嘗試、創(chuàng)新,終于成功制造出了高質(zhì)量的熔斷器。他們憑借出色的產(chǎn)品質(zhì)量和口碑,逐漸贏得了市場的認可,業(yè)務也從小小的地下室擴展到了一間小型廠房。
為了進一步提升競爭力,DESCO公司進行了多次收購和資源整合。例如,在XX年,公司成功收購了美國一家知名的防靜電產(chǎn)品制造商,獲得了其先進的生產(chǎn)技術和銷售渠道。這次收購使DESCO公司的產(chǎn)品線更加豐富,市場覆蓋面更加廣泛。此外,公司還加強了與其他企業(yè)的戰(zhàn)略合作,共同開發(fā)新產(chǎn)品、拓展新市場。
現(xiàn)場總線(Fieldbus)是80年代末、90年代初國際上發(fā)展形成的,用于過程自動化、制造自動化、樓宇自動化等領域的現(xiàn)場智能設備互連通訊網(wǎng)絡。它作為工廠數(shù)字通信網(wǎng)絡的基礎,溝通了生產(chǎn)過程現(xiàn)場及控制設備之間及其與更高控制管理層次之間的聯(lián)系。它不 ...… 查看全部問答∨ |
安裝Protel99SESP6HH2_TSG深度漢化版后,原理圖的元件圖編輯后無法保存,而且保存后會把原有的元件圖刪除成空的。經(jīng)對比發(fā)現(xiàn)這問題是由ADVSCH.DLL(1.05M)文件引起的,我把原來未漢化前備份的這個文件再復制到原來的位置,就能保存了。… 查看全部問答∨ |
yayasoso的博客 http://home.eeworld.com.cn/my/space.php?uid=45925 內(nèi)容如下: 51單片機C語言入門教程 24c02中文官方資料手冊 6n137光耦.pdf 6n137光耦中文資料, &nbs ...… 查看全部問答∨ |
|
cListCtrol.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES); LV_COLUMN lvc; lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT; lv ...… 查看全部問答∨ |
|
【L】新手,沒錢!我現(xiàn)在想把從鍵盤得來的ASK碼存到F060外接的FALSH中,怎樣把ASK.... 本帖最后由 辛昕 于 2018-9-6 21:58 編輯 我現(xiàn)在想把從鍵盤得來的ASK碼存到F060外接的FALSH中,怎樣把ASK碼轉為無符號整型?用C51。… 查看全部問答∨ |
不了解硬件能開發(fā)ARM程序嗎? 聽有人說可以不用關心硬件,在PC上模擬成功后直接下載到芯片中既可。是不是這樣?有六年的c、c#軟件開發(fā)經(jīng)驗。 //解決以下問題,另開帖送分。 哪里有ARM的入門資料可以下載? 誰能提供一款ARM開發(fā)板,價格不要太貴 ...… 查看全部問答∨ |
在寫程序中突然遇到一個怪事情,我使用的ARM是LPC2148,操作系統(tǒng)用的是UCOS,程序是串口發(fā)送接收程序,其中數(shù)據(jù)的接收是用信號量來控制的,當中斷中接收到數(shù)據(jù)后,向接收任務發(fā)送一個信號量,接收任務在接收到信號量后,對數(shù)據(jù)進行處理.程序可以正常運行,但 ...… 查看全部問答∨ |
菜鳥,問的問題很基礎。要求以該ARM芯片為核心做一個智能電表,我是這么想的,設計了采樣電壓電流信號的電路,將采得的值給mcu,然后通過顯示電路顯示出來,并可以和電腦通信。有幾個基礎的問題,聽說這個芯片帶AD轉換,采樣得到的模擬量從哪個引腳 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 迅為IMX6開發(fā)板Android應用-AndroidStudio-calculator測試
- 玩轉 ESP32 + Arduino (二十) SIM800L上傳數(shù)據(jù)到OneNet(新版Mqtts)
- 玩轉 ESP32 + Arduino (二十一) SPIFFS文件系統(tǒng) (已棄用)
- 玩轉 ESP32 + Arduino (二十二) SIM800L上傳數(shù)據(jù)到阿里IOT(溫濕度和LBS)(NTP對時)
- 玩轉 ESP32 + Arduino (二十三) 多文件系統(tǒng)及全局變量
- 玩轉 ESP32 + Arduino (二十四) SD卡讀寫
- 玩轉 ESP32 + Arduino (二十五) SSD1306庫驅動OLED
- 玩轉 ESP32 + Arduino(二十六) 按鍵控制庫 OneButton
- 玩轉 ESP32 + Arduino(二十七) ESP對象