一、環(huán)境 二、移植對(duì)象 三、連接方式 四、主函數(shù)代碼 #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(); //延時(shí)函數(shù)初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí) //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí) 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相關(guān)變量申請(qǐng)內(nèi)存 mem_init(); //初始化內(nèi)存池 while(SD_Initialize()) //檢測(cè)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相關(guān)變量申請(qǐng)內(nèi)存 f_mount(fs[0],'0:',1); //掛載SD卡 while(exf_getfree('0',&total,&free)) //得到SD卡的總?cè)萘亢褪S嗳萘?{ 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卡總?cè)萘?MB OLED_ShowNum(48,2,free>>10,5,12); while(1) { } }
四、問題 1.編譯報(bào)錯(cuò)內(nèi)存不足 2.程序死在while(SD_Initialize())中
百度到的解釋是“rxne只能讀一次,如果調(diào)試器讀取了,那么程序就永遠(yuǎn)讀不到了”,此外SPI運(yùn)行時(shí)有一定幾率程序會(huì)卡死在檢查接受標(biāo)志位處RXNE,論壇上的解決方案是將檢查接受標(biāo)志位改為檢查忙狀態(tài),所以可以換成 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){ //...}
經(jīng)測(cè)試此方案可行。
3.程序死在while(exf_getfree(“0”,&total,&free))中 //SD卡正常工作的時(shí)候,可以高速了void SD_SPI_SpeedHigh(void){ //SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//原函數(shù) SPI1_SetSpeed(SPI_BaudRatePrescaler_4);//修改}
五、資料 |
|