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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 用STM32F103 完成对SD卡的数据读取 -> 正文阅读

[嵌入式]用STM32F103 完成对SD卡的数据读取

目录

一、SD卡读写模块

二、SPI协议

三、代码分析

四、接线

?

五、总结


一、SD卡读写模块

????????SD卡读写是指单片机读写SD卡/TF卡。SD卡是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块。对于MMC操作模式,读写速度快,控制信号线多,操作复杂,对于SPI操作模块,速度慢,线少,操作相对简单。

关于SD卡读写模块在百度百科有更详细的解释:??nullicon-default.png?t=LA92https://baike.baidu.com/item/SD%E5%8D%A1%E8%AF%BB%E5%86%99%E6%A8%A1%E5%9D%97/1455469?fr=aladdin链接如上,我在此不再赘述。

二、SPI协议

SD卡也是通过SPI协议进行通信,关于SPI协议的解释如下:

????????SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。

在百度百科有关于SPI协议更详细的解释:

SPI(SPI协议)_百度百科 (baidu.com)icon-default.png?t=LA92https://baike.baidu.com/item/SPI/53075243?fr=aladdin链接如上,在此我不再过多赘述。

三、代码分析

主函数

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 */
}


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);?? ??? ? //取消挂载
?? ?
}


程序首先进行相关初始化,完成后输出mian,之后进行SD卡格式化,成功后进入循环,进入SD卡读写函数,先后进行SD卡的初始化,挂载,创文件,写入,写入超过10次,输出while

四、接线

SD卡STM32?
? ? ? CS????????PB0
SCKPA5
MISOPA6
MOSIPA7

五、总结

本次实验内容较多,本篇博客内容较清晰,如有不足请指出

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:21:45  更:2021-12-26 22:23:57 
 
开发: 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 12:33:14-

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