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

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

3天内不再提示

瑞萨RA系列FSP库开发实战指南(19)使用寄存器点亮LED灯

瑞萨MCU小百科 ? 来源: 瑞萨MCU小百科 ? 2025-06-11 15:06 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

7.4

实验:使用寄存器点亮LED

7.4.1

硬件设计

野火启明6M5开发板的LED电路图如图所示。图中RA6M5芯片的P400、P403、P404引脚分别通过一个2.2 KΩ的限流电阻连接到LED1、LED2、LED3这三个用户LED灯的阴极,LED灯的阳极连接到3.3V电源。而LED4是电源指示灯,只要开发板通电就会亮。

40b636ce-468a-11f0-b715-92fbcf53809c.png

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

40c51af4-468a-11f0-b715-92fbcf53809c.png

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

40d210e2-468a-11f0-b715-92fbcf53809c.png

以上所示,三块开发板的LED电路图差别都不大,主要差别在于用于控制用户LED灯的引脚不一样,这一点在使用不同板子时需要注意一下引脚的配置。

7.4.2

软件设计

7.4.2.1

新建工程

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

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

7.4.2.2

寄存器定义头文件

当新建工程完成之后,工程里已经自动包含了这个定义寄存器的头文件,比如:R7FA6M5BH.h头文件。在这个头文件里面,已经包含了芯片所有的寄存器定义,包括IOPORT外设的寄存器。

以启明6M5开发板的RA6M5工程为例,我们在这里列出IOPORT部分寄存器定义(它们存在于寄存器定义头文件R7FA6M5BH.h中)。

列表1:代码清单8-1:R7FA6M5BH.h文件中的IOPORT部分寄存器定义

左右滑动查看完整内容

/**
* @brief I/O Ports (R_PORT0)
*/
typedefstruct {/*!< (@ 0x40080000) R_PORT0?
,
→Structure */
union{
union{
__IOMuint32_tPCNTR1;/*!< (@ 0x00000000) Port?
,
→Control Register 1 */


struct{
__IOMuint32_tPDR :16;/*!< [15..0] Pmn?
,
→Direction */
__IOMuint32_tPODR :16;/*!< [31..16] Pmn?
,
→Output Data */
} PCNTR1_b;
} ;
struct{
union{
__IOMuint16_tPODR;/*!< (@ 0x00000000)?
,
→Output data register */
/* ... 代码过长省略 ... */
} ;
union{
__IOMuint16_tPDR;/*!< (@ 0x00000002)?
,
→Data direction register */
/* ... 代码过长省略 ... */
} ;
};
};
union{
union{
__IMuint32_tPCNTR2;/*!< (@ 0x00000004) Port?
,
→Control Register 2 */
struct{
__IMuint32_tPIDR :16;/*!< [15..0] Pmn Input?
__IM uint32_t EIDR : 16; /*!< [31..16] Pmn Event?
,
→Input Data */
} PCNTR2_b;
} ;
struct{
union{
__IMuint16_tEIDR;/*!< (@ 0x00000004)?
,
→Event input data register */
/* ... 代码过长省略 ... */
} ;
union{
__IMuint16_tPIDR;/*!< (@ 0x00000006)?
,
→Input data register */
/* ... 代码过长省略 ... */
} ;
};
};
union{
union{
__OMuint32_tPCNTR3;/*!< (@ 0x00000008) Port?
,
→Control Register 3 */
struct{
__OMuint32_tPOSR :16;/*!< [15..0] Pmn Output?
,
→Set */
__OMuint32_tPORR :16;/*!< [31..16] Pmn?
,
→Output Reset */
} PCNTR3_b;
} ;
struct{
union{
__OMuint16_tPORR;/*!< (@ 0x00000008)?
,
→Output set register */
/* ... 代码过长省略 ... */
} ;
union{
__OMuint16_tPOSR;/*!< (@ 0x0000000A)?
,
→Output reset register */
/* ... 代码过长省略 ... */
} ;
};
};
union{
union{
__IOMuint32_tPCNTR4;/*!< (@ 0x0000000C) Port?
,
→Control Register 4 */
struct{
__IOMuint32_tEOSR :16;/*!< [15..0] Pmn Event?
,
→Output Set */
__IOMuint32_tEORR :16;/*!< [31..16] Pmn Event?
,
→Output Reset */
} PCNTR4_b;
} ;
struct{
union{
__IOMuint16_tEORR;/*!< (@ 0x0000000C)?
,
→Event output set register */
/* ... 代码过长省略 ... */
} ;
union{
__IOMuint16_tEOSR;/*!< (@ 0x0000000E)?
,
→Event output reset register */
/* ... 代码过长省略 ... */
} ;
};
};
} R_PORT0_Type;/*!< Size = 16 (0x10) ?
,
→ */
/**
* @brief I/O Ports-PFS (R_PFS)
*/
typedefstruct {/*!< (@ 0x40080800) R_PFS?
,
→Structure */
__IOM R_PFS_PORT_Type PORT[15];/*!< (@ 0x00000000) Port?
,
→[0..14] */
} R_PFS_Type;/*!< Size = 960 (0x3c0) ?
,
→ */
/**
* @brief I/O Ports-MISC (R_PMISC)
*/
typedefstruct {/*!< (@ 0x40080D00) R_PMISC?
,
→Structure */
union{
__IOMuint8_tPFENET;/*!< (@ 0x00000000)?
,
Ethernet Control Register */
/* ... 代码过长省略 ... */
} ;
__IMuint8_tRESERVED[2];
union{
__IOMuint8_tPWPR;/*!< (@ 0x00000003) Write-
,
→Protect Register */
/* ... 代码过长省略 ... */
} ;
__IMuint8_tRESERVED1;
union{
__IOMuint8_tPWPRS;/*!< (@ 0x00000005) Write-
,
→Protect Register for Secure */
/* ... 代码过长省略 ... */
} ;
__IMuint16_tRESERVED2[5];
__IOM R_PMISC_PMSAR_Type PMSAR[12];/*!< (@ 0x00000010) Port?
,
→Security Attribution Register */
} R_PMISC_Type;/*!< Size = 40 (0x28) ?
,
→ */
/** @addtogroup Device_Peripheral_peripheralAddr
* @{ 外设首地址
*/
#defineR_PORT0_BASE 0x40080000UL
#defineR_PORT1_BASE 0x40080020UL
#defineR_PORT2_BASE 0x40080040UL
#defineR_PORT3_BASE 0x40080060UL
#defineR_PORT4_BASE 0x40080080UL
#defineR_PORT5_BASE 0x400800A0UL
#defineR_PORT6_BASE 0x400800C0UL
#defineR_PORT7_BASE 0x400800E0UL
#defineR_PORT8_BASE 0x40080100UL
#defineR_PORT9_BASE 0x40080120UL
#defineR_PORT10_BASE 0x40080140UL
#defineR_PORT11_BASE 0x40080160UL
#defineR_PORT12_BASE 0x40080180UL
#defineR_PORT13_BASE 0x400801A0UL
#defineR_PORT14_BASE 0x400801C0UL
#defineR_PFS_BASE 0x40080800UL
#defineR_PMISC_BASE 0x40080D00UL
/** @addtogroup Device_Peripheral_declaration
* @{ 外设寄存器声明(定义结构体指针,指向 IOPORT 寄存器首地址)
*/
#defineR_PORT0 ((R_PORT0_Type*) R_PORT0_BASE)
#defineR_PORT1 ((R_PORT0_Type*) R_PORT1_BASE)
#defineR_PORT2 ((R_PORT0_Type*) R_PORT2_BASE)
#defineR_PORT3 ((R_PORT0_Type*) R_PORT3_BASE)
#defineR_PORT4 ((R_PORT0_Type*) R_PORT4_BASE)
#defineR_PORT5 ((R_PORT0_Type*) R_PORT5_BASE)
#defineR_PORT6 ((R_PORT0_Type*) R_PORT6_BASE)
#defineR_PORT7 ((R_PORT0_Type*) R_PORT7_BASE)
#defineR_PORT8 ((R_PORT0_Type*) R_PORT8_BASE)
#defineR_PORT9 ((R_PORT0_Type*) R_PORT9_BASE)
#defineR_PORT10 ((R_PORT0_Type*) R_PORT10_
,
→BASE)
#defineR_PORT11 ((R_PORT0_Type*) R_PORT11_
,
→BASE)
#defineR_PORT12 ((R_PORT0_Type*) R_PORT12_
,
→BASE)
#defineR_PORT13 ((R_PORT0_Type*) R_PORT13_
,
→BASE)
#defineR_PORT14 ((R_PORT0_Type*) R_PORT14_
,
→BASE)
#defineR_PFS ((R_PFS_Type*) R_PFS_BASE)
#defineR_PMISC ((R_PMISC_Type*) R_PMISC_BASE)

7.4.2.3

hal_entry入口函数

一般来说,接下来我们应该在main函数里编写我们的程序,但是使用FSP库却不一样,在没有使用RTOS的情况下,它规定以名为hal_entry的函数作为用户应用程序的入口,因此我们应该在hal_entry入口函数下编写我们的代码。

实际上,当使用RTOS时,程序是从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数调用了hal_entry函数。我们新建的工程是没有选用RTOS的,因此,用户程序是从hal_entry函数开始执行。我们打开“srchal_entry.c”文件,在hal_entry函数里面编写我们的代码。

以启明6M5开发板为例,RA6M5工程的hal_entry函数代码如下所示。

注解

启明4M2开发板和启明2L1开发板的用户可直接打开配套的“08_Register_LED”例程查看该代码,限于篇幅,不在本章中贴出。

列表2:代码清单8-2:hal_entry.c文件

左右滑动查看完整内容

voidhal_entry(void)
{
/*TODO:add your own code here */
/* 取消写保护 */
R_PMISC->PWPR =0;///< Clear BOWI bit -?
,
→writing to PFSWE bit enabled
R_PMISC->PWPR =1U<< BSP_IO_PWPR_PFSWE_OFFSET;?///< Set PFSWE bit -?
,
→writing to PFSregisterenabled
/* LED1:配置引脚 P400 对应的 PFS 寄存器 */
R_PFS->PORT[BSP_IO_PORT_04_PIN_00>>8].PIN[BSP_IO_PORT_04_PIN_00 &?
,
0xFF].PmnPFS =
IOPORT_CFG_PORT_DIRECTION_OUTPUT | IOPORT_CFG_PORT_OUTPUT_LOW;
/* LED2:配置引脚 P403 对应的 PFS 寄存器 */
R_PFS->PORT[BSP_IO_PORT_04_PIN_03>>8].PIN[BSP_IO_PORT_04_PIN_03 &?
,
0xFF].PmnPFS =
IOPORT_CFG_PORT_DIRECTION_OUTPUT | IOPORT_CFG_PORT_OUTPUT_LOW;
/* LED3:配置引脚 P404 对应的 PFS 寄存器 */
R_PFS->PORT[BSP_IO_PORT_04_PIN_04>>8].PIN[BSP_IO_PORT_04_PIN_04 &?
,
0xFF].PmnPFS =
IOPORT_CFG_PORT_DIRECTION_OUTPUT | IOPORT_CFG_PORT_OUTPUT_LOW;
/** 此时 3 个 LED 灯的引脚默认输出的是低电平
* 所以 3 个 LED 灯都会默认亮起来
* 我们在 while 循环里让 LED1 闪烁:每秒钟翻转一次状态
*/
while(1)
{
/* 翻转 LED 灯:LED1 */
//R_PORT4->PODR |= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF);
//R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
//R_PORT4->PODR &= (uint16_t)~(1 << (BSP_IO_PORT_04_PIN_00 & 0xFF));
//R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
/* 或者也可以这样用位异或操作来翻转 LED1 */
R_PORT4->PODR ^=1<<(BSP_IO_PORT_04_PIN_00 &?0xFF);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
//这后面的代码无需理会
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

7.4.3

下载验证

编写好上述代码,然后将程序编译并下载到开发板之后,按下复位按键来复位开发板,可以观察到开发板上面除了电源指示灯之外的3个LED灯当中有两个灯常亮,还有一个灯在缓慢闪烁。

闪烁着的LED灯为LED1,它每秒钟(1000毫秒)便改变一次亮灭的状态。


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

    关注

    242

    文章

    23871

    浏览量

    674906
  • mcu
    mcu
    +关注

    关注

    146

    文章

    18013

    浏览量

    368469
  • 寄存器
    +关注

    关注

    31

    文章

    5439

    浏览量

    124819
  • 瑞萨
    +关注

    关注

    36

    文章

    22389

    浏览量

    88119
  • FSP
    FSP
    +关注

    关注

    0

    文章

    45

    浏览量

    7451

原文标题:实验:使用寄存器点亮LED灯——瑞萨RA系列FSP库开发实战指南(19)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电子RA系列微控制的可扩展性强的配置软件包 (FSP)安装下载与使用指南

    电子RA系列微控制的可扩展性强的配置软件包 (FSP)安装下载与使用
    的头像 发表于 06-11 17:21 ?643次阅读

    RA8系列教程 | RA8 开发环境搭建,并点亮一个LED

    今天就给大家讲讲基于Cortex-M85内核RA8单片机快速上手指南
    的头像 发表于 06-04 17:32 ?779次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>教程 | <b class='flag-5'>瑞</b><b class='flag-5'>萨</b> <b class='flag-5'>RA</b>8 <b class='flag-5'>开发</b>环境搭建,并<b class='flag-5'>点亮</b>一个<b class='flag-5'>LED</b>

    使用寄存器点亮LED

    学习本章时,配合以上芯片手册中的“19. I/O Ports”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容涉及到较多寄存器方面的深入内容,对于初学者而言这些内容丰富也较难理解,但非常有必要细读研究、夯实基础。
    的头像 发表于 05-28 17:37 ?669次阅读
    使用<b class='flag-5'>寄存器</b><b class='flag-5'>点亮</b><b class='flag-5'>LED</b><b class='flag-5'>灯</b>

    RA8系列教程 | 基于 Keil 开发 RA8单片机

    本文结合Cortext-M85单片机RA8D1、Keil MDK,以及自家的代码初始化工具(Smart Configurator)给
    的头像 发表于 04-22 17:41 ?560次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>教程 | 基于 Keil <b class='flag-5'>开发</b> <b class='flag-5'>RA</b>8单片机

    如何用C语言操作寄存器——RA系列FSP开发实战指南(10)

    由于寄存器的数量是非常之多的,如果每个寄存器都用像*((uint32_t*)(0x40080000+0x0020*1))这样的方式去访问的话,会显得很繁琐、很麻烦。为了更方便地访问寄存器,我们会借助C语言结构体的特性去定义
    的头像 发表于 04-22 15:30 ?1032次阅读
    如何用C语言操作<b class='flag-5'>寄存器</b>——<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b><b class='flag-5'>系列</b><b class='flag-5'>FSP</b><b class='flag-5'>库</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b>(10)

    RA系列MCU FSP开发实战指南(09)存储映射

    3.3 存储映射 前文所述,寄存器与RAM、FLASH一样都是芯片内部的一种存储设备。那么,当我们需要访问它们的时候,我们需要知道它们的存储地址。 3.3.1 存储映射表 如下图所示为RA
    的头像 发表于 04-16 15:52 ?850次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b><b class='flag-5'>系列</b>MCU <b class='flag-5'>FSP</b><b class='flag-5'>库</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b>(09)存储<b class='flag-5'>器</b>映射

    RA8快速上手指南:Cortex-M85内核RA8开发环境搭建 并点亮一个LED

    因为Cortex-M内核,RA8系列单片机支持多种市面上常见的开发环境,像Keil MDK、IAR EWARM等,而本文讲述的是
    的头像 发表于 03-17 14:35 ?1064次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8快速上手<b class='flag-5'>指南</b>:Cortex-M85内核<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8<b class='flag-5'>开发</b>环境搭建 并<b class='flag-5'>点亮</b>一个<b class='flag-5'>LED</b>

    RA2L1入门学习】RA2L1开发环境搭建

    e? studio 和 FSP 的下载、安装及使用指南 1. 什么是 e? studio 和 FSP? e? studio 是电子(Re
    发表于 03-07 11:33

    基于RA0E1开发板的ThreadX实时操作系统串口回显测试

    感谢立创提供测试机会,学到RA0及MCU的相关使用。使用FSP
    的头像 发表于 02-25 09:27 ?555次阅读
    基于<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>0E1<b class='flag-5'>开发</b>板的ThreadX实时操作系统串口回显测试

    RA2L1入门学习】1. 点亮LED

    首次使用单片机,先说一下使用感受。 本次学习使用的是RA-Eco-RA2L1-48PIN-V1.0开发板+e2studio(官方的集成开发
    发表于 01-29 22:17

    RA2L1入门学习】开箱+Keil环境搭建+点灯+点亮OLED

    【开箱】 RA2L1 开发板使用 R7FA2L1AB2DFL 芯片 基于 ARM Cortex M23 内核,主频 48M,Flash 256K,RAM 32K 片上资源已经足够
    发表于 01-25 12:10

    RA8D1 CPK开发板】RA8D1移植ThreadX操作系统

    首先感谢[RA生态工作室]( RA MCU 生态社区)提供的
    发表于 10-20 20:22

    e2studio(1)----芯片之搭建FSP环境

    视频教学 样品申请 请勿添加外链 e2studio软件 e2studio是的集成开发环境,FSP 提供了众多可提高效率的工具,用于开发
    发表于 09-30 15:28

    RA-Eco-RA0E1-32PIN-V1.0开发板试用】点灯

    系列。 二、开发环境搭建 开发板外观 : 收到的开发板精致小巧,但不自带仿真,仅提供了一个USB转串口(CH340)。 下载工具 : 查询
    发表于 09-24 11:54

    RA8系列高性能MCU开发上手体验

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是RA8系列高性能MCU开发上手体验。
    的头像 发表于 08-08 15:21 ?1907次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>高性能MCU<b class='flag-5'>开发</b>上手体验