GPIO輸出——使用FSP庫點(diǎn)亮LED燈
關(guān)于 IOPORT 的詳細(xì)分析,我們不再贅述,請(qǐng)讀者參考前面“第一個(gè)實(shí)驗(yàn):用寄存器點(diǎn)亮LED燈”章節(jié)。
11.1. 硬件設(shè)計(jì)
野火啟明6M5開發(fā)板的 LED 電路圖如圖所示。 圖中 RA6M5 芯片的 P400、P403、P404 引腳分別通過一個(gè) 2.2 KΩ 的限流電阻連接到 LED1、LED2、LED3 這三個(gè) LED 燈的陰極,LED 燈的陽極連接到 3.3V 電源。 而 LED4 是電源指示燈,只要開發(fā)板通電就會(huì)亮。
11.2. 軟件設(shè)計(jì)
11.2.1. 新建工程
對(duì)于 e2 studio 開發(fā)環(huán)境:拷貝一份我們之前的 e2s 工程模板 “05_Template” , 然后將工程文件夾重命名為 “11_GPIO_LED” ,最后再將它導(dǎo)入到我們的 e2 studio 工作空間中。
對(duì)于 Keil 開發(fā)環(huán)境:拷貝一份我們之前的 Keil 工程模板 “06_Template” , 然后將工程文件夾重命名為 “11_GPIO_LED” ,并進(jìn)入該文件夾里面雙擊 Keil 工程文件,打開該工程。
工程新建好之后,在工程根目錄的 “src” 文件夾下面新建 “l(fā)ed” 文件夾, 再進(jìn)入 “l(fā)ed” 文件夾里面新建 led 驅(qū)動(dòng)的源文件和頭文件:“bsp_led.c” 和 “bsp_led.h”。 工程文件結(jié)構(gòu)如下。
文件結(jié)構(gòu)
11_GPIO_LED
├─ ......
└─ src
├─ led
│ ├─ bsp_led.c
│ └─ bsp_led.h
└─ hal_entry.c
警告
注意:對(duì)于使用 Keil 開發(fā)環(huán)境的用戶,將代碼文件放到 “src” 文件夾下之后, Keil 軟件并不會(huì)自動(dòng)將它們加入到工程,這時(shí)候需要打開 RASC FSP 配置界面, 點(diǎn)擊一次單擊右上角的 “Generate Project Content” 按鈕,從而 “src” 文件夾下的代碼文件就會(huì)被自動(dòng)加進(jìn)工程中。 接著關(guān)閉 FSP 配置界面返回到 Keil,然后進(jìn)行一次編譯會(huì)彈出一個(gè)提示框提示工程結(jié)構(gòu)發(fā)生了變化,點(diǎn)擊確定即可。 對(duì)于使用 e2 studio 的用戶則不需如此。
11.2.2. FSP配置
首先打開 “11_GPIO_LED” 項(xiàng)目的 FSP 配置界面,接下來我們要在這個(gè)界面里配置芯片的引腳。
在 FSP 配置界面里面點(diǎn)開 “Pins” -> “Ports” -> “P4” -> “P400” , 然后將連接到LED燈的 IO 引腳的 “Mode” 屬性配置為 “Output mode (Initial High)” , 表示該引腳默認(rèn)輸出高電平,其他的屬性默認(rèn)即可。 其他的LED引腳 “P403” 、“P404” 也是按照這樣子配置。
Pin Configuration 頁面的 IOPORT 屬性介紹:
IOPORT 屬性介紹 [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter11/chapter11.html#id10 "永久鏈接至表格")| IOPORT 屬性 | 描述 |
| - | - |
| ---------------------------------------------------------------------------------------------- |
模式 | IO引腳的工作模式,包括輸入模式和輸出模式,選擇輸出模式時(shí)可以設(shè)置引腳的初始輸出電平。 |
---|---|
拔 | IO引腳是否上拉。 |
驅(qū)動(dòng)器容量 | IO引腳的驅(qū)動(dòng)能力設(shè)置。 |
輸出類型 | IO引腳的輸出類型。 可以選 CMOS 推挽輸出或開漏輸出。 |
三個(gè) LED 引腳都配置完成之后的配置界面如圖所示。
配置完成之后按下快捷鍵 “Ctrl + S” 保存,最后點(diǎn)右上角的 “Generate Project Content” 圖標(biāo), 讓軟件根據(jù)我們的設(shè)置自動(dòng)生成配置代碼即可。
對(duì)于 Keil 這邊 RASC 的 FSP 配置也是一樣的,需要先通過 RASC 軟件打開 Keil 工程相關(guān)的 FSP 配置界面。 具體的方法在前面的章節(jié)已經(jīng)詳述過了,這里不再重復(fù)說明。
如果從左側(cè)“項(xiàng)目資源管理器”打開工程目錄下的 “ra_gen/pin_data.c” 源文件, 就會(huì)看到 g_bsp_pin_cfg_data 數(shù)組中已經(jīng)加入了LED引腳的配置數(shù)據(jù)。 在 IOPORT 初始化的時(shí)候,它們會(huì)被用來初始化引腳。
11.2.3. hal_entry入口函數(shù)
當(dāng)使用 RTOS 時(shí),程序從 main 函數(shù)開始進(jìn)行線程調(diào)度; 當(dāng)沒有使用 RTOS 時(shí),C語言程序的入口函數(shù) main 函數(shù)調(diào)用了 hal_entry 函數(shù)。 由于我們新建的工程是沒有選用 RTOS 的,因此,用戶程序從 hal_entry 函數(shù)開始執(zhí)行。 首先打開 “\\src\\hal_entry.c” 文件,在 hal_entry 函數(shù)里面編寫我們的代碼。
想要實(shí)現(xiàn)LED燈的閃爍效果,其思路非常地簡單:首先初始化配置 LED 引腳, 然后在一個(gè)死循環(huán)里面重復(fù)此流程:LED 燈亮,延時(shí)1s,LED 燈滅,延時(shí)1s,然后 LED 燈又亮。 如此反復(fù)循環(huán),就能實(shí)現(xiàn) LED 燈的閃爍效果。
首先,我們需要通過 R_IOPORT_Open 函數(shù)來初始化 IOPORT 模塊, 在調(diào)用 R_IOPORT_Open 函數(shù)時(shí),需要傳入控制塊參數(shù) g_ioport_ctrl 和配置參數(shù) g_ioport.p_cfg。
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
注解
實(shí)際上,由于在 R_BSP_WarmStart 函數(shù)中已經(jīng)打開了一個(gè) IOPORT 模塊, 因此并不需要重復(fù)打開 IOPORT 模塊,雖然重復(fù)打開也不會(huì)出錯(cuò)。 R_BSP_WarmStart 函數(shù)將會(huì)在后面的“FSP庫啟動(dòng)文件詳解”章節(jié)介紹到,這里無需在意。
成功打開 IOPORT 模塊后,說明 IO 引腳已經(jīng)全部初始化完成。 接著讓程序繼續(xù)往下執(zhí)行,進(jìn)入到 while(1) 死循環(huán)。 在 while(1) 循環(huán)里,我們使用 R_IOPORT_PinWrite 和 R_BSP_SoftwareDelay 這兩個(gè)函數(shù)來實(shí)現(xiàn)我們前面所述的思路。
使用 R_IOPORT_PinWrite 函數(shù)可以控制引腳的輸出高低電平,從而控制 LED 燈的亮滅。 它的第一個(gè)參數(shù)需要傳入控制塊 g_ioport_ctrl,第二個(gè)參數(shù)傳入IO端口和引腳號(hào),第三個(gè)參數(shù)傳入IO引腳電平。
使用 R_BSP_SoftwareDelay 函數(shù)可以進(jìn)行延時(shí),LED 燈維持亮和滅這兩種狀態(tài)的時(shí)間由此函數(shù)決定。 它的第一個(gè)參數(shù)表示延時(shí)的時(shí)間量,第二個(gè)參數(shù)表示時(shí)間單位。
- BSP_DELAY_UNITS_SECONDS 表示秒;
- BSP_DELAY_UNITS_MILLISECONDS 表示毫秒;
- BSP_DELAY_UNITS_MICROSECONDS 表示微秒。
完整代碼如下:代碼清單11_1
代碼清單 11-1:hal_entry 入口函數(shù) [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter11/chapter11.html#id4 "永久鏈接至代碼")
void hal_entry(void)
{
/* TODO: add your own code here */
/* 初始化配置引腳(這里重復(fù)初始化了,可以注釋掉) */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
while(1)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW); //LED1亮
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_LOW); //LED2亮
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW); //LED3亮
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時(shí)1秒
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH); //LED1滅
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_HIGH); //LED2滅
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH); //LED3滅
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時(shí)1秒
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
到此,我們已經(jīng)完全實(shí)現(xiàn)了讓 LED 閃爍的效果,讀者可以跳到“下載驗(yàn)證”小節(jié)驗(yàn)證其實(shí)際效果。 按照編寫驅(qū)動(dòng)程序的一般要求,我們可以把 LED 的驅(qū)動(dòng)單獨(dú)拿出來,放到獨(dú)立的源文件/頭文件里面進(jìn)行封裝。 接下來將介紹封裝 LED 設(shè)備驅(qū)動(dòng)程序的一般方法。
11.2.4. 封裝 LED 設(shè)備驅(qū)動(dòng)程序
讓我們重新規(guī)劃一下我們的工程結(jié)構(gòu)。 在 src 文件夾里面新建一個(gè)“l(fā)ed”文件夾,再在該文件夾里面新建兩個(gè)文件:“bsp_led.c”和“bsp_led.h”, 如同前面“新建工程”小節(jié)所述,把它們加入到我們的工程中。 這兩個(gè)文件的內(nèi)容如下。
代碼清單 11-2:led/bsp_led.h [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter11/chapter11.html#id5 "永久鏈接至代碼")
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "hal_data.h"
/* LED引腳置低電平 LED燈亮 */
#define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW)
#define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_LOW)
#define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW)
/* LED引腳置高電平 LED燈滅 */
#define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH)
#define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_HIGH)
#define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH)
/* 使用寄存器來實(shí)現(xiàn) LED燈翻轉(zhuǎn) */
#define LED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF)
#define LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF)
#define LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF)
/* LED初始化函數(shù) */
void LED_Init(void);
#endif
代碼清單 11-3:led/bsp_led.c [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter11/chapter11.html#id6 "永久鏈接至代碼")
#include "bsp_led.h"
/* LED初始化函數(shù) */
void LED_Init(void)
{
/* 初始化配置引腳(這里重復(fù)初始化了,可以注釋掉) */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
在 “hal_entry.c” 文件中添加對(duì)頭文件 “bsp_led.h” 的包含, 然后將 hal_entry 入口函數(shù)的內(nèi)容改為如下。
代碼清單 11-4:hal_entry入口函數(shù) [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter11/chapter11.html#id7 "永久鏈接至代碼")
/* 用戶頭文件包含 */
#include "led/bsp_led.h"
void hal_entry(void)
{
/* TODO: add your own code here */
LED_Init(); // LED 初始化
while(1)
{
LED1_ON; // LED1亮
LED2_ON; // LED2亮
LED3_ON; // LED3亮
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時(shí)1秒
LED1_OFF; // LED1滅
LED2_OFF; // LED2滅
LED3_OFF; // LED3滅
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時(shí)1秒
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
11.3. 下載驗(yàn)證
將程序編譯并下載到開發(fā)板之后,按下復(fù)位按鍵來復(fù)位開發(fā)板, 可以觀察到開發(fā)板上面除了電源指示燈之外的3個(gè) LED 燈在同時(shí)緩慢閃爍, 3個(gè) LED 燈每秒鐘改變一次亮滅的狀態(tài)。
-
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
108449 -
寄存器
+關(guān)注
關(guān)注
31文章
5368瀏覽量
121241 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5125瀏覽量
98292 -
GPIO
+關(guān)注
關(guān)注
16文章
1217瀏覽量
52422 -
FSP
+關(guān)注
關(guān)注
0文章
34瀏覽量
7184
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于51單片機(jī)通過GPIO口點(diǎn)亮LED燈
![基于51單片機(jī)通過<b class='flag-5'>GPIO</b>口<b class='flag-5'>點(diǎn)亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>](https://file1.elecfans.com/web2/M00/8C/E7/wKgaomS03KGAOLB3AAIj8IF9IdE376.jpg)
【CANNON試用體驗(yàn)】之GPIO--點(diǎn)亮LED燈
STM32LL庫系列教程(二)——點(diǎn)亮LED燈 精選資料推薦
如何利用stm32固件庫去點(diǎn)亮LED
匯編點(diǎn)亮LED燈的方法
如何利用stm32的GPIO口去點(diǎn)亮一個(gè)LED燈
控制GPIO輸出低電平來點(diǎn)亮LED燈
【野火啟明6M5開發(fā)板體驗(yàn)】開箱+認(rèn)識(shí)開發(fā)板+資料
IO輸出-點(diǎn)亮多個(gè)LED燈方法2
STM32的GPIO輸出編程實(shí)例之點(diǎn)亮三色LED
![STM32的<b class='flag-5'>GPIO</b><b class='flag-5'>輸出</b>編程實(shí)例之<b class='flag-5'>點(diǎn)亮</b>三色<b class='flag-5'>LED</b>](https://file.elecfans.com/web1/M00/45/DC/o4YBAFp6b4WACm0eAABWf8BmgXE007.jpg)
2. 匯編實(shí)現(xiàn)GPIO輸出實(shí)驗(yàn)(LED)
![2. 匯編實(shí)現(xiàn)<b class='flag-5'>GPIO</b><b class='flag-5'>輸出</b>實(shí)驗(yàn)(<b class='flag-5'>LED</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32】標(biāo)準(zhǔn)庫與HAL庫對(duì)照學(xué)習(xí)教程三--使用庫函數(shù)配置GPIO點(diǎn)亮LED燈
![【STM32】標(biāo)準(zhǔn)<b class='flag-5'>庫</b>與HAL<b class='flag-5'>庫</b>對(duì)照學(xué)習(xí)教程三--使用庫函數(shù)配置<b class='flag-5'>GPIO</b><b class='flag-5'>點(diǎn)亮</b><b class='flag-5'>LED</b><b class='flag-5'>燈</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32入門之GPIO:點(diǎn)亮一盞LED燈
![ESP32入門之<b class='flag-5'>GPIO</b>:<b class='flag-5'>點(diǎn)亮</b>一盞<b class='flag-5'>LED</b><b class='flag-5'>燈</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32】開發(fā)板學(xué)習(xí)1 NUCLEO-L476RG:GPIO例程 點(diǎn)亮LED2燈
![【STM32】開發(fā)板學(xué)習(xí)1 NUCLEO-L476RG:<b class='flag-5'>GPIO</b>例程 <b class='flag-5'>點(diǎn)亮</b><b class='flag-5'>LED</b>2<b class='flag-5'>燈</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
使用樹莓派GPIO口點(diǎn)亮雙色LED燈
![使用樹莓派<b class='flag-5'>GPIO</b>口<b class='flag-5'>點(diǎn)亮</b>雙色<b class='flag-5'>LED</b><b class='flag-5'>燈</b>](https://file1.elecfans.com/web2/M00/8B/F9/wKgaomSjkdaACxA2AANesavyNq0885.jpg)
評(píng)論