绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据

绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据

文章目录

  • 绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据
  • 1 AltiumDesigner 软件配置
  • 2 AltiumDesigner 绘制STM32最小系统原理图
    • 2.1 建立工程文件
    • 2.2 基本绘制方法
    • 2.3 绘制其余模块
  • 3 AltiumDesigner 绘制STM32+SD卡原理图
  • 4 SD卡概述
    • 4.1 SD 卡简介
    • 4.2 SD 卡模块结构
    • 4.3 SD 卡的寄存器
    • 4.4 SD 卡操作
  • 5 SD卡数据读取实作
    • 5.1 源代码
    • 5.2 硬件连线
    • 5.3 结果及分析
  • 6 总结
  • 7 参考文献

1 AltiumDesigner 软件配置

  1. 安装连接:百度网盘
    提取码:fnr9
  2. 解压——安装包——双击打开AltiumDesigner18Setup.exe——

利用AD软件,完成以下任务
用Altium Designer绘制一个stm32最小系统的电路原理图,并在此基础上完成STM32+SD卡 的系统原理图设计。

2 AltiumDesigner 绘制STM32最小系统原理图

2.1 建立工程文件

  1. File——New——Project——PCB Project
    (记得将工程保存在文件夹下。)
    在这里插入图片描述
  2. File——New——Project——PCB Project——Schematic
  3. 导入元件库:右上角“库”——Libraries——可用库——右下角“添加库”——选指定的元件库——打开。
    绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第1张图片

2.2 基本绘制方法

  1. 选择芯片,将其拖入界面(STM32C8T6)。要放置其余原件也是类似方式。
    绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第2张图片
  2. 延长引脚线,设置标签。
    绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第3张图片
    绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第4张图片
    绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第5张图片
  3. 点击原件,按空格键可以旋转 90°。

2.3 绘制其余模块

系统供电稳压
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第6张图片调试JTAG、SW模块
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第7张图片
复位模块
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第8张图片
I/O接口
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第9张图片
扩展供电接口
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第10张图片
STM32USB
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第11张图片

数据存储E2
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第12张图片

OLED
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第13张图片
STM32
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第14张图片

3 AltiumDesigner 绘制STM32+SD卡原理图

如图示STM32F103CT6 和 SD 卡的原理图。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第15张图片

4 SD卡概述

4.1 SD 卡简介

SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备,由于它体积小、数据传输速度快、可热插拔等优良的特性,被广泛地于便携式装置上使用,例如数码相机、平板电脑和多媒体播放器等。

4.2 SD 卡模块结构

绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第16张图片绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第17张图片

绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第18张图片

各个部分的功能:

一共有6个接口,分别是GND,VCC,CS,SCK,MOSI,MISO。VCC是供电,GND是接地。其他4根是SPI通讯时用的,CS是片选,SCK是时钟信号,MOSI为主输出从输入,MISO为主输入从输出。

4.3 SD 卡的寄存器

名称 宽度 描述
CID 128 卡标识寄存器
RCA 16 相对卡地址寄存器:本地系统中卡的地址,动态变化,在卡的初始化时确定。(SPI模式中没有)
CSD 128 卡描述数据寄存器:卡操作条件相关的信息数据
SCR 64 SD配置寄存器:SD卡特定信息数据
OCR 32 操作条件寄存器

4.4 SD 卡操作

  • SD卡初始化过程(知道 SD 卡的类型V1、 V2、 V2HC 或者 MMC):

    初始化与 SD 卡连接的硬件条件(MCU 的 SPI 配置, IO 口配置);
    上电延时(>74 个 CLK)(因为 SD 卡内部有个供电电压上升时间,大概为 64 个 CLK,剩下的 10 个 CLK 用于 SD 卡同步,之后才能开始 CMD0 的操作);
    复位卡(CMD0),进入 IDLE 状态;
    发送 CMD8,检查是否支持 2.0 协议;
    根据不同协议检查 SD 卡(命令包括: CMD55、 CMD41、 CMD58 和 CMD1 等);
    取消片选,发多 8 个 CLK(提供 SD 卡额外的时钟,完成某些操作),结束初始化;
    
  • SD卡读取数据(CMD17):

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

     发送 CMD24;
     接收卡响应 R1;
     发送写数据起始令牌 0XFE;
     发送数据;
     发送 2 字节的伪 CRC;
     禁止片选之后,发多 8 个 CLK;
    

5 SD卡数据读取实作

用STM32F103完成对SD卡的数据读取(fat文件模式)。

5.1 源代码

工程文件连接:
百度网盘
提取码:e63q

  1. 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(" mian \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] +0;
    		WriteBuffer[1] = WriteBuffer[1] +1;
    		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 */
    }
    
  2. 其余函数:

    // SD卡初始化函数  
     void Get_SDCard_Capacity(void)  
     // SD卡写入函数
     void WritetoSD(BYTE write_buff[],uint8_t bufSize)  
    
    //SD 卡初始化函数
    void Get_SDCard_Capacity(void)   
    {
    	FRESULT result;
    	FATFS FS;
    	FATFS *fs;
    	DWORD fre_clust,AvailableSize,UsedSize;  
    	uint16_t TotalSpace;
    	uint8_t res;
    	
    	res = SD_init();		//SD卡初始化
    	if(res == 1)
    	{
    		printf("SD卡初始化失败! \r\n");		
    	}
    	else
    	{
    		printf("SD卡初始化成功! \r\n");		
    	}
    	
    	/* 挂载 */
    	res=f_mount(&FS,"0:",1);		//挂载
    	if (res != FR_OK)
    	{
    		printf("FileSystem Mounted Failed (%d)\r\n", result);
    	}
    
    	res = f_getfree("0:", &fre_clust, &fs);  /* 根目录 */
    	if ( res == FR_OK ) 
    	{
    		TotalSpace=(uint16_t)(((fs->n_fatent - 2) * fs->csize ) / 2 /1024);
    		AvailableSize=(uint16_t)((fre_clust * fs->csize) / 2 /1024);
    		UsedSize=TotalSpace-AvailableSize;              
    		/* Print free space in unit of MB (assuming 512 bytes/sector) */
    		printf("\r\n%d MB total drive space.\r\n""%d MB available.\r\n""%d MB  used.\r\n",TotalSpace, AvailableSize,UsedSize);
    	}
    	else 
    	{
    		printf("Get SDCard Capacity Failed (%d)\r\n", result);
    	}		
    } 
    
    //SD卡写入函数
    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);		 //取消挂载
    	
    }
    
  3. 编译构建
    绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第19张图片
    没有错误。

5.2 硬件连线

USB和STM32芯片的连线和之前一样,这里主要是SD卡和STM32芯片的连线。【这里要选择 5V 要是电压不够大,后面的内容无法进行】

SD卡 STM32F103C8T6
SDCS PA4
SCK PA5
MOSI PA7
MISO PA6
VCC 5V
GND GND

连线如下图:

绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第20张图片

5.3 结果及分析

烧录代码, 打开串口调试助手
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第21张图片
发现每按一次复位键,串口只发送“main”,说明SD卡并没有起到作用。

将 SD 卡插到电脑上,可以看到弹出格式化 SD 卡的窗口:文件系统选择FAT(按下图设置)。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第22张图片
格式化成功。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第23张图片
再次烧录并打开串口,注意考虑是否线路连接正常(接触不良等问题。)初始化和发送数据的过程要等一会儿才能完成,大约几分钟。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第24张图片
初始化成功,显示了“总内存和可用内存,挂载成功,文件写入成功”等信息。

再等待一会儿,就会发送“ while ”。表示成功。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第25张图片把SD卡插到电脑上,可以看到里面有一个 “HELLO.TXT ” 文件。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第26张图片
打开该文件,发现前面几个字符出现了乱码。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第27张图片
这是代码中的问题,修改代码:将 main 函数中的如下函数进行修改(数字部分)。

绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第28张图片
再次编译、烧录、运行,最后打开 .TXT 文件。
绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据_第29张图片
可以看到问题解决了。(但是第二个字母发生了变化,按字母的顺序变化的,这里是代码中设置的“+1”,相当于ASCII码变化了,对应的内容也发生了变化。)

6 总结

  • 原理图部分:原理图主要是连线仔细与否的问题。学习一个和专业相关的新软件,并明白要运用到的芯片的原理结构,能够帮助我们更直观地理解硬件与软件的交接。
  • SD卡读取部分:主要是供电电压不足的问题。在前人的基础上完成一件事情是容易的,但也没有任何成就感。我想我们更需要的是去做一个先行者。

7 参考文献

Altium Designer2018下载安装及基本使用
STM32使用SPI方式读写SD 卡
STM32——SD卡和FATFS文件系统

你可能感兴趣的:(stm32,单片机,arm)