【GD32H757Z海棠派开发板使用手册】第十三讲 SDIO-SD卡读写实验

发布者:MusicLover123最新更新时间:2024-12-03 来源: elecfans关键字:SDIO 手机看文章 扫描二维码
随时随地手机看文章

13.1实验内容

通过本实验主要学习以下内容:

  • USB协议基本原理

  • GD32H7xx USBHS的使用

  • 虚拟键盘的协议原理及使用

13.2实验原理

13.2.1USB通信基础知识

USB的全称是Universal Serial Bus,通用串行总线。它的出现主要是为了简化个人计算机与外围设备的连接,增加易用性。USB支持热插拔,并且是即插即用的,另外,它还具有很强的可扩展性,传输速度也很快,这些特性使支持USB接口的电子设备更易用、更大众化。GD32H7系列MCU集成了USB2.0高速OTG模块。首先为大家介绍USB通信的一些基础知识,包括USB协议、枚举流程等,建议读者可以多多阅读USB协议,以更深入了解USB,USB官网链接如下,可参考:https://www.usb.org/

13.2.1.1USB金字塔型拓扑结构

塔顶为USB主控制器和根集线器(Root Hub),下面接USB集线器(Hub),集线器将一个USB口扩展为多个USB口,USB2.0规定集线器的层数最多为6层,理论上一个USB主控制器最多可接127个设备,因为协议规定USB设备具有一个7 bit的地址(取值范围为0~127,而地址0是保留给未初始化的设备使用的)。

wKgZomZJWwyAXF12AAGV9tCTOqI472.png?imageView2/2/w/1000

13.2.1.2NRZI编码

USB采用差分信号传输,使用的是如上图所示的NRZI编码方式:数据为0时,电平翻转;数据为1时,电平不翻转。如果出现6个连续的数据1,则插入一个数据0,强制电平翻转,以便时钟同步。上面的一条线表示的是原始数据序列,下面的一条线表示的是经过NRZI编码后的数据序列。

wKgZomZhIqGACEQlAAI_IiTFYI8858.png?imageView2/2/w/1000

13.2.1.3USB数据协议

USB数据是由二进制数据串组成,首先由数据串构成包(packet),包再构成事务(transaction),事务最终构成传输(transfer)。

USB传输的最小单位为包,一个包被分成不同的域,根据不同类型的包,所包含的域是不一样的,但是不同的包有个共同的特点,就是以包起始(SOP)开始,之后是同步域(0x00000001),然后是包内容,最后以包结束符(EOP)结束这个包。PID为标识域,由四位标识符加4位标识符反码构成,表明包的类型和格式。根据PID的不同,USB协议中规定的包类型有令牌包、数据包、握手包和特殊包等。

wKgaomZJWyGAdonqAAB8I0rvGFU350.png?imageView2/2/w/1000

USB事务通常有两个或三个包组成:令牌包、数据包和握手包,令牌包用来启动一个事务,总是由主机发送;数据包用来传输数据;握手包由数据接收者进行发送,表明数据的接收情况。批量、同步和中断传输每次传输都是一个事务,控制传输包括三个阶段:建立过程、数据过程和状态过程。

针对不同的数据传输场景,USB分为四种数据传输模式,这四种传输模式分别由不同的包(packet)组成,并且有不同的数据处理策略。每种数据传输模式的流程示意图以及应用场景如下:

  • 控制传输一般用于命令和状态的传输,分为控制读、控制写和无数据控制传输。在设备枚举的过程中,采用控制传输方式进行数据传输。

wKgaomZJWyyADNPjAACEVK-mK84554.png?imageView2/2/w/1000

  • 批量传输分为批量读和批量写,用于数据量大、对实时性要求不高的场合,如U盘。

wKgaomZJWzqAZO8uAAFUBWvFHOc025.png?imageView2/2/w/1000

  • 中断传输用于数据量小的场合,保证查询频率,如鼠标、键盘。

wKgZomZJW0eAXrKzAACbdpLmWDg195.png?imageView2/2/w/1000

  • 同步传输用于数据量大、同时对实时性要求较高的场合,如音视频。不保证数据完整性,没有ACK/NAK应答包,不进行数据重传。

wKgaomZJW1KAekrcAACaA0A3l5U676.png?imageView2/2/w/1000

13.2.1.4USB描述符

wKgZomZJW12AEgDpAAG50oNk3Wg291.png?imageView2/2/w/1000

  • 一个USB设备通常有一个或多个配置,但在同一时刻只能有一个配置;

  • 一个配置通常有一个或多个接口;

  • 一个接口通常有一个或多个端点;

在USB通信中,USB设备需要配置多个USB描述符用以枚举阶段将描述符返回给主机,用以主机的枚举以及识别。USB描述符包括设备描述符、配置描述符、接口描述符、端点描述符以及字符串描述符等。在GD32 USBD固件库中,针对各种描述符都按照USB协议定义了相关结构体,具体说明如下。

  • 设备描述符

每个设备必须有一个设备描述符,设备描述符提供了关于设备的配置、设备所归属的类、设备所遵循的协议代码、VID、PID等信息,其相关结构体定义如下。

C typedef struct _usb_desc_dev { usb_desc_header header; /*!< descriptor header, including type and size */ uint16_t bcdUSB; /*!< BCD of the supported USB specification */ uint8_t bDeviceClass; /*!< USB device class */ uint8_t bDeviceSubClass; /*!< USB device subclass */ uint8_t bDeviceProtocol; /*!< USB device protocol */ uint8_t bMaxPacketSize0; /*!< size of the control (address 0) endpoint's bank in bytes */ uint16_t idVendor; /*!< vendor ID for the USB product */ uint16_t idProduct; /*!< unique product ID for the USB product */ uint16_t bcdDevice; /*!< product release (version) number */ uint8_t iManufacturer; /*!< string index for the manufacturer's name */ uint8_t iProduct; /*!< string index for the product name/details */ uint8_t iSerialNumber; /*!< string index for the product's globally unique hexadecimal serial number */ uint8_t bNumberConfigurations; /*!< total number of configurations supported by the device */ } usb_desc_dev;

  • 配置描述符

每个USB设备都至少具有一个配置描述符,在设备描述符中规定了该设备有多少种配置,每种配置都有一个描述符,其相关结构体定义如下。

C typedef struct _usb_desc_config { usb_desc_header header; /*!< descriptor header, including type and size */ uint16_t wTotalLength; /*!< size of the configuration descriptor header,and all sub descriptors inside the configuration */ uint8_t bNumInterfaces; /*!< total number of interfaces in the configuration */ uint8_t bConfigurationValue; /*!< configuration index of the current configuration */ uint8_t iConfiguration; /*!< index of a string descriptor describing the configuration */ uint8_t bmAttributes; /*!< configuration attributes */ uint8_t bMaxPower; /*!< maximum power consumption of the device while in the current configuration */ } usb_desc_config;


  • 接口描述符

接口描述符用以描述接口信息,接口描述符不能单独返回,必须附着在配置描述符后一并返回,其相关结构体定义如下。

C typedef struct _usb_desc_itf { usb_desc_header header; /*!< descriptor header, including type and size */ uint8_t bInterfaceNumber; /*!< index of the interface in the current configuration */ uint8_t bAlternateSetting; /*!< alternate setting for the interface number */ uint8_t bNumEndpoints; /*!< total number of endpoints in the interface */ uint8_t bInterfaceClass; /*!< interface class ID */ uint8_t bInterfaceSubClass; /*!< interface subclass ID */ uint8_t bInterfaceProtocol; /*!< interface protocol ID */ uint8_t iInterface; /*!< index of the string descriptor describing the interface */ } usb_desc_itf;


  • 端点描述符

端点描述符用以描述端点信息,端点描述符不能单独返回,必须附着在配置描述符后一并返回,其相关结构体定义如下。

C typedef struct _usb_desc_ep { usb_desc_header header; /*!< descriptor header, including type and size. */ uint8_t bEndpointAddress; /*!< logical address of the endpoint */ uint8_t bmAttributes; /*!< endpoint attributes */ uint16_t wMaxPacketSize; /*!< size of the endpoint bank, in bytes */ uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an INTERRUPT or ISOCHRONOUS type */ } usb_desc_ep;


  • 字符串描述符

字符串描述符可含有指向描述制造商、产品、序列号、配置和接口的字符串的索引。类和制造商专属描述符可含有指向额外字符串描述符的索引。对字符串描述符的支持是可选的,有些类可能会需要它们。

C typedef struct _usb_desc_str { usb_desc_header header; /*!< descriptor header, including type and size. */ uint16_t unicode_string[64]; /*!< unicode string data */ } usb_desc_str;

13.2.1.5USB枚举过程

USB枚举实际上是host检测到device插入后,通过发送各种标准请求,请device返回各种USB描述符的过程。USB枚举的示意图如下:

wKgaomZJW7yAXYOoAAH64GaWpyY119.png?imageView2/2/w/1000

13.2.2GD32 USBHS模块简介

GD32H7系列MCU提供了最多两个USB2.0高速USBHS接口模块,USBHS包含了一个内部的USB PHY,可以配置成全速或高速,并且不再需要外部PHY芯片。USBHS可以支持USB 2.0协议所定义的所有四种传输方式(控制传输、批量传输、中断传输和同步传输)。

USBHS主要特性如下:

n支持USB 2.0高速(480Mb/s)/全速(12Mb/s)/低速(1.5Mb/s)主机模式;

n支持USB 2.0高速(480Mb/s)/全速(12Mb/s)设备模式;

n支持遵循HNP(主机协商协议)和SRP(会话请求协议)的OTG协议;

n支持所有的4种传输方式:控制传输、批量传输、中断传输和同步传输;

n支持高带宽中断和同步传输;

n在主机模式下,包含USB事务调度器,用于有效地处理USB事务请求;

n包含一个4KB的FIFO RAM;

n在主机模式下,支持16个通道;

n在主机模式下,包含2个发送FIFO(周期性发送FIFO和非周期性发送FIFO)和1个接收

FIFO(由所有的通道共享);

n在设备模式下,包含8个发送FIFO(每个IN端点一个发送FIFO)和1个接收FIFO(由所有

的OUT端点共享);

n在主机模式下,若在高速模式下操作,支持PING协议;

n在设备模式下,支持8个OUT端点和8个IN端点;

n在设备模式下,支持远程唤醒功能;

n包含一个支持USB OTG协议的USB PHY;

n包含一个内部DMA调度器和引擎,每个应用请求都可在USBHS和系统之间执行数据拷贝;

n在主机模式下,SOF的时间间隔可动态调节;

n可将SOF脉冲输出到PAD;

n可检测ID引脚电平和VBUS电压;

n在主机模式或者OTG A设备模式下,需要外部部件为连接的USB设备提供电源;

n支持1.2版电池充电规范中描述的电池充电检测(BCD);

n支持2.0版USB OTG补充协议中描述的附加检测协议(ADP);

n支持USB 2.0链路层电源管理附录和USB2.0工程变更通知单勘误表中描述的链路电源管理(LPM)。

USBD模块框图如下所示,该系列有两个USB HS模块(USB_HS0和USB_HS1),均支持ULPI接口,允许外部HS收发器高速传输USB的数据。

wKgZomZhKoSAVm-QAAG2qdAyk-U864.png?imageView2/2/w/1000

GD32H7 USBHS使用注意事项可通过以下文档学习:

https://www.gd32mcu.com/data/documents/applicationNote/AN117_GD32H7xx_USBHSshiyongzhuyishixiang_Rev1.0.pdf

wKgaomZhKo-AMPyhAADgFbr0gTg607.png?imageView2/2/w/1000

13.2.3USBFS固件库说明

USBFS 固件库使用指南可以参考官网相关文档,下载地址如下:https://www.gd32mcu.com/data/documents/userManual/AN050_GD32_USBFS_USBHS_Firmware_Library_User_Guide_Rev1.0_CN.pdf

wKgaomZhKpqAdnS2AADklbyOwFs164.png?imageView2/2/w/1000

13.3硬件设计

GD32H757海棠派开发板的USB通信接口选择的是目前较为通用的Type C接口,读者手中的用于手机充电的Type C通信线即可使用。

wKgaomZhKqaAf2yQAAIe6fiq47U114.png?imageView2/2/w/1000

13.4代码解析

本例程主要实现通过按键向PC发送键值的现象,实现模拟键盘的效果。

本例程主函数如下所示。

C
int main(void)
{
driver_init(); /* 延时和公共驱动部分初始化 */

bsp_uart_init(&BOARD_UART); /* 打印串口初始化 */

bsp_led_group_init(); /* 初始化LED组 */

#ifdef USE_ULPI_PHY
usb_gpio_config();
#endif /* USE_ULPI_PHY */

usb_rcu_config();

usb_timer_init();

hid_itfop_register (&hid_keyboard, &fop_handler);

#ifdef USE_USBHS0

#ifdef USE_USB_FS
usb_para_init (&hid_keyboard, USBHS0, USB_SPEED_FULL);
#endif

#ifdef USE_USB_HS
usb_para_init (&hid_keyboard, USBHS0, USB_SPEED_HIGH);
#endif

#endif /* USE_USBHS0 */

#ifdef USE_USBHS1

#ifdef USE_USB_FS
usb_para_init (&hid_keyboard, USBHS1, USB_SPEED_FULL);
#endif

#ifdef USE_USB_HS
usb_para_init (&hid_keyboard, USBHS1, USB_SPEED_HIGH);
#endif

#endif /* USE_USBHS1 */

usbd_init (&hid_keyboard, &hid_desc, &usbd_hid_cb);

#ifdef USE_USB_HS
#ifndef USE_ULPI_PHY
#ifdef USE_USBHS0
pllusb_rcu_config(USBHS0);
#elif defined USE_USBHS1
pllusb_rcu_config(USBHS1);
#else
#endif
#endif /* !USE_ULPI_PHY */
#endif /* USE_USB_HS */

usb_intr_config();

/* check if USB device is enumerated successfully */
while (USBD_CONFIGURED != hid_keyboard.dev.cur_status) {
}

while (1) {
fop_handler.hid_itf_data_process(&hid_keyboard);
}
}


C
void usb_rcu_config(void)
{
pmu_usb_regulator_enable();
pmu_usb_voltage_detector_enable();
while (pmu_flag_get(PMU_FLAG_USB33RF) != SET) {
}

#ifdef USE_USB_FS

#ifndef USE_IRC48M

#ifdef USE_USBHS0
rcu_usb48m_clock_config(IDX_USBHS0, RCU_USB48MSRC_PLL0R);
#endif /* USE_USBHS0 */

#ifdef USE_USBHS1
rcu_usb48m_clock_config(IDX_USBHS1, RCU_USB48MSRC_PLL0R);
#endif /* USE_USBHS1 */

#else
/* enable IRC48M clock */
rcu_osci_on(RCU_IRC48M);

/* wait till IRC48M is ready */
while (SUCCESS != rcu_osci_stab_wait(RCU_IRC48M)) {
}

#ifdef USE_USBHS0
rcu_usb48m_clock_config(IDX_USBHS0, RCU_USB48MSRC_IRC48M);
#endif /* USE_USBHS0 */

#ifdef USE_USBHS1
rcu_usb48m_clock_config(IDX_USBHS1, RCU_USB48MSRC_IRC48M);
#endif /* USE_USBHS1 */

#endif /* USE_IRC48M */

#endif /* USE_USB_FS */

#ifdef USE_USBHS0
rcu_periph_clock_enable(RCU_USBHS0);
#endif /* USE_USBHS0 */

#ifdef USE_USBHS1
rcu_periph_clock_enable(RCU_USBHS1);
#endif /* USE_USBHS1 */

#ifdef USE_ULPI_PHY
#ifdef USE_USBHS0
rcu_periph_clock_enable(RCU_USBHS0ULPI);
#endif

#ifdef USE_USBHS1
rcu_periph_clock_enable(RCU_USBHS1ULPI);
#endif
#endif /* USE_ULPI_PHY */
}


rcu的配置如下,主要用于配置USB时钟,USB需要一个稳定的48M时钟,历程中根据相关宏定义开关进行选择配置。


C
void usb_rcu_config(void)
{
pmu_usb_regulator_enable();
pmu_usb_voltage_detector_enable();
while (pmu_flag_get(PMU_FLAG_USB33RF) != SET) {
}

#ifdef USE_USB_FS

#ifndef USE_IRC48M

#ifdef USE_USBHS0
rcu_usb48m_clock_config(IDX_USBHS0, RCU_USB48MSRC_PLL0R);
#endif /* USE_USBHS0 */

#ifdef USE_USBHS1
rcu_usb48m_clock_config(IDX_USBHS1, RCU_USB48MSRC_PLL0R);
#endif /* USE_USBHS1 */

#else
/* enable IRC48M clock */
rcu_osci_on(RCU_IRC48M);

/* wait till IRC48M is ready */
while (SUCCESS != rcu_osci_stab_wait(RCU_IRC48M)) {
}

#ifdef USE_USBHS0
rcu_usb48m_clock_config(IDX_USBHS0, RCU_USB48MSRC_IRC48M);
#endif /* USE_USBHS0 */

#ifdef USE_USBHS1
rcu_usb48m_clock_config(IDX_USBHS1, RCU_USB48MSRC_IRC48M);
#endif /* USE_USBHS1 */

#endif /* USE_IRC48M */

#endif /* USE_USB_FS */

#ifdef USE_USBHS0
rcu_periph_clock_enable(RCU_USBHS0);
#endif /* USE_USBHS0 */

#ifdef USE_USBHS1
rcu_periph_clock_enable(RCU_USBHS1);
#endif /* USE_USBHS1 */

#ifdef USE_ULPI_PHY
#ifdef USE_USBHS0
rcu_periph_clock_enable(RCU_USBHS0ULPI);
#endif

#ifdef USE_USBHS1
rcu_periph_clock_enable(RCU_USBHS1ULPI);
#endif
#endif /* USE_ULPI_PHY */
}

Usb timer的配置如下,主要用于延迟。

C
void usb_timer_init (void)
{
/* configure the priority group to 2 bits */
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);

/* enable the TIM2 global interrupt */
nvic_irq_enable((uint8_t)TIMER2_IRQn, 1U, 0U);

rcu_periph_clock_enable(RCU_TIMER2);
}

注册HID接口操作函数如下所示。在该代码清单中,注册了HID接口操作的配置以及数据处理函数句柄,用于后续函数调用。

C
uint8_t hid_itfop_register(usb_dev *udev, hid_fop_handler *hid_fop)
{
if(NULL != hid_fop) {
udev->dev.user_data = (void *)hid_fop;

return USBD_OK;
}

return USBD_FAIL;
}

USBD内核初始化函数如下所示。在该代码清单中,首先配置设备类callback函数,之后创建字符串,配置USB以及初始化USB内核,断开USB连接,初始化USB设备模式,之后设置USB连接,将USB连接状态配置为DEFAULT默认状态,启动状态机。

[1] [2]
关键字:SDIO 引用地址:【GD32H757Z海棠派开发板使用手册】第十三讲 SDIO-SD卡读写实验

上一篇:意法半导体推出 STM32WL33 低功耗、长距离无线微控制器,扩展专用生态系统
下一篇:【GD32H757Z海棠派开发板使用手册】第九讲 USART-printf打印实验

推荐阅读最新更新时间:2026-03-20 15:41

GD32H757Z海棠开发板使用手册】第五讲 PMU-低功耗实验
5.1实验内容 通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作; 5.2实验原理 5.2.1PMU结构原理 PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32H7XX系列MCU具有三个电源域,包括VDD/VDDA电源域、0.9V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电。0.9V由内部LDO或者外部Vcore供电。在备份域中有一个电源切换器,当VDD/VDDA电源关闭时,电源切换器可以将备份域的电源切换到VBAT引脚,此时备份域由VBAT引脚(电池)供电。 VDD/VDDA电源域 VDD / VDDA 域包括VDD域和VDDA域两部分。VDD域包括HXTAL(高速
[单片机]
【<font color='red'>GD32H757Z</font><font color='red'>海棠</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第五讲 PMU-低功耗<font color='red'>实验</font>
STM32 SDIO详解
1、SDIO简介 SDIO,全称:Secure Digital Input and Output,即安全数字输入输出接口。它是在SD卡接口的基础上发展而来,它可以兼容之前的SD卡,并可以连接SDIO接口设备,比如:蓝牙、WIFI、照相机等。 SDIO和SD卡规范间的一个重要区别是增加了低速标准。低速卡的目标应用是以最小的硬件开支支持低速I/O能力。低速卡支持类似调制解调器、条码扫描仪和GPS接收器等应用。 STM32的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SDI/O卡和CE-ATA设备。 SDIO框图 复位后SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置) 如果一个多媒体卡
[单片机]
STM32 <font color='red'>SDIO</font>详解
STM32笔记--SDIO(SD卡读取)
学习这里首先要了解一下SD卡基本资料: SD卡的协议部分太多,也比较复杂,建议资料:《Simplified_Physical_Layer_Spec.pdf》其主要复杂在繁多的命令,一共有64个命令,各个命令代表什么可查资料。 关于这里大部分都是熟悉函数然后直接调用库就行,但还是需要每个函数都去读一下的,后面会有具体函数的使用实例,到时候再补充。 我们代码中一般用到的是ARM官方给的SD卡的库,但是库中存在问题,SD_Error SD_ReadBlock()缺少代码:(有标注,可直接替换) SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t R
[单片机]
STM32笔记--<font color='red'>SDIO</font>(<font color='red'>SD卡</font>读取)
基于STM32的SDIO用4位总线24MHZDMA模式操作SHDC卡
发现网上很多所谓的SDIO操作SHDC无意例外都是官方的那个烂玩意,完全没有修改过,所以很多时候根本无法初始化SHDC,我也在网上看到很多人关于这部分的疑问,虽然STM32的SDIO的确是可以这样操作。但是很佩服那群人,什么都没改就发上来,把哥我害惨了。。。。 经过查资料,追踪,最后运气可佳。我发现自己的金士顿4GSD卡(class4)不能初始化跟用4位总线dma操作的原因。。各位也可以上网去找别人的试试,很多人都说不能用4位总线操作,而且用1位总线也只能是在低速率以及开启流控的情况下。而且经常出错。而4位总线总是提示没有检测到起始位。 但是他们都只会问,都没有去想象为什么,我也是。。但是后来发现。STM32的SDIO是完全没问题
[单片机]
STM32CubeMX配置SDIO模式(非DMA方式)
1.问题描述: 使用STM32CubeMX配置SDIO模式,读取SD卡的信息。 2.实际操作: (1)CubeMX软件界面配置: I.首先是Pinout界面选择: II.接下来是Configuration界面,点击下图的SDIO,其中串口1是为了输出调试信息。 在SDIO选项里,习惯性开启全局中断和DMA使能,实际测试中并未用到。其他全部默认。 (2)KEIL5生成代码 首先贴出之前找到的一份参考资料。后续的一些SD读取操作可以参考该文章。 http://www.stmcu.org/module/forum/thread-604576-1-1.html 本文章里最核心的配置部分在于到sdio.c文件的MX_SD
[单片机]
STM32 USB SD读卡器(SDIO)
这次是做一个SD卡的USB读卡器的功能,我们就在上次NAND Flash模拟出的U盘的工程上修改了,这样的话只要修改一小部分了。 工程的绝大部分不需要修改,只要将fsmc_nand.c文件移除工程,添加上官方的关于SDIO的SD卡的驱动代码文件stm32_eval_sdio_sd.c,我讨厌出现eval,所以将该文件直接改为sdio_sdcard.c。同时,既然我们使用SDIO来驱动SD卡,所以在外设库文件组里要添加stm32_sdio.c文件,否则会出现很多未定错误。 我们接下去修改的就只有mass_mal.c这个文件了。更NAND Flash工程一样,我们改成简洁点: uint32_t Mass_Memory_Si
[单片机]
STM32 USB SD读卡器(<font color='red'>SDIO</font>)
SDIO_FATFS_MDK 调试记录
现在已经调通,把文件系统的各个操作也基本测试了一遍,代码还有待于整理。 首先要说一个问题,就是在写文件(f_write)的时候跳硬件中断的问题。堆栈不够,使用的开发板是奋斗v3.0,芯片是stm32f103vet6,有64K的ram,但是在startup_stm32f10x_hd.s的启动代码文件里对堆栈的定义却很小,不知道为什么,是因为别的硬件资源自己去分配么?现在还没有搞明白。下面有图为证: 原来是512个字节,现在我把他修改成了 2048个字节(2kb)。就可以使用了,在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。
[单片机]
<font color='red'>SDIO</font>_FATFS_MDK 调试记录
SDIO接口
SDIO卡是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备,目前根据SDIO协议的SPEC,SDIO接口支持的设备总类有蓝牙,网卡,电视卡等。              SDIO协议是由SD卡的协议演化升级而来的,很多地方保留了SD卡的读写协议,同时SDIO协议又在SD卡协议之上添加了CMD52和CMD53命令。由于这个,SDIO和SD卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开始来支持低速I/O能力。低速卡支持类似调制解调器,条形码扫描仪和GPS接收器等应用。高速卡支持网卡,电视卡还有“组合”卡等,组合卡指的是存储器+SDIO。    
[嵌入式]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved