【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界面属性找到对应函数
再修改例程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 结构体中成员值的效果,实现四种波形、四种频率的输出
分别为:
- 正弦波
- 方波
- 三角波
- 随机波
正弦波实现方法与基础任务类似方波则是通过计数的方式实现。
三角与方波类似,添加上升和下降的判断逻辑即可
随机波形则是使用到了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
|