在嵌入式開發(fā)的奇妙旅程中,GPIO(通用輸入輸出接口)作為芯片與外部世界交互的重要橋梁,扮演著不可或缺的角色。從簡單的 LED 燈控制,到復雜的外設通信,GPIO 的靈活運用為開發(fā)者打開了無限可能的大門。自本章開始,正式開始用代碼控制AS32x601各外設完成功能配置。
需要注意的是,AS32X601提供了8組GPIO,其中GPIOA~GPIOG寄存器操作完全一致,但在使用GPIOH的時候,寄存器列表中間少了一個32位寄存器,因此在使用過程中容易造成誤操作,我們在驅動庫中已經做了映射,若想要自行操作寄存器進行控制,需要格外注意這一點。
另外,在芯片的IO復用表中,其默認功能并非全部都是GPIO,還包含了MUL類型,使用此類型IO時,需要先將復用配置為GPIO功能,在完成接下來的操作。
硬件設計
AS32x601評估板板載3顆LED燈用于IO輸出評估,原理圖如下:
根據上圖可以知道,LED“正極”接電源,“負極”接GPIOG三個引腳,當IO拉低時,LED亮,IO輸出高時,LED滅,據此設計控制邏輯。
程序設計
操作流程
- 開led對應IO時鐘
- 檢查對應引腳默認配置,是否需要復用調整
- 初始化gpio結構體
- 控制gpio輸出
主要代碼分析
復制上一小節(jié)的工程模板,在工程目錄下新建Bsp文件夾用于存放led相關控制代碼,在IAR工程界面添加led.c和led.h文件。
在led.c文件中添加相應頭文件,之后編寫led初始化代碼。
- /*
- Function: User_LED_Init
- Description: Configure LED GPIO.
- Param: None.
- Return: None.
- */
- void User_LED_Init()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIOG_CLK_ENABLE();
- /* GPIOB Configure */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
- GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;
- GPIO_Init(GPIOG, &GPIO_InitStructure);
- }
在上述代碼清單中,根據電路原理圖,led與mcu的PG10、14、15引腳相連,因此我們首先打開GPIOG的時鐘使能;
之后初始化gpio結構體,通過或操作同時對三個引腳進行初始化,配置推挽輸出,同時配置io輸出能力位9mA。
接下來,我們用宏定義的形式編寫LED的控制函數。
- #define LED1_ON() GPIO_WriteBits(GPIOG, GPIO_Pin_15, GPIO_OCtrl_Vol)
- #define LED1_OFF() GPIO_WriteBits(GPIOG, GPIO_Pin_15, GPIO_OCtrl_Voh)
- #define LED1_TOGGLE() GPIO_ToggleBits(GPIOG, GPIO_Pin_15)
- #define LED2_ON() GPIO_WriteBits(GPIOG, GPIO_Pin_14, GPIO_OCtrl_Vol)
- #define LED2_OFF() GPIO_WriteBits(GPIOG, GPIO_Pin_14, GPIO_OCtrl_Voh)
- #define LED2_TOGGLE() GPIO_ToggleBits(GPIOG, GPIO_Pin_14)
- #define LED3_ON() GPIO_WriteBits(GPIOG, GPIO_Pin_10, GPIO_OCtrl_Vol)
- #define LED3_OFF() GPIO_WriteBits(GPIOG, GPIO_Pin_10, GPIO_OCtrl_Voh)
- #define LED3_TOGGLE() GPIO_ToggleBits(GPIOG, GPIO_Pin_10)
在led.h文件中添加如上代碼,AS32驅動庫中包含了引腳控制輸出函數以及引腳翻轉控制函數,通過宏的形式完成led控制名稱的轉換,便于理解。
此時,代碼并不算完成,之后我們需要查詢芯片設計手冊中,GPIOG所在的總線,在系統(tǒng)時鐘配置函數中需要打開對應總線時鐘,具體方式參考上一小節(jié)。
最后,編寫主函數代碼,控制三個led燈流水閃爍。
- void main()
- {
- Systemclock_Init();
- delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);
- /* Initialize LED */
- User_LED_Init();
- while(1)
- {
- LED1_ON();LED2_OFF();LED3_OFF();
- delay_ms(100);
- LED1_OFF();LED2_ON();LED3_OFF();
- delay_ms(100);
- LED1_OFF();LED2_OFF();LED3_ON();
- delay_ms(100);
- }
- }
補充
在這個代碼中調用了一個延時函數,該函數位于庫文件System目錄下,利用RISCV的CSR定時器,可以理解為系統(tǒng)定時器編寫的精確延時函數,因此需要對此函數進行初始化,并傳入當前系統(tǒng)時鐘。
- delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);
SMU_ClocksStruct.AXIBus0_Frequency就是在系統(tǒng)時鐘初始化函數中最后一個函數調用所讀回來的所有總線時鐘,由于Core時鐘與AXIBus0同頻,所以在此處就利用該參數進行延時初始化,除1000000的作用是,延時計算的時候單位為MHz,所以把后邊的數量級給除掉。
審核編輯 黃宇
-
led
+關注
關注
242文章
23696瀏覽量
670854 -
mcu
+關注
關注
146文章
17831瀏覽量
360303 -
GPIO
+關注
關注
16文章
1271瀏覽量
53554
發(fā)布評論請先 登錄
解鎖Air780EPM:N種GPIO操控LED的實戰(zhàn)技巧!

AS32X601驅動系列教程 PLIC_中斷應用詳解

AS32X601驅動系列教程 USART_串口通訊詳解

AS32X601驅動系列教程 GPIO_按鍵檢測詳解

AS32X601驅動系列教程 SMU_系統(tǒng)時鐘詳解

HTR3310 10路LED驅動器和GPIO控制器中文手冊
HTR3316 16路LED驅動器和GPIO控制器中文手冊
面向工業(yè)與汽車領域的高安全可靠MCU——AS32X601系列芯片解析
AS32X601芯片技術剖析
AS32X601雙核鎖步MCU技術優(yōu)勢分析
【敏矽微ME32G070開發(fā)板免費體驗】+ADC測試與LED點亮
HTR3310 10路LED驅動器和GPIO控制器

HTR3316 16路LED驅動器和GPIO控制器

HTR3310 10路LED驅動器和GPIO控制器

評論