正點原子wifi實驗分析:
fatfs檔案系統分為三個層:應用層、fatfs模組、fats模組提供底層介面驅動層。
1.應用層只需要呼叫fats提供的介面函式,如f_open、f_read、f_write和f_close等。
2.fatfs模組提供的是ff.c和ff.h.除非有必要,一般情況下只需要直接包含進去即可。
3.需要編寫的是fatfs模組提供的底層介面,它包括儲存媒介讀/寫介面(disk i/o)和供給檔案建立修改時間的實時時鐘。
fatfs的介紹:doc裡面是主要對fatfs的介紹,而src裡面才是真正的原始碼。
src中的原始碼有:
ffconf.h fatfs模組配置檔案
ff.h
fatfs和應用模組公用的包含檔案
fatfs fatfs模組
diskio.h fatfs和disk i/o模組公用的包含檔案
interger.h 資料型別定義
option.h 可選外部功能支援
重點:fatfs模組在移植的時候,我們一般只需要修改2個檔案,即ffconf.h和diskio.c。fatfs的所有配置項都放在ffconf.h中。
在使用fatfs的時候,必須先要通過f_mount的函式註冊乙個工作區,才能對後續的api進行使用。即使用f_mount();
f_mount(fatfs* fs,const tchar *path,btye opt)函式分析:
其中fs為檔案系統物件結構,path將要掛載的驅動的邏輯號,opt為掛載狀態設定(0 不掛載:1 掛載)。
目的是為了註冊乙個工作區。
ff.h檔案分析:
1.定義了fatfs結構體為檔案系統物件結構,其中包含了各項引數。同時還定義了fil、dir、filinfo等結構體,還有sturct enum{}fresult返回錯
誤列舉型別。
2.定義了各種fatfs模組的應用介面。
重要函式分析:
1.exfuns_init()函式分析:
fs[i] = (fatfs *)mymalloc(sramin,sizeof(fats)); //其中i為支援磁碟的個數。
file = (fil *)mymalloc(sramin,sizeof(fil)); //為file申請記憶體
ftemp = (fil *)mymalloc(sramin,sizeof(fil)); //為ftemp申請記憶體
fatbuf = (u8 *)mymalloc(sramin,512); //為fatbuf申請記憶體
2.f_mount(fatfs *fs,const tchar *path,byte opt)函式分析:
vol = get_ldnumber(&rp); //通過path name來提取邏輯驅動號
其中get_ldnumber獲取id的方式有兩種,一種是數字id或者是string id。如果是string id ,則根據_volume_strs
定義的#define _volume_strs
"ram","nand","cf","sd1","sd2","usb1","usb2","usb3"的這些情況進行對比,然後
給出返回值vol.
後面將fatfs * fs 賦值給了fatfs[vol],fatfs[vol] = fs;不同的儲存介質有對應的乙個fatfs結構.其中main.c中使用的fs[0]、fs[1]是在exfuns.h中定義指向fatfs結構體的指標陣列,其為全域性變數extern fatfs * fs[_volumes];所以main中能直接使用。
f_mount(fs[0],"0:",1);
f_mount(fs[1],"0:",1);
綜上所述兩個函式的綜上作用是從path中提取了fatfs[vol]陣列中的vol編號,並分配了指標fs[i]指向
fatfs[vol]結構體。
3.font_init()字型檔檢查函式分析:
fontok = font_init(); //檢查字型檔是否ok.
w25qxx_init((u8*)&ftinfo,fontinfoaddr,sizeof(ftinfo));//讀出ftinfo結構體資料
以上函式可以看出對於main.c中的字型檔,首先對flash中的的字型檔位址fontinfoaddr 1024*1024*12,讀取出乙個ftinfo大小的結構體
,這個結構體定義為:
__packed typedef struct_font_info;
extern _font_info ftinfo; //字型檔資訊結構體
同時要知道的是fatfs占用了前12m的記憶體空間(即fontinfoaddr後),12m以後緊跟著3個字型檔+unigbk.bin,總大小為3.09m,被字型檔占用,
不能動!!!!!15.10m以後,使用者可以自由使用,建議用最後的100k位元組比較好。
而對於字型檔檢查是通過10次讀finfo結構體的資訊,並判斷finfo.fontok == 0xaa,才能正確判斷字型檔正常。
4.sd_init()和updata_font()從sd卡更新字庫函式分析:
上面分析了從flash(w25q128)中檢查字型檔的方式,但如果檢查失敗則必須通過sd卡來進行更新字型檔操作。
(1).sd_init()函式初始化了sd卡,通過設定為sdio初始化、獲取卡資訊、選中sd卡、設定為4位寬度(mmc卡不能用這種方式)、設定sdio時鐘、dma
模式、查詢模式等進行初始化。
(2).updata_font(u16 x,u16 y,u8 size,u8 *src);
strcpy((char*)pname,(char*)src);
//copy src內容到pname
strcat((char*)pname,(char*)unigbk_path);
res=f_open(fftemp,(const tchar*)pname,fa_read);
... w25qxx_read((u8*)buf,((fontinfoaddr/4096)+i)*4096,4096);
第一步:其中x、y提示資訊的顯示位址,size字型大小,src字型檔**磁碟:"0:",sd卡;"1:",flash盤,"2:",u盤。這個函式首先將指定的盤src(0、1或者2)的unigbk目錄(//system/font/unigbk.bin)和gbk12_path、gbk16_path、gbk24_path定義的目錄檔案進行開啟檢查是否成功。
第二步:然後檢查是否flash卡(w25q128)(實驗預設為flash卡)弄髒(dirty),否則進行擦除操作。
strcpy((char*)pname,(char*)src);
//copy src到pname
strcat((char*)pname,(char*)unigbk_path);
res=updata_fontx(x+20*size/2,y,size,pname,0);
第三步:在確認檔案可以開啟,flash無dirty或dirty被擦除後,就可以進行第三步的更新操作,將
updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx)函式分析:
fftemp = (fil*)malloc(sramin,sizeof(fil)); //分配記憶體
tempbuf = mymalloc(sramin,4096); //分配4096個位元組
res = f_open(fftemp,(const tchar*)fxpath,fa_read); //將函式fxpath:0/system/font/unigbk.bin檔案開啟
//並且賦給fftemp.
上述函式將fxpath路徑下的檔案開啟後,通過f_open()函式得到了該路徑目錄下的檔案的引數,並且賦給了檔案
結構體fil。fftemp->fsize就是在f_open()函式後得到的。
switch(fx)
上述語句將開啟的sd卡的path(有4種情況)後,通過f_open()得到大小,得到每個檔案的大小fftemp->fsize,然後將其賦給字型檔資訊全域性結構體ftinfo,每個fxpath路徑下的檔案有兩個引數要賦給ftinfo結構體:ftinofo.ugbkaddr和ftinfo.ugbksize。
while(res == fr_ok)
上述**是從fftemp結構體使用f_read()函式讀取資料到tempbuf,然後將其寫入到flash(w25q128)的位址offx+flashaddr。(其中fftemp是fxpath路徑用f_open()賦予的,所以資料**於sd卡,資料目的是flash)。
正點原子STM32串列埠例程解析
學習32,串列埠的使用很重要,特別是現在學的越多就覺得在很多方面通訊才是主角,原子歷程寫的挺好,但是我看論壇裡好像沒怎麼有這個的解析那就按自己的理解寫寫吧,希望能幫助到正在學習的同學。然後寫在前面,初學者或者想深入學習一定要多看看參考手冊。在主函中使用以下語句實現將接收到的資料傳送出去 if usa...
正點原子Mini Linux UART串列埠簡單介紹
二 部分例程 uart,也就是非同步序列收發器,使用uart與外界相連最少只要三條線 txd 傳送 rxd 接收 和gnd 地線 uart串列埠的介面電平有ttl和rs 232兩種,在正電原子的這款mini linux開發板上有ch340晶元,可以實現usb和串列埠ttl訊號之間的轉換,這裡用到的是...
正點原子 Mini Linux BSP工程管理
靜態模式 其他疑問 模仿stm32驅動開發實驗中,主要是在.s檔案中新增了清除.bss段資料 未初始化的資料段 的 在.件下對時鐘,io暫存器組的基位址進行巨集定義,並構造了對應的結構體 注意暫存器位址的連續性 最後將各個外設的暫存器組基位址強轉為對應的結構體指標並進行巨集定義,這樣在主函式中就能像...