簡介
不同的開發板的原理圖結構也不盡相同,筆者在這里使用野火的MINI-V3(F103VET6)簡易開發板對GPIO口的設置做一個簡單的介紹,并實現按鍵控制LED燈的亮滅。方便讀者可以快速熟悉并靈活應用。
原理圖分析
首先我們來看一下發光二極管部分和按鍵部分的原理圖。
下面是按鍵的原理圖部分:
在這里,我們將使用KEY1(PA0)來控制紅燈PB5的亮滅。由原理圖可知,其控制LED燈的PB5引腳為低電平時,燈亮。當KEY1按下時,PA0引腳由之前的低電平轉為高電平(3V3)。明確了目的之后我們就可以分析GPIO口并進行設置了。
GPIO設置
經過上述的功能明確之后,我們將其分為兩大類,分別是輸入類(如按鍵)和輸出類(LED燈)。
STM32系列單片機的引腳有著豐富的功能,在這里將其芯片的GPIO口部分的結構圖放出,有興趣的朋友可自行研究或在評論區留言討論。在這里筆者將不再講解時鐘樹的相關內容,以免對初學者造成較大壓力,有興趣的朋友可自行參考官方文檔。
輸入輸出模式
GPIO的輸入、輸出種類詳見下表。
功能 | 名稱 | 簡述 |
---|---|---|
輸入 | 上拉輸入(GPIO_Mode_IPU) | 默認狀態下(引腳無輸入),讀得的數據為1,高電平 |
輸入 | 下拉輸入(GPIO_Mode_IPD) | 與上拉輸入相反,默認為0,低電平 |
輸入 | 浮空輸入(GPIO_Mode_IN_FLOATING) | 輸入不確定,無上拉和下拉。輸入阻抗較大,一般用于標準通信協議如、USART的接收端 |
輸入 | 模擬輸入模式(GPIO_Mode_AIN) | 一般由ADC采集電壓信號時將其設置為模擬輸入。 |
輸出 | 普通推挽輸出(GPIO_Mode_Out_PP) | 輸出電平為3.3V |
輸出 | 普通開漏輸出(GPIO_Mode_Out_OD) | 若要輸出5V,則需外加上拉電阻,電源為5V。輸出為高阻態時,由上拉電阻和電源向外輸出5V的高電平 |
輸出 | 復用推挽輸出(GPIO_Mode_AF_PP) | 引腳復用功能采用復用模式 |
輸出 | 復用開漏輸出(GPIO_Mode_AF_OD) | 復用模式,且加入上拉電阻 |
由上表可知,我們需要將LED燈的引腳設置為推挽輸出。按鍵部分的輸入可以是上拉輸入也可以是下拉輸入。在這里,因為我們的電路原理圖設置的是按鍵按下為高,釋放為低。所以我們使用下拉輸入的模式 。
結構體設置
STM32以高效的庫函數開發而著稱。由于其寄存器過多,不適合類似51系列單片機的寄存器操作,所以我們將直接采用庫函數開發的方法(CMSIS 3.5.0版本)。
STM32的庫函數將結構體的功效發揮到了極致,我們首先來看一下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操作
對于庫函數開發來說,一切硬件操作都可以使用函數來解決。如:
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); //初始化,使燈為熄滅狀態
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的操作完成,功能也成功實現。但是按鍵部分未加消抖處理,所以可能出現不穩定的狀態。不過對于本示例來說,這一現象并不明顯。
上一篇:STM32之LED配置
下一篇:STM32單片機基礎03——使用GPIO點亮一個LED
推薦閱讀
史海拾趣
FREESCALE (NXP) 公司發展的五個故事
故事一:從摩托羅拉剝離到獨立上市
FREESCALE的前身可以追溯到摩托羅拉的半導體部門。2002年,面對半導體業務的持續虧損,摩托羅拉集團決定剝離該部門。2004年,摩托羅拉半導體產品事業部正式更名為FREESCALE半導體公司,并在次年成功上市。這一剝離與上市過程標志著FREESCALE作為一個獨立實體的誕生,為其后續的發展奠定了基礎。獨立后的FREESCALE迅速調整戰略,專注于嵌入式電子解決方案,特別是在汽車電子、工業控制等領域取得了顯著成就。
故事二:與恩智浦(NXP)的合并
2015年,FREESCALE與另一家半導體巨頭恩智浦(NXP)達成合并協議,這是半導體行業內的一次重大整合。合并后的公司成為全球最大的汽車半導體供應商之一,并在多個關鍵技術領域占據領先地位。此次合并不僅增強了雙方的市場競爭力,還促進了資源共享和技術創新,為未來的增長開辟了更廣闊的空間。合并后的公司在全球范圍內擁有更強大的研發和銷售網絡,能夠更好地服務于全球客戶。
故事三:從虧損到盈利的轉型
在成為獨立公司之前,FREESCALE的前身——摩托羅拉的半導體部門曾長期面臨虧損困境。然而,在剝離并獨立運營后,FREESCALE通過一系列戰略調整和市場拓展措施,成功實現了從虧損到盈利的轉型。公司注重技術創新和產品研發,不斷推出符合市場需求的新產品,同時加強與客戶和合作伙伴的合作,共同推動行業發展。這些努力使得FREESCALE在激烈的市場競爭中脫穎而出,成為半導體行業的佼佼者。
故事四:技術創新的引領者
FREESCALE一直致力于技術創新,不斷推動半導體技術的進步。公司在嵌入式處理器、模擬芯片、射頻芯片等多個領域擁有深厚的技術積累和豐富的產品線。例如,FREESCALE推出的基于Arm Cortex-M系列的微控制器在智能家居、智能穿戴等領域得到了廣泛應用;其汽車半導體產品更是廣泛應用于高級駕駛員輔助系統、車載網絡等領域,為汽車行業的智能化轉型提供了有力支持。FREESCALE的技術創新不僅提升了自身產品的競爭力,也為整個行業的發展注入了新的活力。
故事五:全球布局與本地化服務
為了更好地服務全球客戶,FREESCALE(及合并后的NXP)在全球范圍內進行了廣泛的布局。公司在多個國家和地區設立了研發中心、生產基地和銷售網絡,能夠快速響應客戶需求并提供本地化服務。同時,FREESCALE還積極與全球各地的合作伙伴建立緊密關系,共同推動技術創新和市場拓展。這種全球布局與本地化服務的策略使得FREESCALE能夠更好地融入當地市場,為客戶提供更加貼心和高效的服務。
Amphenol Piher 是 Amphenol 公司的一部分,專注于設計、制造和銷售電子行業中的傳感器和電位器等產品。以下是關于 Amphenol Piher 公司發展的五個相關故事:
創立與初期發展:Amphenol Piher 公司的歷史可以追溯到20世紀60年代,在西班牙的Valencia成立。最初,公司主要致力于生產電位器和傳感器等電子元器件,為不同行業的客戶提供定制化的解決方案。隨著市場需求的增長和公司技術實力的提升,Amphenol Piher 逐漸贏得了客戶的信任和市場認可。
技術創新與產品多樣化:Amphenol Piher 公司在技術研發方面持續投入,并不斷推出新型的傳感器和電位器產品。公司專注于提升產品性能、精度和可靠性,滿足客戶對高品質電子元器件的需求。除了傳統的電位器和傳感器,Amphenol Piher 還推出了一系列新型產品,如角位移傳感器、線性位移傳感器等,為不同應用領域提供多樣化的解決方案。
客戶合作與定制化解決方案:Amphenol Piher 公司與客戶建立了緊密的合作關系,致力于開發定制化的傳感器和電位器解決方案。公司的工程團隊與客戶密切合作,根據客戶的需求和應用場景,設計和制造符合特定要求的產品。這種定制化解決方案能夠滿足客戶個性化的需求,為客戶提供更加專業和完善的服務。
質量控制與認證標準:Amphenol Piher 公司高度重視產品質量控制,并嚴格遵循國際質量管理體系標準。公司的生產工藝和質量管理體系符合ISO 9001質量管理體系認證標準,以確保產品質量的穩定性和可靠性。此外,Amphenol Piher 公司的產品還通過了各種行業和應用領域的認證標準,如汽車行業的TS16949認證等,確保產品符合行業標準和規定。
全球市場拓展與合作伙伴關系:除了在西班牙的生產基地外,Amphenol Piher 公司還在全球范圍內設有多個銷售辦事處和代理商網絡,拓展了國際市場份額。公司與全球各種行業領先企業建立了長期穩定的合作關系,共同推動產品的創新和市場拓展。通過全球市場拓展和合作伙伴關系,Amphenol Piher 公司不斷擴大業務規模,增強了在電子行業中的市場競爭力。
這些故事展示了 Amphenol Piher 公司從成立初期到如今在技術創新、產品多樣化、客戶合作與定制化解決方案、質量控制與認證標準以及全球市場拓展與合作伙伴關系等方面取得的重要進展。
Analog Microelectronics GmbH是一家德國的半導體公司,專注于開發和生產模擬集成電路(ICs),以及為汽車、工業和醫療等領域提供解決方案。以下是Analog Microelectronics GmbH公司發展的相關故事:
創立與早期發展:Analog Microelectronics GmbH成立于1984年,總部位于德國巴伐利亞州的蘭格維塔赫鎮。公司的創始人致力于開發高質量的模擬集成電路,以滿足市場對精密電子元件的需求。在創立初期,公司主要專注于生產模擬傳感器和信號處理器件。
技術創新與產品優化:Analog Microelectronics GmbH在技術創新方面持續投入,不斷改進和優化其產品線。公司注重研發和設計,致力于提供高性能、高精度和可靠性的模擬集成電路產品。公司的產品包括壓力傳感器、溫度傳感器、加速度傳感器、電流傳感器等,廣泛應用于汽車電子、工業自動化、醫療器械等領域。
市場拓展與客戶合作:Analog Microelectronics GmbH通過與全球各行業的客戶建立長期穩定的合作關系,不斷拓展市場份額和業務范圍。公司在歐洲、亞洲和北美等地區設立了銷售辦事處和代表處,加強了與客戶的溝通和服務能力,提高了產品的市場競爭力。
質量控制與認證:Analog Microelectronics GmbH嚴格遵循國際質量管理體系標準,對產品的生產過程進行嚴格控制和管理。公司獲得了ISO 9001質量管理體系認證,確保產品質量穩定可靠。此外,公司的產品也符合汽車行業的相關認證標準,如ISO/TS 16949等,為客戶提供高品質的產品和服務。
持續發展與未來展望:作為一家成熟的模擬集成電路供應商,Analog Microelectronics GmbH將繼續致力于技術創新和產品研發,以滿足不斷變化的市場需求。公司將繼續加強與客戶和合作伙伴的合作關系,拓展業務領域,為全球客戶提供更加優質的解決方案和服務。
喬光電子在全球擁有廣泛的銷售網絡,不僅在國內的上海和深圳設有銷售公司,還在韓國、印度、新加坡、巴西、意大利等國家設立了銷售據點。隨著市場的不斷拓展和技術的不斷創新,喬光電子的銷售額從2015年的2200萬元增長到2022年的27000萬元,實現了跨越式發展。未來,喬光電子計劃進一步擴展導熱導電膠生產線業務,并可能涉足傳感器和安規電容領域。同時,公司還將繼續加大研發投入,提升產品性能和質量,為全球客戶提供更加優質、可靠的電子產品和服務。
隨著全球市場的不斷變化和公司規模的擴大,Cal Test Electronics開始實施全球化戰略。公司積極拓展海外市場,通過參加國際展會、建立海外銷售渠道等方式,提高品牌知名度和市場份額。同時,公司還加強與國際同行的合作與交流,引進先進的技術和管理經驗,不斷提升自身的競爭力。這些努力使得Cal Test Electronics逐漸成為一個具有全球影響力的電子配件和測試產品制造商。
這些故事旨在展示Cal Test Electronics公司可能的發展軌跡和成就,但并非基于實際發生的事件。對于該公司的真實發展歷程和故事,建議查閱相關官方資料或行業報告以獲取更準確的信息。
下午花了3個多小時搭建DS開發環境 一開始包含頭文件 streams.h 出現一大堆的重定義問題 查詢資料后是庫文件載入優先DX的目錄即可 更正后還剩下2個錯誤 d:\\dxsdk\\include\\strmif.h(6166) : error C2011: \'_RGNDATAHEADER\' : \'struct\' type ...… 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 09:42 編輯 請教各位大俠,我的精密整流電路輸出正負不對稱, 當輸入1V時,輸約1.5V, 輸入2V, 輸出約為2.5V.輸入負電壓時, 輸出與輸入相等. 不好意思, 圖怎么貼不上去呀. … 查看全部問答∨ |
|
學校沒教過FPGA/CPDL這門課程,但是畢業設計卻要我做這個題目。我真是一頭霧水。每個人個都在工作階段了,難道要我花一段時間來學一門課程再完成一個設計嗎?抽到題目是我在忙考研,考研失敗了,我就找工作,現在工作都找到了,但是星期一到六都要 ...… 查看全部問答∨ |
求一個advanteck labtool 48編程器的ICTEST軟件 advanteck labtool 48編程器帶一個測試TTL門電路的功能。需要在dos下運行的ICTEST。這幾天搜遍了網絡也沒有找到,只有燒錄的軟件。哪位大哥大姐有的話發給我下,謝謝。論壇附件也可,郵箱也可fengcheche76@163.com謝謝了。… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 迅為IMX6開發板Android應用-AndroidStudio-calculator測試
- 玩轉 ESP32 + Arduino (二十) SIM800L上傳數據到OneNet(新版Mqtts)
- 玩轉 ESP32 + Arduino (二十一) SPIFFS文件系統 (已棄用)
- 玩轉 ESP32 + Arduino (二十二) SIM800L上傳數據到阿里IOT(溫濕度和LBS)(NTP對時)
- 玩轉 ESP32 + Arduino (二十三) 多文件系統及全局變量
- 玩轉 ESP32 + Arduino (二十四) SD卡讀寫
- 玩轉 ESP32 + Arduino (二十五) SSD1306庫驅動OLED
- 玩轉 ESP32 + Arduino(二十六) 按鍵控制庫 OneButton
- 玩轉 ESP32 + Arduino(二十七) ESP對象