- 2024-12-15
-
回复了主题帖:
【Follow me第二季第3期】玩转EK-RA6M5开发板 (全流程综合贴)
内容一视频链接有误,正确网址为https://training.eeworld.com.cn/course/68853
-
加入了学习《【Follow me第二季第3期】玩转EK-RA6M5开发板》,观看 【Follow me第二季第3期】玩转EK-RA6M5开发板
-
加入了学习《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开发板 (全流程综合贴)
本帖最后由 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 结构体中成员值的效果,实现四种波形、四种频率的输出
分别为:
正弦波
方波
三角波
随机波
正弦波实现方法与基础任务类似方波则是通过计数的方式实现。
三角与方波类似,添加上升和下降的判断逻辑即可
随机波形则是使用到了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
- 2024-09-23
-
回复了主题帖:
罗姆有奖直播 | 高输出功率激光二极管—助力激光雷达性能提升
已报名参加
- 2024-08-27
-
回复了主题帖:
>>征集 | 使用 MCU,哪些问题最令你头大?
下载和调试接口不够统一,就比如最近用到的DAP:项目开源、成本较低、速度较快,但就是不能给某些芯片下载程序。有的厂家喜欢jtag,有的喜欢串口,有的喜欢自己设计专用下载器。做不同的项目就要备不同的下载器,切换也不够方便
- 2024-08-22
-
回复了主题帖:
运放电源接反的影响?
电源压降这么厉害就应该检查一下负载,上电后电源异常优先查找短路。没底的话上电时用热成像看一下
- 2024-08-21
-
发表了主题帖:
【51篇】(7-1)C51单片机实现按键控制的MAX517四种波形输出并显示
本帖最后由 QuaX_Chow 于 2024-8-21 22:12 编辑
声明及本系列注意事项优先阅读:🔗
工程源码及仿真文件入口在文末,如果没显示就是还在审核
任务要求:使用C51实现四按键控制MAX517分别产生方波、三角波、锯齿波和正弦波,波形通过Proteus内的示波器显示,在P2.0~P2.3接四个按键开关,分别对应与四种波形;时钟信号由,一开始无按键按下时无输出
想要实现以上功能,我们需要将任务拆分为以下几个部分:
MAX517通信
中断按键判断
1.Proteus部分
波形显示使用的是虚拟仪器模式中的“OSCILLOSCOPE”四通道示波器:
搭建好的仿真电路如下:
如果在仿真时不小心把波形显示窗口关掉了,只需在仿真状态下点击菜单栏里的“调试”-“Digital Oscilloscope”,即可显示示波器界面
2.代码部分
(1)MAX517通信
在我们驱动MAX517之前,我们首先需要理清这颗芯片的时序
驱动MAX517需要使用两线串行接口,兼容IIC
见下图:
一条时钟线,一条数据线。声明如下:
sbit SCL = P1^0;//MAX517串行时钟
sbit SDA = P1^1;//MAX517串行数据
开始状态标志为时钟线高、数据线下降沿。结束状态标志为时钟线高、数据线上升沿。
在编程时我们就需要根据芯片时序,使用GPIO进行模拟。
以SC为示例编写函数:
void start(void)//起始条件子程序
{
SDA= 1;
SCL = 1;
_nop_();
SDA =0;
_nop_();
}
完整的传输过程如下图:
控制MAX517模拟输出需要根据上图步骤编写一个有着完整的:启动-发送地址-应答-命令-应答-数据-应答-结束,流程的函数:
void DACOut (uchar ch)//串行D/A转换子程序
{
start();//发送启动信号
send(0x58);//发送地址字节
ack();
send(0x00);//发送命令字节
ack();
send(ch);//发送数据字节
ack();
stop();//结束一次转换
}
如果我们需要输出一个指定的电压,就只需要 DACOut(需要的值);
公式如下:
但是我们需要输出的是波形,而非稳定的电平,所以我们需要一直改变输出模拟量的值ch。
以输出正弦波为例,创建数组存储ch的值,使用在输出时仅需将元素递增:
uchar sindata[64]=
{ 0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1,
0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff,
0xff,0xff,0xfd,0xfa,0xf6,0xf0,0xea,0xe3,
0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,0x8c,
0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e,
0x25,0x1d,0x15,0xf,0x9,0x5,0x2,0x0,0x0,
0x0,0x2,0x5,0x9,0xe,0x15,0x1c,0x25,0x2e,
0x38,0x43,0x4e,0x5a,0x66,0x73};
方波、锯齿、三角波的实现思路类似,循环内递增、递减、延时即可,具体方法参见文末源码
(2)中断按键判断
要实现立刻切换输出波形的功能,我们需要使用到外部中断0,中断服务函数如下:
void intp0() interrupt 0
{
if(P2_0 == 0) key = 0;//三角波
if(P2_1 == 0) key = 1;//方波
if(P2_2 == 0) key = 2;//正弦
if(P2_3 == 0) key = 3;//锯齿波
}
四种波形输出效果如下:
任务完成
2024/8/21
源码以及仿真文件
#本文首发于EEWORLD,版权归作者所有
补充内容 (2024-8-27 14:28):
勘误:任务要求部分:“时钟信号由,一开始无按键按下时无输出”改为“一开始无按键按下时无输出”
- 2024-08-20
-
上传了资料:
C51单片机实现按键控制的MAX517四种波形输出并显示
-
发表了日志:
【51篇】(1-1)片内RAM两字节的拆与拼
- 2024-08-05
-
回复了主题帖:
【大学生电子竞赛题目分析】——2024年C题《无线传输信号模拟系统》
测评老师是不知道题目的,他们只会按照测评表上的要求进行测评。测量条件没满足直接不测,该项目完全没分。并且本次电赛设计赛题及测评的人极为不专业,甚致认为信号时延仅需调整初相位即可,忽略t趋近于+0时多径信号SM(t)应该为0
- 2024-07-03
-
发表了主题帖:
【51篇】(1-0)使用Keil5和Proteus的系列实验
本帖最后由 QuaX_Chow 于 2024-7-3 21:56 编辑
新的一轮学习周期结束,有感而发,总结一下上个阶段的学习成果与心得。
虽是故知新说,但不想让炒了4个月的冷饭白炒,故开帖此系列👆
链接目录:
(1-0)本篇:系列说明
(1-1)片内RAM两字节的拆与拼
(1-2)片内RAM单字节十进制值的百十个位拆分
(2-1)片内RAM单字节十进制值的百十个位拆分并显示
(3-1)C51单片机利用定时器输出PWM
(4-1)C51单片机串行口扩展并行口
(4-2)C51单片机使用串口交换双机指定并口状态并使用LED显示
(5-1)C51单片机实现双按键控制八位数码管滚动十六进制数
(5-2)C51单片机实现有紧急时间的红绿灯控制
(6-1)C51单片机实现LCD1602两行滚动非等长含自定义字符
(7-1)C51单片机实现按键控制的MAX517四种波形输出并显示
(7-2)C51单片机实现按键控制的ADC0808八路模拟量测量并显示
(待续
1.软件说明
所有仿真使用的Proteus版本均为8.17,低版本大概率不兼容
所有代码部分使用的Keil版本均为5.39,低版本有概率不兼容
2.代码说明
所有上传的代码均进行过仿真验证,未进行实物验证
本人水平有限,不可能代码最简化且部分仿真会有小瑕疵,欢迎讨论
初始几个实验会使用汇编,后面均为C
2024/7/3
补充内容 (2024-8-21 22:14):
“按键控制的MAX517四种波形输出并显示”已更新:
https://bbs.eeworld.com.cn/thread-1291106-1-1.html
-
发表了主题帖:
【51篇】(5-1)C51单片机实现双按键控制八位数码管滚动十六进制数
本帖最后由 QuaX_Chow 于 2024-7-3 15:58 编辑
2024/5/27 新建帖子
声明及本系列注意事项优先阅读:🔗
工程源码及仿真文件入口在文末
任务要求:使用C51实现双按键控制八位数码管滚动十六进制数,反向滚动间隔时间为正向的两倍,一开始无按键按下时不显示
想要实现以上功能,我们需要将任务拆分为以下几个部分:
ms级定时器
数码管扫描函数
中断按键判断
延时函数(用于数码管余辉)
1.Proteus部分
数字显示使用的是Proteus中的八段共阴数码管,型号为:7SEG-MPX-8-CC-BLUE:
搭建好的仿真电路如下。红框为基础电路,外部中断0与按键之间使用与门且拉高:
2.代码部分
阳极连接的是P0口,需要在扫描函数中将每个十六位进制数对应的字段码
字段码如下:
smg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
而阴极连接单片机对应的片选代码如下:
unsigned char code yang[8]={0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
声明uint类型的direct变量用于判断方向。在main函数中实现数码管扫描的仿真效果更好。
void main()
{
unsigned char i;
unsigned int k;
init();
Timer0Init();
direct = 2;//初始无滚动方向
while(1)
{
while(direct == 0)
{
flag = 0;
while(direct == 0)
{
for(i=0;i<8;i++)
{
k = flag+i;
if( flag+i >= 16) k -= 16;
choose = yang[i];
show = smg[k];
delay(1);
}
}
}
while(direct == 1)
{
flag = 16;
while(direct == 1)
{
for(i=0;i<8;i++)
{
k = flag+i;
if( flag+i < 0) k += 16;
if( flag+i >= 16) k -= 16;
choose = yang[i];
show = smg[k];
delay(1);
}
}
}
}
}
参考中断表编写中断服务函数,外部中断0的中断号为0,定时器0为1:
外部中断0的中断函数中对按键进行了判断,仿真电路无需消抖:
void change() interrupt 0// using 0
{
// do{
// key();
// }while(j == 1); //中断函数,当按键按下时中断
// if(P3_2 == 0)
// {
if(P1_6 == 0) direct = 0;
if(P1_7 == 0) direct = 1;
// }
}
定时器提供数码管刷新基准(flag),每当基准达到15则清零,反向滚动计数值为正向的两倍:
void intp1() interrupt 1
{
jm++;
if(direct == 0)
{
if(jm == 12)
{
TF0 = 0;
flag++;
if(flag==16) flag = 0;
jm = 0;
}
}
if(direct == 1)
{
if(jm == 24)
{
TF0 = 0;
flag--;
if(flag==0) flag = 16;
jm = 0;
}
}
}
最终效果如下:
任务完成
2024/7/3
源码以及仿真文件
#本文首发于EEWORLD,版权归作者所有
-
发表了日志:
【51篇】(1-0)使用Keil5和Proteus的系列实验
- 2024-05-27
-
上传了资料:
C51单片机实现双按键控制八位数码管滚动十六进制数
- 2024-03-30
-
发表了主题帖:
【得捷Follow me第4期】(补充)网络控制STM32从机、实现简易频率计功能
本帖最后由 QuaX_Chow 于 2024-3-30 21:21 编辑
2024.3.30
本篇是Follow Me第四期任务提交的补充内容
分两个部分:网络控制STM32从机、实现简易频率计功能
1.网络控制从机
电脑上由网络调试助手使用TCP向W5500-EVB-Pico发送指令,再由W5500-EVB-Pico通过串口,向从机发送我们在从机设定好的指令,这样从机即可进行对应操作
框架示意图如下:
经查阅手册,从机主控F407的USART3为PB10和PB11:
连接即可:
对应在W5500-EVB-PICO上如下所示:
这里我们需要使用stlink给从机下载代码。
最终实物连接图如下:
功能实现代码如下:
from usocket import socket
from machine import Pin, SPI, UART
import network
import time
# 初始化UART
uart = UART(0, baudrate=115200, bits=8, stop=1)
# 初始化WIZNET5K以太网模块
def w5x00_init():
spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18))
nic = network.WIZNET5K(spi, Pin(17), Pin(20)) # spi, cs, reset引脚
nic.active(True)
nic.ifconfig(('192.168.137.100', '255.255.255.0', '192.168.137.1', '8.8.8.8'))
print('IP地址:', nic.ifconfig())
while not nic.isconnected():
time.sleep(1)
# 服务器循环
def server_loop():
s = socket()
s.bind(('192.168.137.100', 5050))
s.listen(5)
conn, addr = s.accept()
print("已连接到:", conn, "地址:", addr)
print("服务器已开启")
while True:
data = conn.recv(2048)
print("发送: ", data.decode('utf-8'), " 给从机")
if data != b'NULL':
uart.write(data)
# 客户端循环
def client_loop():
s = socket()
s.connect(('192.168.137.114', 5050))
print("循环客户端已连接!")
while True:
data = s.recv(2048)
print(data.decode('utf-8'))
if data != b'NULL':
s.send(data)
def main():
w5x00_init()
while True:
server_loop()
if __name__ == "__main__":
main()
通过输入1~4四个数字,即可控制对应led的状态:
2.实现简易频率计功能
模块:MCU与AK5522使用IIS通信,AK5522读取到阈值高电平,模块串口打印一次“1”
这里需要开启双核,一个核用于定时,一个计数
框架示意图如下:
W5500-EVB-Pico通过串口👇直接读取AK5522模块发送的数据
模块的部分原理图如下:
功能实现代码如下:
from usocket import socket
from machine import Pin, UART
import time
import _thread
# 初始化UART1和UART0
uart1 = UART(1, baudrate=115200, bits=8, stop=1)
uart0 = UART(0, baudrate=115200, bits=8, stop=1)
# 初始化计数器
count = 0
# Core 0的线程函数,用于接收数据并计算1的数量
def receive_and_count():
global count
while True:
if uart1.any():
data = uart1.read(64) # 读取UART1接收到的数据
count += data.count(b'1')
time.sleep(1) # 每秒计算一次1的数量
# Core 1的线程函数,用于打印1的数量
def print_count():
while True:
uart0.write('FRE: {}\n'.format(count))
time.sleep(1) # 每秒打印一次计数结果
# 启动Core 0的线程
_thread.start_new_thread(receive_and_count, ())
# 在Core 1上运行打印1的数量的代码
print_count()
,用补充1的F407开发板输出1KHz的PWM,串口助手显示如下:
可以看见开发板十分准确地每秒打印了当前频率
功能实现
(完)
- 2024-02-25
-
上传了资料:
【得捷Follow me第4期】玩转W5500-EVB-Pico 资料包