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

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

3天内不再提示

自己写库:构建库函数雏形

瑞萨嵌入式小百科 来源:野火电子 2025-06-19 11:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

第8章自己写库——构建库函数雏形

实际上,构建固件库是一件费时费力的事情,并且它对开发者对芯片的熟悉程度有一定的要求。甚至,当一个固件库的封装程度很高时,想要阅读并理解该固件库的底层代码也会变成一件有较高难度的事情。瑞萨RA系列单片机所使用的官方FSP库便是这样的一种封装程度很高的固件库。所幸的是,FSP库的意义在于为开发者封装硬件底层,因此一般而言,FSP库是带来方便的,开发者只需学会如何使用FSP库即可,而不用深入到FSP库的底层细节。

构建固件库一般是由芯片厂商来做,比如FSP库就是由瑞萨官方构建和维护的。为了让读者更加清晰地了解到固件库的作用,我们接下来将会说明一种构建一个封装程度较低的固件库的思路。值得注意的是,本章所构建的库函数雏形与实际上的FSP库有很大区别,但求这对读者理解和使用FSP库有所帮助。

8.1硬件设计

野火启明6M5开发板的LED电路图如图所示。

030a01f8-4a67-11f0-b715-92fbcf53809c.png

野火启明4M2开发板的LED电路图下图所示。

0312f3f8-4a67-11f0-b715-92fbcf53809c.png

野火启明2L1开发板的LED电路图下图所示。

0321e066-4a67-11f0-b715-92fbcf53809c.png

8.2软件设计

8.2.1新建工程

对于e2studio开发环境:拷贝一份我们之前新建的e2s工程模板“05_Template”,然后将工程文件夹重命名为“09_Register_MyLib”,最后再将它导入到我们的e2studio工作空间中。

对于Keil开发环境:拷贝一份我们之前新建的Keil工程模板“06_Template”,然后将工程文件夹重命名为“09_Register_MyLib”,并进入该文件夹里面双击Keil工程文件,打开该工程。

工程新建好之后,在工程根目录的“src”文件夹下面新建“ioport”文件夹,再进入“ioport”文件夹里面新建ioport驱动的源文件和头文件:“ra_ioport.c”和“ra_ioport.h”。工程文件结构如下。

列表1:文件结构

左右滑动查看完整内容

09_Register_MyLib
├─ ......
└─src
 ├─ ioport
 │ ├─ ra_ioport.c
 │ └─ ra_ioport.h
 └─ hal_entry.c

警告

注意:对于使用Keil开发环境的用户,将代码文件放到“src”文件夹下之后,Keil软件并不会自动将它们加入到工程,这时候需要打开RASC FSP配置界面,点击一次单击右上角的“Generate Project Content”按钮,从而“src”文件夹下的代码文件就会被自动加入进工程中。接着关闭FSP配置界面返回到Keil,然后进行一次编译后会弹出一个提示框提示工程结构发生了变化,点击确定即可。对于使用e2studio的用户则不需要如此。

8.2.2包含寄存器定义的头文件

在ra_ioport.h中通过包含“hal_data.h”头文件来间接包含寄存器定义头文件:R7FA6M5BH.hR7FA4M2AD.hR7FA2L1AB.h

列表2:代码清单8-1:ra_ioport.h

左右滑动查看完整内容

#include"hal_data.h"//间接包含了头文件 "R7FA6M5BH.h" / "R7FA4M2AD.h" /
→"R7FA2L1AB.h"

8.2.3端口和引脚号的枚举类型定义

我们需要定义端口和引脚号的枚举类型,用来表示某个要操控的某个引脚。但是如果像:“BSP_IO_PORT_04_PIN_00”、“BSP_IO_PORT_04_PIN_03”和“BSP_IO_PORT_04_PIN_04”

这样定义端口和引脚号的枚举类型,会造成与FSP库中的枚举定义冲突,因此我们暂时把端口和引脚号分开出来单独定义。

列表3:代码清单8-2:ra_ioport.h文件

左右滑动查看完整内容

/* IOPORT 端口定义 */
typedefenumio_port
{
IO_PORT_00 = 0x0000, ///< IO port 0
IO_PORT_01 = 0x0100, ///< IO port 1
IO_PORT_02 = 0x0200, ///< IO port 2
IO_PORT_03 = 0x0300, ///< IO port 3
IO_PORT_04 = 0x0400, ///< IO port 4
IO_PORT_05 = 0x0500, ///< IO port 5
IO_PORT_06 = 0x0600, ///< IO port 6
IO_PORT_07 = 0x0700, ///< IO port 7
IO_PORT_08 = 0x0800, ///< IO port 8
IO_PORT_09 = 0x0900, ///< IO port 9
IO_PORT_10 = 0x0A00, ///< IO port 10
IO_PORT_11 = 0x0B00, ///< IO port 11
IO_PORT_12 = 0x0C00, ///< IO port 12
IO_PORT_13 = 0x0D00, ///< IO port 13
IO_PORT_14 = 0x0E00, ///< IO port 14
} IO_Port_t;


/* IOPORT 引脚定义 */
typedefenumio_pin
{
IO_PIN_00 = 0x0000, ///< IO port 0 pin 0
IO_PIN_01 = 0x0001, ///< IO port 0 pin 1
IO_PIN_02 = 0x0002, ///< IO port 0 pin 2
IO_PIN_03 = 0x0003, ///< IO port 0 pin 3
IO_PIN_04 = 0x0004, ///< IO port 0 pin 4
IO_PIN_05 = 0x0005, ///< IO port 0 pin 5
IO_PIN_06 = 0x0006, ///< IO port 0 pin 6
IO_PIN_07 = 0x0007, ///< IO port 0 pin 7
IO_PIN_08 = 0x0008, ///< IO port 0 pin 8
IO_PIN_09 = 0x0009, ///< IO port 0 pin 9
IO_PIN_10 = 0x000A, ///< IO port 0 pin 10
IO_PIN_11 = 0x000B, ///< IO port 0 pin 11
IO_PIN_12 = 0x000C, ///< IO port 0 pin 12
IO_PIN_13 = 0x000D, ///< IO port 0 pin 13
IO_PIN_14 = 0x000E, ///< IO port 0 pin 14
IO_PIN_15 = 0x000F, ///< IO port 0 pin 15
} IO_Pin_t;

8.2.4IOPORT相关功能的枚举类型定义

接着定义IOPORT相关功能的枚举类型,这里的每一个枚举类型都对应着IOPORT的其中一项功能配置。

列表4:代码清单8-3:ra_ioport.h文件

左右滑动查看完整内容

/* IO 引脚模式 */
typedefenum
{
IO_MODE_GPIO=0,/* 普通 GPIO 功能 */
IO_MODE_AF=1,/* 复用功能 */
IO_MODE_AN=2/* 模拟输入输出功能 */
} IO_Mode_t;
/* IO 引脚方向 */
typedefenum
{
IO_DIR_INPUT=0,// 引脚用作 GPIO 输入功能
IO_DIR_OUTPUT=1// 引脚用作 GPIO 输出功能
} IO_Dir_t;
/* IO 引脚输出类型 */
typedefenum
{
IO_OTYPE_PP=0x00,/* 推挽模式 */
IO_OTYPE_OD=0x01/* 开漏模式 */
} IO_OType_t;
/* IO 引脚输出能力 */
typedefenum
{
IO_DRIVE_LOW=0,// Low drive
IO_DRIVE_MIDDLE=1,// Middle drive
IO_DRIVE_HSHD=2,// High-speed high-drive
IO_DRIVE_HIGH=3// High drive
} IO_DriveCapability_t;
/* IO 引脚输出电平 */
typedefenumio_level
{
IO_LEVEL_LOW=0,// Low
IO_LEVEL_HIGH// High
} IO_Level_t;
/* IO 引脚输入上下拉 */
typedefenum
{
IO_NO_PULL= 0x00u,/* 浮空输入 */
IO_PULL_UP= 0x01u,/* 上拉输入 */
//IO_PULL_DOWN = 0x02u /* RA6M5/RA4M2/RA2L1 引脚没有下拉功能 */
} IO_Pull_t;

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

    关注

    36

    文章

    22429

    浏览量

    89708
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66814
  • 开发板
    +关注

    关注

    25

    文章

    6122

    浏览量

    113165
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    用TIM的PWM输出模式一个步进电机的Stepper库函数

    这是之前平衡小车时自己用TIM的PWM输出模式写了一个步进电机的Stepper库函数
    的头像 发表于 07-24 14:36 3309次阅读
    用TIM的PWM输出模式<b class='flag-5'>写</b>一个步进电机的Stepper<b class='flag-5'>库函数</b>

    什么是STM32函数库

    文章目录- 自己构建库函数雏形1. 什么是 STM32
    发表于 08-05 07:30

    单片机库函数有哪些

    高中生自己的STC8A8K64S4A12(8051)单片机库函数分享库函数相关开源协议现在拥有哪些?开源地址
    发表于 11-26 08:19

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

    寄存器5. 使用e2 studio新建工程6. 使用RASC生成Keil工程7. e2 studio/Keil/RASC使用说明8. 第一个实验:用寄存器点亮LED灯9. 自己——构建
    发表于 12-20 23:28

    PICC库函数详解

    PICC库函数详解
    发表于 04-18 20:13 132次下载

    STC库函数使用参考

    STC库函数使用参考STC库函数使用参考
    发表于 07-06 15:14 0次下载

    CAN库函数程序

    CAN库函数程序
    发表于 02-27 16:06 26次下载

    高中生自己的STC8A8K64S4A12(8051)单片机库函数分享

    高中生自己的STC8A8K64S4A12(8051)单片机库函数分享库函数相关开源协议现在拥有哪些?开源地址
    发表于 11-18 12:21 20次下载
    高中生<b class='flag-5'>自己</b><b class='flag-5'>写</b>的STC8A8K64S4A12(8051)单片机<b class='flag-5'>库函数</b>分享

    从自定义的库函数到STM32官方标准

      在上一节的基础上,进一步改写代码,再引入官方标注库函数。虽然官方标准慢慢式微,有一些别的可能会取代它,但是并不妨碍我们继续拿官方来写代码,吸取里边好的写法,强化下C语言技能,
    发表于 12-02 20:06 1次下载
    从自定义的<b class='flag-5'>库函数</b>到STM32官方标准<b class='flag-5'>库</b>

    IAR中将部分文件编译成库函数.a及如何调用库函数

    目的:将库函数提供给第三方,但有不想让别人得到源代码。目的:将库函数提供给第三方,但有不想让别人得到源代码。一、如何将文件编译成静态连接.a二、如何在项目中引入静态连接...
    发表于 12-03 11:36 19次下载
    IAR中将部分文件编译成<b class='flag-5'>库函数</b>.a及如何调用<b class='flag-5'>库函数</b>

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

    介绍3、使用库函数编写程序使LED灯闪烁操作4、实验效果五、使用cubemx生成HAL工程点亮LED灯1、cubemx配置生成工程2、HAL控制函数介绍3、编写使LED灯闪烁的程序
    发表于 12-05 14:06 17次下载
    【STM32】标准<b class='flag-5'>库</b>与HAL<b class='flag-5'>库</b>对照学习教程三--使用<b class='flag-5'>库函数</b>配置GPIO点亮LED灯

    stm32下标准库函数与HAL库函数编程方式的差异

    stm32下标准库函数与HAL库函数编程方式的差异标准库函数HAL库函数标准库函数与HAL库函数
    发表于 12-09 14:21 15次下载
    stm32下标准<b class='flag-5'>库函数</b>与HAL<b class='flag-5'>库函数</b>编程方式的差异

    关于STM32库函数手动添加时钟问题。

    自己添加库函数以及启动文件,全部使用keil自带的manage run-time environment功能,后来发现一个问题自带中指引的库函数为安装目录下的文件,多个程序公用一堆
    发表于 12-27 18:46 2次下载
    关于STM32<b class='flag-5'>库函数</b>手动添加时钟问题。

    基于标准库函数与基于HAL库函数的stm32编程方式对比

    一、基于标准库函数的stm32编程方式二、基于HAL库函数的stm32编程方式差异上面也提到了,STM32有非常多的寄存器,而导致了开发困难,所以为此ST公司就为每款芯片都编写了一份文件,也就是工程
    发表于 12-28 19:09 30次下载
    基于标准<b class='flag-5'>库函数</b>与基于HAL<b class='flag-5'>库函数</b>的stm32编程方式对比

    stc库函数使用参考

    stc库函数使用参考,本函数库适用于STC/IAP15F/L2K61S2系列MCU,具体的MCU的资源,请参考用户手册中对应的章节。
    发表于 10-17 14:33 15次下载