目录
一安装 Altium Designer18 并用其绘制 stm32 最小系统的电路原理图
二、掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
一安装 Altium Designer18 并用其绘制 stm32 最小系统的电路原理图
1.下载与安装
网盘下载地址:百度网盘 请输入提取码 提取码:luha
解压后
2.文件配置
打开下载的 AltiumDesigner 软件,选择 license ,选择文件进行保存,如下:
完成
3.绘制 stm32 最小系统的电路原理图
3.1绘制前目标
使用 Altium Designer 绘制一个 stm32 最小系统的电路原理图。
何为stm32 最小系统的电路原理图
最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是嵌入式入门的基础。
stm32 最小系统的电路原理图如下,我们的目标就是绘制出下面的原理图。
最小系统主要有电源,时钟,调试,复位,以及控制芯片五大部分组成。
3.2创建工程
点击 File
-> New
-> Project
-> PCD Project
,新建一个 PCD 工程,得到如下界面:
右击 PCD_Project1.PrjPCB
,选择 Add New to Project
-> Schematic
,新建一个原理图,等待加载完毕后,得到如下界面:
3.3元件库
下载链接 :元件库.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)
提取码:luha
将三个元件库加入到里面
3.4绘制开始
打开的元件库里找到 stm32f103c8t6 芯片,并双击打开,然后点击左将元件放在中间
引脚连接
将所有引脚都延长,可以复制粘贴(选中之后可以使用 ctrl + c 复制,ctrl + v 粘贴,按空格可以每90°旋转器件)。最终效果如下:
然后选择这个
选中后,按下TAB键,编辑名称
选择下面的元件
3.5绘制结果
STM32芯片
R:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 10k
指示灯
R:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 1k
D:Miscellaneous Devices LC.IntLib 元件库中搜索 0603
stm32 去耦电路
C:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 100nf
晶振电路
Y:Miscellaneous Devices.IntLib 元件库中搜索 XTAL
C:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 22pf
复位电路
S:Miscellaneous Devices.IntLib 元件库中搜索 SW-PB
C:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 1uf
降压电路
AMS1117:stm32f103c8t6 最小系统.SchLib 元件库中
下载方式选择及程序烧录接口
P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR
输入、输出电源
J:base.SchLib 元件库中搜索 USB micro
排针
P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR1X16
4 SD卡原理图
5.最终原理图STM32C8T6+SD
二、掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
sd卡协议
下图是SD卡的体系架构,可以看到内部包含了一系列的寄存器:
SD Memory Card Architecture
各个寄存器的详细信息如下:
SD Memory Card Registers
SD配置寄存器提供SD卡的特殊特性信息,其大小为64位。该寄存器由厂商编程,主机不能对它进行编程。
SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡
一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5 个部分。
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;
接口驱动器控制 SD 卡引脚的输入输出。驱动模式
SD卡有两种驱动模式:SPI模式与SDIO模式。它们所使用的接口信号是不同的。在SPI模式下,只会用到SD卡的4根信号线,即CS、DI、SCLK与DO(分别是SD卡的片选、数据输入、时钟与数据输出)。传输模式
SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出),1位SD模式(独立指令和数据通道,独有的传输格式),4位SD模式(使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)。
FATFS 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到资源有限的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。
FATFS提供了以下文件访问函数:
f_open - 打开/创建文件
f_close - 关闭打开的文件
f_read - 从文件中读取数据
f_write - 将数据写入文件
f_lseek - 移动读/写指针,扩展大小
f_truncate - 截断文件大小
f_sync - 刷新缓存的数据
f_forward - 将数据转发到流
f_expand - 为文件分配连续块
f_gets - 读取字符串
f_putc - 写一个字符
f_puts - 编写字符串
f_printf - 编写格式化字符串
f_tell - 获取当前读/写指针
f_eof - 测试文件结尾
f_size - 获取尺寸
f_error - 测试错误
1.stm32cube配置
我用的这个芯片
勾选
sys配置
配置PA4
SPI1
USART1
时钟配置
最后一步
2.文件工程配置
将这两个文件放在本目录下
打开文件
修改main,添加头文件
添加下面代码
HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); //enable uart
printf(" mian \r\n");
Get_SDCard_Capacity(); //得到使用内存并选择格式化
WritetoSD(WriteBuffer,sizeof(WriteBuffer));
HAL_Delay(500);
WriteBuffer[0] = WriteBuffer[0] +10;
WriteBuffer[1] = WriteBuffer[1] +10;
write_cnt ++;
while(write_cnt > 10)
{
printf(" while \r\n");
HAL_Delay(500);
}
修改user_diskio.c文件
1.添加头文件 #include "diskio.h" /* Declarations of disk functions */
#include "SDdriver.h"
2.将下面代码放在指定位置,修改函数内容:USER_initialize、USER_status、USER_read、USER_write、USER_ioctl
uint8_t res;
res = SD_init();//SD_Initialize()
if(res)//STM32 SPI的bug,在sd卡操作失败的时候如果不执行下面的语句,可能导致SPI读写异常
{
SPI_setspeed(SPI_BAUDRATEPRESCALER_256);
spi_readwrite(0xff);//提供额外的8个时钟
SPI_setspeed(SPI_BAUDRATEPRESCALER_2);
}
if(res)return STA_NOINIT;
else return RES_OK; //初始化成功
switch (pdrv)
{
case 0 :
return RES_OK;
case 1 :
return RES_OK;
case 2 :
return RES_OK;
default:
return STA_NOINIT;
}
uint8_t res;
if( !count )
{
return RES_PARERR; /* count不能等于0,否则返回参数错误 */
}
switch (pdrv)
{
case 0:
res=SD_ReadDisk(buff,sector,count);
if(res == 0){
return RES_OK;
}else{
return RES_ERROR;
}
default:
return RES_ERROR;
}
uint8_t res;
if( !count )
{
return RES_PARERR; /* count不能等于0,否则返回参数错误 */
}
switch (pdrv)
{
case 0:
res=SD_WriteDisk((uint8_t *)buff,sector,count);
if(res == 0){
return RES_OK;
}else{
return RES_ERROR;
}
default:return RES_ERROR;
}
DRESULT res;
switch(cmd)
{
case CTRL_SYNC:
SD_CS(1);
do{
HAL_Delay(20);
}while(spi_readwrite(0xFF)!=0xFF);
res=RES_OK;
SD_CS(0);
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = 512;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(WORD*)buff = 8;
res = RES_OK;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = SD_GetSectorCount();
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
return res;
可以直接下载我后面参考博客的代码。
3.效果展示
连接串口
查看写入的文件
参考链接:
(31条消息) STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客
(31条消息) 安装 Altium Designer18 并用其绘制 stm32 最小系统的电路原理图_L-GRAZY的博客-CSDN博客