一、绘制电路原理图
1.建立工程
建立工程 建立原理图 加载完毕后,如下图
2.添加元件库
链接: https://pan.baidu.com/s/1FPWEQcV8F2cJQZvbQU-QlA 提取码:1108
3.绘制原理图
从元件库中选取 stm32f103c8t6 芯片 延长部分管脚 放置网络编号(右键点击) 点击后,元件会挂在鼠标上,此时,先不要放置,按 tab 键进入设置窗口,编辑编号名称:PB12,然后按回车即可退出编辑框,然后左键再放下,方便的是,当放置一个网络标签后,下一个标签的值会 stm32最小系统的电路原理图: 指示灯: 排针: 输入、输出电源: 下载方式选择、程序烧录入口: 降压电路:
晶振电路: 复位电路: 去耦电路: STM32原理总图:
三、STM32+SD卡 的系统原理图设计
下面的步骤就和上面差不多了就不在重复
四、参考
https://www.bilibili.com/video/BV17E411x7dR?p=2
STM32F103对SD卡的数据读取
一、SD卡协议原理
1、SD卡简述
很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。 只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。
2、SD卡物理结构
一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。 存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输; 电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位; 卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器; 接口驱动器控制SD卡引脚的输入输出。
3、SD卡寄存器
SD卡总共有8个寄存器,用于设定或表示SD卡信息。 这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
CID 128 卡识别号(Card identification number):用来识别的卡的个体号码(唯一的)
RCA 16 相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准
DSR 16 驱动级寄存器(Driver Stage Register):配置卡的输出驱动 CSD 128 卡的特定数据(Card
Specific Data):卡的操作条件信息 SCR 64 SD配置寄存器(CD Configuration
Register):SD卡特殊特性信息 OCR 32 操作条件寄存器(Operation conditiongs register)
SSR 512 SD状态(SD Status):SD卡专有特征的信息 CSR 32 卡状态(Card Status):卡状态信息
4、SD卡操作模式
SD卡一般都支持 SDIO 和 SPI 这两种接口。 其中SD卡模式的信号线有:CLK、CMD、DAT0-DAT3,6根线。 SPI模式的信号线有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根线。 SD卡的命令格式:命令CMD0就是0,CMD16就是16,以此类推。 SD卡的命令总共有12类,下表为几个比较重要的命令:
CMD0(0X00) NONE R1 复位SD卡 CMD8(0X08) VHS+Check Pattern R7 发送接口状态命令
CMD9(0X09) NONE R1 读取卡特定数据寄存器 CMD10(0X0A) NONE R1 读取卡标志数据寄存器
CMD16(0X10) 块大小 R1 设置块大小(字节数) CMD17(0X11) 地址 R1 读取一个块的数据
CMD24(0X18) 地址 R1 写入一个块的数据 CMD41(0X29) NONE R3 发送给主机容量支持信息和激活卡初始化过程
CMD55(0X37) NONE R1 告诉SD卡,下一个是特定应用命令 CMD58(0X3A) NONE R3 读取OCR寄存器
5、SD卡初始化(SPI模式)
SPI操作模式下:在SD卡收到复位命令时,CS为有效电平(低电平),则SPI模式被启用,在发送CMD之前要先发送74个时钟,64个为内部供电上升时间,10个用于SD卡同步;之后才能开始CMD操作,在初始化时CLK时钟不能超过400KHz。 1、初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置); 2、上电延时(>74个CLK); 3、复位卡(CMD0),进入IDLE状态; 4、发送CMD8,检查是否支持2.0协议; 5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等); 6、取消片选,发多8个CLK,结束初始化
这样我们就完成了对SD卡的初始化,注意末尾发送的8个CLK是提供SD卡额外的时钟,完成某些操作。通过SD卡初始化,我们可以知道SD卡的类型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以开始读写数据了。
6、SD卡读取与写入(SPI模式)
1、发送CMD17; 2、接收卡响应R1; 3、接收数据起始令牌0XFE; 4、接收数据; 5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。 6、禁止片选之后,发多8个CLK; 以上就是一个典型的读取SD卡数据过程,SD卡的写于读数据差不多,写数据通过CMD24来实现,具体过程如下: 1、发送CMD24; 2、接收卡响应R1; 3、发送写数据起始令牌0XFE; 4、发送数据; 5、发送2字节的伪CRC; 6、禁止片选之后,发多8个CLK; 以上就是一个典型的写SD卡过程。
二、cube配置
勾选User-defined SYS配置 GPIO配置 SPI1配置 USART1配置 Clock Configuration配置
修改堆栈大小为0x1400 找到创立的工程文件夹,移植此文件到自己的路径下 打开刚刚建立的工程 修改user_diskio.c函数 添加头文件 #include “diskio.h” /* Declarations of disk functions */ #include “SDdriver.h” 添加文件并修改接口里面的内容映射到SPI上,建议直接复制源码放进去,修改函数后面列举 main.c函数修改 修改函数内容:USER_initialize、USER_status、USER_read、USER_write、USER_ioctl 具体修改内容与源码对比 链接:https://pan.baidu.com/s/1f9O1bUbCLm0vNUY5JKwi1w 提取码:1108
四、烧录结果
五、总结
这次实验有的时候报错老是出现许多我不理解的地方,多尝试几次有无缘无故的成功,说明对这次的基础原理还是掌握的不好。
六、参考
https://blog.csdn.net/qq_46475595/article/details/122028621
|