藍橋杯嵌入式之點燈
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()中加入程式碼:
編譯,下載:
增加一點變化:
相關文章
- 藍橋杯考點整理
- 藍橋杯
- 藍橋嵌入式之 USART_AgainAI
- 藍橋杯-分巧克力
- 藍橋杯-N皇后
- 藍橋杯真題
- 藍橋杯 買瓜
- 藍橋杯 剪格子
- 藍橋杯真題之錯誤票據
- 藍橋杯之帶分數(全排列+暴力)
- 藍橋杯-長草(BFS)
- 藍橋杯-日期問題
- 藍橋杯-帶分數
- 藍橋杯-翻硬幣
- 藍橋杯-座次問題
- 藍橋杯 計算方程
- 藍橋杯-螞蟻感冒
- 藍橋杯-排列序數
- 如何準備藍橋杯
- 藍橋杯年號字串字串
- 藍橋杯 分巧克力(Java)Java
- 藍橋杯訓練2
- 藍橋杯 整數拼接
- 藍橋杯注意的地方
- 1303: [藍橋杯2016決賽]路徑之謎
- 2013年藍橋杯真題
- 藍橋杯-日誌統計
- 藍橋杯-走迷宮(BFS)
- 藍橋杯模板(二)python組Python
- 藍橋杯模板(三)python組Python
- 太陽(藍橋杯14屆)
- 藍橋杯-合併數列
- 藍橋杯-班級活動
- 藍橋杯-波動數列
- 藍橋杯-k倍區間
- 藍橋杯-地宮取寶
- 藍橋杯javaB組備賽Java
- 藍橋杯全排列專題