大家好,我是良許。
隨著疫情的平穩,最近全國各地都陸續放開了。但很不幸,我的幾個號主朋友不小心中招了,成了「陽過」。
良許在此提醒各位朋友,放開不等于躺平,該做的防護一個都不能少。雖然現在病毒沒有剛爆發時的可怕,但也絕不是大號的感冒。根據身邊的陽大俠反饋,一旦中招那是相當不舒服的,千萬不要以身試毒。
好了,回歸正題。最近在錄制一套 STM32 的課程,導致公眾號的原創變少了,跟各位朋友說聲抱歉哈。從現在開始,我也在公眾號連更一些 STM32 相關的內容,畢竟俺是嵌入式開發工程師哦(不是你們以為的運維哈)~
學習嵌入式,最經典的第一個實驗就是點亮一顆 LED 燈。別小看這個實驗,從我輔導的學員來看,不少初學者連這么簡單的案例都做不出來。
想要成這一名優秀的點燈大師,第一步就是要學會 STM32 最基礎的外設——GPIO。
1. 什么是GPIO?
1.1 定義
GPIO是通用輸入輸出(general-purpose input/output)端口的簡稱,簡單來說就是STM32可控制的引腳STM32芯片的GPIO引腳與外部設備連接起來,從而實現與外部通訊、控制以及數據采集的功能。
這是比較正式的說法,是不是聽得一愣一愣的?
再簡單一點,就是芯片里拉出一堆引腳,這些引腳在我們的控制下可以輸出高電平/低電平,或者可以通過這些引腳向芯片輸入一些信號,從而實現你們的一些目的。
1.2 命名規則
以 STM32F103C8T6 這顆芯片為例,它的 GPIO 口一共有 37 個,如何對它們進行命名呢?總不能叫翠花、二蛋、狗剩吧?
咱有正規的命名規則,那就是組編號+引腳編號。
什么是組編號?那就是 GPIOA, GPIOB, GPIOC, GPIOD .. GPIOG,一般最多到 GPIOG 。
什么是引引腳編號?那就是 0,1,2,3 ... 15。
所以組合起來,就是:
PA0, PA1, PA2 .. PA15
PB0, PB1, PB2 .. PB15
PC0, PC1, PC2 .. PC15
...
但并不是所有的芯片都有 A 到 G 個組,就比如咱這顆芯片就只有 A~D 四組。而且也不是每組都有 15 個引腳,就比如 D 組就只有 0 和 1 兩個引腳。
1.3 內部框架
上面這張圖來自于官方手冊,看起來是不是有點嚇人?
嚇到你就對了,第一次看到的時候我也嚇哭了。但是,作為初學者,可以先不用研究太底層的內容,咱先把燈點起來再說,否則你學會了一堆理論知識,結果到頭來連顆燈都點不起來,豈不是本末倒置了?
1.4 推挽輸出與開漏輸出
咱先看下這兩種輸出的電路圖。
從電路圖可以看出,這兩種輸出有著本質的區別:
推挽輸出: 可以真正的輸出高電平和低電平
開漏輸出: 開漏輸出無法真正輸出高電平,即高電平時沒有驅動能力,需要借助外部上拉電阻完成對外驅動。
2. 如何點亮一顆 LED 燈?
我們先看下 LED 燈的接線。
可以看到,LED 燈都是一側通過電阻拉高,另一側接到 GPIO 腳。所以,GPIO腳必須拉低,這樣才會產生電壓,對應的 LED 燈才會亮起來。
以 LED1 為例,它又接到了哪個引腳上呢?咱看原理圖,一定要遵循一個原則:標號一樣的導線在物理上是連接在一起的。
很明顯,LED1 引腳是連接在 PB8 這個 GPIO 口的。所以,我們只要編程將 PB8 拉低,就可以實現將 LED1 燈點亮。
3. 編程實現點燈
3.1 常用 GPIO HAL 庫函數
對于單片機編程,一般有三種方式:寄存器編程、標準庫編程、HAL 庫編程。目前,HAL 庫編程方式是 ST 公司主推的編程方式,這也是時代的潮流,所以我們主要介紹的還是 HAL 庫編程。
GPIO 常用 HAL 庫函數有以下這幾個:
voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init); voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState); GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin) voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
HAL_GPIO_Init 這個函數是初使化一個 GPIO 引腳的,如果你使用 CubeMX 的話,那么初始化的代碼將自動生成,你甚至都不需要自己動手寫。
HAL_GPIO_WritePin 就是可以將對應的引腳拉高或拉低,我們點燈的時候用的就是這個函數。而它的兄弟 HAL_GPIO_ReadPin 就是獲取某個引腳的狀態(拉高 or 拉低)。
最后的 HAL_GPIO_TogglePin 可以實現引腳電平的翻轉,比如原來是高電平,則會被翻轉為低電平;原來是低電平,則會被翻轉為高電平。
3.2 CubeMX 配置
配置debug模式
配置 PB8 引腳
右側選中 PB8 引腳,然后選擇 GPIO_Output 模式。
在中間欄里,點擊對應的 GPIO 管腳,然后屬性按圖中所示設置。特別要注意,咱剛開始要將 PB8 拉高,否則一上電 LED1 就亮了。我們要在代碼中將它點亮。
配置工程
注意哈,一定不要將工程放在有中文路徑的地方,否則將出現異常情況!
都配置完成之后,就可以點擊右上角的 GENERATE CODE 來生成工程了。
3.3 編寫代碼
到這邊,我們的工作已經完成大半了。CubeMX 的強大之處,就是它可以通過簡單的幾次點擊,就可以自動生成初始化代碼。
比如下面的這段 GPIO 口初始化代碼,如果自己寫的話,至少需要幾分鐘時間,但它都已經自動幫你寫好了,非常方便!
voidMX_GPIO_Init(void) { GPIO_InitTypeDefGPIO_InitStruct={0}; /*GPIOPortsClockEnable*/ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*ConfigureGPIOpinOutputLevel*/ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); /*ConfigureGPIOpin:PB8*/ GPIO_InitStruct.Pin=GPIO_PIN_8; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull=GPIO_NOPULL; GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB,&GPIO_InitStruct); }
接下來,我們就可以在 main 函數的 while 循環里寫自己的這么一段代碼,就可以實現 LED1 隔 1 秒點亮 1 秒的效果了。
一定要注意哈,要把代碼放在 USER CODE BEGIN 和 USER CODE END 里,否則你修改了 cubemx 的配置,自動生成的代碼會將你寫好的代碼覆蓋掉,那你的代碼就白寫了!
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); HAL_Delay(1000);
點燈操作就到此結束了,后面我還會繼續更新 STM32 的其它干貨內容,敬請期待哦~
我也建了個嵌入式交流群,專門進行技術交流,而且也會發一發小福利,到時候也會將源碼放在群里,想要進群的小伙伴可以掃描下面二維碼進群哈:
4. 小結
千里之行,始于足下。點亮 LED 燈不難,但這是你學習 STM32 的第一步。千萬不要過于自大,覺得這個太簡單,然后就不自己動手操作。
很多小伙伴學習編程,都是覺得這個簡單,然后不自己動手,結果學了一段時間后,突然發現,貌似自己啥也沒學會~
所以,動手才是硬道理,千萬不要自大,盲目自信!!
審核編輯:湯梓紅
-
led
+關注
關注
242文章
23277瀏覽量
660895 -
STM32
+關注
關注
2270文章
10900瀏覽量
356046 -
GPIO
+關注
關注
16文章
1204瀏覽量
52104
原文標題:如何快速成為點燈大師?
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論