QuaX_Chow

个性签名:

github.com/Amanitaphalloide

  • 2025-01-08
  • 发表了日志: 搓了块国产FPGA遨格芯AG10K的板子,水一下踩坑经历

  • 2025-01-07
  • 加入了学习《【Follow me第二季第3期】玩转EK-RA6M5开发板》,观看 【Follow me第二季第3期】玩转EK-RA6M5开发板

  • 2024-12-15
  • 回复了主题帖: 【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)

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

  • 加入了学习《FollowMe 第二季:3 - EK_RA6M5 开发板入门》,观看 EK-RA6M5 开发板入门

  • 上传了资料: 【Follow me第二季第3期】玩转EK-RA6M5资料包

  • 2024-11-21
  • 回复了主题帖: STM32全球线上峰会,STM32N6重磅发布啦!

    已报名

  • 2024-11-18
  • 发表了日志: 【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)

  • 发表了主题帖: 【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)

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

最近访客

< 1/2 >

统计信息

已有17人来访过

  • 芯积分:765
  • 好友:--
  • 主题:8
  • 回复:9

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言