娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月03日(星期一)

2021年02月03日 | [STM32]STM32F407系列教程之二,gpio輸入輸出實驗

發布者:AngelicGrace 來源: eefocus關鍵字:STM32F407  gpio  輸入輸出 手機看文章 掃描二維碼
隨時隨地手機看文章

一、實驗準備

1.模板demo

圖1
原因呢,我在第一講中已經說過,費盡千辛萬苦搭建了一個模板,流過多少淚、費勁多少事,只有親自搭建過的才會體會到(第一講我只是講了組成,后續有機會,我將帶大家親手搭建一個),搭建完成后,備份壓縮(玩過Linux的大概有點感觸,配置了一個新環境,就得做個鏡像,哪天系統崩了,就可以重裝系統,這里也是一樣的)。

2.板級支持包

就是在我的工程文件中,所有以”Bsp_”開頭的文件,位于BSP文件夾下:

圖2
BSP文件夾下有兩個文件夾:BINC、BSRC。一個存放h文件,一個存放c文件,是可以放到一個文件中,我只是為分類能夠明顯點。

PS:關于這種分類,我在其他文件夾中也有類似的設計,有興趣可自行查找,另外無論去不去查找,請記住這里的東西,我在本章后面還會用到這里的知識點。

另外介紹一下什么“板級支持包“:
圖3
百度到的一段介紹,本來BSP是用來實現對操作系統的支持,比如我們在使用PC時,有顯示器、有鍵盤、有鼠標,PC的操作系統,比如Windows、Linux系統,它們只是用來管理這些資源,向用戶或者應用提供使用接口(如果你《大學計算機基礎》這門課還記得的話)操作系統通過BSP來訪問硬件設備。單片機到現在(起碼到我們正在學習的這個初期階段)還無法移植操作系統。但是我們也需要去使用外設的,如使用usart來跟PC進行通信,我們需要配置usart的工作模式。這里,BSP就涵蓋了一些對硬件外設的操作。


總之,一句話,有了BSP,我們可以隨心所欲的配置單片機上的外設,而不需要去關心如何去配置,當然,如果想研究比如usart的工作原理時,不好意思,讀源碼吧。

另外,補充一點,BSP是我在學習時候編寫的,是基于ST公司的固件庫(位于SYSLIB文件夾中)所做的二次開發。


二、實驗目的

  1. 配置gpio工作模式,使其可以讀取一個外部按鍵的狀態

  2. 配置gpio工作模式,使其可以控制一個LED燈

三、實驗前理論準備

圖4
打開”STM32F4xx中文參考手冊.pdf”文件(我很反感使用中文手冊,雖然我英語也不是很好,我建議可能的話盡量使用英文原版的datasheet,建議,建議),第7章,講的是通用I/O(GPIO)。


和51單片機不同,STM32等一些相對高端的單片機,它的I/O口可以工作在輸入、輸出、復用、模擬,不僅如此,還可以上拉、下拉、浮空,沒完呢,還有推挽模式、開漏模式。

當初我在學習時,那叫一個頭疼,去**的(和諧音),好難。不過仔細想想,這么設計也是必須的,存在即合理,接下來,解釋一下這些東西:


(都是大白話,不要見怪……)

輸入:數字信號流入單片機引腳;

輸出:數字信號從單片機引腳流出;

復用:有些引腳在被設計成特殊功能后,硬件會控制它,不需要用戶在程序中操作;

模擬:模擬信號流入單片機引腳;

上拉:引腳通過一個電阻連接到VDD;

下拉:引腳通過一個電阻連接到GND;

浮空:引腳啥也不接;


推挽模式:可理解為普通;

開漏模式:漏極開路(理解它,需要一點模電知識,場效應管相關知識);


用大白話解釋了一遍,接下來,用幾個硬件電路來從理論方面解釋一下:

下圖是”STM32F4xx中文參考手冊.pdf”文件中的第176頁圖17:
圖5
這張圖,完整的展示了GPIO的工作方式,特別說明,這只是一個引腳,在STM32F407VE上,每16個為一組,像這樣的一組,STM32F407VE有好幾組(GPIOA、GPIOB、GPIOC…自己去找找吧,我就不多說了)。

PS:為了能夠看懂這張圖,我們先來解釋一些特殊符號:
圖6

TTL施密特觸發器:詳細介紹請百度,我這里只告訴大家,它可以容忍信號的一些小波動(畢竟空間里的信號永遠不會穩定,不服來辯)。
圖7

場效應管:詳細介紹也請百度,理解為電子開關,左側的兩根線時控制信號(注意,這里是兩個不同的場效應管!),另外,有小圓圈的表示低電平有效。
圖8

二極管保護電路:這個嘛,是為了容忍引腳輸入5V信號的,因為STM32F407VE是3.3V的,沒有這個電路的話,分分鐘鈔票送到馬云爸爸兜里啊。當然,我們本章實驗最高也就接入3.3V,所以,這個電路就沒作用,既然沒作用,也就不用考慮了。

然后,我們就可以分析了:
首先是輸入模式:
圖9圖中的紅線就是輸入信號的流動過程,下方的輸出我們就不考慮了。

輸入模式的信后從引腳傳入,進來后,有一個上拉電阻和下拉電阻的選擇,是可以控制的(拉上開啟,接入上拉電阻;拉下開啟接入,下拉電阻;都關閉,浮空;都開啟,你丫是有病吧!),之后,信號可能傳入模擬通道(如果開啟了ADC設備,信號會被送到ADC中),然后就是TTL施密特觸發器,經過TTL施密特觸發器,信號相對穩定,一些小的波動被忽略了;然后,信號可以進入復用功能輸入通道,如果開啟了復用工作模式,相關硬件會來接管這個信號,硬件會自行判斷;最后的最后,進入輸入數據寄存器,到這里,信號就被存儲到單片機里了,用戶就可以訪問這個所謂的輸入數據寄存器來感知傳入的信號是高電平還是低電平了。

PS:到底信號能否進入模擬通道、復用功能輸入通道,是靠一個開關(學名叫寄存器)來控制的,想知道的自己查找嘍。
另外,說一個冷門的知識點,不管模擬通道、復用功能輸入通道是否打開,信號總會進入輸入信號寄存器,也就是說,無論是什么信號(模擬也好、數字也好,還是復不復用都好),用戶總是可以去主動讀取這個輸入信號。(注意,這個以后你一定會用到的,我以我這輩子的桃花做擔保,用不到,我一輩子遇不到她!)

再來是輸出模式:

圖10
輸出模式比較麻煩了,不過也不是沒有突破點。

首先,按照我之前說的,不要看二極管保護電路(不知道那個是,倒回去看去!),然后,暫時(注意是暫時!)不看輸入驅動器(再強調一起,暫時不看!)。好了,該說的都說了,來分析吧。

信號是從左到右,從單片機內部到引腳:首先是寫,這個寫需要注意一下,不是直接寫進輸出寄存器,而是通過向置位和復位寄存器(這是兩個寄存器!)寫數據,然后單片機硬件再把置位和復位寄存器里的數據轉移到輸出寄存器中**(PS:置位和復位寄存器的值是為1有效,如果置位寄存器的某一位為1,則這個位對應的引腳最終會輸出高電平,為0無效;如果復位寄存器的某一位為1,則這個位對應的引腳最終會輸出低電平,為0無效。建議大家仔細閱讀這段話。)。**

為什么要這么麻煩?有道理的,往下看:
圖11

輸出數據寄存器的數據還會來自片上外設,如USART1,會使用PA9和PA10來傳輸數據。設計成這么復雜,目的只有一個,在當USART1工作時,可以通過關閉從置位和復位寄存器到輸出數據寄存器的通道,來防止用戶對片上外設的輸出操作產生干擾。

隨著信號接著看,輸出數據寄存器的數據到了輸出控制那里,這里是很復雜的一塊電路,不過只要知道這里會完成信號的調理、邏輯轉換即可,還有的就是可以選擇用不用后面的邏輯門(通過這個來選擇工作在開漏模式還是推挽模式)。同時,復用功能的輸出也會對輸出進行控制。輸出控制之后是開關門,通過了邏輯門,信號才會被轉化為真正的信號(因為在此之前,信號可能只是存在于寄存器中的一個表示形式,好比U盤里的數據,雖然這個比喻不太恰當);通過了邏輯門,就到了上拉、下拉電阻接入控制區,在之后,就是輸出引腳了。

特別注意一下,右下角有一個模擬輸出,不要忘了,畢竟還有個東西叫DAC!

PS:輸出模式的工作原理基本說完了,不過我還要補充一點,我再講輸出模式時,說過暫時忽略這個模式下的輸入通道,好了,現在要開始講了:

首先貼幾個截圖,都可以在”STM32F4xx中文參考手冊.pdf”文件的第7章找見:
圖12
圖13
圖14
圖15

可以發現,GPIO模式的工作方式無非就是輸入、輸出、模擬、復用模式,除了模擬模式時,其他所有的模式都開啟了施密特觸發器,說明了什么?說明了什么?說明了什么?說明了,這幾種模式下,我們輸出了信號之后,可以回讀信號;也可以輸出信號,然后讀入信號而不需要切換工作模式,只需要讀信號時對輸出做些處理。
同時,可以根據這幾個截圖的信息重新再回顧一下輸入輸出模式的工作原理(有點馬后炮了,早不提醒!實際上,工作原理需要大家下點功夫去學習,3遍、5遍是少不了的)。

二、C語言那些被遺忘的語法

本來不想去說的,不過當下某學校的C語言這么課,講的真是,***(和諧音),實在看不下去了,我就再啰嗦幾句吧,自認為C語言很棒的,自動跳過:

1.結構體

首先結構體的定義:

struct

{

uint8_t param_a;

uint16_t param_b;

} a_struct;


或:


struct newStruct

{

uint8_t param_a;

uint16_t param_b;

};

struct newStruct a_struct;


或:


typedef struct

{

uint8_t param_a;

uint16_t param_b;

} newStruct ;

newStruct a_struct;


PS:順便問一個小問題,變量a_struct所占存儲空間大小是多少?


還有,無比仔細琢磨三種方式的特點;


結構體是可以嵌套的:

比如:


struct tag_1

{

struct tag_1 *ps; //注意,只能是個指針!

uint8_t param_a;

uint16_t param_b;

} ;


但是,這樣就錯誤了:


typedef struct

{

NODE *ps; //錯誤,NODE還沒有被定義!

uint8_t param_a;

uint16_t param_b;

} NODE;


好了,暫時結構體先會這些,我主張的學習的總之就是:缺哪補哪,打哪指哪;


2.位操作

這個是在普通C中常常被忽略的東西,因為在PC端,我們學習C的目的是為了簡化繁瑣的科學計算,所以往往很少去糾結位與位的操作;

首先,回憶一下位操作符:&、|、~、^;(我記得就這4個吧,不好意思,忘了);

然后,出幾個題:


0xFF & 0xFE = ?

0xA0 | 0x0B = ?

0x11 ^ 0x11 = ?


PS:琢磨一下我出的三個題的特點,聽我的,馬上就會有用的。


最后,跟賦值運算符結合”=”一下:于是就有了:&=、|=、^=;


3.移位操作

老實說,這個也是位操作的范疇,因為太常用了,我把它揪出來單獨說:

首先,移位操作符有兩個:>>和<<;

然后,還是出幾個題:


a = 0x01;

b = a<<2;

b = ?

a = 0x80;

b = a>>6;

b = ?


4.數據的存放

數據在存儲器中是如何存放的?


學過C語言的我們都知道,char、int、float、double,學習了C#之后,還有string等,學習了Python后,還有complex啥的(雖然人家python主打的概念是標簽)等等。


那么,數據到底如何存放?


我想這么來說:首先,計算機能識別的,就是通電和斷電(抽象點,就是0和1),這個概念叫二進制,一個二進制只有兩個值,換句話說,只有兩個狀態,也就只能表示兩個結果,這樣的一個二進制稱之為“1位數據(bit)”,表示的數據種類太少了。將8個二進制位捆綁在一起,這樣就可以表示2^8種結果(不會的,回去復習高中的排列、組合),就可以表示最大數值為255的十進制整數,這樣的8個二進制位稱為“1個字節(Byte)”。想表示的數值再大怎么辦,16個二進制唄,沒錯,不過別叫16個二進制位了,叫兩個字節。再大呢,4個字節(以后會知道,4個字節叫字(Word),所以2個字節也叫半字(Half Word)),顯而易見,8個字節叫雙字(Double Word)。想表示小數怎么辦,最開始是使用定點數,后來就使用浮點數(PS:關于定點數和浮點數,不是我這里的重點,請自行百度)。


所以,數據在存儲器中是按“組”存放的,這個“組”,指的就是字節、半字、字、雙字等。至于什么char、int、float,只是對這個“組”按照不同的需求進行別名:比如,若一個字節內存放的時ASCII碼,那么這塊數據的類型就是char;當然,若使用兩個字節存放一個有符號的整數,那么這塊數據的類型就是int;其他的也類似。所以,要明白,所謂的類型,只是對數據類型的說明和所占空間長度的說明,數據存放的本質,還是以二進制的形式按照不同的空間分塊方式(1個字節、2個字節…)來存放。


PS:似乎我說的比較毀三觀,也有點懵,不過不要緊,多寫寫程序,就會明白:什么char、int,在我STM32的世界里,統統是int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t。


然后我在留一個小問題:負數是怎么存放的?

三、開始實驗

1.添加需要的ST固件庫

這個可能我在模板里已經添加了,沒關系,一起來熟悉一下:
圖16

要添加的是:stm32f4xx_gpio.c和stm32f4xx_rcc.c,雙擊”SYSLIB”在之前說的SYSLIB文件夾下找到這兩個文件,添加;

其他的嘛,是單片機正常工作所必須的,慢慢就會知道了,這里只有stm32f4xx_gpio.c和stm32f4xx_rcc.c和本次實驗密切相關;

2.添加需要的BSP文件

同樣,雙擊”BSP”在之前說的BSP文件夾下找到這兩個文件,添加;
圖17

3.在main.h中注冊

圖18

4.設置h文件的包含路徑

圖19
然后點擊下圖中紅框中的按鈕:

圖20添加如下內容:
圖21

當然了,我已經添加好了,不過大家可以去熟悉一下流程;

5.主函數中書寫測試代碼

圖22
程序其實很簡單,使用BSP提供的接口初始化led燈和按鍵(其實就是配置gpio的輸入和輸出方式,詳細配置我們一會挨個看)。

PS:特別說明的是,程序中用到了一個比較經典的案例,就是按鍵消抖,同樣,什么是按鍵消抖,請百度。

四、分析BSP配置代碼,學習GPIO

圖23
圖24

大家打開”Bsp_led.c”文件,找到第24行,這個就是gpio方式的配置過程:

第40行:


RCC_AHB1PeriphClockCmd((1<<(((u32)GPIOx - AHB1PERIPH_BASE)>>10)), ENABLE);

1

這個是使能時鐘,就是給所使用的GPIO開啟能量,這個是我寫的一個通用方式,其一般形式是:AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);不要糾結,以后我會詳細講解。


第45至50行:


gpio.GPIO_Pin = (1< gpio.GPIO_Mode = GPIO_Mode_OUT; //配置工作模式,輸出模式

gpio.GPIO_OType = GPIO_OType_PP; //配置工作模式,推挽輸出

gpio.GPIO_PuPd = GPIO_PuPd_UP; //配置工作模式,上拉模式

gpio.GPIO_Speed = GPIO_Speed_50MHz; //配置翻轉速度,50MHz(即中速)

GPIO_Init(GPIOx, &gpio); //將配置真正寫入到寄存器


這個是STM32中的初始化常用方式,我說過,ST的外設太多,導致寄存器很多,一般人根本記不住,所以ST公司就提供了固件庫,用戶通過ST提供的接口函數的參數進行設置,然后調用初始化函數,進行初始化。


至于為什么使用結構體,想想就知道:要配置的內容太多,而且類型又不一樣,有8位數據,有16位數據,所以數組是不能用的,結構體恰恰是最佳選擇。


而且GPIO_Init()這個函數的實質,就是把結構體gpio包含的內容,組合后賦給指定的寄存器:

圖25
這個是對GPIO_Init()函數執行Go to the Definition操作(還記得怎么操作么?忘記的話回去看第一講),可以發現,好多”&=”和”|=”,我這里先不介紹怎么用,只是說它們一個叫置位、一個叫復位,相關細節,我會拿出一講詳細介紹。

PS:仔細看”Bsp_led.c”文件的第45行,這個移位指令能告訴我當PinNum為2是1<< PinNum是十六進制的多少么?然后使用Go to the Definition操作看一下GPIO_Pin_2是多少?

五、問題思考

1.以同樣的方式看一下BSP_KEY_InitConfig()的配置過程

2.打開”Bsp_led.c”文件,找到第24行

RCC_AHB1PeriphClockCmd((1<<(((u32)GPIOx - AHB1PERIPH_BASE)>>10)), ENABLE);


當GPIOx為GPIOA時,((1<<(((u32)GPIOx - AHB1PERIPH_BASE)>>10))的十六進制結果是多少?

同樣使用Go to the Definition操作看一下RCC_AHB1Periph_GPIOA的十六進制結果是多少?發現了什么?


關鍵字:STM32F407  gpio  輸入輸出 引用地址:[STM32]STM32F407系列教程之二,gpio輸入輸出實驗

上一篇:stm32f4的GPIO和位帶區
下一篇:STM32F4xx GPIO函數解釋

推薦閱讀

聯想近日發布公告稱,旗下多款產品配套的紋識別功能存在嚴重的安全漏洞,官方已經發布更新予以修復。聯想在公告中解釋說,聯想指紋掃描管理軟件Fingerprint Manager Pro會存儲一些敏感數據,包括Windows登陸憑證和指紋數據,但使用的是弱算法加密,其中包含一個硬編碼密碼,只要安裝這個指紋掃描管理軟件,即便沒有管理員訪問權限,也可以讓任何人可以登...
2019年2月2日,全球知名投資機構CBInsight發布了全球310家獨角獸公司榜單,其中中國企業入選的包括商湯科技、一點咨詢、小紅書、滿幫集團等入選。值得一提的是,在智能物流行業近年來持續發力的AI機器人公司Geek+也成功入選此榜單,躋身全球獨角獸企業。CBInsight將入選的獨角獸公司分為13類,從汽車行業、人工智能、自動駕駛再到電子商務等。榜單根據不同...
  T/C0相關  1.TCCR0——T/C0控制寄存器  FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00  位7——FOC0:強制輸出比較位。  FOC0僅在WGM[01:00]設置為非PWM模式時才有效。為了保證與未來器件的兼容性,在使用PWM時,寫TCCR0要對其清零。對其寫1后,將立即進行比較操作。比較匹配輸出引腳OC0將按照COM[01:00]的設置輸出相應的電平。...
近年來,在5G+iOT+大數據的背景下,智能家居行業快速發展。在智能家居大生態之下,來自通信、互聯網、家電、家居等行業的巨頭紛紛發布新戰略或新動向,搶灘智能家居市場,賽道異常火熱。智能家居市場猶如一塊香餑餑,吸引了各行各業的關注,那么,智能家居市場的現狀如何?誰又能在競爭中占據有利位置呢?家電巨頭搶灘市場超50家房企擠入賽道近年,家電巨...

史海拾趣

問答坊 | AI 解惑

下載教學資料的好地方

http://www.abab123.com/bbs/down.asp?html=606142…

查看全部問答∨

AD/DA的分類與指標

1. AD轉換器的分類 下面簡要介紹常用的幾種類型的基本原理及特點:積分型、逐次逼近型、并行比較型/串并行型、Σ-Δ調制型、電容陣列逐次比較型及壓頻變換型。 1)積分型(如TLC7135) 積分型AD工作原理是將輸入電壓轉換成時間( ...…

查看全部問答∨

電子電路抗干擾技術

該書由諸邦田編著,由人民郵電出版社出版的書,主要介紹電路中產生干擾的來源及怎么預防,如果你想從事電路設計或PCB layout那么推薦你閱讀這本書。…

查看全部問答∨

44種電子自制.pdf

本帖最后由 paulhyde 于 2014-9-15 03:41 編輯 44種電子自制.pdf    …

查看全部問答∨

電源的請加60403998

本帖最后由 paulhyde 于 2014-9-15 09:42 編輯 電源的請加60403998,剛建的。  …

查看全部問答∨

第3/15原創:數碼管

事無巨細,數碼管閃亮 仍然是深夜,仍然精力充沛,遂來寫寫數碼管的顯示。篇幅也許會很長,各位看客最好端杯茶慢慢消遣。 言歸正傳,我們先看看什么是數碼管(圖片來自網絡): 上圖就是各種長相各種樣子的數碼管了,肯定很眼熟了吧。 簡單講講 ...…

查看全部問答∨

如何用verilog中延時啊 不用計數器

來自:EEWORLD合作群63762526,群主:wangkj…

查看全部問答∨

如何探測到某個硬盤讀寫的開始和結束

一個應用程序,當從某個盤符下讀寫數據時, 開始的時候要收到一個消息,結束的時候也要知道一個通知消息, 不知道有哪個高手知道怎么做. 我曾經參考過filemon,但是出現的消息太復雜了.搞不懂.…

查看全部問答∨

求助 2406與STM32F103通訊

    1.STM32F103先上電2406后上電 485通訊正常     2.2406先上電 在STM32F103上電時 會自動給2406發數(貌似是硬件上電就會這樣)然后2406就不能進接受中斷了 不能通訊     3.用串口調試助手給2406 ...…

查看全部問答∨

求各位達人相助

這學期要做課程設計,可惜真的不懂。。。RT,請有愛心的達人教下我吧 課題如下: CPU核心芯片采用的是 ARM7 的LPC2138 1.     利用串口接收中斷方式從PC機上接收任意長度字符串。為了測試 需要,把接收到的字符串發送到PC ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 丹凤县| 蒲江县| 获嘉县| 东光县| 萨嘎县| 鹤壁市| 襄垣县| 高要市| 米易县| 马公市| 探索| 新安县| 同心县| 吉安县| 邹平县| 佳木斯市| 丽江市| 富阳市| 稻城县| 长岭县| 田东县| 麻阳| 靖宇县| 竹山县| 云阳县| 固原市| 南投市| 图们市| 英德市| 韩城市| 泾川县| 宽城| 景泰县| 固安县| 化隆| 元朗区| 高清| 黑山县| 芜湖县| 民县| 清流县|