致敬未来的攻城狮计划

前言

这回参加的是csdn李肯老师的攻城狮计划,简单说就是我白嫖板子,输出学习笔记。

552ca9fa46d8c1c7f192cdad4d207d4

板子是瑞萨的CPK_RA2E1,还有触摸元件,看起来很有意思hh。

环境搭建

一开始决定采取vscode搭建的方式。后期进行到最后一步——cmake build的时候一直显示语法错误,肯哥表示是环境配置不全,但是我反反复复根据官网和其他博主的文章检查了不下10遍都不知道问题何在。最终决定还是老老实实用keil。

  1. keil导入瑞萨包。官网下载地址:Arm Keil | Renesas

  2. 下载rasc软件。对于这个东西我的理解是类似stm32cubemx,可以快速初始化项目的软件。该软件可以在瑞萨官网下载:https://www2.renesas.cn/kr/en/software-tool/ra-smart-configurator

  3. 接下来我们尝试新建编译一个项目。这是我第一次没有跟着一块有完整开发流程的板子的视频课,而几乎完全是自己检索资料探索尝试的项目构建,因此碰到了很多弯路。首先rasc软件我们新建一个项目。

    项目起名

    板子型号这里是根据我的学习板设置的。IDE一定记得改为keil。

    image-20230601022545320

后两页选择 no rtos 和 minimal 即可,因为我们现在的目的只是尝试编译通过一个项目。

  1. 添加完成后,点击generate code 生成相关的项目代码。然后用keil打开,尝试编译。

  2. 我第一次遇到的问题是报了19个错。我还以为是pack导入的不对,但是后来搜了一下发现不是那么回事,是编译方式选错了。参考文章:keil出现大量未知语法错误(系统移植)_portforce_inline_IT小生lkc的博客-CSDN博客

    image-20230601022913830

  3. 于是我把编译器改为version5,编译到一半,再次报错:error: A3903U: Argument ‘Cortex-M7.fp.sp’ not permitted for option cpu’.。这个问题原因是因为编译器版本太低,于是我又去下载了新的keil5.

  4. 再次编译的时候提示我,不能用version5,新版本已经不支持了。于是我又改为version6进行编译。这次非常顺利!

image-20230601023151749

下载

终于考完试了,然而攻城狮的截止期限也快到了QAQ,得尽快水(划掉)写几篇文章了!

先争取可以成功下载一个空的程序。

先对上一篇文章下载 DFP 也就是 keil MDK Software Packs 做一个补充。我们要下载的是 RA_DFP,下载地址为:Arm Keil | Renesas RA_DFP

至于版本我看到有前辈使用 3.5.0 的版本可以成功运行,而我下载的是4+的版本也可以。只不过在选择 device 的时候会有一点不同:
image-20230622160103209

可以看到 4.1.0 的版本无法细化选择到 R7FA2E1A92DFM,只能选择大类 A9. 不过经过下面的烧录尝试,是没有问题的。

流程:基于上次的空项目,用keil打开,编译,下载成功。

一直到编译的步骤前面都做完了。下载主要需要以下几个步骤:

  1. 引入项目的 src 文件夹。在 options for target - c/c++ 里引入即可很简单。image-20230622154546545
  2. debug 模式设置为 jlink 模式。设置完之后插上板子设置配置,这里因为我的jlink版本太低出现了一个报错:unkown to this version of the jlink software。解决办法就是在官网上下载了一个新版本的jlink(官网链接:https://www.segger.com/downloads/jlink,我选择的是 windows 版本),下载好后直接会提示“检测到你电脑里的 keil 环境,请问是否更新其 jlink 调试器”,更新后重新启动就没有问题了。
  3. 上一步参考文章: keil识别不到芯片,提示unkown to this version of the jlink software_keil识别不到单片机_王小琪0712的博客-CSDN博客 里面也有如果没有提示自动更新 jlink 调试器的选项如何手动进行更新的步骤,建议多多支持原作者。
  4. 只是选择了 jlink 调试器也并不算设置完成。如果这个时候点击下载,会提示“找不到 flash”,也就是还没有配置完成,需要设置闪存。首先确保插上了板子,然后打开 jlink 的setting:image-20230622155204869
  5. 如果显示下图说明板子被正常识别。如果没有显示这些数据,可能是 jlink 的版本还是过低,或者线坏了,或者还未下载对应 rcsa 包。image-20230622155322848
  6. 接下来我们配置 flash download. 打开这个页面后点击 add,添加图中所示的这款型号芯片,然后 start 和 size 应该就会自动配置成和图中一样的情形,这样就算成功了。image-20230622155451715
  7. 点击 load,如果显示如下信息说明成功下载程序。image-20230622155546525

刚插上板子的时候板子上是有白色的 power 指示灯和一个红蓝交替闪烁灯。下载空程序之后,应该只有电源指示灯还在亮。

de933bcec619535b3e8b7fe60f61238

点亮LED

本文主要参考文章:【致敬未来的攻城狮计划】— 连续打卡第十一天:FSP固件库开发点亮第一个灯。_嵌入式up的博客-CSDN博客

在32阶段我们已经接触过类似做法了。初始化引脚模式(可以手动库函数,或者在工具包图形化界面里配置),设置引脚输出值。

设置 FSP Smart Configurator

像上次一样创建一个项目。

首先我们翻一下RA2E1的数据手册看看led在哪。

image-20230624005444720

如图所示,一红一蓝,502 501,输出高电平亮。

因此 configurator 里的pin如图所示设置501 502为output initial high

image-20230624005611958

配置完成后点击右上角 generate project content,输出更新配置到该项目中。

Keil代码编写

接下来就是编写keil里,驱动两个led灯输出高电平的部分了。

image-20230624011259206

hal_entry.c 是相当于 main.c 的入口函数。其他都是 configurator 提供的配置函数。

引脚设置已经设置好了。我们打开 pin_data.c 可以看到:

image-20230624011748710

这就代表确实初始化配置加进代码里了。

然后在 hal_entry.c 里是通过这个 open 函数在 warm_start 里初始化了。

image-20230624012345948

接下来我们需要一个写入位函数。在 r_ioport.c 里。

image-20230624012543274

参数1:固定参数,传入 &p_ctrl。

参数2:引脚,老方法 goto the definition

image-20230624013133790

参数3:电平。

image-20230624013206720

然后就简单了,只需要在主函数里调用write函数写亮led。

1
2
3
4
5
6
7
8
9
10
11
12
13
void hal_entry(void)
{
/* TODO: add your own code here */
while(1){
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH);
}

#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

实验结果

image-20230624013456059

按键模块

后台轮询

按键也是一个比较简单的模块,主要是为了学习IO输入模式。

查看RA2E1电路图可见:

image-20230624133704709

按键相关引脚是004引脚,默认上拉高电平,按下接地为低电平。

首先第一步还是设置对应引脚。类似上一期设置LED的方式,只不过Mode改为Input mode。

image-20230624133750237

设置好之后仍然是记得generate。

然后就是程序编写。首先还是明确一下开发流程。首先我们尝试后台轮询的按键检测。在while里不断检测按键电平,如果为高点亮蓝灯,如果为低点亮红灯。

点亮好写,上一次已经尝试过write函数。那么我们接下来再去看类似的read函数。

image-20230624135423601

第一个参数还是传入固定的&g_ioport_ctrl。第二个是引脚。第三个是存放我们要存储的读取按键的值。比如传入变量state的地址 &state,函数执行结束后state的值就是读取的按键电平。

主函数编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void hal_entry(void)
{
bsp_io_level_t state;
/* TODO: add your own code here */
while(1){
R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_04,&state);
if(state==BSP_IO_LEVEL_HIGH){
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW);
}
else{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH);
}
}

#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

实现效果:

8d99e5ae0be2c97e2e2bb44a1ed92f6

59b0f842762bb1349190932bdcb4e74

活动总结

一转眼攻城狮计划就已经到了最后一天了。
5月我还处在一个迷茫期,那时候刚刚入坑嵌入式,只学了几款电子积木,对整个体系也不是很清楚,也不知道应该学些什么。因为刚刚转到硬件领域,也缺少相关经历和能力证明,科研实习面试都失败了。

一开始得到的少许鼓励来源于C站推荐的一系列交流会活动。我去参加了RTThread的学习营,第一次尝试在单片机开发中加入RTOS系统,也算是跳脱出自己当时缓慢的按部就班学习路线,如井底之蛙般弹出脑袋窥探了一眼外面的风景。

后来偶然收到李肯老师的攻城狮活动邀请。虽然因为选在了期末周,自己又比较懒,基本没更几篇文章hh。但是借助李肯老师的交流活动认识了很多嵌入式领域的前辈,同伴,从每天的交流话题中也能学到很多。

image-20230624180328147

现如今,虽然学到的知识相比之前可能没有太多,但是整个系统的框架,从硬件到ISA,操作系统解释器等系统软件,汇编语言和机器语言的转化等……确实见识到了很多。

再聊到本次活动。虽然自己没有做过多的尝试,但是因为之前我也只尝试过51和32的库函数开发,rcsa的configurator配置本身对我来说就是一种新奇的开发模式。与32的hal库对比更能让我体会到这些driver的便捷之处,也开始适应这种开发方式。

非常感谢给予这次机会的李肯老大!也期望自己能保持这股热情继续学下去~

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2024 Jingqing3948
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信