完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近两天由于之前研究的GPS+BD定位信息不只需要获取信息并显示,还需要对当时的信息进行存储,比如说我们在一个地方进行测量,测量人员记录了测量数值和位置,但是不免会出现错误,当然GPS出现错误也有可能,所以我们需要把每次测试的信息和位置同时记录一份,以便工作结束后数据比对校正。我的处理方式就是使用SD卡和FATFS搞定
首先要讲一点小知识 【SD卡根据其使用的系统规范】 [tr]系统规范版本时钟[/tr]
今日目标
1、根据自己的stm32的芯片型号来选择,我这里是STM32F767IGTx 2、选好芯片之后照旧设置RCC为外部时钟 3、使能串口1(usart1) 模式设为异步(Asynchronous)其他默认,波特率可以自己改,USART1为115200Bits/s,如图 4、使能SDMMC 模式设为SD 4 Bits Wide bus ,设置DMA,如图 使能SDMMC1中断 此处必须使得SDMMC的中断优先级高于DMA,才可正常工作,所以在中断设置中设置中断优先级 [tr]设备优先级[/tr]
5、使能FATFS 勾选SD Card,修改红框相应参数如图 6、时钟树设置 由于本人使用的SD卡系统规范的版本为V3.31所以需要保证SDMMC的时钟小于20MHz,如图: 之后下拉时钟树,找到SDMMC1的频率,修改时钟源为PLL48CLK,如图: 7、项目设置 有文件系统,堆栈改大一点0x1000 生成代码右上角GENERATE CODE 8、代码修改 为保证我们方便的使用串口打印信息,所以找到uart.c,并在/* USER CODE BEGIN 0 */后添加如下代码: #include struct __FILE { int handle; }; FILE __stdout; void _sys_exit(int x) { x = x; } int fputc(int ch, FILE *f) { while((USART1->ISR&0X40)==0); USART1->TDR=(uint8_t)ch; return ch; } 用于重定义printf函数的输出口 在main.c函数中的/* USER CODE BEGIN PV */后添加如下定义 FATFS fs; //工作空间 FIL fil; // 文件项目 uint32_t byteswritten; // 写文件计数 uint32_t bytesread; // 读文件计数 uint8_t wtext[] = "我就是那张SD卡,8G那张!!"; // 写的内容 uint8_t rtext[1024]; // 读取的buff char filename[] = "GPSSave.txt"; // 文件名 在main.c函数中的/* USER CODE BEGIN 2 */后添加如下代码: printf("rn ****** 文件系统 ******rnrn"); /*-1- 挂载文件系统*/ retSD = f_mount(&fs, "", 0); if(retSD) { printf(" mount error : %d rn",retSD); Error_Handler(); } else printf(" mount sucess!!! rn"); /*-2-创建新的文件并写入数据*/ retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); //打开文件,权限包括创建、写(如果没有该文件,会创建该文件) if(retSD) //返回值不为0(出现问题) printf(" open file error : %drn",retSD); //打印问题代码 else printf(" open file sucess!!! rn"); /*-3- 在txt文件中写入数据*/ retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); //在文件内写入wtext内的内容 if(retSD) //返回值不为0(出现问题) printf(" write file error : %drn",retSD); //打印问题代码 else { printf(" write file sucess!!! rn"); printf(" write Data : %srn",wtext); //打印写入的内容 } /*-4- 关闭txt文件*/ retSD = f_close(&fil); //关闭该文件 if(retSD) //返回值不为0(出现问题) printf(" close error : %drn",retSD); //打印问题代码 else printf(" close sucess!!! rn"); /*-5- 打开文件读取数据*/ retSD = f_open(&fil, filename, FA_READ); //打开文件,权限为只读 if(retSD) //返回值不为0(出现问题) printf(" open file error : %drn",retSD); //打印问题代码 else printf(" open file sucess!!! rn"); /*-6- 读取txt文件数据*/ retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); //读取文件内容放到rtext中 if(retSD) //返回值不为0(出现问题) printf(" read error!!! %drn",retSD); //打印问题代码 else { printf(" read sucess!!! rn"); printf(" read Data : %srn",rtext); //打印读取到的数据 } /*-7- 关闭文件*/ retSD = f_close(&fil); //关闭该文件 if(retSD) //返回值不为0(出现问题) printf(" close error!!! %drn",retSD); //打印问题代码 else printf(" close sucess!!! rn"); /*##-8- 读写一致性检测 ############*/ if(bytesread == byteswritten) //如果读写位数一致 { printf(" FatFs is working well!!!rn"); //打印文件系统工作正常 } 编译、下载 三、结果验证 插上SD卡,打开串口调试助手并设置比特率等参数与串口1一致,上电 得到如下结果: 为保证我不是瞎搞的,现在来看看SD卡里的内容 文件名为:GPSSave.txt 打开后内容为:我就是那张SD卡,8G那张!! 到此试验成功。 Good Game!!!!!!接下来会推出一系列的关于串口外设使用的分享,有需要的猿们敬请关注!!!!! 以上内容欢迎大家转载引用,标明出处即可!!!!! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 15:34 , Processed in 0.618188 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号