IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取 -> 正文阅读

[嵌入式]Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取

Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取

一、题目内容

  1. 掌握电路原理图绘制。安装Altium Designer 18,学习使用Altium Designer绘制一个stm32最小系统的电路原理图,并在此基础上完成STM32+SD卡 的系统原理图设计。(该系统的PCB图的绘制不做要求,凭个人兴趣选做)
  2. 掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。

二、SD卡协议原理

1、SD卡介绍

很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。
只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

2、物理结构&寄存器

一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。
物理结构:
在这里插入图片描述
在这里插入图片描述
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证 SD 卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
卡及接口控制单元控制 SD 卡的运行状态,它包括有 8 个寄存器;
接口驱动器控制 SD 卡引脚的输入输出。
SD卡寄存器
D卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
在这里插入图片描述
SD卡引脚功能详述
在这里插入图片描述

3、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类,下表为几个比较重要的命令:
在这里插入图片描述

4、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),在完成了初始化之后,就可以开始读写数据了。

5、SD卡读取和写入(SPI)

SD卡读取:
1、发送CMD17;
2、接收卡响应R1;
3、接收数据起始令牌0XFE;
4、接收数据;
5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
6、禁止片选之后,发多8个CLK;
SD卡写入:
1、发送CMD24;
2、接收卡响应R1;
3、发送写数据起始令牌0XFE;
4、发送数据;
5、发送2字节的伪CRC;
6、禁止片选之后,发多8个CLK;

三、SD卡实验过程及实验结果

1、前期准备

SD卡模块及SD卡
在这里插入图片描述
内部结构:
在这里插入图片描述
在这里插入图片描述

2、连线

在这里插入图片描述
在这里插入图片描述

3、HAL库的配置

这里是网盘地址:
链接:https://pan.baidu.com/s/1KNBN-y2esPHLJWBjv6IiRw
提取码:1234

4、代码

main主函数

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration---------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_FATFS_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); 	//enable uart	
	printf(" main \r\n");
	Get_SDCard_Capacity();	//得到使用内存并选择格式化
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		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 CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


while循环中

while (1)
  {
		
		
		
		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);
		}		

这里我们看下write_cnt初始定义的值,计算写入次数循环要求。
(在main.c文件头部)
从0开始,write_cnt=0,因此要写入超过11次,之后不再写入内容。
在这里插入图片描述
写入函数WritetoSD

void WritetoSD(BYTE write_buff[],uint8_t bufSize)
{
	FATFS fs;
	FIL file;
	uint8_t res=0;
	UINT Bw;	
	res = SD_init();		//SD卡初始化
	if(res == 1)
	{
		printf("SD卡初始化失败! \r\n");		
	}
	else
	{
		printf("SD卡初始化成功! \r\n");		
	}
	res=f_mount(&fs,"0:",1);		//挂载
//	if(test_sd == 0)		//用于测试格式化
	if(res == FR_NO_FILESYSTEM)		//没有文件系统,格式化
	{
//		test_sd =1;				//用于测试格式化
		printf("没有文件系统! \r\n");		
		res = f_mkfs("", 0, 0);		//格式化sd卡
		if(res == FR_OK)
		{
			printf("格式化成功! \r\n");		
			res = f_mount(NULL,"0:",1); 		//格式化后先取消挂载
			res = f_mount(&fs,"0:",1);			//重新挂载	
			if(res == FR_OK)
			{
				printf("SD卡已经成功挂载,可以进进行文件写入测试!\r\n");
			}	
		}
		else
		{
			printf("格式化失败! \r\n");		
		}
	}
	else if(res == FR_OK)
	{
		printf("挂载成功! \r\n");		
	}
	else
	{
		printf("挂载失败! \r\n");
	}	
	res = f_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);
	if((res & FR_DENIED) == FR_DENIED)
	{
		printf("卡存储已满,写入失败!\r\n");		
	}
	f_lseek(&file, f_size(&file));//确保写词写入不会覆盖之前的数据
	if(res == FR_OK)
	{
		printf("打开成功/创建文件成功! \r\n");		
		res = f_write(&file,write_buff,bufSize,&Bw);		//写数据到SD卡
		if(res == FR_OK)
		{
			printf("文件写入成功! \r\n");			
		}
		else
		{
			printf("文件写入失败! \r\n");
		}		
	}
	else
	{
		printf("打开文件失败!\r\n");
	}	
	f_close(&file);						//关闭文件		
	f_mount(NULL,"0:",1);		 //取消挂载
}

从写入函数中,我们可以知道,针对SD卡文件的每个步骤,我们都进行了相应的字段输出,来具体判断究竟进行到了什么地步。
在这里插入图片描述
这可以更改输入我们想要的内容。

5、实验结果

编译成功
在这里插入图片描述
烧录
在这里插入图片描述
初始化
在这里插入图片描述
实验成果
在这里插入图片描述

四、安装Altium Designer 18

介绍:
Altium Designer 在单一设计环境中集成板级和FPGA系统设计、基于FPGA和分立处理器的嵌入式软件开发以及PCB版图设计、编辑和制造。并集成了现代设计数据管理功能,使得Altium Designer成为电子产品开发的完整解决方案,一个既满足当前,也满足未来开发需求的解决方案。
安装Altium Designer18:
在这里插入图片描述
以管理员运行
在这里插入图片描述
选择汉语
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打开Crack文件夹,复制shfolder.dll文件到Altium Designer的安装目录下
在这里插入图片描述
打开Altium Designer 软件,选择license,选择文件并打开
在这里插入图片描述
成功注册
在这里插入图片描述
点击设置,勾选Use localized resources,点击OK,重启Altium Designer,汉化成功
在这里插入图片描述
安装完成

五、原理图绘制

因为我们是第一次进行绘制,所以我们先可以在网上找现成的原理图进行模仿。
网盘链接(淘宝商家):https://pan.baidu.com/share/init?surl=ipHs1nPdf6Xq3H_OH5j7DA
提取码:7hqu

1、新建工程

点击File->New->Project->PCD Project,新建工程
在这里插入图片描述
右击PCD_Project1.PrjPCB,选择Add New to Project->Schematic,新建原理图。
在这里插入图片描述

2、下载元件库

这里有别人的网盘:https://pan.baidu.com/s/1jiJAqjsCjWf41C5edIP7Ww
提取码:1521
添加
在这里插入图片描述

在这里插入图片描述

3、绘制原理图

在元件库中找到stm32f103c8t6芯片,双击打开,将元件放在中间
在这里插入图片描述
点击放置线延长管脚,左键在起始和终点各点击一下连接,右键释放掉
(可使用 ctrl + c 复制,ctrl + v 粘贴,按空格可每90°旋转器件)
在这里插入图片描述
点击Net Label放置网络编号,按tab键进入设置窗口,编辑编号名称,回车退出编辑框,再左键放下
在这里插入图片描述
这就是连接完的成果

六、绘制STM32+SD卡原理图

1、SD卡模块

SD卡模块说明
在这里插入图片描述
内部结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、SD卡模块原理图

在这里插入图片描述
根据SD卡模块的设计,可以知道各管脚连线如下:
在这里插入图片描述
绘制
点击右上角的Libraries,选择下载的元件库并寻找器件
AMS1117:stm32f103c8t6 最小系统.SchLib 元件库中
P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR
C:Miscellaneous Devices LC.IntLib元件库中搜索 0805 100uF
在这里插入图片描述
在这里插入图片描述

3、实验成果

在这里插入图片描述

七、实验总结

通过这次实验我们可以学习Altium Designer 18的一些基本操作,然后还有SD卡的相关知识,在实验过程中还是遇到了一些问题但是,通过老师、同学还有网上的博客得到了解决,总之这次实验收获还是挺大的。

八、参考资料

https://www.bilibili.com/video/BV1Ab411K7yp/?spm_id_from=333.788.videocard.0
https://www.bilibili.com/video/BV17E411x7dR?p=2
https://detail.tmall.com/item.htm?id=43580108042&spm=a1z09.2.0.0.4e1c2e8dwVFPWk&_u=e3meo26c8f82
STM32用cube配置FATFS模式下SPI读写SD卡

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:38:44  更:2021-12-24 18:39:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:57:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码