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

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

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

推荐阅读

STM32学习【2】STM32F103C8T6串口2USART2程序
STM32F103C8T6串口1(PA10/RXD1,PA9/TXD1)用来烧写程序,串口2(PA3/RXD2,PA2/TXD2)接串口模块与电脑串口助手通信。IO口PA1接LED+470R电阻+D3V3。调试后,能正常运行的程序如下:#include "stm32f10x.h"#include "stm32f10x_usart.h" #define LED_ON  GPIO_ResetBits(GPIOA ,GPIO_Pin_1)#define LED_OFF GPIO_SetBits(GPIOA ,GPIO_Pin_1) void GPIO_C
发表于 2019-10-16
STM32学习【2】STM32F103C8T6串口2USART2程序
Stm32f103c8t6工程模板(内部晶振)源码
p; SysTick_Config(SystemCoreClock / 1000);        }void SYS_Init(void){        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                Init_Systick();  IO_Init();  uart1_init(9600);}
发表于 2019-10-14
STM32F103C8T6使用普通IO口模拟串口收发
在单片机用基本定时器来完成这样的事情。。。。即完成非阻塞式通讯!(1)定时器开启如下:(2)调用发送函数:UART4_Send_Buf(...);//注意STM32F103C8t6是没有串口4的!!!这是虚拟串口!!(3)调用的发送函数里面开启了定时器,所以接下来将在定时期中断中进行发送操作发送函数模拟了串口的时序:开始-发送-结束发送完一个字节,然后从缓冲区callback(),调用下一个字节进行传输!代码段如下:static void send_remain_byte(void){ if(VirtualUart.send_cnt>=VirtualUart.send_max) { VirtualUart.s
发表于 2019-09-11
STM32F103C8T6使用普通IO口模拟串口收发
STM32F103C8T6 Standby低功耗模式
1. 开发环境:winXPMDK4.45STM32 3.5固件库2. 低功耗模式简介刚接触PWR的内容,使用手册说的不太能让我好理解。其实当你弄懂了以后再回去看使用手册还是能找到的,只是写的过于简略,对于初学者很多地方理解不到位。 这个小总结完全从初学者角度,目的只有一个:进入/唤醒 PWR的standby模式。其实更多的是如何配置进入,唤醒基本上是配置好了后自动完成或硬件出发的,我们需要做的退出后的设计。这块内容暂不作为本次讨论内容。NVIC  和 PWR 各寄存器状态决定三种低功耗模式:低功耗模式一览表 PS: STM32F的NRST是异步复位脚。当NRST输入低电平的时候,MCU处于
发表于 2019-09-11
STM32F103C8T6 Standby低功耗模式
STM32F103C8T6定时器TIM4通道1、2输出PWM
这美妙的波形,真好,我他喵的终于把你弄出来了。STM32F103C8T6使用定时器TIM4进行双通道的PWM输出:下面的图是从STM32中文参考手册中截取的,定时器TIM4的通用和复用功能I/O我选用的是TIM4_CH1和TIM4_CH2也就是PB6和PB7输出。注意事项:输出PWM是属于IO口的复用功能,所以在设置GPIO_Mode的时候一定要设置为GPIO_Mode_AF_PP也就是推挽复用。我就是被这个卡了好长时间……,感觉自己蠢到家了。我是用的正点原子的精英板学的32,所以一些写代码的习惯都是学的正点原子的。下面是代码timer.c#include "timer.h"//TIM4 PWM部分初始化
发表于 2019-08-21
STM32F103C8T6定时器TIM4通道1、2输出PWM
stm32之USB应用实例(官方例程资料下载使用)
开发环境:Window 7开发工具:Keil uVision5硬件:stc32f103c8t6stm32系列芯片很多都拥有一个USB2.0全速的通讯接口,下面介绍怎么使用st官方的usb应用例程。首先从官网下载源码:https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html需要登录才能下载,如果没有账号,注册一个也很快的。下载解压,打开
发表于 2019-08-20
stm32之USB应用实例(官方例程资料下载使用)
小广播
何立民专栏 单片机及嵌入式宝典

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

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