1、概述
很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有U盘,FLASH芯片,SD卡等。他们各有优点,综合比较,最适合单片机系统的莫过于SD卡了,它不仅容量可以做到很大(32GB以上),支持SPI/SDIO驱动,而且有多种体积的尺寸可供选择(标准的SD卡尺寸,以及TF卡尺寸等),能满足不同应用的要求。
只需要少数几个IO口即可外扩一个高达32GB以上的外部存储器,容量从几十M到几十G选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。
2、资源介绍
HaaS EDU K1最大支持1路eMMC4.41/SD3.0/SDIO3.0 主机接口, 单数据速率高达50MHz,最大支持64G。
3、示例介绍
3.1、硬件实现
HaaS EDU K1用到的SD卡为标准的TF卡槽。其在电路在开发板上默认是已经连接好了的。所以在硬件上不需要动任何东西。其连接原理图如图下:
SD卡槽原理图
3.2、软件设计
SD用到的测试代码文件路径如下:
application/example/edu_demo/mfg_test/sd_test.c
驱动文件位于:
platform/mcu/haas1000/hal/sd.c
3.2.1、测试流程
3.2.2、初始化函数
int32_t hal_sd_init(sd_dev_t *sd)
{
int ret;
hal_iomux_init((struct HAL_IOMUX_PIN_FUNCTION_MAP *)sd_pinmux, sizeof(sd_pinmux) / sizeof(struct HAL_IOMUX_PIN_FUNCTION_MAP));
ret = hal_sdmmc_open(HAL_SDMMC_ID_0);
if (0 == ret)
{
sd_initialised = 1;
if (sd)
{
sd->port = HAL_SDMMC_ID_0;
sd->config.bus_wide = hal_sdmmc_get_bus_width(HAL_SDMMC_ID_0);
sd->config.freq = hal_sdmmc_get_clock(HAL_SDMMC_ID_0);
sd->priv = NULL;
}
} else {
printf("sd init failed!\n");
}
return ret;
}
3.2.3、测试代码
testfd = fopen(SDTEST_FILE_NAME, "w");
if(testfd == NULL) {
printf("create /sdcard/sdtest.test fail !!!\n");
return;
}
printf("create /sdcard/sdtest.test success !!!\n");
data = (char *)malloc(SDTEST_FILE_LEN);
for (i = 0; i < SDTEST_FILE_LEN / strlen(SDTEST_WORDS); i++) {
memcpy(data + i * strlen(SDTEST_WORDS), SDTEST_WORDS, strlen(SDTEST_WORDS));
}
printf("begin init /sdcard/sdtest.test ... \n");
ret = fwrite(data, 1, SDTEST_FILE_LEN, testfd);
if(ret != SDTEST_FILE_LEN) {
printf("write data SDTEST_FILE_LEN bytes to file /sdcard/sdtest.test fail !!!\n");
}
fsync(testfd);
printf("write init data to /sdcard/sdtest.test success !!!\n");
fclose(testfd);
free(data);
aos_msleep(1000);
ret = sdtest_read();
ret += sdtest_write();
3.3、编译与下载
3.3.1、代码准备
打开edu_demo的产测开关
application/example/edu_demo/Config.in
在该文件中修改编译选项,打开EDK_DEMO_FACTORY_TEST_ENABLIE开关。
config EDK_DEMO_FACTORY_TEST_ENABLIE
bool "enable factory test function"
default y
加入Demo到启动代码
application/example/edu_demo/app_entry.c
函数application_start中注释掉menu_init();,添加sdcard_test();
//menu_init();
sdcard_test();
3.3.2、编译
如下使用命令行方式
aos make distclean
aos make edu_demo@haaseduk1 -c config
aos make
4.3.3、烧录
- 命令行方式
aos upload
- 图形界面方式
详见haaS EDU K1 快速开始 第4.3.3章节-使用GUI工具烧录部分。
开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/