一、环境 二、移植对象 三、连接方式 四、主函数代码 #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) { } }
四、问题 1.编译报错内存不足 2.程序死在while(SD_Initialize())中
百度到的解释是“rxne只能读一次,如果调试器读取了,那么程序就永远读不到了”,此外SPI运行时有一定几率程序会卡死在检查接受标志位处RXNE,论坛上的解决方案是将检查接受标志位改为检查忙状态,所以可以换成 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){ //...}
经测试此方案可行。
3.程序死在while(exf_getfree(“0”,&total,&free))中 //SD卡正常工作的时候,可以高速了void SD_SPI_SpeedHigh(void){ //SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//原函数 SPI1_SetSpeed(SPI_BaudRatePrescaler_4);//修改}
五、资料 |
|
来自: goodwangLib > 《stm32F103C8T6》