Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SDIO总线
NXP 微控制器
NXP-MCXN947
NXP MCXN947测评之SDIO实践
发布于 2024-04-01 16:32:02 浏览:243
订阅该版
[tocm] ## 开箱 因为工作的原因,好久没有参加RTT的测评活动了,但是看到这款双核而且带NPU的MCU,而且出自大厂NXP,还是忍不住下手了,正好能作为自己入门AIoT的引子。不过那都是后话了,当务之急还是先完成测评,顺便熟悉熟悉这块板子。 板子整体来说是非常精致的,果然符合大厂的气质😀 ![包装箱外观](https://oss-club.rt-thread.org/uploads/20240401/f4d205191f2473afdf5b738e4713134b.jpg.webp) ![展示.jpg](https://oss-club.rt-thread.org/uploads/20240401/76575aec839086adc64b8c8867ec76a5.jpg.webp) # 前言说明 这次我选择的项目是SDIO,原因是前段时间正好在一个项目中反反复复和SD/TF卡打交道了好久,测评和各种各样的卡,功耗,读写等等。这次由于使用的是开发板,功耗就不好单独测了,主要从读写速度入手做些工作。 ## 模块介绍 先来看看本次要测评的模块: ![board_block_diagram.png](https://oss-club.rt-thread.org/uploads/20240401/a18910fc086cf3e55c9fc5d93906feb6.png.webp) 这个虚线框,难道是没有卡槽的意思吗?果然,拿到开发板后: ![卡槽位置.jpg](https://oss-club.rt-thread.org/uploads/20240401/8fd7ed51234ef6b945989d4eccd91736.jpg.webp) 还好还有之前的卡槽存货,简单焊上一个完事,应该能用,不能用大不了回来再看。 ![焊接完成.jpg](https://oss-club.rt-thread.org/uploads/20240401/92f3291aad7143d0ce4e9b41a98c0ebf.jpg.webp) 实际上本次测评的虽然是SDIO,但是在官方资源描述是SDHC,在网上简单找了下资料: | SD卡(Secure Digital Memory Card) | Mini SD卡(Mini Secure Digital Memory Card) | SDHC卡(Secure Digital High Capacity) | SDXC卡(SD eXtended Capacity) | | ------------ | ----------- | ------------ | ------------ | | SD是早先的版本的,据说是由MMC演变而来的。最大支持2GB大小容量。通过9针的接口界面与专门的驱动器相连接,SD接口除了保留MMC的7针外,还在两边加多了2针,作为数据线。SD卡的通信协议包括SD总线和SPI两类,通信电压范围:2.0-3.6V;工作电压范围:2.0-3.6V。SD卡的结构能保证数字文件传送的安全性,也很容易重新格式化,所以有着广泛的应用领域。 |miniSD卡是SD卡发展而来,性能和传统的SD卡并无大的区别,T-Flash卡:全名(TransFLash由),是一种超小型卡(11*15*1MM)。TF卡可经SD卡转换器后,当SD卡使用。 |SDHC是大容量SD卡,也就是SD High Capacity,支持最大32GB大小容量。SDHC,Secure Digital High Capacity,大容量SD,也就是说,超过2G的SD都叫SDHC,因为早期的SD使用的是FAT16文件系统,并不支持大容量,而SDHC升级为FAT32,才支持2G以上的大容量。 |SDXC除了容量可以升级为最大2T以外,主要是可以支持300M/s的传输速度,也就是说是“高速SD”卡。SDXC又是不可向下兼容的,不支持普通的SD和SDHC卡槽和读卡器。 | ## 软件开发 由于本开发板的SDIO驱动已经移植完毕了,所以本次测评不存在移植工作,只需要简单配置以下就好。需要用到的软件有: 1. Keil with MDK,官方推荐5.36及以上,本次我用的是5.38 2. scon # 步骤说明 ## 新建工程 1. 首先从RT Thread官当下载最新代码 https://github.com/RT-Thread/rt-thread/ 2. 在源码目录.bsp\nxp\mcx\mcxn\frdm-mcxn947 的位置找到N947的工程,并在此打开scons 3. 执行 ```c scons --dist --target=mdk5 ``` 生成初始工程 ![new project.PNG](https://oss-club.rt-thread.org/uploads/20240401/d56376686a1ba70e241bf1c9642aa114.png) 4. 此时位于dist目录中的工程就是专门为MCXN947生成的工程了,可以单独拷贝到任何目录,不依赖于当前源码目录。 5. 在新生成的工程目录中执行 ```c pkgs --update ``` 这一步的目的是从服务器拉取工程中用到但是尚未下载源码的包,如果没有这一步,直接在keil中编译会报错 ![pkgs update.PNG](https://oss-club.rt-thread.org/uploads/20240401/20f31602de655b770f3ba5a95b7196bb.png) 6. 新的工程就建好了,可以现在keil中编译,下载一下。 ## 配置SDIO 接下来就是为本次验证的配置, 首先打开menuconfig工具,需要配置的有以下几项: 1. DFS 虚拟文件系统 ![dfs.PNG](https://oss-club.rt-thread.org/uploads/20240401/50501cbc12d258403d01f9f4be91e07e.png) 2. MMC/SD driver ![sd driver.PNG](https://oss-club.rt-thread.org/uploads/20240401/6aaf8ce2eeb7075feb152b3d35862ee8.png) 3. SDIO 外设驱动 ![SDIO driver.PNG](https://oss-club.rt-thread.org/uploads/20240401/f1bbc1ab31c05d9a0d06a79c2b104285.png) 结束后退出并保存,注意这里要重新生成以下keil工程,否则keil里是没有刚刚新的配置的。 # 代码验证 使用Keil编译并下载Demo程序 ## SD卡识别 Demo程序总已经自带了SD卡的挂载 ```c #ifdef RT_USING_SDIO rt_thread_mdelay(2000); if (dfs_mount("sd", "/", "elm", 0, NULL) == 0) { rt_kprintf("sd mounted to /\n"); } else { rt_kprintf("sd mount to / failed\n"); } #endif ``` ### 结果 所以很容易验证SD卡的挂载 ![sd mount.PNG](https://oss-club.rt-thread.org/uploads/20240401/6d07ca7e31b3d94cfb432a9e0bcb002f.png) ## 文件读写测试 ### 代码实现 写一个文件读写的测试case,主要实现的功能有: 1. 在当前目录打开或新建一个名为“test.txt”的文件 2. 在文件中写入一段文字,关闭文件 3. 重新打开文件,并读取打印其中的文字 代码实现如下: ```c #include
#include "drv_pin.h" #include "dfs_fs.h" int rwTest(void) { FILE *fout; char buf[32]; const char test[] = "This is a test file"; rt_kprintf("This is SD card read&write test\r\n"); fout = fopen("test.txt", "wb"); if (fout == NULL) { printf("Failed to open file \"%s\"\n", "test.txt"); exit(-1); } fwrite(test, 1, sizeof(test), fout); fclose(fout); fout = fopen("test.txt", "r"); if (fout == NULL) { printf("Failed to open file \"%s\"\n", "test.txt"); exit(-1); } fread(buf, 1, sizeof(buf), fout); rt_kprintf("Read from file: %s \r\n", buf); } MSH_CMD_EXPORT(rwTest, rwTest); ``` ### 测试结果 ![rw.PNG](https://oss-club.rt-thread.org/uploads/20240401/16faf008b7fe429125be96393f0a3e53.png) 使用ls命令查看文件,并使用cat命令查看文件内容: ![cat.PNG](https://oss-club.rt-thread.org/uploads/20240401/ad54cc1ea50b101a627e2f282851b181.png) ## 读写速度测试 ### 代码实现 对于读写速度测试,由于自己对RTOS的领悟还没有那么深刻,设计的方案可能不那么科学,如果有上面欠考虑的地方还请多多指教。 按照自己的理解设计了一个测试case,主体思路就是对512B - 64KB的读写速度进行测试,使用timer0记录时间。 代码如下: ```c #include
#include "drv_pin.h" #include "dfs_fs.h" void readWriteTest(int size) { FILE *fout, *fin; void* buf; rt_device_t hw_dev; rt_hwtimerval_t timeout_s; /* 用于保存定时器经过时间 */ /* 查找定时器设备 */ hw_dev = rt_device_find("timer0"); rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); /* 设置定时器超时值为10s并启动定时器 */ timeout_s.sec = 10; /* 秒 */ timeout_s.usec = 0; /* 微秒 */ fout = fopen("test.txt", "wb"); buf = malloc(size); rt_memset(buf, 0xff, size); if (fout == NULL) { printf("Failed to open file \"%s\"\n", "test.txt"); exit(-1); } if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) { rt_kprintf("set timeout value failed\n"); return; } fwrite(buf, 1, size, fout); fclose(fout); rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); rt_kprintf("%d Byte write test, time cost: Sec = %d, Usec = %d\n", size, timeout_s.sec,timeout_s.usec); fin = fopen("test.txt", "r"); if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) { rt_kprintf("set timeout value failed\n"); return; } fread(buf, 1, size, fin); fclose(fin); rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); rt_kprintf("%d Byte read test, time cost: Sec = %d, Usec = %d\n", size, timeout_s.sec,timeout_s.usec); free(buf); } int speedTest(void) { rt_kprintf("This is SD card speed test\r\n"); readWriteTest(512); readWriteTest(1024); readWriteTest(2048); readWriteTest(4096); readWriteTest(8192); readWriteTest(16384); readWriteTest(32768); readWriteTest(65536); } MSH_CMD_EXPORT(speedTest, speedTest); ``` ### 测试结果 结果说实话还是很出乎我的意料的,自己也做了反复尝试 ![sp.PNG](https://oss-club.rt-thread.org/uploads/20240401/05c353a5faaf96a8c59f5377dc88f3ef.png) 初步的结论是,4K以下的读写速率相差很小,可能是主要的时间消耗在了调用和系统调度。之前在另一块产品中,主频比这个单片机低很多,而且还是使用的SPI接口,但是写一个512的扇区也只需要6ms,而这里竟然需要15ms。好在随着我不断加大测试数据量,区别在大数据读写还是很大的。 ### 一些思考 我觉得这个测试仍然存在一些疑点,目前我怀疑的有以下几个,如果有知道的大佬欢迎讨论,或者不知道我们一起学习也可以。 1. 4K以下读写或许和文件系统实现有一些关系 2. 也可能和SDIO的实现有关系 3. 或许我采用的计时方式并不准确,有一个很大的基准值叠加在了结果上面,导致实际观测的实际差不准确 其他的,欢迎大家补充讨论。 ## 代码 所有的代码其实在文章中已经全部贴出来了,不过也给出仓库:https://gitee.com/yu-wang-yy/mcxn947-sdio # 总结 总的来说,RTT在快速原型开发阶段无敌,在驱动完备的情况下,搭建一个属于自己的嵌入式系统的速度超过了我使用过的其他RTOS,对于专注于应用开发的工程师来说太具有吸引力。 这次测试对于SD卡读写还留了很多疑问,需要进一步学习研究,也欢迎大家的讨论。 对于开发板的学习,尤其是板载NPU的学习,还要继续下去,官方也出具了一个关于NPU的demo,值得一试。相信将来AI的发展一定不只局限于云端的大模型,对于这种边缘计算同样大有可为。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
AngerCoke
这个人不懒,主要是真的不想写什么
文章
10
回答
2
被采纳
0
关注TA
发私信
相关文章
1
试贴-消灭0主题
2
LPC M4的一些资料
3
LPC4088的临时分支
4
lpc1788 ad 不稳定
5
1788 LCD控制器缓冲区字节问题
6
一起来学习LPC4088吧
7
上传LPC4088的realtouch主工程
8
RealBoard 4088预定帖 [第一批板子不多,预定提前结束]
9
晒RealBoard LPC4088开箱照啦,速带小板凳前来围观
10
4088主程序需要的SD卡资源
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
at_device
rt_mq_消息队列_msg_queue
ulog
C++_cpp
SFUD
本月问答贡献
出出啊
1512
个答案
341
次被采纳
小小李sunny
1437
个答案
289
次被采纳
张世争
774
个答案
167
次被采纳
crystal266
546
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部