0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPIO输出——使用FSP库点亮LED灯

CHANBAEK 来源:doc.embedfire.com 作者:doc.embedfire.com 2023-02-15 15:43 次阅读

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 "永久链接至代码")

voidhal_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秒}#ifBSP_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灯亮 */#defineLED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW)#defineLED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_LOW)#defineLED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW)/* LED引脚置高电平 LED灯灭 */#defineLED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH)#defineLED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_HIGH)#defineLED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH)/* 使用寄存器来实现 LED灯翻转 */#defineLED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF)#defineLED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF)#defineLED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF)/* LED初始化函数 */voidLED_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初始化函数 */voidLED_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"voidhal_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秒}#ifBSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();#endif}

11.3. 下载验证

将程序编译并下载到开发板之后,按下复位按键来复位开发板, 可以观察到开发板上面除了电源指示灯之外的3个 LED 灯在同时缓慢闪烁, 3个 LED 灯每秒钟改变一次亮灭的状态。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led灯
    +关注

    关注

    22

    文章

    1574

    浏览量

    107303
  • 寄存器
    +关注

    关注

    31

    文章

    5226

    浏览量

    118970
  • 开发板
    +关注

    关注

    25

    文章

    4707

    浏览量

    95803
  • GPIO
    +关注

    关注

    16

    文章

    1164

    浏览量

    51414
  • FSP
    FSP
    +关注

    关注

    0

    文章

    34

    浏览量

    7067
收藏 人收藏

    评论

    相关推荐

    基于51单片机通过GPIO点亮LED

    在之前的教程中,我们成功搭建了开发环境,初步对开发板的 GPIO口有了一定的了解,在本教程中,我们将带领大家制作第一个工程,就是通过 GPIO口来 点亮一盏 LED
    发表于07-17 14:18 4631次阅读
    基于51单片机通过<b class='flag-5'>GPIO</b>口<b class='flag-5'>点亮</b><b class='flag-5'>LED</b><b class='flag-5'>灯</b>

    【CANNON试用体验】之GPIO--点亮LED

    _Pin_3);delay_ms(500); GPIO_ResetBits(GPIOB, GPIO_Pin_3);delay_ms(500);}4、程序下载入开发板上图中 LED D3已
    发表于02-28 15:08

    STM32LL系列教程(二)——点亮LED精选资料推荐

    LL 直接操作寄存器,改变 GPIO 输出状态,进而 点亮 LED
    发表于08-03 06:54

    如何利用stm32固件点亮LED

    简直是保姆级别…赞赞赞!二、正文:这是 LED的硬件电路,绿灯为PB0,红灯为PB5,蓝灯为PB1。这些 LED 的阴极都是连接到STM32的 GPIO引脚,只要我们控制
    发表于08-24 07:44

    汇编点亮LED的方法

    IX6MULL之汇编 点亮 LED 一、原理分析1、查看原理图2、配置 GPIO复用3、配置 GPIO的电气特性一、原理分析IX6MULL是恩智浦公
    发表于12-08 06:08

    如何利用stm32的GPIO口去点亮一个LED

    stm32的 GPIO口的基本结构是怎样构成的?stm32的 GPIO口的工作模式有哪几种呢?如何利用stm32的 GPIO口去 点亮一个 LED
    发表于12-15 07:04

    控制GPIO输出低电平来点亮LED

    控制 GPIO 输出低电平来 点亮 LED 。 */_start:/* 1、使能所有时钟 */ldr r0, =0X020C4068/* CCGR0
    发表于01-12 08:34

    【野火启明6M5开发板体验】开箱+认识开发板+资料

    10. 初识瑞萨 FSP固件 11. GPIO 输出——使用 FSP
    发表于12-20 23:28

    IO输出-点亮多个LED方法2

    4-IO 输出- 点亮多个 LED 方法2---51单片机源代码 用keil直接打开
    发表于06-15 18:17 17次下载

    STM32的GPIO输出编程实例之点亮三色LED

    本实验通过STM32的三个 GPIO口驱动三色 LED的三个通道,将 GPIO设置为推挽 输出模式,采用灌电流的方式与 LED连接,
    的头像 发表于02-07 11:14 2.7w次阅读
    STM32的<b class='flag-5'>GPIO</b><b class='flag-5'>输出</b>编程实例之<b class='flag-5'>点亮</b>三色<b class='flag-5'>LED</b>

    2. 汇编实现GPIO输出实验(LED)

    基于I.MX6U通过汇编实现 点亮 LED的实验,分析 GPIO的控制方法和配置。一、原理图分析 LED0 接到了 GPIO_3 上,
    发表于12-01 19:06 10次下载
    2. 汇编实现<b class='flag-5'>GPIO</b><b class='flag-5'>输出</b>实验(<b class='flag-5'>LED</b>)

    【STM32】标准与HAL对照学习教程三--使用库函数配置GPIO点亮LED

    【STM32】标准 与HAL 对照学习教程三--使用库函数配置 GPIO 点亮 LED 一、前言二、准
    发表于12-05 14:06 15次下载
    【STM32】标准<b class='flag-5'>库</b>与HAL<b class='flag-5'>库</b>对照学习教程三--使用库函数配置<b class='flag-5'>GPIO</b><b class='flag-5'>点亮</b><b class='flag-5'>LED</b><b class='flag-5'>灯</b>

    ESP32入门之GPIO点亮一盏LED

    物理 GPIO引脚,除了一些具有特殊用途的 GPIO外,大部分 GPIO都可以复用。本文就通过 点亮一盏 LED
    发表于12-07 17:06 10次下载
    ESP32入门之<b class='flag-5'>GPIO</b>:<b class='flag-5'>点亮</b>一盏<b class='flag-5'>LED</b><b class='flag-5'>灯</b>

    【STM32】开发板学习1 NUCLEO-L476RG:GPIO例程点亮LED2

    【STM32】开发板学习1 NUCLEO-L476RG: GPIO例程 点亮 LED2
    发表于12-08 15:36 31次下载
    【STM32】开发板学习1 NUCLEO-L476RG:<b class='flag-5'>GPIO</b>例程 <b class='flag-5'>点亮</b><b class='flag-5'>LED</b>2<b class='flag-5'>灯</b>

    使用树莓派GPIO点亮双色LED

    上一篇文章向大家介绍树莓派的硬件部分、安装操作系统及基础设置。这篇文章将介绍树莓派的强大的开发功能口—— GPIO,以及利用 GPIO点亮双色 LED
    的头像 发表于07-04 11:34 1684次阅读
    使用树莓派<b class='flag-5'>GPIO</b>口<b class='flag-5'>点亮</b>双色<b class='flag-5'>LED</b><b class='flag-5'>灯</b>