【野火启明_瑞萨RA6M5】梦的开始 ---- 点灯(FSP库)

news2024/12/24 21:23:26

文章目录

  • 一、FSP配置
  • 二、hal_entry入口函数
  • 三、封装 LED 设备驱动程序
  • 下载验证


一、FSP配置

对于 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

首先打开以前 “11_GPIO_LED” 项目的 FSP 配置界面,接下来我们要在这个界面里配置芯片的引脚。 以下的配置过程是以启明6M5开发板为例,启明4M2/2L1开发板的配置方法也是一样的,只是需要配置的LED引脚不同。

在 FSP 配置界面里面点开 “Pins”-> “Ports”-> “P4”-> “P400”, 然后将连接到LED灯的 IO 引脚的 “Mode” 属性配置为 “Output mode (Initial High)”, 表示该引脚默认输出高电平,其他的属性默认即可。 其他两个LED引脚 “P403”、“P404” 也是按照这样进行配置。
在这里插入图片描述
Pin Configuration 页面的 IOPORT 属性介绍:
在这里插入图片描述
三个 LED 引脚都配置完成之后的配置界面如图所示。
在这里插入图片描述
配置完成之后按下快捷键 “Ctrl + S” 保存,最后点右上角的 “Generate Project Content” 图标, 让软件根据我们的设置自动生成配置代码即可。

对于 Keil 这边 RASC 的 FSP 配置也是一样的,需要先通过 RASC 软件打开 Keil 工程相关的 FSP 配置界面。

二、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 函数来初始化 IOPORT 模块
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);

成功打开 IOPORT 模块后,说明 IO 引脚已经全部初始化完成。接着让程序继续往下执行,进入到 while(1) 死循环。 在 while(1) 循环里,我们使用 R_IOPORT_PinWrite 和 R_BSP_SoftwareDelay 这两个函数来实现前面所述的思路。

使用 R_IOPORT_PinWrite 函数可以控制引脚的输出高低电平,从而控制 LED 灯的亮灭。 它的第一个参数需要传入控制块 g_ioport_ctrl,第二个参数传入IO端口和引脚号,第三个参数传入IO引脚电平。

fsp_err_t R_IOPORT_PinWrite (ioport_ctrl_t * const p_ctrl, bsp_io_port_pin_t pin, bsp_io_level_t level);

使用 R_BSP_SoftwareDelay 函数可以进行延时,LED 灯维持亮和灭这两种状态的时间由此函数决定。 它的第一个参数表示延时的时间量,第二个参数表示时间单位。

void R_BSP_SoftwareDelay (uint32_t delay, bsp_delay_units_t units);

时间单位参数可选:

  • BSP_DELAY_UNITS_SECONDS,表示秒;

  • BSP_DELAY_UNITS_MILLISECONDS,表示毫秒;

  • BSP_DELAY_UNITS_MICROSECONDS,表示微秒。

以启明6M5开发板为例,完整代码如下:

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 设备驱动程序的一般方法。

三、封装 LED 设备驱动程序

重新规划一下我们的工程结构。 在 src 文件夹里面新建一个“led”文件夹,再在该文件夹里面新建两个文件:“bsp_led.c”和“bsp_led.h”, 如同前面“新建工程”小节所述,把它们加入到我们的工程中。 这两个文件的内容如下。

led/bsp_led.h

#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
`**加粗样式**``

**led/bsp_led.c**
```c
#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 入口函数的内容改为如下。

hal_entry入口函数

/* 用户头文件包含 */
#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
}

通过这种方式来封装硬件的驱动程序可以使程序看起来更简单与清晰,并且会让我们以后的开发变得更加的顺畅。

下载验证

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/542582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023关于ES中的数据聚合相关操作

1.ES数据聚合 聚合(aggregation)可以实现对文档数据的统计、分析、运算。聚合常见有三大类。 桶(Bucket)聚合&#xff1a;用来对文档做分组 常用的方法 语句描述TermAggregation按照文档字段值分组Date Histogram按照日期阶梯分组&#xff0c;列如一周或一月为一组 度量(Me…

【走进Linux的世界】Linux---基本指令(1)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 ls指令pwd指令…

IS420UCSBH4A 用于高速应用中的Mark VIe系列

控制器IS420UCSBH4A由通用电气公司设计&#xff0c;用于高速应用中的Mark VIe系列&#xff0c;采用1066 MHz EP80579英特尔处理器。该控制器可与Mark VIe系列一起用于EX2100e和LS2100e应用。 IS420UCSBH4A技术规格 系列马克维处理机类型1066兆赫EP80579英特尔型号IS420UCSBH4A…

chatgpt赋能Python-python3_8_5怎么打开

Python3.8.5 是如何打开的&#xff1f; Python3.8.5 是近期发布的 Python 编程语言的一个版本&#xff0c;它具有很多新的功能和性能的改进。对于想要学习或者使用 Python3.8.5 的人&#xff0c;本文将介绍如何打开 Python3.8.5 环境。 步骤1&#xff1a;下载 Python3.8.5 首…

chatgpt赋能Python-python3_8怎么用

Python 3.8是什么&#xff1f; Python 3.8是一种编程语言版本&#xff0c;是在2019年10月发布的&#xff0c;它提供了许多新的功能和改进&#xff0c;其中包括优化的性能、新的语法糖&#xff0c;以及一些新的标准库模块&#xff0c;使Python 3.8成为了Python 3.x系列中最受欢…

你可能不需要担心,AI对你的工作造成威胁:万字长文解读科技革命与人类发展

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 上周&#xff0c;AI似乎成为全互联网的焦点了。谷歌在2023IO开发者大会上&#xff0c…

chatgpt赋能Python-python3_8怎么换行

Python是一种高级编程语言&#xff0c;其易用性和简洁语法深受程序员的喜爱。而在Python中&#xff0c;换行是一项必不可少的操作。今天&#xff0c;我们将介绍如何在Python3.8中进行换行&#xff0c;并提供一些有用的技巧。 Python3.8中的换行操作 在Python中&#xff0c;我…

一星期学sql day1

文章目录 了解部分&#xff08;详细部分google一下&#xff09;mysql的下载和安装mysql的启动MySQL的客户端的链接MySQL数据模型sql的通用语法sql 分类DDL&#xff1a;数据定义语言表操作数值类型字符串类型日期时间类型 DML&#xff08;数据操作语言&#xff09;添加数据 了解…

微信小程序 Vue+uniapp电脑手机笔记本预约维修系统 java python

系统具有专门的供用户使用的前台和专门供管理人员使用的后台。 前台用户使用小程序&#xff0c;后台信息处理使用基 MySql进行管理﹔通过后台添加手机信息、管理用户信息、管理预约信息﹔前台用户通过小程序登录&#xff0c;查看维修信息、发起预约。 管理员后端&#xff1b;首…

mysql入门(二)——函数与约束

mysql入门——函数与约束 mysql中的函数字符串函数字符串函数的基本应用 数值函数日期函数流程函数 约束概述约束的演示外键约束建立外键关联&#xff1a;删除外键外键的删除/更新行为为什么要采取外键约束 mysql中的函数 之前我们介绍过聚合函数&#xff0c;在MySQL中&#x…

chatgpt赋能Python-python3_7字体大小调整

Python3.7字体大小调整指南 您是否在使用Python3.7时遇到字体大小问题&#xff1f;本文将为您提供一份全面的Python3.7字体大小调整指南&#xff0c;帮助您轻松解决这一问题。 什么是字体大小问题 字体大小问题指的是当我们在使用Python3.7编辑器时&#xff0c;发现字体太小…

chatgpt赋能Python-python3_8字体大小

Python3.8 字体大小对程序员的重要性 在编写 Python 代码时&#xff0c;设置字体大小可能是最基本的操作之一&#xff0c;特别是对于长期进行编码工作的程序员来说。Python 3.8 为程序员提供了更好的字体调节能力&#xff0c;可以将字体大小设置为适合自己的大小&#xff0c;使…

chatgpt赋能Python-python3_9_4怎么用

介绍 Python是目前最为流行的编程语言之一&#xff0c;用途非常广泛&#xff0c;可以应用于各个领域。Python 3.9.4是Python最新版本&#xff0c;其中包含了很多新功能和改进&#xff0c;让Python编程更加简单和高效。 此文将解释Python 3.9.4的一些主要的功能&#xff0c;以…

JAVA-SE-异常

在JAVA中&#xff0c;将程序执行过程中发生的不正常行为称为异常。简单来说就是我们在运行或编译一段代码时所报的错误。 一&#xff0c;异常的体系结构 在JAVA中不同类型的异常&#xff0c;都有与其对应的类来进行描述。 …

实验三、数据高级查询实验

实验名称&#xff1a;实验3 数据高级查询实验 实验目的和要求&#xff1a; 实验目的和要求 掌握SQL嵌套查询和集合查询等各种高级查询的设计方法等。 实验软硬件要求&#xff1a; 计算机、MySQL,Navicat 实验内容、实验过程、所遇问题及其解决方法 实验内容&#xff1a;针…

Discourse 的用户信息中的 IP 地址显示的是 CloudFlare 的 IP 地址

因为使用了 CloudFlare 的反向地址。 所有 Discourse 获得的用户的 IP 地址其实是 CloudFlare 的服务器地址。 修改 好在 Discourse 已经提供了相关的解决方案。 需要在 Discourse 的配置文件中&#xff0c;添加下面的内容&#xff1a; “templates/cloudflare.template.ym…

分布式系统概念和设计——协调和协定

分布式系统概念和设计 协调和协定 分布式系统中的进程如何协调它们的动作和对共享值达成协议? 算法在分布式系统中的基本目的是&#xff1a;供一组进程来协调它们的动作或对一个或多个值达成协议 避免固定的主-从关系的主要原因是&#xff0c;经常需要系统即使在系统故障的情…

日志文件的轮循(logrotate)

文章目录 日志文件的轮循(logrotate)轮循基本原理轮循的基本配置实际测试logrotate的操作使用案例 自定义日志文件的轮循功能 日志文件的轮循(logrotate) 日志轮循&#xff08;logrotate&#xff09;是一种用于管理日志文件的工具&#xff0c;它可以帮助我们自动地对日志文件进…

EasyRecovery Photo16 for windows数据恢复软件免费版下载安装教程

EasyRecovery Photo16 for windows数据恢复软件免费版下载是一款由Kroll Ontrack公司开发的数据恢复软件&#xff0c;其主要功能是恢复已经删除或损坏的图片文件。该软件可用于恢复各种类型的图片文件&#xff0c;包括JPEG、GIF、BMP、PNG等&#xff0c;同时也支持恢复照片文件…

Thematica: 炫彩主题与黑暗奇观的Vue3之旅

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 博客主题和目的1.2 Vue 3简介二、炫彩主题2.1 准备工作2.2 安装必要依赖2.3 创建Vue项目2.4 设置全局样式