藍橋杯嵌入式之點燈

重複名稱----林樹林發表於2024-03-02

1、GPIO口簡單介紹

通用並行介面GPIO包括多個16位I/O埠(GPIOA~GPIOG),每個埠可以獨立設定4種輸入方式(浮空、上拉、下拉和模擬)和4種輸出方式(通用推輓、通用開漏、複用推輓和複用開漏)。

2、Cube中對GPIO的設定

點選引腳檢視中的引腳標籤,會彈出一個功能選擇選單,包括引腳的通用功能和複用功能,和一個復位狀態鍵,可以取消引腳配置。

這裡我們先選擇輸出模式進行演示

對引腳進行配置

這樣我們就對一個引腳進行了基本的配置。

3、LED電路圖

開啟比賽用資料夾中的產品手冊,找到其中的LED電路圖

可以看到LED採用共陽模式電路,且並不是陰極直接與微控制器IO口相連,而是連線了一個鎖存器74HC573。74HC573包含八路3態輸出的非反轉透明鎖存器,是一種高效能矽柵CMOS器件。資料夾中也有74HC573的英文文件。

其中,D*是輸入端,Q*是輸出端,1引腳OE#是輸出使能,11引腳LE是鎖存使能,輸入與輸出中間還有一個內部資料保持器。

微控制器引腳PC8~PC15與鎖存器8個輸入引腳相連,鎖存器11引腳LE與PD2相連, 當 LE = 0 (PD2輸出0)時,PC8~PC15與74HC573內部資料保持器的輸入端斷開;當 LE = 1 (PD2輸出1)時,PC8~PC15與74HC573內部資料保持器的輸入端連通。

鎖存器1引腳OE#接地,即輸出端與保持器的資料會一直保持一致。

因此,我們操作LED的步驟為:

1、復位PC的16個埠(置1),防止其他對PC埠的操作影響到LED的正常顯示

2、將需要點亮的LED對應引腳置為0(LED採用共陽模式);

LD8        LD7        LD6        LD5        LD4        LD3        LD2        LD1

          |             |              |             |              |             |              |             |           

PC15     PC14      PC13     PC12      PC11     PC10      PC9        PC8

3、PD2置1,使LE = 1,此時鎖存器透明,單機埠與對應的鎖存器輸入端、輸出端狀態一致;

4、再將PD2置,斷開IO口與輸入端的連線,鎖存器輸出端狀態保持,實現了對LED的操作。

4、Cube MX配置PC8~PC15

在Cube 中對PC8~PC15進行配置:

PC8~PC15都配置為輸出模式:初始低電平,推輓輸出,不上拉不下拉,低速

推輓輸出模式(Push-Pull Output):輸出引腳可以提供高電平和低電平,能夠提供較大的輸出電流。在輸出高電平時,輸出引腳與VCC連線;在輸出低電平時,輸出引腳與地連線。

PC8~PC15都無外部上拉電阻,所以要用推輓輸出。

最後,建立\更新工程。

5、LED模組編寫

為了方便開發、修改,我們採用模組化的程式設計,為每個模組新建一對.c,.h檔案,再在主函式中匯入使用。

在工程資料夾中新建一個“USER”子資料夾,用於存放使用者編寫的外設程式。

新建外設.c、.h檔案

把檔案載入到工程中:

1、開啟工程專案管理

2、新建分組並命名

3、往新建的“USER”分組中新增LED.c檔案

4、把LED.h標頭檔案加入編譯路徑中

先在.h標頭檔案中編寫以下語句:

1、2句為定義__LED_H這個宏,同時防止標頭檔案多重包含

4句為包含“main.h”,其中有一些全域性的宏定義、函式宣告等等

7句 #endif  為結束標記,之後要記得多回車一行,防止報錯。

這是一個自編標頭檔案基本的一個初始框架,之後就根據需要在標頭檔案中宣告編寫的函式,變數,宏定義等。

接下來我們在LED.c中編寫LED的顯示函式

函式名:led_disp,輸入變數:led_dat

//LED顯示函式
//輸入:led_dat,一個八位chat型變數,高位對應LD8,低位對應LD1,對應位為1時,該LED亮
void led_disp(unsigned char led_dat)
{
	GPIOC->ODR = ~led_dat <<8;	//將需要點亮的LED對應IO口置0(共陽模式)
	
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);		//使能鎖存,LE = 1,IO口資料傳遞至鎖存器輸出端
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//失能鎖存,LE = 0,鎖存器輸出端保持狀態,且不再受IO口影響

}



GPIOC->ODR是GPIO C 的輸出資料暫存器(Output Data Register),用於控制該埠的輸出狀態。

        記得在函式最後多打一行空行,要不然會報警告。

HAL_GPIO_WritePin 是STM32的HAL庫提供的函式之一,用於設定指定GPIO引腳的輸出電平。

  • GPIOx:要操作的GPIO埠,如 GPIOA、GPIOB、GPIOC 等。
  • GPIO_Pin:要操作的引腳,可以是多個引腳的組合,如 GPIO_PIN_0、GPIO_PIN_1、GPIO_PIN_2 等,也可以透過按位或(|)將多個引腳組合在一起。
  • PinState:要設定的引腳狀態,可以是 GPIO_PIN_SET 表示設定引腳為高電平,或者 GPIO_PIN_RESET 表示設定引腳為低電平。

最後,在LED.h中宣告下剛寫的led_disp函式,LED的模組就寫好了。

6、使用LED模組以及演示效果

在main.c中先把led原始檔包含進來

注意,自己新增的內容要寫在每一對USER CODE BEGIN\END中,才不會在更新工程配置時被清除掉。

在主函式main()中加入程式碼:

編譯,下載:

增加一點變化: