最近两天由于之前研究的GPS+BD定位信息不只需要获取信息并显示,还需要对当时的信息进行存储,比如说我们在一个地方进行测量,测量人员记录了测量数值和位置,但是不免会出现错误,当然GPS出现错误也有可能,所以我们需要把每次测试的信息和位置同时记录一份,以便工作结束后数据比对校正。我的处理方式就是使用SD卡和FATFS搞定
首先要讲一点小知识
【SD卡根据其使用的系统规范】
[tr]系统规范版本时钟[/tr]
V3.31 | 1-20MHz |
V4.2和V4.4 | 1-48MHz |
这一点浪费了我一整天的时间在找问题(也怪我是个菜鸡,没有看完模块的说明就来干活,希望大家不要和我犯一样的错误)
今日目标
- 实现通过文件系统在SD卡根目录下创建一个名为“GPSSave.txt”的文本文档
- 在“GPSSave.txt”内写上“我就是那张SD卡,8G那张!!”
- 读取“GPSSave.txt”,将其内容写到串口上。
一、基本思路
- 需要接入SD卡,所以需要使能SDMMC
- 需要通过串口显示,需要使能UART
- 需要用文件系统管理,需要使能FATFS
二、操作步骤
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!!!!!!接下来会推出一系列的关于串口外设使用的分享,有需要的猿们敬请关注!!!!! 以上内容欢迎大家转载引用,标明出处即可!!!!!
最近两天由于之前研究的GPS+BD定位信息不只需要获取信息并显示,还需要对当时的信息进行存储,比如说我们在一个地方进行测量,测量人员记录了测量数值和位置,但是不免会出现错误,当然GPS出现错误也有可能,所以我们需要把每次测试的信息和位置同时记录一份,以便工作结束后数据比对校正。我的处理方式就是使用SD卡和FATFS搞定
首先要讲一点小知识
【SD卡根据其使用的系统规范】
[tr]系统规范版本时钟[/tr]
V3.31 | 1-20MHz |
V4.2和V4.4 | 1-48MHz |
这一点浪费了我一整天的时间在找问题(也怪我是个菜鸡,没有看完模块的说明就来干活,希望大家不要和我犯一样的错误)
今日目标
- 实现通过文件系统在SD卡根目录下创建一个名为“GPSSave.txt”的文本文档
- 在“GPSSave.txt”内写上“我就是那张SD卡,8G那张!!”
- 读取“GPSSave.txt”,将其内容写到串口上。
一、基本思路
- 需要接入SD卡,所以需要使能SDMMC
- 需要通过串口显示,需要使能UART
- 需要用文件系统管理,需要使能FATFS
二、操作步骤
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!!!!!!接下来会推出一系列的关于串口外设使用的分享,有需要的猿们敬请关注!!!!! 以上内容欢迎大家转载引用,标明出处即可!!!!!
举报