datasheet

stm32f103c8t6移植Fatfs文件系统出现的一些问题

2019-05-25来源: eefocus关键字:stm32f103c8t6  移植  Fatfs文件系统

一、环境

keil5,使用库函数


二、移植对象

stm32f103zet6 >> stm32f103c8t6


三、连接方式

硬件SPI1(PA5,6,7)


四、主函数代码


#include "stdio.h"


#include "delay.h"

#include "sys.h"

#include "oled.h"


#include "malloc.h"  

#include "MMC_SD.h"   

#include "ff.h"  

#include "exfuns.h"


void SD_Read_Sectorx(u32 sec);


int main(void)

{

u32 total,free;

delay_init();     //延时函数初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init();      //LED端口初始化


OLED_Init(); //初始化OLED  

OLED_Clear();

OLED_ShowString(0,0,"OLED ready",12);

delay_ms(1000);

OLED_Fill(0,0,127,7,0);//清除显示

delay_ms(1000);

exfuns_init(); //为fatfs相关变量申请内存

mem_init(); //初始化内存池  

while(SD_Initialize()) //检测SD卡

{

OLED_ShowString(0,0,"SD Card Error!",12);

delay_ms(200);

OLED_Fill(0,0,127,7,0);//清除显示   

delay_ms(200);

//LED0=!LED0;//DS0闪烁

}    

  exfuns_init(); //为fatfs相关变量申请内存  

f_mount(fs[0],"0:",1); //挂载SD卡 

while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量

{

OLED_ShowString(0,0,"Fatfs Error!",12);

delay_ms(200);

OLED_Fill(0,0,127,7,0);//清除显示   

delay_ms(200);

//LED0=!LED0;//DS0闪烁

}

OLED_ShowString(0,0,"FATFS OK!",12);  

OLED_ShowString(0,1,"Total:     MB",12);  

OLED_ShowString(0,2,"Free :     MB",12);     

  OLED_ShowNum(48,1,total>>10,5,12); //显示SD卡总容量 MB

  OLED_ShowNum(48,2,free>>10,5,12);

while(1) 

{


}   

}



四、问题

0.移植准备

①修改device为STM32F103C8

②将C/C++中define“STM32F10X_HD,USE_STDPERIPH_DRIVER”改为“STM32F10X_HD,USE_STDPERIPH_DRIVER”

③更换相应的启动文件(.s)


1.编译报错内存不足

①从工程中删除cc936.c等文件,c8t6装不下

②mallco.h中#define MEM_MAX_SIZE 421024改小,测试101024可用,需保证编译结果后面两个size的和小于20k

③#define _CODE_PAGE 936 改为 #define _CODE_PAGE 1 使用ascii码减少存储开销

④相应#define _LFN_UNICODE 0 和 #define _STRF_ENCODE 0 ,使用ascii


2.程序死在while(SD_Initialize())中

①强烈建议检查连线,特别是SLK

②最好单片机单独供电而不是使用仿真器供电,可能由于供电不足导致spi初始化的高电平不符合要求

③如果使用仿真器调试时卡在此处,可能是卡在以下代码


while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET)

{

//...

}


百度到的解释是“rxne只能读一次,如果调试器读取了,那么程序就永远读不到了”,此外SPI运行时有一定几率程序会卡死在检查接受标志位处RXNE,论坛上的解决方案是将检查接受标志位改为检查忙状态,所以可以换成


while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET)

{

//...

}


经测试此方案可行。

④如果改为SPI2,可能是SPI2时钟初始化的问题。SPI1的时钟在APB2上而SPI2的在APB1上,初始化需调用不同的函数。如:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //硬件SPI1

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //硬件SPI2


3.程序死在while(exf_getfree(“0”,&total,&free))中

①一般来说不会在这句话中卡住,卡住了检查下连线吧

②设置SPI为高速模式时可能由于时钟太快导致初始化不成功(也可能是初始化之后的部分导致无法正常使用,ZET6没有这个问题而C8T6存在),可以适当降低高速模式的时钟


//SD卡正常工作的时候,可以高速了

void SD_SPI_SpeedHigh(void)

{

  //SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//原函数

SPI1_SetSpeed(SPI_BaudRatePrescaler_4);//修改

}


五、资料

1.SPI存储器W25X16,Debug时卡在SPI_I2S_GetFlagStatus(SPI1, 2.SPI_I2S_FLAG_RXNE

3.SPI调试小结

4.fatfs文件系统移植 读写时莫名出现FR_DISK_ERR问题

5.死循环了:while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);

6.SPI/I2S调试总结

7.F103C8T6移植Fatfs文件系统时编译报错空间不够


关键字:stm32f103c8t6  移植  Fatfs文件系统

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic462886.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32外设的使能,失能,复位的区别
下一篇:STM32F10x互补输出TIM_OutputState,TIM_OutputNState的意思

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103C8T6移植enc28j60+UIP1.0

移植环境(蓝色粗体字为特别注意内容)1,开发板:STM32F103C8T6最小系统开发板。2,开发环境:Keil uv53,参考文献:https://blog.csdn.net/wzs298/article/details/12228481移植ENC28J60这个网络模块可谓是困难重重啊,。。。。。找了很多个例子都没有成功的,只能说很坑很坑,我不知道网上为什么那么多人抄袭,,没有经过自己验证就copy出来。。。。捣鼓了一天终于把这个坑爹的模块搞定了,,,,先来贴一张图片:本例程移植uIP-1.0协议栈,演示开发板和PC间的TCP通信。自定义了一个简单的应用层通信协议。本例程实现的功能有:(1)通过PC机控制板子上的LED
发表于 2019-06-13
stm32f103C8T6移植enc28j60+UIP1.0

STM32F103C8T6使用MDK 4.12中Custom_HID的修改方法

目的,由上位机发送64字节,设备回应3个字节,功能自定。。板子使用的是最小核心板,MCU为STM32F103C8T6。USB的D-和D+分别接到PA11(USBDM)和PA12(USBDP)上,PA12(USBDP)即D+通过跳线使上拉1.5K电阻到VCC(3.3V)。1:打开MDK4.12,打开C:KeilARMExamplesSTSTM32F10xUSBLibDemosCustom_HIDproject目录下的Custom_HID项目文件。2:选择菜单 Project->Options for Target 'STM3210E-EVAL'在Device选项卡里选择 STM32F103C8。在Output
发表于 2019-06-12

STM32F103RCT6移植到STM32F103C8T6注意事项

1,修改IC为STC32F103C8 2,修改晶振为8.0M  3,修改C/C++宏定义,由STM32F10X_HD,USE_STDPERIPH_DRIVER 改为 STM32F10X_MD,USE_STDPERIPH_DRIVER 4,替换启动文件,由startup_stm32f10x_hd.s修改为startup_stm32f10x_md.s到这里已经没有报错了5,重新分配各模块引脚定义这一步做完以后才发现,程序好像跑的慢了10来倍,群里求助,说是倍频没有设置好,找到一个设置倍频的代码后,发现还是不行.再搜索原子论坛有人同样遇到相同的问题,在某位大神的回复中找到了答案,就是第6步
发表于 2019-06-12
STM32F103RCT6移植到STM32F103C8T6注意事项

STM32F103C8T 学习 - 环境配置

直接开发的MCU的型号的,而且使用版本稳定的,因为MDK是我们的开发编写程序的软件,想必你也不想日后麻烦。3、安装ST LINK v2这个驱动是下载调试需要的驱动软件,安装完成后插进ST LINK v2下载器就会自动安装了二、文件说明ST库压缩包解压后,会出现如下文件,但是这些文件并不是所有的都是我们需要的。首先在STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver下的inc和src是我们需要的库文件函数库。在STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport下的是M3内核MCU编译需要的文件
发表于 2019-06-03
STM32F103C8T 学习 - 环境配置

STM32F103C8T 学习 - 第一个DEMO LED灯闪烁

一.需要修改的文件使用的硬件是最小系统,LED使用的引脚与库定义的LED不相同,所有要先修改LED的定义.stm3210c_eval.h#define LED1_PIN                         GPIO_Pin_7#define LED1_GPIO_PORT                   GPIOB#define LED1_GPIO_CLK   
发表于 2019-06-03

STM32开发笔记34:USB CDC驱动程序的详细移植过程

本文详细介绍USB CDC驱动程序的移植过程。    1、按照STM32F4 开发笔记8:解决USB CDC “该设备无法启动”问题介绍的过程生成驱动程序后,找到如下图所示的文件加入到自己的项目工程中。    2、打开usbd_cdc_if.c文件,可以看到其中有,如下4个函数,其中Init、DeInit和Control函数都不需要改变,关键是Receive函数。static int8_t CDC_Init_FS(void);static int8_t CDC_DeInit_FS(void);static int8_t CDC_Control_FS(uint8_t cmd, uint8_t
发表于 2019-06-12
STM32开发笔记34:USB CDC驱动程序的详细移植过程

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved