sd调试记录(标准库 + keil + RL-FlashFS):
裸机,RL-FlashFS,调试SD卡,几份很重要的资料:
1. https://shequ.stmicroelectronics.cn/thread-600358-1-1.html,提供了一份pdf步骤说明;
2. 硬汉的两个文件夹:提供样例
a. RL-FlashFS+SD卡(裸机长文件名综合实现)文件夹;
b. RTX5 RL-USB FL-FlashFS RL-TCPnet emWin6.x(V1.1) 文件夹;
3. RL-ARM User's Guide (MDK v4): RL-FlashFS keil 的官网说明;
可以分别去找,也可以在csdn中下载:sd卡嵌入式stm32RL-FlashFS移植资料资源-CSDN文库
安装资料1的步骤操作:
1)拷贝、设置相关文件;
2)根据自己的硬件(407),修改驱动;
3)测试SD卡;
一切还要,可以加载SD卡、卸载SD卡,但是:
1.执行写SD卡:fwrite、fprintf、fputs函数时没有写入SD卡,而是把数据写入到串口输出上了;
2.执行读SD卡:fread、fscanf、fgets函数时读SD卡时,程序卡滞了,但是没有死机;
问题发现,RL-FlashFS使用不能使用MicroLIB,printf、scanf需要通过retarget.c重定向两个函数int sendchar(int ch),int getkey (void)。由于程序bsp_uart_fifo.c中有四个函数:int sendchar(int ch),int getkey (void)、int fputc(int ch, FILE *f)、int fgetc(FILE *f);无论执行读写sd,还是执行读写串口(printf),都重定向为这两组函数:nt fputc(int ch, FILE *f)、int fgetc(FILE *f);使得都是对串口进行操作,故出现1,2的问题,解决问题的方式有两种:
1. 删掉这两组函数,使得串口操作,比如printf重定向为:_sys_write函数,调用sendchar函数,写SD卡不知道是怎样重定向的;
2. 或者在原有的fputc函数添加if语句:
int fputc(int ch, FILE *f)
{/* 采用阻塞方式发送每个字符,等待数据发送完毕 *//* 使用了RL-TCPnet网络协议栈,这里特别调整下 */if (f == &__stdout) { if (ch == '\n') // 如果是换行符,凑齐 \r\n{sendchar('\r'); // 发送回车符/* 等待发送结束 */}sendchar(ch); // 发送字符}return ch;}
int fgetc(FILE *f)
{if (f == &__stdin) { /* 等待串口1输入数据 */return ((int)getkey());}return EOF; // 如果不是标准输入流,返回EOF}
方法2,解决了sd卡读写不会对串口进行操作,但是写sd卡的时候,内容还是空,原因没有找到。
方法1,可以实现对sd卡的准确操作。