- 2024-12-26
-
回复了主题帖:
2025年测评中心,DigiKey得捷赞助继续,欢迎跟帖推你期待的上线的测品啦~
nxp 的s32k144
- 2024-12-24
-
回复了主题帖:
【Follow me第二季第3期】任务提交贴
本帖最后由 breeze_i 于 2024-12-24 15:22 编辑
完整的请看这里
【Follow me第二季第3期】任务汇总提交贴重写版
- 2024-12-23
-
发表了主题帖:
【Follow me第二季第3期】任务汇总提交贴重写版
本帖最后由 breeze_i 于 2024-12-23 16:02 编辑
一、项目简介
本次实验通过按键选择波形输出,并可以通过ADC模块对DAC电压输出采样,并通过串口打印结果。
实验器材
1.EK-RA6M5开发板1块,
2.Windows电脑一台,
3.CH340串口转换工具一个
4.杜邦线若干,MicroUSB数据线两根
软件:
e2 studio
FreeMaster,
ch340驱动程序,
term串口显示工具,
Renesas Flash Programmer V3.14(烧录软件)
二、程序流程图
三、各任务具体实现代码
相关经验分享贴
【Follow me第二季第3期】 EK-RA6M5开发板开箱分享
【Follow me第二季第3期】 EK-RA6M5 开发前准备工作
【Follow me第二季第3期】入门任务,_quickstart工程调试
【Follow me第二季第3期】简单按键控制LED实验
【Follow me第二季第3期】基础任务:quad-spi flash和octo-spi flash读写速度测试
【Follow me第二季第3期】DAC配置生成波形及性能测试
【Follow me第二季第3期】进阶任务:示例程序中新增命令打印信息
【Follow me第二季第3期】扩展任务:简单信号发生器
这里主要介绍一下波形产生原理和按键扫描方法1、 三角波产生原理
定义一个全局变量gs_dac_value,开始时,每隔一定时间加一,然后写入到DAC,更新DAC输出,当gs_dac_value=4095时,接下来每隔一段时间减一,直到gs_dac_value==0,为一个周期。如果在10ms任务中加一,然后更新DAC输出,则,三角波的周期为10ms*4096*2=81920ms=81.92s,这个周期是比较长的,所以将DAC输出和LED连接产生的呼吸灯效果不是很明显,实际输出是没有问题的。
fsp_err_t DAC_output(void)
{
static int16_t a = 1;
gs_dac_value = (uint16_t) (gs_dac_value + a);
if (gs_dac_value >= 0x0FFF)
// if (gs_dac_value >= 0x5)
{
a = -1;
}
else if (gs_dac_value == 0)
{
a = 1;
}
fsp_err_t status = R_DAC_Write (&g_dac0_ctrl, gs_dac_value);
return status;
}
2、 正弦波产生原理
定期调用math.h库函数sin(),根据系统运行时间来计算正弦波输出,周期T=2π,无相位偏移,然后将电压波形向上偏移1V将负电压转化为正电压,再除以2,然后乘以DAC的精度(4096-1),即可输出正弦波。
fsp_err_t DAC_output_Sinewave(void)
{
fsp_err_t ret;
uint64_t currenttime = gs_dwTick;
uint64_t t_ms = (currenttime - gs_starttime); //ms
double t_s = (double) t_ms / 1000; //(double)(t_ms/1000);
DAC_value = (uint16_t) ((sin (t_s) + 1) / 2 * 4095);
gs_dac_value = DAC_value;
ret = R_DAC_Write (&g_dac0_ctrl, gs_dac_value);
return ret;
}
3、 按键扫描原理
要检测按键状态,检测与按键连接的IO口的输入电压即可,但是机械按键会有抖动,电压波动容易误判,所以需要再加上消抖,硬件消抖就是利用RC电路充放电来使得电压变化平滑,消除尖刺,达到消抖目的;软件消抖则是在第一次检测到电平变化之后,等待一段时间,待电压稳定后再次读取电平,如果,检测到按键仍然在按下状态,则说明按键按下了;另一种按键扫描则是,等检测到按键松开了再生成按键按下信号,不松开就会阻塞程序运行。
#include "key.h"
uint8_t keyscan(bsp_io_port_pin_t Key)
{
uint8_t ret = 0;
bsp_io_level_t keystatus = KEY_RELEASE;
bsp_io_level_t keystatus1 = KEY_RELEASE;
g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystatus);
if (keystatus == KEY_PRESS)
{
R_BSP_SoftwareDelay (KEY_SCAN_DELAY_MS, BSP_DELAY_UNITS_MILLISECONDS);
ret = g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystatus1);
if (keystatus == keystatus1)
{
ret = 1;
}
return ret;
}
return ret;
}
uint8_t Key_Scan(bsp_io_port_pin_t Key)
{ //阻塞式扫描按键
uint8_t ret = 0;
bsp_io_level_t keystate = KEY_RELEASE;
//bsp_io_level_t keystate1=KEY_RELEASE;
g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystate);
if (keystate == KEY_PRESS)
{
do
{
g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystate);
}
while (keystate == KEY_PRESS);
ret = 1;
}
return ret;
}
4、 串口
本项目中通过串口打印ADC采样数据,我选用的是串口7,在MyRA6M5Project工程中添加串口模块,并重定义Printf()函数。
在项目属性中可以看到,e2studio使用的工具链是GNU,通过查阅资料,找到printf()重定向代码如下(其实只写一个_write()函数就可以实现printf()函数打印到串口了,但是会有许多warning):
/* 重定向 printf 输出 */
int _isatty(int fd);
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char *ptr, int len);
int _fstat(int fd, struct stat *st);
int _write(int fd, char *pBuffer, int size)
{
(void) fd;
R_SCI_UART_Write (&g_uart7_ctrl, (uint8_t*) pBuffer, (uint32_t) size);
uart7_wait_for_tx ();
return size;
}
__attribute__((weak)) int _read(int file, char *ptr, int len)
{
(void) file;
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
R_SCI_UART_Read (&g_uart7_ctrl, (uint8_t*) ptr, 1); //__io_getchar();
ptr++;
}
return len;
}
__attribute__((weak)) int _isatty(int fd)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 1;
errno = EBADF;
return 0;
}
__attribute__((weak)) int _close(int fd)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 0;
errno = EBADF;
return -1;
}
__attribute__((weak)) int _lseek(int fd, int ptr, int dir)
{
(void) fd;
(void) ptr;
(void) dir;
errno = EBADF;
return -1;
}
__attribute__((weak)) int _fstat(int fd, struct stat *st)
{
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
{
st->st_mode = S_IFCHR;
return 0;
}
errno = EBADF;
return 0;
}
然后在项目属性中按如下图所示勾选3个选项
串口重定向完成。
四、视频
五、心得体会
EK-RA6M5这块开发板的MCU是瑞萨设计的基于M33内核的MCU,时钟最高可达200MHz,在m系列内核控制器中属于非常强大的了,而且丰富的外设资源,超多的IO引脚以及各种通信协议的支持让这块开发板可扩展性非常强!借着本次活动,我有幸体验了一下这块板子,强大的的硬件加上e2studio这款优秀的软件,让开发过程非常简单,省去了大量的写底层驱动的时间,这一点对初学者和缺乏时间的电子工程师来说非常棒。
一点小建议:希望e2studio里面可以增加Flash下载按钮(就像NXP的s32ds那样),Renesas Flash Programmer V3.14这个软件下载的速度太慢了,而且每次切换软件也不方便。还有,希望可以选择软件安装位置,C盘空间实在不够用了!
最后,祝eeworld和digikey越来越好!
-
上传了资料:
【Follow me第二季第3期】信号发生器工程文件
- 2024-12-22
-
回复了主题帖:
【Follow me第二季第3期】扩展任务:一个波形信号发生器
Juggernaut 发表于 2024-12-22 19:08
mobaxterm
好嘞,感谢大佬
-
发表了日志:
【Follow me第二季第3期】任务汇总提交贴
-
加入了学习《FollowMe 第二季:3 - EK_RA6M5 开发板入门》,观看 EK-RA6M5 开发板入门
- 2024-12-21
-
回复了主题帖:
【Follow me第二季第3期】扩展任务:一个波形信号发生器
大佬,请问视频中用到的串口工具叫什么名字?
- 2024-12-17
-
发表了日志:
【Follow me第二季第3期】DAC配置生成波形及性能测试(二)使用ADC采样DAC模块输出...
-
发表了主题帖:
【Follow me第二季第3期】DAC配置生成波形及性能测试(二)使用ADC采样DAC模块输出...
ADC配置
按照如下步骤在DAC工程中添加ADC模块
属性设置:
我选用的是Channel0,P000引脚,不使用中断。采样精度选最高的12bit
点击Generate Project Content生成代码。
驱动函数封装
在src文件夹下新adc.h,adc.c两个文件。
adc.c添加代码如下
#include "adc.h"
volatile bool scan_complete_flag = false;
uint16_t gs_adc_value=0;
void ADC_Init()
{
fsp_err_t status = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
if(status!=FSP_SUCCESS)
{
while(1);
}
status = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
if(status!=FSP_SUCCESS)
{
while(1);
}
}
//void adc_callback(adc_callback_args_t * p_args)
//{
// FSP_PARAMETER_NOT_USED(p_args);
// scan_complete_flag = true;
//}
void ADC_READ_DATA()
{
fsp_err_t status = R_ADC_ScanStart(&g_adc0_ctrl);
adc_status_t adc_status;
do{
status=R_ADC_StatusGet(&g_adc0_ctrl, &adc_status);
}while(adc_status.state==ADC_STATE_SCAN_IN_PROGRESS);
//if(scan_complete_flag==true)
{
status = R_ADC_Read(&g_adc0_ctrl,ADC_CHANNEL_0, &gs_adc_value);
// scan_complete_flag = false;
}
}
注意ADC转换需要时间,尽管只要0.4us,但这个时间对mcu来说还是很长的,在开始扫描之后需要等待转换完成之后,才能读取到数据。
然后再在hal_entry()函数中中调用ADC_Init()函数,初始化ADC模块。
在1ms任务中调用ADC 读取函数
使用Freemaster观测dac模块设定输出值和adc模块采集到的电压值,可以看到两条曲线基本重合,说明dac模块的输出还是挺准的。
- 2024-12-15
-
发表了主题帖:
【Follow me第二季第3期】任务提交贴
首先感谢eeworld论坛和digikey对电子爱好者的大力支持,感谢提供了这样一个学习的机会。
任务提交:
准备工作
https://bbs.eeworld.com.cn/thread-1297415-1-1.html
https://bbs.eeworld.com.cn/thread-1297445-1-1.html
入门任务
https://bbs.eeworld.com.cn/thread-1301454-1-1.html
https://bbs.eeworld.com.cn/thread-1298078-1-1.html
基础任务
https://bbs.eeworld.com.cn/thread-1301576-1-1.html
https://bbs.eeworld.com.cn/thread-1301868-1-1.html
【Follow me第二季第3期】进阶任务:示例程序中新增命令打印信息
【Follow me第二季第3期】扩展任务:简单信号发生器
由于时间不够了,先写到这里
-
发表了日志:
【Follow me第二季第3期】任务提交贴
-
发表了主题帖:
【Follow me第二季第3期】扩展任务:简单信号发生器
在DAC任务中已经实现了三角波和正弦波的生成,本次结合按键,使用按键选择输出的波形。
新增全局变量wave_select,当wave_select==0,输出三角波,当wave_select==1,输出正弦波。
在100ms任务扫描按键,根据按下的按键切换波形;在10ms任务中输出波形。
void Timer_10msTask()
{
if(wave_select==0)
{
DAC_output();
}
else
{
DAC_output_Sinewave();
}
}
void Timer_100msTask()
{
static uint8_t led1level=BSP_IO_LEVEL_LOW;
if(keyscan(KEY_S1)==1)
// if(Key_Scan(KEY_S1)==1)
{
wave_select=0;
// led1level=!led1level;
// g_ioport.p_api->pinWrite(g_ioport.p_ctrl,LED1_BLUE,led1level);
// R_BSP_SoftwareDelay(350,BSP_DELAY_UNITS_MILLISECONDS);
}else if(keyscan(KEY_S2)==1)
{
wave_select=1;
}
}
三角波和正弦波实现代码如下
/*
* dac.c
*
* Created on: 2024年12月12日
* Author: LXL
*/
#include "dac.h"
#include <math.h>
#include <stdint.h>
#include "haL_data.h"
uint16_t gs_dac_value=0;
uint64_t gs_starttime=0;
uint16_t DAC_value=0;
extern uint64_t gs_dwTick;
fsp_err_t DAC_Init(void)
{
fsp_err_t status = R_DAC_Open(&g_dac0_ctrl, &g_dac0_cfg);
status = R_DAC_Write(&g_dac0_ctrl, 0);
status = R_DAC_Start(&g_dac0_ctrl);
gs_starttime = gs_dwTick;
return status;
}
fsp_err_t DAC_output(void)
{
static int16_t a=1;
gs_dac_value=(uint16_t)(gs_dac_value+a);
if(gs_dac_value>=0x0FFF)
// if (gs_dac_value >= 0x5)
{
a = -1;
}
else if (gs_dac_value == 0)
{
a = 1;
}
fsp_err_t status = R_DAC_Write(&g_dac0_ctrl, gs_dac_value);
return status;
}
fsp_err_t DAC_output_Sinewave(void)
{
fsp_err_t ret;
uint64_t currenttime=gs_dwTick;
// uint16_t DAC_value=0;
uint64_t t_ms=(currenttime-gs_starttime); //ms
double t_s =(double)t_ms/1000;//(double)(t_ms/1000);
DAC_value=(uint16_t)((sin(t_s)+1)/2*4096);
gs_dac_value=DAC_value;
ret = R_DAC_Write(&g_dac0_ctrl, gs_dac_value);
return ret;
}
实验现象:
将dac输出引脚和LED3使用杜邦线连接。
[localvideo]d14d2dcc38774172c4b21a036537efcf[/localvideo]
可以看到,运行后默认输出三角波,按下按键s2切换为正弦波,按下按键s1切换回三角波,由于从led看现象并不明显,所以使用freemaster直接查看gs_dac_value的值,这样直观一些。
-
发表了日志:
【Follow me第二季第3期】扩展任务:简单信号发生器
-
发表了主题帖:
【Follow me第二季第3期】进阶任务:示例程序中新增命令打印信息
本次任务是进阶任务:示例程序中新增命令打印信息。
在memu_main.c中修改s_menu_items菜单数组。添加,Hello Information,对应函数为hello_display_menu。
/* Table of menu functions */
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 }
};
然后//memu_kis.c文件中新增以下代码
//memu_kis.c
#define HELLO_OPTIONS "\r\n\x1b[2m\x1b[37m a) FollowMe 2-3 " \
"\r\n\x1b[2m\x1b[37m a) Kit name: %s " \
"\r\n\x1b[2m\x1b[37m b) Kit ordering part number: %s " \
"\r\n\x1b[2m\x1b[37m c) RA Device part number: %s" \
"\r\n\x1b[2m\x1b[37m d) RA MCU 128-bit Unique ID (hex): " \
"\x1b[32m%08x\x1b[37m-\x1b[32m%08x\x1b[37m-\x1b[32m%08x\x1b[37m-\x1b[32m%08x\x1b[37m" \
"\r\n\x1b[2m\x1b[37m e) RA MCU Die temperature (F/C): \x1b[32m%d.%02d/%d.%02d\x1b[37m " \
"\r\n\x1b[2m\x1b[37m f) Blue LED blinking frequency (Hz): \x1b[32m%d\x1b[37m " \
"\r\n\x1b[2m\x1b[37m g) Blue LED blinking intensity (%%%%): \x1b[32m%d\x1b[37m "
//memu_kis.c
test_fn hello_display_menu(void)
{
int8_t c = -1;
uint16_t wn_mcu_temp_f = 0;
uint16_t fr_mcu_temp_f = 0;
uint16_t wn_mcu_temp_c = 0;
uint16_t fr_mcu_temp_c = 0;
bsp_unique_id_t const * p_uid = R_BSP_UniqueIdGet ();
sprintf (s_print_buffer, "%s%s", gp_clear_screen, gp_cursor_home);
/* ignoring -Wpointer-sign is OK when treating signed char_t array as as unsigned */
print_to_console((void*)s_print_buffer);
//sprintf (s_print_buffer, MODULE_NAME, g_selected_menu);
sprintf (s_print_buffer, "Eeworld and Dgikey is very good", g_selected_menu);
/* ignoring -Wpointer-sign is OK when treating signed char_t array as as unsigned */
print_to_console((void*)s_print_buffer);
wn_mcu_temp_f = g_board_status.temperature_f.whole_number;
fr_mcu_temp_f = g_board_status.temperature_f.mantissa;
wn_mcu_temp_c = g_board_status.temperature_c.whole_number;
fr_mcu_temp_c = g_board_status.temperature_c.mantissa;
sprintf (s_print_buffer, HELLO_OPTIONS, FULL_NAME, PART_NUMBER, DEVICE_NUMBER,
(int_t)p_uid->unique_id_words[0], (int_t)p_uid->unique_id_words[1], // typedef uint_t in stdint.h
(int_t)p_uid->unique_id_words[2], (int_t)p_uid->unique_id_words[3], // as signed long long int64_t;
wn_mcu_temp_f, fr_mcu_temp_f, wn_mcu_temp_c, fr_mcu_temp_c,
g_pwm_rates_data[g_board_status.led_frequency], g_pwm_dcs_data[g_board_status.led_intensity]);
/* ignoring -Wpointer-sign is OK when treating signed char_t array as as unsigned */
print_to_console((void*)s_print_buffer);
sprintf (s_print_buffer, MENU_RETURN_INFO);
/* ignoring -Wpointer-sign is OK when treating signed char_t array as as unsigned */
print_to_console((void*)s_print_buffer);
/* provide small delay so board_status should be up to date */
vTaskDelay (s_ticks_to_wait);
xEventGroupSetBits (g_update_console_event, STATUS_DISPLAY_MENU_KIS);
while (CONNECTION_ABORT_CRTL != c)
{
c = input_from_console ();
if ((MENU_EXIT_CRTL == c) || (CONNECTION_ABORT_CRTL == c))
{
break;
}
}
xEventGroupClearBits (g_update_console_event, STATUS_DISPLAY_MENU_KIS);
return (0);
}
编译,下载运行。
可以看到,新增的Eeworld and Dgikey is very good和fellow Me 2-3字样,新增命令成功。
-
发表了日志:
【Follow me第二季第3期】进阶任务:示例程序中新增命令打印信息
- 2024-12-14
-
发表了日志:
【Follow me第二季第3期】DAC配置生成波形及性能测试
-
发表了主题帖:
【Follow me第二季第3期】DAC配置生成波形及性能测试
本帖最后由 breeze_i 于 2024-12-17 21:25 编辑
简介:本次实验使用RA6M5的片内外设DAC模块,产生三角波和正弦波,驱动LED,实现呼吸灯效果。
打开用户手册,找到DAC模块,框图如下:
可以看到,这是一个转换精度12为的ADC,有两路输出,在原理图中看到DA0对应的引脚是P014。本次将DAC输出通过杜邦线连接到LED3上。
二、模块配置
打开e2studio,如图打开FSP配置界面:添加DAC模块。
三、三角波、正弦波实现
第一个DAC_output()是三角波,第二个函数DAC_output_sineware()是生成正弦波。
fsp_err_t DAC_output(void)
{
static int16_t a=1;
gs_dac_value=(uint16_t)(gs_dac_value+a);
if(gs_dac_value>=0x0FFF)
// if (gs_dac_value >= 0x5)
{
a = -1;
}
else if (gs_dac_value == 0)
{
a = 1;
}
fsp_err_t status = R_DAC_Write(&g_dac0_ctrl, gs_dac_value);
return status;
}
fsp_err_t DAC_output_Sinewave(void)
{
fsp_err_t ret;
uint64_t currenttime=gs_dwTick;
// uint16_t DAC_value=0;
uint64_t t_ms=(currenttime-gs_starttime); //ms
double t_s =(double)t_ms/1000;//(double)(t_ms/1000);
DAC_value=(uint16_t)((sin(t_s)+1)/2*4096);
ret = R_DAC_Write(&g_dac0_ctrl, DAC_value);
return ret;
}
四、实验现象
使用杜邦线将P014和P008短接,将工程中P008引脚去使能,即保持在高阻态。
1.在10ms任务中调用三角波生成函数DAC_outoput();实验现象如视频所示(可能是白天太亮了,手机摄像头录的LED3变化不明显)。
[localvideo]f66ee56947b892bc6def4864312da07e[/localvideo]
2.在10ms任务中调用三角波生成函数DAC_outoput_Sineware();实验现象如视频所示(这次把旁边的绿色led2关掉试试),可以看到红色LED3的明暗变化,实现了呼吸灯效果,然后打开FreeMaster看一下DAC生成的波形是按照正弦规律变化的。
[localvideo]b764cb1016080b6b91a7fdaaef3d3e48[/localvideo]
下面配置ADC模块。
按照如下步骤在DAC工程中添加ADC模块
属性设置:
我选用的是Channel0,P000引脚,不使用中断。采样精度选最高的12bit
点击Generate Project Content生成代码。
驱动函数封装
在src文件夹下新adc.h,adc.c两个文件。
adc.c添加代码如下
#include "adc.h"
volatile bool scan_complete_flag = false;
uint16_t gs_adc_value=0;
void ADC_Init()
{
fsp_err_t status = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
if(status!=FSP_SUCCESS)
{
while(1);
}
status = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
if(status!=FSP_SUCCESS)
{
while(1);
}
}
//void adc_callback(adc_callback_args_t * p_args)
//{
// FSP_PARAMETER_NOT_USED(p_args);
// scan_complete_flag = true;
//}
void ADC_READ_DATA()
{
fsp_err_t status = R_ADC_ScanStart(&g_adc0_ctrl);
adc_status_t adc_status;
do{
status=R_ADC_StatusGet(&g_adc0_ctrl, &adc_status);
}while(adc_status.state==ADC_STATE_SCAN_IN_PROGRESS);
//if(scan_complete_flag==true)
{
status = R_ADC_Read(&g_adc0_ctrl,ADC_CHANNEL_0, &gs_adc_value);
// scan_complete_flag = false;
}
}
注意ADC转换需要时间,尽管只要0.4us,但这个时间对mcu来说还是很长的,在开始扫描之后需要等待转换完成之后,才能读取到数据。
然后再在hal_entry()函数中中调用ADC_Init()函数,初始化ADC模块。
在1ms任务中调用ADC 读取函数
使用Freemaster观测dac模块设定输出值和adc模块采集到的电压值,可以看到两条曲线基本重合,说明dac模块的输出还是挺准的。
- 2024-12-12
-
发表了主题帖:
【Follow me第二季第3期】基础任务:quad-spi flash和octo-spi flash读写速度测试
本帖最后由 breeze_i 于 2024-12-12 21:18 编辑
由于_quickstart示例工程中已经实现了对quad-spi flash和octo-spi flash读写速度测试的功能,我在这里顺便测试一下两种spi的速度,配置放到后面。
插上mico USB线,连接开发板的全速USB接口(靠近LED灯的那个,丝印为USB FULL SPEED)到电脑USB;打开teraterm,选择对应端口打开,即可看到菜单。
根据提示,输入4进入quad-spi flash和octo-spi flash读写速度测试的功能:
quad-spi flash和octo-spi flash读写时间对比
size
8
16
24
32
40
48
56
64
WRITE
quad-spi flash
7973
15926
23974
31884
39889
47927
55826
63981
octo-spi flash
4445
8901
13399
17802
22343
26735
31180
35753
READ
quad-spi flash
788
1588
2387
3198
3986
4775
5575
6374
octo-spi flash
127
245
383
522
650
778
916
1055
可以看出,quad-spi flash的读写时间都是octo-spi flash 的读写时间的两倍,即octo-spi flash速度是quad-spi flash的两倍。
查看用户手册可知,quad-spi有四根数据线,
octa-spi有8根数据线,每次传输的位数刚刚好是前者的两倍。
- 2024-12-11
-
发表了日志:
【Follow me第二季第3期】基础任务:quad-spi flash和octo-spi flash读写速度测试