GPIO輸出——使用FSP庫點亮LED燈
關于 IOPORT 的詳細分析,我們不再贅述,請讀者參考前面“第一個實驗:用寄存器點亮LED燈”章節。
11.1. 硬件設計
野火啟明6M5開發板的 LED 電路圖如圖所示。 圖中 RA6M5 芯片的 P400、P403、P404 引腳分別通過一個 2.2 KΩ 的限流電阻連接到 LED1、LED2、LED3 這三個 LED 燈的陰極,LED 燈的陽極連接到 3.3V 電源。 而 LED4 是電源指示燈,只要開發板通電就會亮。
11.2. 軟件設計
11.2.1. 新建工程
對于 e2 studio 開發環境:拷貝一份我們之前的 e2s 工程模板 “05_Template” , 然后將工程文件夾重命名為 “11_GPIO_LED” ,最后再將它導入到我們的 e2 studio 工作空間中。
對于 Keil 開發環境:拷貝一份我們之前的 Keil 工程模板 “06_Template” , 然后將工程文件夾重命名為 “11_GPIO_LED” ,并進入該文件夾里面雙擊 Keil 工程文件,打開該工程。
工程新建好之后,在工程根目錄的 “src” 文件夾下面新建 “led” 文件夾, 再進入 “led” 文件夾里面新建 led 驅動的源文件和頭文件:“bsp_led.c” 和 “bsp_led.h”。 工程文件結構如下。
文件結構
11_GPIO_LED
├─ ......
└─ src
├─ led
│ ├─ bsp_led.c
│ └─ bsp_led.h
└─ hal_entry.c
警告
注意:對于使用 Keil 開發環境的用戶,將代碼文件放到 “src” 文件夾下之后, Keil 軟件并不會自動將它們加入到工程,這時候需要打開 RASC FSP 配置界面, 點擊一次單擊右上角的 “Generate Project Content” 按鈕,從而 “src” 文件夾下的代碼文件就會被自動加進工程中。 接著關閉 FSP 配置界面返回到 Keil,然后進行一次編譯會彈出一個提示框提示工程結構發生了變化,點擊確定即可。 對于使用 e2 studio 的用戶則不需如此。
11.2.2. FSP配置
首先打開 “11_GPIO_LED” 項目的 FSP 配置界面,接下來我們要在這個界面里配置芯片的引腳。
在 FSP 配置界面里面點開 “Pins” -> “Ports” -> “P4” -> “P400” , 然后將連接到LED燈的 IO 引腳的 “Mode” 屬性配置為 “Output mode (Initial High)” , 表示該引腳默認輸出高電平,其他的屬性默認即可。 其他的LED引腳 “P403” 、“P404” 也是按照這樣子配置。
Pin Configuration 頁面的 IOPORT 屬性介紹:
IOPORT 屬性介紹 [](https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter11/chapter11.html#id10 "永久鏈接至表格")| IOPORT 屬性 | 描述 |
| - | - |
| ---------------------------------------------------------------------------------------------- |
模式 | IO引腳的工作模式,包括輸入模式和輸出模式,選擇輸出模式時可以設置引腳的初始輸出電平。 |
---|---|
拔 | IO引腳是否上拉。 |
驅動器容量 | IO引腳的驅動能力設置。 |
輸出類型 | IO引腳的輸出類型。 可以選 CMOS 推挽輸出或開漏輸出。 |
三個 LED 引腳都配置完成之后的配置界面如圖所示。
配置完成之后按下快捷鍵 “Ctrl + S” 保存,最后點右上角的 “Generate Project Content” 圖標, 讓軟件根據我們的設置自動生成配置代碼即可。
對于 Keil 這邊 RASC 的 FSP 配置也是一樣的,需要先通過 RASC 軟件打開 Keil 工程相關的 FSP 配置界面。 具體的方法在前面的章節已經詳述過了,這里不再重復說明。
如果從左側“項目資源管理器”打開工程目錄下的 “ra_gen/pin_data.c” 源文件, 就會看到 g_bsp_pin_cfg_data 數組中已經加入了LED引腳的配置數據。 在 IOPORT 初始化的時候,它們會被用來初始化引腳。
11.2.3. hal_entry入口函數
當使用 RTOS 時,程序從 main 函數開始進行線程調度; 當沒有使用 RTOS 時,C語言程序的入口函數 main 函數調用了 hal_entry 函數。 由于我們新建的工程是沒有選用 RTOS 的,因此,用戶程序從 hal_entry 函數開始執行。 首先打開 “\\src\\hal_entry.c” 文件,在 hal_entry 函數里面編寫我們的代碼。
想要實現LED燈的閃爍效果,其思路非常地簡單:首先初始化配置 LED 引腳, 然后在一個死循環里面重復此流程:LED 燈亮,延時1s,LED 燈滅,延時1s,然后 LED 燈又亮。 如此反復循環,就能實現 LED 燈的閃爍效果。
首先,我們需要通過 R_IOPORT_Open 函數來初始化 IOPORT 模塊, 在調用 R_IOPORT_Open 函數時,需要傳入控制塊參數 g_ioport_ctrl 和配置參數 g_ioport.p_cfg。
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
注解
實際上,由于在 R_BSP_WarmStart 函數中已經打開了一個 IOPORT 模塊, 因此并不需要重復打開 IOPORT 模塊,雖然重復打開也不會出錯。 R_BSP_WarmStart 函數將會在后面的“FSP庫啟動文件詳解”章節介紹到,這里無需在意。
成功打開 IOPORT 模塊后,說明 IO 引腳已經全部初始化完成。 接著讓程序繼續往下執行,進入到 while(1) 死循環。 在 while(1) 循環里,我們使用 R_IOPORT_PinWrite 和 R_BSP_SoftwareDelay 這兩個函數來實現我們前面所述的思路。
使用 R_IOPORT_PinWrite 函數可以控制引腳的輸出高低電平,從而控制 LED 燈的亮滅。 它的第一個參數需要傳入控制塊 g_ioport_ctrl,第二個參數傳入IO端口和引腳號,第三個參數傳入IO引腳電平。
使用 R_BSP_SoftwareDelay 函數可以進行延時,LED 燈維持亮和滅這兩種狀態的時間由此函數決定。 它的第一個參數表示延時的時間量,第二個參數表示時間單位。
- BSP_DELAY_UNITS_SECONDS 表示秒;
- BSP_DELAY_UNITS_MILLISECONDS 表示毫秒;
- BSP_DELAY_UNITS_MICROSECONDS 表示微秒。
完整代碼如下:代碼清單11_1
代碼清單 11-1:hal_entry 入口函數 [](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 */
/* 初始化配置引腳(這里重復初始化了,可以注釋掉) */
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); //延時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); //延時1秒
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
到此,我們已經完全實現了讓 LED 閃爍的效果,讀者可以跳到“下載驗證”小節驗證其實際效果。 按照編寫驅動程序的一般要求,我們可以把 LED 的驅動單獨拿出來,放到獨立的源文件/頭文件里面進行封裝。 接下來將介紹封裝 LED 設備驅動程序的一般方法。
11.2.4. 封裝 LED 設備驅動程序
讓我們重新規劃一下我們的工程結構。 在 src 文件夾里面新建一個“led”文件夾,再在該文件夾里面新建兩個文件:“bsp_led.c”和“bsp_led.h”, 如同前面“新建工程”小節所述,把它們加入到我們的工程中。 這兩個文件的內容如下。
代碼清單 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)
/* 使用寄存器來實現 LED燈翻轉 */
#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初始化函數 */
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初始化函數 */
void LED_Init(void)
{
/* 初始化配置引腳(這里重復初始化了,可以注釋掉) */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
在 “hal_entry.c” 文件中添加對頭文件 “bsp_led.h” 的包含, 然后將 hal_entry 入口函數的內容改為如下。
代碼清單 11-4:hal_entry入口函數 [](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); //延時1秒
LED1_OFF; // LED1滅
LED2_OFF; // LED2滅
LED3_OFF; // LED3滅
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時1秒
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
11.3. 下載驗證
將程序編譯并下載到開發板之后,按下復位按鍵來復位開發板, 可以觀察到開發板上面除了電源指示燈之外的3個 LED 燈在同時緩慢閃爍, 3個 LED 燈每秒鐘改變一次亮滅的狀態。
-
led燈
+關注
關注
22文章
1592瀏覽量
108007 -
寄存器
+關注
關注
31文章
5343瀏覽量
120377 -
開發板
+關注
關注
25文章
5050瀏覽量
97484 -
GPIO
+關注
關注
16文章
1204瀏覽量
52104 -
FSP
+關注
關注
0文章
34瀏覽量
7141
發布評論請先 登錄
相關推薦
評論