在嵌入式開發(fā)的奇妙旅程中,GPIO(通用輸入輸出接口)作為芯片與外部世界交互的重要橋梁,扮演著不可或缺的角色。從簡(jiǎn)單的 LED 燈控制,到復(fù)雜的外設(shè)通信,GPIO 的靈活運(yùn)用為開發(fā)者打開了無限可能的大門。自本章開始,正式開始用代碼控制AS32x601各外設(shè)完成功能配置。
需要注意的是,AS32X601提供了8組GPIO,其中GPIOA~GPIOG寄存器操作完全一致,但在使用GPIOH的時(shí)候,寄存器列表中間少了一個(gè)32位寄存器,因此在使用過程中容易造成誤操作,我們?cè)隍?qū)動(dòng)庫中已經(jīng)做了映射,若想要自行操作寄存器進(jìn)行控制,需要格外注意這一點(diǎn)。
另外,在芯片的IO復(fù)用表中,其默認(rèn)功能并非全部都是GPIO,還包含了MUL類型,使用此類型IO時(shí),需要先將復(fù)用配置為GPIO功能,在完成接下來的操作。
硬件設(shè)計(jì)
AS32x601評(píng)估板板載3顆LED燈用于IO輸出評(píng)估,原理圖如下:
根據(jù)上圖可以知道,LED“正極”接電源,“負(fù)極”接GPIOG三個(gè)引腳,當(dāng)IO拉低時(shí),LED亮,IO輸出高時(shí),LED滅,據(jù)此設(shè)計(jì)控制邏輯。
程序設(shè)計(jì)
操作流程
- 開led對(duì)應(yīng)IO時(shí)鐘
- 檢查對(duì)應(yīng)引腳默認(rèn)配置,是否需要復(fù)用調(diào)整
- 初始化gpio結(jié)構(gòu)體
- 控制gpio輸出
主要代碼分析
復(fù)制上一小節(jié)的工程模板,在工程目錄下新建Bsp文件夾用于存放led相關(guān)控制代碼,在IAR工程界面添加led.c和led.h文件。
在led.c文件中添加相應(yīng)頭文件,之后編寫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);
- }
在上述代碼清單中,根據(jù)電路原理圖,led與mcu的PG10、14、15引腳相連,因此我們首先打開GPIOG的時(shí)鐘使能;
之后初始化gpio結(jié)構(gòu)體,通過或操作同時(shí)對(duì)三個(gè)引腳進(jìn)行初始化,配置推挽輸出,同時(shí)配置io輸出能力位9mA。
接下來,我們用宏定義的形式編寫LED的控制函數(shù)。
- #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驅(qū)動(dòng)庫中包含了引腳控制輸出函數(shù)以及引腳翻轉(zhuǎn)控制函數(shù),通過宏的形式完成led控制名稱的轉(zhuǎn)換,便于理解。
此時(shí),代碼并不算完成,之后我們需要查詢芯片設(shè)計(jì)手冊(cè)中,GPIOG所在的總線,在系統(tǒng)時(shí)鐘配置函數(shù)中需要打開對(duì)應(yīng)總線時(shí)鐘,具體方式參考上一小節(jié)。
最后,編寫主函數(shù)代碼,控制三個(gè)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);
- }
- }
補(bǔ)充
在這個(gè)代碼中調(diào)用了一個(gè)延時(shí)函數(shù),該函數(shù)位于庫文件System目錄下,利用RISCV的CSR定時(shí)器,可以理解為系統(tǒng)定時(shí)器編寫的精確延時(shí)函數(shù),因此需要對(duì)此函數(shù)進(jìn)行初始化,并傳入當(dāng)前系統(tǒng)時(shí)鐘。
- delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);
SMU_ClocksStruct.AXIBus0_Frequency就是在系統(tǒng)時(shí)鐘初始化函數(shù)中最后一個(gè)函數(shù)調(diào)用所讀回來的所有總線時(shí)鐘,由于Core時(shí)鐘與AXIBus0同頻,所以在此處就利用該參數(shù)進(jìn)行延時(shí)初始化,除1000000的作用是,延時(shí)計(jì)算的時(shí)候單位為MHz,所以把后邊的數(shù)量級(jí)給除掉。
審核編輯 黃宇
-
led
+關(guān)注
關(guān)注
242文章
23847瀏覽量
674211 -
mcu
+關(guān)注
關(guān)注
146文章
17984瀏覽量
367088 -
GPIO
+關(guān)注
關(guān)注
16文章
1280瀏覽量
54120
發(fā)布評(píng)論請(qǐng)先 登錄
【VisionFive 2單板計(jì)算機(jī)試用體驗(yàn)】GPIO口點(diǎn)亮LED燈
AS32X601驅(qū)動(dòng)系列教程 PLIC_中斷應(yīng)用詳解

AS32X601驅(qū)動(dòng)系列教程 USART_串口通訊詳解

AS32X601驅(qū)動(dòng)系列教程 GPIO_按鍵檢測(cè)詳解

AS32X601驅(qū)動(dòng)系列教程 SMU_系統(tǒng)時(shí)鐘詳解

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

HTR3310 10路LED驅(qū)動(dòng)器和GPIO控制器

HTR3316 16路LED驅(qū)動(dòng)器和GPIO控制器

HTR3310 10路LED驅(qū)動(dòng)器和GPIO控制器

評(píng)論