642|1

548

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【匠芯创D133CBS】--7.SD卡挂载与文件读写 [复制链接]

 

      本篇讲述SD卡挂载与文件读写。通过按键触发读SD卡文件,初次没有则创建,读到文件后打印出来。

 

一.硬件原理

      开发板主控SOC有SD/MMC控制器(简称SDMC),支持访问 SD 卡/ eMMC/ SDIO 设备,有硬件原理如下可知使用到SDMC1,开发板上有SD卡座,插上SD卡。

图1:SD卡接口原理

二.代码准备

      本部分分为SD卡挂载 和 SD卡文件读写,下面分别展开讲述。

●.SD卡挂载

1.配置SDMC接口,这里根据硬件原理使用SDMC1

图2:SD接口配置

2.设置自动挂载,这里稍微改写board.c里挂载表mount_table,如下

图3:设置自动挂载

3.热拔插配置。目前Lite 下只实现了 SDMC1 热插拔,刚好可以支持到。

图4:SD卡热拔插配置

      至此,SD卡挂载配置与准备完成。

 

●.SD卡文件读写

      此部分实现的功能是:使用按键触发文件读写,初次SD卡没有打开读的文件则创建,读到文件则直接打印出来。

1.SD卡读写使用到文件系统,下面配置文件系统。此处需要打开 RT-Thread 中的 elm(即 FatFS 文件系统)

图5:文件系统配置

2.定义SD卡根路径,申请文件读写内存大小FILE_DATA_LEN ,以及消息发送数据结构体及消息分类。

  • #define SD_PATH "sdcard/"
  • #define FILE_DATA_LEN_64K 64*1024
  • #define FILE_DATA_LEN_16K 16*1024
  • #define FILE_DATA_LEN 5*1024
  • typedef enum
  • {
  • MSG_LED_BUZZER,
  • MSG_SD,
  • }MSG_EVT_TYPE;
  • typedef struct
  • {
  • uint8_t msg_type;
  • uint16_t msg_len;
  • uint8_t led_value;
  • uint8_t buzzer_pwm_percent;
  • }msg_control;

3.在按键中断发送SD卡操作消息队列

  • static void key_irq_handler(void *args)
  • {
  • unsigned int ret;
  • u32 pin = *((u32 *)(args));
  • printf("Key INT \r\n");
  • memset(&msg_control_t,0,sizeof(msg_control));
  • msg_control_t.msg_type=MSG_SD;
  • msg_control_t.msg_len=sizeof(msg_control_t);
  • app_msg_send(&msg_control_t,sizeof(msg_control_t));
  • }

4.在消息队列接收任务里实现SD卡文件的读写。里面添加的日志可以便于后面测验。

  • void app_thread_entry(void *parameter)
  • {
  • FILE *fp;
  • char file_path[128] = { 0 };
  • char *data;
  • int ret;
  • int pin;
  • msg_control msg_control_p;
  • while(1)
  • {
  • if(rt_mq_recv(&user_mq, &msg_control_p, sizeof(msg_control_p), RT_WAITING_FOREVER)==RT_EOK)
  • {
  • rt_kprintf("Receive msg quene.msg_type:%d,msg_len:%d\r\n",msg_control_p.msg_type,msg_control_p.msg_len);
  • switch(msg_control_p.msg_type)
  • {
  • case MSG_LED_BUZZER:
  • rt_kprintf("led_value:%d,buzzer_pwm_percent:%d%%\r\n",\
  • msg_control_p.led_value,msg_control_p.buzzer_pwm_percent);
  • pin = rt_pin_get(LED_PIN);
  • rt_pin_write(pin, msg_control_p.led_value);
  • hal_pwm_set(BUZZER_PWM_CH, msg_control_p.buzzer_pwm_percent*BUZZER_FREQ_PARAM/100, BUZZER_FREQ_PARAM,PWM_SET_CMPA_CMPB);
  • break;
  • case MSG_SD:
  • data = aicos_malloc_align(0, FILE_DATA_LEN, CACHE_LINE_SIZE);
  • if (data == NULL)
  • {
  • rt_kprintf("Low memory\r\n");
  • return;
  • }
  • rt_kprintf("To Read File...\r\n");
  • rt_sprintf(file_path, "%s%s", SD_PATH,"test.txt");
  • fp=fopen(file_path,"rb");
  • if(fp==NULL)
  • {
  • rt_kprintf("Open read file %s failed!\n", file_path);
  • fclose(fp);
  • fp=fopen(file_path,"wb");
  • if (fp == NULL)
  • {
  • printf("create file %s failed!\n", file_path);
  • }
  • else
  • {
  • rt_kprintf("Open write file %s OK!\n", file_path);
  • rt_sprintf(data, "%s","你好,欢迎使用匠芯创开发板");
  • ret=fwrite(data, sizeof(char), FILE_DATA_LEN, fp);
  • {
  • rt_kprintf("Write file Success! size:%d\n", ret);
  • rt_kprintf("Write file Content:\r\n%s\r\n", data);
  • }
  • }
  • fclose(fp);
  • aicos_free_align(0, data);
  • }
  • else
  • {
  • rt_kprintf("Open read file %s OK!\n", file_path);
  • ret=fread(data, sizeof(char), FILE_DATA_LEN, fp);
  • if(ret)
  • {
  • rt_kprintf("Read file Success! size:%d\n", ret);
  • rt_kprintf("Read file Content:\r\n%s\r\n", data);
  • }
  • fclose(fp);
  • aicos_free_align(0, data);
  • }
  • break;
  • default :
  • break;
  • }
  • }
  • }
  • }

      下面是工程关于SD卡读写的逻辑功能代码结构。至此代码准备完毕。

图6:SD卡读写工程

 

三.测试

      编译烧录后,下面开始测验,同样分两部分进行:SD卡挂载,SD卡文件读写。

1.查询SD卡设备,使用命令list_device,如下

图7:SD卡识别

2.按一下WEAKUP按键,可以看到没有文件则创建文件并写入数据。再按之后,可以读出文件。命令切入到SD卡下,可以查询到创建了test.txt文件。

图8:SD卡读写日志

 

      至此,成功挂载SD卡,并实现了文件的读写。

查看本帖全部内容,请登录或者注册

最新回复

666   详情 回复 发表于 2024-9-1 14:24
点赞 关注
个人签名

保持热爱

 
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

666

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表