72|1

18

帖子

6

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴) [复制链接]

  本帖最后由 QuaX_Chow 于 2024-12-15 23:10 编辑

2024/11/18


这次给大家带来的是Follow Me第二季第3期任务的速通教学(又双鸽了很久

 

感谢主办方eeworld、得捷电子的支持。感谢我人生路上的每个人。


内容一:3-5分钟短视频

内容二:本篇

内容三:本次活动的资料包

 

开始前我们先将两根usb线分别连接开发板全速USB和DEBUG,再准备一台示波器

 

开发环境搭建

首先我们在github上下载瑞萨的fsp&e2 studio整合安装包

链接已隐藏,如需查看请登录或者注册

 

下载完成后双击安装包

 

 
选择自定义安装
 
 
安装终端,省的看串口时切程序
 
 
默认勾选内容即可,点 Next 
 
 
最下面那栏 Renesas AI 可以不勾选,节省点空间
 
 

选择接受协议

 

 

等待安装完成即可

安装完成后双击安装好的程序

选择工作空间,这里我就使用默认的workspace

 

 

弹出登录界面,登录自己的瑞萨账号:

 

 

安装完成!

 

接下来的部分操作基于教学直播和官方guider

 

入门任务

----下载调试示例程序,Blink,按键----

 

官方为开发者提供的例程地址

下载好例程,解压至与workspace同级的文件夹方便查找

 

因为我们需要用到官方例程,所以需要将源工程导入进我们的workspace

工具栏第一项-导入-现有项目到工作空间中

 

 
根目录就是例程文件夹-_quickstart,单击该文件夹,归档文件不用选择。同时勾选下面的“将项目复制到工作空间中”:
 

 

 

 

通过按键切换blink LED的亮度、频率,共4x4种情况,我们需要进行以下修改:

 

 
 
 
 
 
 

点击工具栏的锤子进行编译下载,再点小虫子调试

在监视器表达式窗口中添加g_board_status,并可以将其设置为实时刷新,方便我们观察程序运行效果:

 

 

实际监控效果如下:

 

 

实际效果如下:

 

 

任务完成!

 

基础任务

----quad-spi flash和octo-spi flash配置及读写速度测试----

 

示例代码中已经给我们进行了功能实现,直接测试即可:

 

 

结果如下,速度还是可以的:

Reading from flash completed

-------------------------------------------------
Operation/Flash     Quad-SPI       Octa-SPI
-------------------------------------------------
Write                 64311          37619
Read                   6374           1044
-------------------------------------------------

 

我们看一下SPI的读写代码,以部分OSPI读取数据为例:

 

#ifdef READ_AS_SINGLE_BLOCK
    /* Start timer */
    R_GPT_Start(g_memory_performance.p_ctrl);

    R_OSPI_XipEnter(g_ospi.p_ctrl);
        memcpy (p_dest, p_src, (data_size * 1024) / 4);
    R_OSPI_XipExit(g_ospi.p_ctrl);

    /* Stop timer */
    R_GPT_Stop(g_memory_performance.p_ctrl);
#endif

    R_GPT_StatusGet(g_memory_performance.p_ctrl, &status);
    R_GPT_Reset(g_memory_performance.p_ctrl);
    R_GPT_Close(g_memory_performance.p_ctrl);

    return (status.counter);
}

 

以上代码用于测量从flash读数据所需的时间:

启动定时器开始计时,将 OSPI 控制器切换到 XIP模式,允许直接从外部存储器执行代码

使用 memcpy 函数将数据从源地址 p_src 复制到目标地址 p_dest,复制的数据大小为 (data_size * 1024) / 4 字节

再退出 XIP 模式,恢复 OSPI 的正常操作模式

最后,停止定时器结束计时。获取定时器的状态信息并存储在 status 结构体中,重置定时器以清除其计数值,返回定时器的计数值

 

 

整个程序还是相当复杂的,若想深入了解还需研究例程中QSPI和OSPI单独的工程。

 

 

----DAC配置生成波形及性能测试----

 

先在配置界面使能DAC:

 

 
发现与ADC引脚冲突,失能ADC对应pin
 
 
在DAC界面属性找到对应函数
 
 
先将其中两个拖进 common_init.c
 

 

再修改例程LED的回调函数如下:

 

#include "math.h"
#define M_PI        3.14159265358979323846
/**********************************************************************************************************************
 * Function Name: gpt_blue_callback
 * Description  : Callback function for driver g_gpt_blue.
 * Argument     : p_args
 * Return Value : .
 *********************************************************************************************************************/
void gpt_blue_callback(timer_callback_args_t * p_args)
{
    /* Void the unused params */
    FSP_PARAMETER_NOT_USED(p_args);
    
    uint16_t dacvalue = 0;
    static double w = 0.0;
    w += M_PI/90;
    if(w > 2*M_PI)
    {
        w = 0.0;
        
    }
    
    dacvalue = (sin(w) + 1) / 2 * 4095;
    
    R_DAC_Write(&g_dac0_ctrl, dacvalue);

    switch (s_blueled_flashing)
    {
        case ON:

 

FFT可见DAC输出效果可观,作为片上集成完全够用:

 

 

 

任务完成!

 

进阶任务

----示例程序中新增命令打印信息----

 

两步即可

1、修改.c

 
 
static st_menu_fn_tbl_t s_menu_items[] =
{
    {"HELLO Information"                       , hello_display_menu},
    {"Kit Information"                         , kis_display_menu},
    {"Web Server"                              , eth_emb_display_menu},
    {"Network Name Lookup"                     , eth_www_display_menu},
    {"Quad-SPI and Octo-SPI Speed Comparison"  , ext_display_menu},
    {"Cryptography and USB High speed (MSC)"   , enc_display_menu},
    {"Next Steps", ns_display_menu },
    {"", NULL }
};

 

2、头文件也需要修改:
 

 

效果如下:

 

 

任务完成!

 

扩展任务

----设计一个类似信号发生器功能的例程----

----通过命令或按键,设置DAC输出波形----

----可通过flash存储历史波形等信息----

 

与基础任务类似,我将函数发生功能在回调函数中实现。

利用按键改变 g_board_status 结构体中成员值的效果,实现四种波形、四种频率的输出

 

分别为:

  1. 正弦波
  2. 方波
  3. 三角波
  4. 随机波

正弦波实现方法与基础任务类似方波则是通过计数的方式实现。

三角与方波类似,添加上升和下降的判断逻辑即可

随机波形则是使用到了C语言中随机数的生成,具体可以了解下 rand() 函数

回调函数代码如下:

 

#include "math.h"
#include "stdlib.h"
#define M_PI        3.14159265358979323846
static uint16_t wavemode = 0;
/**********************************************************************************************************************
 * Function Name: gpt_blue_callback
 * Description  : Callback function for driver g_gpt_blue.
 * Argument     : p_args
 * Return Value : .
 *********************************************************************************************************************/
void gpt_blue_callback(timer_callback_args_t * p_args)
{
    /* Void the unused params */
    FSP_PARAMETER_NOT_USED(p_args);

    uint16_t dacvalue = 0;
    static uint16_t squareval = 0;
    static uint16_t trista = 0;
    static double w = 0.0;
    wavemode = g_board_status.led_intensity;
    if(g_board_status.led_intensity == 0 )
    {
        w += M_PI/(60*(g_board_status.led_frequency+1));
        if(w > 2*M_PI)
        {
            w = 0.0;

        }

        dacvalue = (sin(w) + 1) / 2 * 4095;
    }

    if(g_board_status.led_intensity == 1 )
        {
            dacvalue = squareval*4095;
            w += 0.1*(g_board_status.led_frequency+1);
            if(w > 2*M_PI)
            {
                w = 0.0;
                squareval = !squareval;
                dacvalue = squareval*4095;
            }

        }

    if(g_board_status.led_intensity == 2 )
    {

        if(trista == 0)
        {
            w += 0.1*(g_board_status.led_frequency+1);
            if(w>=4) trista = !trista;
        }
        else {
            w -= 0.1*(g_board_status.led_frequency+1);
            if(w<=0) trista = !trista;
        }
        dacvalue = (w / 4.5)*4095 ;

    }

    if(g_board_status.led_intensity == 3 )
    {

        dacvalue = rand()%4095;
    }

 

而将历史波形写入flash也很简单。

 

 

回调函数中添加判断,若改变了输出波形,则将对应的波形代号写入flash:

 

static uint16_t flag_wavemode = 4;
static uint16_t frq_wavemode = 4;

/**********************************************************************************************************************
 * Function Name: gpt_blue_callback
 * Description  : Callback function for driver g_gpt_blue.
 * Argument     : p_args
 * Return Value : .
 *********************************************************************************************************************/
void gpt_blue_callback(timer_callback_args_t * p_args)
{
    /* Void the unused params */
    FSP_PARAMETER_NOT_USED(p_args);

    uint16_t dacvalue = 0;
    static uint16_t squareval = 0;
    static uint16_t trista = 0;
    static double w = 0.0;
    wavemode = g_board_status.led_intensity;

    if( flag_wavemode != wavemode | frq_wavemode != g_board_status.led_frequency )
    {
        write_record_ospi(flag_wavemode,frq_wavemode);
    }

 

参考OSPI编写的写函数如下:

 

static void write_record_ospi(uint16_t param1, uint16_t param2)
{
    fsp_err_t err;
    uint32_t test_var;

    /* Cast to required type */
    uint8_t * p_dest = (uint8_t *)OSPI_DMA_ADDRESS;

    /* Define the data to be written (in this case, the two uint16_t parameters) */
    uint8_t data_to_write[4];  // 2 uint16_t = 4 bytes
    data_to_write[0] = (uint8_t)(param1 & 0xFF);   // Lower byte of param1
    data_to_write[1] = (uint8_t)((param1 >> 8) & 0xFF); // Higher byte of param1
    data_to_write[2] = (uint8_t)(param2 & 0xFF);   // Lower byte of param2
    data_to_write[3] = (uint8_t)((param2 >> 8) & 0xFF); // Higher byte of param2

    /* Loop to write the data to Flash */
    for (test_var = 0; test_var < OSPI_TEST_PAGE_SIZE / sizeof(data_to_write); test_var++)
    {
        /* Perform the actual OSPI write operation */
        err = R_OSPI_Write(g_ospi.p_ctrl, s_page, p_dest, OSPI_TEST_PAGE_SIZE);
        if (FSP_SUCCESS != err)
        {
            __asm("bkpt");
        }

        //ospi_test_wait_until_wip();
        p_dest += OSPI_TEST_PAGE_SIZE;
    }

    /* Return some status or indication after writing (can be modified based on actual requirement) */
    //return 0; // or other status as needed
}

 

波形输出效果如下(GIF有点大要加载一会):

 
 
 

类信号发生器功能实现,任务完成!

 

对本活动的心得体会

 

最后还是感谢活动举办方EEWorld和得捷电子的支持

 

这块开发板的功能丰富,还有很多没用到的外设,如:以太网、QWIIC,甚至还有树莓派接口

 

值得研究

 


2024/12/15

 

 

 

 

点赞 关注
个人签名

github.com/Amanitaphalloide

 
 

回复
举报

18

帖子

6

TA的资源

一粒金砂(中级)

沙发
 
内容一视频链接有误,正确网址为https://training.eeworld.com.cn/course/68853
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表