一、文檔背景
在ARM Cortex-M處理器中,GPIO(通用輸入輸出)初始化代碼對于嵌入式系統的開發具有重要的指導意義。GPIO是嵌入式系統中最常用的外設之一,幾乎所有的外設控制都涉及到GPIO的操作。理解和正確實現GPIO的初始化代碼,可以幫助開發者快速上手硬件編程,提高開發效率并減少錯誤。
二、 解決的問題或者進行問題分析
● 使能GPIO外設時鐘:在進行任何GPIO操作之前,首先需要使能對應GPIO端口的時鐘。不同的微控制器系列有不同的方法來實現這一點,但通常是在RCC(時鐘控制寄存器)中設置相應的位。
● 配置GPIO引腳的模式:每個GPIO引腳可以配置為不同的模式,例如輸入模式、輸出模式、復用功能模式(用于外設)、模擬模式。這個配置通常通過GPIO端口的模式寄存器(如GPIOx_MODER)來完成。
● 配置GPIO引腳的輸出類型:如果引腳配置為輸出模式,還需要設置引腳的輸出類型,例如推挽輸出或開漏輸出。這個配置通過GPIOx_OTYPER寄存器來實現。
● 配置GPIO引腳的速度:不同的應用可能對GPIO引腳的速度有不同的要求,可以通過GPIOx_OSPEEDR寄存器來設置引腳的速度。
● 配置GPIO引腳的上拉/下拉電阻:為了避免引腳在未連接時浮空,可以配置內部的上拉或下拉電阻。這個配置通過GPIOx_PUPDR寄存器來實現。
● 配置GPIO引腳的復用功能:如果引腳被配置為復用功能模式,則需要通過AFR寄存器(GPIOx_AFRL和GPIOx_AFRH)來選擇具體的外設功能。
三、 如何在ArmDS中實現STM32F769開發板上LED燈的控制
1. STM32F769開發板上LED燈的原理圖如圖3-1所示:

圖3-1
2. 宏定義 #define __setbit(___reg, ___bit) ((___reg) |= (1U << (___bit))) 是一種便捷的方法,用于在寄存器中設置特定位(bit)為1。這個宏定義在嵌入式系統開發中非常常見,因為它能夠簡化和標準化寄存器操作。
3. 使能GPIOI與GPIOJ的時鐘:“__setbit(RCC->AHB1ENR, 8); __setbit(RCC->AHB1ENR, 9);”這樣設置的依據如圖3-2所示:

圖3-2
4. 配置GPIOI_15引腳的模式為輸出模式:“__setbit(GPIOI->MODER, 30);__clearbit(GPIOI->MODER, 31);”,設置的依據如圖3-3所示:

圖3-3
5. 配置GPIOI_15引腳的輸出類型為Push-Pull:“__clearbit(GPIOI->OTYPER, 15);”設置的依據如圖3-4所示:

圖3-4
6. 配置GPIOI_15引腳的速度為中速:“__setbit(GPIOI->OSPEEDR, 30);__clearbit(GPIOI->OSPEEDR, 31);”,設置的依據如圖3-5所示:

圖3-5
7. 配置GPIOI_15引腳為上拉電阻:“__setbit(GPIOI->PUPDR, 30);__clearbit(GPIOI->PUPDR, 31);”設置的依據如圖3-6所示:

圖3-6
四、驗證STM32F769開發板上LED燈的控制
1. 創建一個點亮LED的函數:LED_On,代碼如圖4-1所示:

圖4-1
2. 點亮LED的函數中代碼設置的依據,如圖4-2

圖4-2
3. 再創建一個關閉LED的函數:LED_Off。
4. 在ArmDS創建一個最基本的工程,通過CMSIS類型,只添加Startup文件與Core組件。
5. 在工程中創建main.c文件,在main.c中添加GPIOI_15引腳的初始化代碼,與LED_On與LED_Off函數,編譯工程,下載到開發板上后,查看開發板上LED燈的情況。
五、討論分析
1. GPIO引腳的復用功能如何設置?
解決方法:
(1)、先查看復用功能寄存器的功能Map表,找到需設置的引腳數,確認復用功能,如圖5-1所示:

圖5-1
(2)、 查看復用功能寄存器,根據確認的復用功能,設置對應的值,如圖5-2所示:

圖5-2
六、結論
通過分析GPIO初始化代碼,開發者可以更好地理解微控制器的硬件抽象層次(HAL),包括如何直接訪問寄存器進行外設控制。
熟悉不同微控制器系列的GPIO初始化代碼,有助于開發者在不同平臺間進行代碼移植時,更加游刃有余。