【致敬未来的攻城狮计划】--RA2E1 开发板测评(2)LED闪烁

简介: 【致敬未来的攻城狮计划】--RA2E1 开发板测评(2)LED闪烁

前言

(1)首先感谢 李肯前辈的活动,从而申请到了RA2L1开发板的测评。

(2)注意,学习本文之前要学习 瑞萨Renesas RA2L1 开发板测评(1)--keil环境配置;

(3)我们拿到开发板的第一步就应该学习GPIO的输出,所以以LED闪烁作为例子。


启动文件简介

以STM32为例

(1)首先,我们需要知道, 开发板开机的第一步是执行Reset_Handler这个程序。这个时候有人就说了:“放屁!是执行main函数,不懂装懂!”是的,对于绝大多数人来说,都认为main函数才是开机执行的第一个程序,这是很正常的,但是是错误的。

(2)为什么我们会常常有这样错误的想法呢?因为对于绝大多数人而言,他们没有接触过Reset_Handler,而也不需要他们接触。因为用户只需要编写main函数里面的内容即可。前面的初始化是固定的。

但是为什么我要介绍这个东西呢?因为瑞萨的Reset_Handler与我们经常接触的STM32配置有些许区别。我以STM32为切入方便各位理解。

(3) IMPORT:表示该标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似。这里表示 SystemInit 和 __main 这两个函数均来自外部的文件。


RA2E1启动开机启动程序

(1)瑞萨的Reset_Handler程序并不是使用汇编程序编写的。而且,对于STM32而言SystemInit程序都是一些固定死的程序,不需要我们过多查看。而对于 瑞萨开发板有所不同,他的SystemInit里面是会随着我们在rasc中的配置而发生改变的。

(2)这个时候有人会问了。什么变化呢?很简单,就是我们的IO初始化,会存放到R_BSP_WarmStart()函数中,而R_BSP_WarmStart()函数会被SystemInit()函数调用。


(3)现在我们知道了开发板程序执行顺序了。是不是可以直接在main()函数里面直接写程序了呢?不是的,瑞萨开发板有规定 当使用 RTOS 时,程序从 main 函数开始进行线程调度;当没有使用 RTOS 时,C 语言程序的入 口函数 main 函数调用了 hal_entry 函数。

这是什么意思呢?很简单,如果我们使用了操作系统,就是从main()函数开始写,而如果是裸机开发,就是从hal_entry()函数开始。但是这个时候就有人问了开机启动的第一个程序不是Reset_Handler()吗?而Reset_Handler()中调用的是main()函数啊。为什么我们是要在hal_entry()函数中写程序呢?看下图

LED闪烁程序编写

利用rasc初始化GPIO


(1)我们知道了瑞萨开发板的启动文件之后,就可以开始编写程序了。首先为我们在 keil环境配置那一章获得了一个文件夹了,此时打开。

(2)因为我们在上一章节已经将rasc添加进入keil中了,所以打开右上角的Tools,RA Smart Configurator。


(3)此时我们需要打开原理图,因为我们需要知道LED是由哪一个引脚控制,需要给什么电平才能够亮灯。

(4)从原理图中获得信息之后,我们开始配置rasc。


(5)配置好之后,关闭rasc。界面如下,我们先下载程序进去,看看LED1是否被点亮。


keil程序编写

(1)因为我们本文是要让LED1闪烁,所以需要在hal_entry()函数中编写程序。我首先介绍一下需要用到的函数。
/*R_IOPORT_PinWrite()用于设置IO高低电平
 *传入参数有三个
 *参数一:
    *固定为&g_ioport_ctrl
 *参数二:
    *指定IO口,比如我们需要控制P502,就输入BSP_IO_PORT_05_PIN_02。如果是控制P411,就输入BSP_IO_PORT_04_PIN_11
 *参数三:
    *指定输出的电平,BSP_IO_LEVEL_LOW输出低电平,BSP_IO_LEVEL_HIGH输出高电平
 */
/*R_BSP_SoftwareDelay()用于设置延时时间
 *参数一:
    *设置延时时间长短,是32bit的数据,所以只能输入0-4294967296(正常人应该都不会超过。。)
 *参数二:
    *设置延时单位,BSP_DELAY_UNITS_SECONDS表示单位为秒,BSP_DELAY_UNITS_MILLISECONDS表示ms,BSP_DELAY_UNITS_MICROSECONDS是us
 */


(2)由此我们可以得出以下代码:
void hal_entry(void)//为什么在这里写程序,看RA2E1启动开机启动程序介绍
{
    /* TODO: add your own code here */
        while(1)
        {
            //将P502设置为低电平
            R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_02,BSP_IO_LEVEL_LOW);
            //延时1s
            R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS);
            //将P502设置为高电平
            R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_02,BSP_IO_LEVEL_HIGH);
            //延时1s
            R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS);
        }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}


将LED程序封装

将led文件添加进入keil

(1)作为一名程序员,必须具备模块的思想,绝不重复造轮子。所以我们要学会如何将已经写好的程序进行封装。

(2)在因为我们需要使用rasc配置程序,而如果我们突然需要更改rasc的初始化,怕自动生成的代码将我们原来生成的代码删除。于是瑞萨就规定了,用户自己写的程序需要放在 src文件夹下这样就不会被自动生成的代码删除。

(3)首先我们在src文件夹中创建一个led文件夹,然后led中加入led.c和led.h文件。


(4)当我们再次打开keil,发现led.c和led.h并没有加入工程。这就需要我们重新打开rasc——>点击“Generate Project Content”按钮 ——>然后关闭rasc。


在led中写入程序

led.c

双击右侧project中的led.c文件写入如下程序
#include "led.h"
/*函数说明:led1闪烁
 *传入参数:无
 *返回参数:无
 */
void led_1_flicker(void)
{
            LED1_lighting_up;
            R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS);
            LED1_lighting_off;
            R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS);
}
/*函数说明:led2闪烁
 *传入参数:无
 *返回参数:无
 */
void led_2_flicker(void)
{
            LED2_lighting_up;
            R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS);
            LED2_lighting_off;
            R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_SECONDS);
}


led.h

我们需要注意,因为led.h文件很可能被多个文件重复引用。所以我们需要加上 #ifndef/#define/#endif进行保护。
#ifndef    __led_H
#define    __led_H
#include "hal_data.h"
/*********   参数宏定义     *********/
#define LED1 BSP_IO_PORT_05_PIN_02
#define LED2 BSP_IO_PORT_05_PIN_01
/*********   函数宏定义     *********/
#define LED1_lighting_off    R_IOPORT_PinWrite(&g_ioport_ctrl,LED1,BSP_IO_LEVEL_LOW)
#define LED1_lighting_up     R_IOPORT_PinWrite(&g_ioport_ctrl,LED1,BSP_IO_LEVEL_HIGH)
#define LED2_lighting_off    R_IOPORT_PinWrite(&g_ioport_ctrl,LED2,BSP_IO_LEVEL_LOW)
#define LED2_lighting_up     R_IOPORT_PinWrite(&g_ioport_ctrl,LED2,BSP_IO_LEVEL_HIGH)
/*********   函数声明      *********/
void led_1_flicker(void);
void led_2_flicker(void);
#endif


hal_entry.c

(1)在hal_entry()写入如下函数。(2)需要注意:我们上面只初始化了LED1,所以我们还需要使用rasc初始化LED2。否则LED2是不会闪烁的。

void hal_entry(void)
{
    /* TODO: add your own code here */
        while(1)
        {
            led_1_flicker();
            led_2_flicker();
        }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}
目录
相关文章
|
6月前
|
传感器 人工智能 IDE
探索电子技术的魅力:使用Arduino实现LED闪
探索电子技术的魅力:使用Arduino实现LED闪
|
6月前
|
传感器 Linux 编译器
不同平台下的点灯代码,你在点灯的哪个段位?
不同平台下的点灯代码,你在点灯的哪个段位?
|
芯片
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式(下)
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式
143 0
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式(下)
|
API
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式(上)
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式
201 0
|
Shell 芯片
荔枝派Zero(全志V3S)驱动开发之RGB LED灯
查看 V3S 原理图,查看 RGB LED对应的引脚 PG0 -> green LED PG1 -> blue LED PG2 -> red LED
403 0
【致敬未来的攻城狮计划】--RA2E1 开发板测评(3)按键输入
【致敬未来的攻城狮计划】--RA2E1 开发板测评(3)按键输入
137 0
【致敬未来的攻城狮计划】--RA2E1 开发板测评(4)UART通讯
【致敬未来的攻城狮计划】--RA2E1 开发板测评(4)UART通讯
155 0
|
Android开发 芯片
【致敬未来的攻城狮计划】--RA2E1 开发板测评(1)keil环境配置
【致敬未来的攻城狮计划】--RA2E1 开发板测评(1)keil环境配置
198 0
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
279 0
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32
【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32
500 0