Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
在RTT中实现SD卡热插拔的方法
发布于 2012-04-24 13:39:19 浏览:6636
订阅该版
在实际嵌入式设备中,有时候需要使用SD卡携带数据,此时就面临SD卡热插拔的问题.我正好也使用到了这个功能,就试着修改了一下SVN的代码,下面将我的方法与大家分享一下. 我的测试平台是mini2440,代码是从google-svn直接下载的. 为了实现SD卡的热插拔,嵌入式设备应该能够检测到SD卡的插入与移除动作,所以需要对硬件平台进行如下改造.![SDCARD.JPG](/uploads/1044_8ef2f9da0816d21a6c15cdb3c7b8d5b2.jpg)![74HC14.JPG](/uploads/1044_0f4d6f36cb9ee8ad734c60cee6f43a7a.jpg) 管脚SDnCDa是SD卡座的11脚,卡座中插入SD卡时该管脚会与地相连(我的图中外壳是金属的,接工作地了,如果你是将外壳接电源了,则SDnCDa与电源相连).然后SDnCDa经过施密特触发器进行整形,SDnCDb接到S3C2440A的EINT16/GPG8脚.(其它芯片也一样处理,要求是EINT管脚能够双边沿触发).经过施密特非门整形能够保证不会误触发,主要是不让它提前触发. 下面介绍下软件如何修改: 从SVN上down代码,找到bsp/mini2440/sdcard.c文件 在函数void rt_hw_sdcard_init(void)中: ```//...... RCA = 0; EINT_SD_init();//加入该句 if (sd_init() == RT_EOK) //......``` 再建一个新文件SD_hotplug.c,在该文件中添加如下代码: ```#include "s3c24x0.h" #include
#include "sdcard.h" #include "dfs_fs.h" void rt_hw_sdcard_init(void); #define SDnCD_VALUE() (GPGDAT & (1<<8)) rt_int32_t sdcard_exist=0;//SD卡是否存在 void rt_sdcard_handler(int vector) { rt_uint32_t eint_pend; eint_pend = EINTPEND; /* EINT16 for SDCARD */ if(eint_pend & (1<<16)) { //插入SD卡 if(SDnCD_VALUE()) { /* init the device filesystem */ rt_hw_sdcard_init(); #ifdef RT_USING_DFS #ifdef RT_USING_DFS_ELMFAT /* init the elm chan FatFs filesystam*/ elm_init(); /* mount sd card fat partition 1 as root directory */ dfs_mount("sd0", "/", "elm",0, 0); sdcard_exist = 1; //msg_sdcard_in();//SD插入消息 #endif #endif } else { if(sdcard_exist) { dfs_unmount("/"); rt_device_unregister(rt_device_find("sd0"));//卸载设备 sdcard_exist = 0; //msg_sdcard_out();//SD移出消息 } } } /* clear EINT pending bit */ EINTPEND = eint_pend; } /******************************************************************************************************** ** Descriptions: 外部中断初始化。设置GPG8引脚为外部中断EINT16功能,双边沿触发模式,并使能中断允许。 ********************************************************************************************************/ void EINT_SD_init(void) { /* Set GPG8 as EINT16 */ GPGCON = GPGCON & (~(3 << 16)) | (2 << 16); GPGUP = GPGUP & (~(1<<8)) | (0 << 8);//允许上拉电阻 EXTINT2 = (EXTINT2 & (~0x0f)) | (0x0f); /* EINT16 双沿触发,使能滤波器 */ EINTMASK = EINTMASK & (~(1<<16)); /* Enable EINT16 */ /* instal interrupt */ rt_hw_interrupt_install(INTEINT8_23, rt_sdcard_handler, RT_NULL); rt_hw_interrupt_umask(INTEINT8_23); }``` 加入如上代码,SD卡就可以支持热插拔了,基本思想就是使用中断自动挂载/卸载SD卡使用的文件系统. 为了防止访问时出错,用户可以在使用时SD卡文件系统之前检查**_sdcard_exist_**变量. 如果要使用sdcard_exist变量,需要在application.c文件中 ```if (dfs_mount("sd0", "/", "elm",0, 0)) { sdcard_exist=1;//新加入的语句 rt_kprintf("FatFs File System initialized!"); } //KOKOKOKOKOKOKO...``` PS: 谢谢prife的提醒,已经修改了。关于使用“施密特非门”的一个主要原因,是为了防止触发中断时产生多个毛刺,导致多次进入中断代码发生错误,如果能保证触发脉冲是稳定可靠的,这个非门可以去掉,或者在进入中断后失效外部中断功能,处理完毕后再打开,具体使用哪种方式看个人的喜好了。
查看更多
7
个回答
默认排序
按发布时间排序
zchong
2012-04-26
这家伙很懒,什么也没写!
这个值得好好研究研究
iwillbeback008
2012-05-03
这家伙很懒,什么也没写!
这个值得好好研究研究 真是个好帖!!! 收藏以后方便学习。
mique
2012-12-22
这家伙很懒,什么也没写!
mark,后续加此功能
prife
2013-02-05
这家伙很懒,什么也没写!
这个帖子真不错,学习中,另外麻烦amsl再编辑一下。 1. 加上 ``` ``` 2. 最后有个笔误。 if ("sd0", "/", "elm",0, 0) 漏掉了dfs_mount了。
os2
2014-07-31
这家伙很懒,什么也没写!
这个帖子真不错,学习中
joe3501
2014-08-27
这家伙很懒,什么也没写!
之前做项目时解决SD卡热插拔问题没有用到楼主的方法,而是利用状态机的机制来处理的!运行时维护一个SD卡状态的状态机。。。
撰写答案
登录
注册新账号
关注者
0
被浏览
6.6k
关于作者
amsl
这家伙很懒,什么也没写!
提问
12
回答
137
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
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组件
最新文章
1
profinet从站主线error open adapt
2
2024 RT-Thread睿赛德开发者大会共探商业共赢的开源生态
3
rt-thread 小内存算法源码分析
4
env中添加lvgl软件包后,keil编译包--c99错误
5
【NXP-MCXA153】 定时器驱动移植
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
Debug
中断
编译报错
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
20
个答案
3
次被采纳
红枫
8
个答案
2
次被采纳
踩姑娘的小蘑菇
7
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
张世争
6
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
12
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部