收藏 分享(赏)

零死角玩转STM32 高级篇 152页 6.9M 超清书签版.pdf

上传人:weiwoduzun 文档编号:3137463 上传时间:2018-10-04 格式:PDF 页数:152 大小:6.83MB
下载 相关 举报
零死角玩转STM32 高级篇 152页 6.9M 超清书签版.pdf_第1页
第1页 / 共152页
零死角玩转STM32 高级篇 152页 6.9M 超清书签版.pdf_第2页
第2页 / 共152页
零死角玩转STM32 高级篇 152页 6.9M 超清书签版.pdf_第3页
第3页 / 共152页
零死角玩转STM32 高级篇 152页 6.9M 超清书签版.pdf_第4页
第4页 / 共152页
零死角玩转STM32 高级篇 152页 6.9M 超清书签版.pdf_第5页
第5页 / 共152页
点击查看更多>>
资源描述

1、 -第 2 页 - 0、 友情提示 零死角玩转 STM32 系列教程 由 初级篇 、 中级篇 、 高级篇 、 系统篇 、四个部分组成 , 根据野火 STM32 开发板 旧版教程 升级 而来,且经过 重新 深入 编写 ,重新排版,更适合初学者 ,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转 STM32。 M3 的世界,与 野火同行,乐意惬无边。 另外,野火团队历时一年精心打造的 STM32 库开发实战指南 将于今年 10 月份由 机械工业出版社 出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。内容上会给你带来更多的惊喜。 是一本学习 STM32 必备的工具书。敬请期待! -第 3

2、 页 - 1、 SDIO( 4bit + DMA、支持 SDHC) 1.1 实验描述及工程文件清单 实验描述 MicroSD 卡 (SDIO 模式 )测试实验, 采用 4bit 数据线模式。 没 有跑文件系统, 只是单纯地读 block 并将测试信息通过串口 1 在电脑的超级终端上 打印出来。 硬件连接 PC12-SDIO-CLK: CLK PC10-SDIO-D2 : DATA2 PC11-SDIO-D3: CD/DATA3 PD2-SDIO-CMD : CMD PC8-SDIO-D0: DATA0 PC9-SDIO-D1: DATA1 用到的库文件 startup/start_stm32f

3、10x_hd.c CMSIS/core_cm3.c CMSIS/system_stm32f10x.c FWlib/stm32f10x_gpio.c FWlib/stm32f10x_rcc.c FWlib/stm32f10x_usart.c FWlib/ stm32f10x_sdio.c FWlib/ stm32f10x_dma.c FWlib/ misc.c 用户编写的文件 USER/main.c USER/stm32f10x_it.c USER/usart1.c USER/ sdio_sdcard.c -第 4 页 - 野火 STM32 开发板 MicroSD 卡硬件原理图: 1.2 SDI

4、O 简介 野火 STM32 开发板的 CPU ( STM32F103VET6 )具有一个 SDIO 接口。SD/SDIO/MMC 主机接口可以支持 MMC 卡系统规范 4.2 版中的 3 个不同的数据总线模式: 1 位 (默认 )、 4 位和 8 位。在 8 位模式下,该接口可以使数据传输速率达到 48MHz,该接口兼容 SD 存储卡规范 2.0 版。 SDIO 存储卡规范 2.0 版支持两种数据总线模 式: 1 位 (默认 )和 4 位。 目前的芯片版本只能一次支持一个 SD/SDIO/MMC 4.2 版的卡,但可以同时支持多个 MMC 4.1 版或之前版本的卡。除了 SD/SDIO/MMC

5、,这个接口完全与 CE-ATA 数字协议版本 1.1 兼容。 1.3 SD 协议 大多数人原来没有了解过 SD 协议,又看到 SDIO 的驱动有 2000 多行,感觉无从下手。所以野火重新写了这个文档进行详细的解释,帮助大家更快地跨过这道槛。 附资料: Simplified_Physical_Layer_Spec.pdf ,这个资料包含了 SDIO协议中 SD 存 储卡的部分。 -第 5 页 - 下面野火结合 STM32 的 SDIO,分析 SD 协议,让大家对它先有个大概了解,更具体的说明在代码中展开。 SDIO 接口图 一从 SDIO 的时钟说起。 SDIO_CK 时钟是通过 PC12 引

6、脚连接到 SD 卡的,是 SDIO 接口与 SD 卡用于同步的时钟。 SDIO 选配器挂载到 AHB 总线上,通过 HCLK 二分频 输入到适配器得到SDIO_CK 的时钟,这时 SDIO_CK = HCLK/( 2+CLKDIV) 。其中 CLKDIV 是SDIO_CLK(寄存器 )中的 CLKDIV 位。 另外, SDIO_CK 也可以由 SDIOCLK 通过设置 bypass 模式直接得到,这时SDIO_CK = SDIOCLK=HCLK。 通过下面的库函数来配置时钟: 1. SDIO_Init( 对 SD 卡的操作一般是大吞吐量的数据传输,所以采用 DMA 来提高效率,SDIO 采用的

7、是 DMA2 中的 通道 4。在数据传输的时候 SDIO 可向 DMA 发出请求。 二讲解 SDIO 的命令、数据传输方式。 SDIO 的所有命令及命令响应,都是通过 SDIO-CMD 引脚来传输的。 -第 6 页 - 命令只能由 host 即 STM32 的 SDIO 控制器发出。 SDIO 协议把命令 分成了11 种,包括基本命令,读写命令还有 ACMD 系列命令等。其中, 在发送 ACMD命令前,要先向卡发送编号为 CMD55 的命令 。 参照下面的命令格式图,其中的 start bit, transmission bit , crc7,endbit,都是由 STM32 中的 SDIO

8、硬件完成 ,我们在 软件 上配置的时候只需要设置 command index 和命令参数 argument。 Command index 就是命令索引(编号),如 CMD0, CMD1被编号成 0, 1.。有的命令会包含参数,读命令的地址参数等,这个参数被存放在 argument 段。 SD 卡命令格式 可以通过下面的函数来配置、发送命令: 1. SDIO_SendCommand( /发送命令 SD 卡对 host 的各种命令的回复称为响应,除了 CMD0 命令外, SD 卡在接收到命令都会返回一个响应。对于不同的命令,会有不同的响应格式,共 7种,分为 长响应型( 136bit) 和 短响应

9、型( 48bit) 。以下图,响应 6( R6)为例: SD 卡命令响应格式 ( R6) -第 7 页 - SDIO 通过 CMD 接收到响应后, 硬件去除头尾的信息 ,把 command index 保存到 SDIO_RESPCMD 寄存器 ,把 argument field 内容保存存储到SDIO_RESPx 寄存器 中。这两个值可以分别通过下面的库函数得到。 1. SDIO_GetCommandResponse(); /卡返回接收到的命令 2. SDIO_GetResponse(SDIO_RESP1); /卡返回的 argument field 内容 数据写入,读取。请看下面的写数据时序

10、图,在软件上,我们要处理的只是读忙。另外,我们的实验中用的是 Micro SD 卡,有 4 条数据线,默认的时候 SDIO 采 用 1 条数据线的传输方式,更改为 4 条数据线模式要通过向卡发送命令来更改。 SD 卡的多块写入时序图 三卡的种类。 STM32 的 SDIO 支持 SD 存储卡, SD I/O 卡 , MMC 卡。 其中 SDI/O 卡 与 SD 存储卡 是 有区别 的, SDI/O 卡实际上就是利用 SDIO 接口的一些模块,插入 SD 的插槽中,扩展设备的功能,如: SDI/O wifi, SDI/O cmos 相机等。而 SD 存储卡就是我们平时常见的单纯用于存储数据的卡。

11、 -第 8 页 - 可使用 SDIO 接口类型的卡 本实验中使用的 Micro SD 卡属于 SDSC(标准 容量,最大两 G)卡。介绍卡的种类是因为 SD 协议中的命令也支持这三种类型的卡,因此对 STM32 中的SDIO 接口进行初始化后,上电后就要对接入的卡进行 检测、分类 ,这个过程是通过向卡发送一系列不同的命令,根据卡 不同 的 响应 来进行分类。 下面进入代码展开具体讲解。 1.4 代码分析 首先要添加用的库文件 ,在工程文件夹下 Fwlib 下我们需添加以下库文件: FWlib/stm32f10x_gpio.c FWlib/stm32f10x_rcc.c FWlib/stm32f

12、10x_usart.c FWlib/stm32f10x_sdio.c FWlib/stm32f10x_dma.c FWlib/misc.c 还要在 stm32f10x_conf.h 中把相应的头文件添加进来: -第 9 页 - 1. #include “stm32f10x_dma.h“ 2. #include “stm32f10x_gpio.h“ 3. #include “stm32f10x_rcc.h“ 4. #include “stm32f10x_sdio.h“ 5. #include “stm32f10x_usart.h“ 6. #include “misc.h“ 保持良好的习惯,从 m

13、ain 函数开始分析: 1. int main(void) 2. 3. 4. /*进入到 main 函数前,启动文件 startup( startup_stm32f10x_xx.s)已经调用了在 5. system_stm32f10x.c 中的 SystemInit(),配置好了系统时钟,在外部晶振 8M的条件下, 6. 设置 HCLK = 72M */ 7. 8. /* Interrupt Config */ 9. NVIC_Configuration(); 10. 11. /* USART1 config */ 12. USART1_Config(); 13. 14. /*- SD Ini

14、t - */ 15. Status = SD_Init(); 16. 17. printf( “rn 这是一个 MicroSD 卡实验 (没有跑文件系统 ).rn “ ); 18. 19. 20. if(Status = SD_OK) /检测初始化是否成功 21. 22. printf( “ rn SD_Init 初始化成功 rn “ ); 23. 24. else 25. 26. printf(“rn SD_Init 初始化失败 rn“ ); 27. printf(“rn 返回的 Status 的值为: %d rn“,Status ); 28. 29. 30. printf( “ rn Ca

15、rdType is : %d “, SDCardInfo.CardType ); 31. printf( “ rn CardCapacity is : %d “, SDCardInfo.CardCapacity ); 32. printf( “ rn CardBlockSize is : %d “, SDCardInfo.CardBlockSize ); 33. printf( “ rn RCA is : %d “, SDCardInfo.RCA); 34. printf( “ rn ManufacturerID is : %d rn“, SDCardInfo.SD_cid.Manufactu

16、rerID ); 35. 36. SD_EraseTest(); /擦除测试 37. 38. SD_SingleBlockTest(); /单块读写测试 39. 40. SD_MultiBlockTest(); /多块读写测试 41. 42. while (1) 43. 44. -第 10 页 - main 函数的流程简单明了: 1. 用 NVIC_Configuration()初始化好 SDIO 的中断; 2. 用 USART1_Config()配置好用于返回调试信息的串口, SD_Init()开始进行 SDIO 的初始化; 3. 最后分别用 SD_EraseTest()、 SD_Singl

17、eBlockTest()、 SD_MultiBlockTest()进行擦除,单数据块读写,多数据块读写测试。 下面我们先进入 SDIO 驱动函数的大头 SD_Init()进行分析: 1. /* 2. * 函数名: SD_Init 3. * 描述 :初始化 SD 卡,使卡处于就绪状态 (准备传输数据 ) 4. * 输入 :无 5. * 输出 : -SD_Error SD 卡错误代码 6. * 成功时则为 SD_OK 7. * 调用 :外部调用 8. */ 9. SD_Error SD_Init(void) 10. 11. /*重置 SD_Error 状态 */ 12. SD_Error erro

18、rstatus = SD_OK; 13. 14. /* SDIO 外设底层引脚初始化 */ 15. GPIO_Configuration(); 16. 17. /*对 SDIO 的所有寄存器进行复位 */ 18. SDIO_DeInit(); 19. 20. /*上电并进行卡识别流程,确认卡的操作电压 */ 21. errorstatus = SD_PowerON(); 22. 23. /*如果上电,识别不成功,返回 “响应超时 ”错误 */ 24. if (errorstatus != SD_OK) 25. 26. /*! 31) = 1) ? 1 : 0); /读取卡的 ocr寄存器的 p

19、wr_up 位,看是否已工作在正常电压 137. count+; /计算循环次数 138. 139. if (count = SD_MAX_VOLT_TRIAL) /循环检测超过一定次数还没上电 140. 141. errorstatus = SD_INVALID_VOLTRANGE; /SDIO 不支持 card 的供电电压 142. return(errorstatus); 143. 144. /*检查卡返回信息中的 HCS 位 */ 145. if (response /把卡类型从初始化的 sdsc 型改为 sdhc 型 148. 149. 150. /*!DCTRL = 0x0; 25

20、. 26. if (CardType = SDIO_HIGH_CAPACITY_SD_CARD) 27. 28. BlockSize = 512; 29. WriteAddr /= 512; 30. 31. 32. /*add,没有这一段容易卡死在 DMA 检测中*/ 33. /*! diskio.c - ff.c 。 关于具体源码的分析不是我能力所及呀,大家就自己研究吧。 我的主要工作是带领大家把这个文件系统移植到我们的开发板上,让这个文件系统先跑起来,这样才是硬道理呀。文件系统工作起来了的话,源码的分析那自然是大家的活啦。 2.5 开始移植 首先我们要获取一个完全没有修改过的文件系统源码,

21、然后在 10-MicroSD卡 这个文件夹下的实验代码下移植, 这个实验代码实现的是卡的底层的块操作 。 注意,我们在移植这个文件系统的过程中会尽量保持文件 系统源码的纯净,尽量做到在修改最少量的源码的情况下移植成功。 首先将 integer.h、 diskio.h、 diskio.c、 ff.h、 ff.c 添加到工程目录下的USER 文件夹下,如下截图: -第 8 页 - 然后并回到 MDK 界面下将 diskio.c 、 ff.c 这两个文件添加到 USER 目录下,如 下截图: 因为我们要用到这两个 c 文件,所以我们在 main.c 中将这两个 c 文件对应的头文件 diskio.h 、 ff.h 包含进来,如下截图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报