STM32 IAP 設計實(shí)例 (二)
目標功能:STM32做主機,硬件接口主要包括SD card, USB,CAN, LCD,按鍵。
主要功能:
1,通過(guò)USB鏈接到PC,將用于更新的APP程序的BIN文件,放入SD中。
2,STM32通過(guò)FATFS讀寫(xiě)SD卡中的文件。
3,通過(guò)CAN接口發(fā)送數據給從機。
4,LCD和按鍵用于人機交互。
PC通過(guò)STM32 USB讀取SD卡的部分功能直接使用使用了神州三號開(kāi)發(fā)板中的例程。移植FATFS參考了網(wǎng)上的一些例子,比較亂。
[cpp]view plaincopy
- intmain(void)
- {
- uint16_tStatus=0;
- delay_init();//延時(shí)初始化
- NVIC_Configuration();//設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
- LED_Init();//初始化與LED連接的硬件接口
- KEY_Init();
- uart_init(9600);
- if(KEY2==0&&KEY3==0)//按著(zhù)組合按鍵啟動(dòng),進(jìn)入讀卡器模式
- {
- sys_mode_flag=MODE_CARD_READ;
- GPIO_Config();
- /*MAL配置*/
- MAL_Config();
- /*中斷配置*/
- Interrupts_Config();
- /*USB接口初始化*/
- Set_USBClock();//設置USB接口時(shí)鐘
- USB_Init();//USB接口初始化
- while(bDeviceState!=CONFIGURED)
- {
- ;//reserved
- }
- USB_Configured_LED();//設置USB接口的LED指示燈狀態(tài)
- while(1)
- {
- ;
- }
- }
- else
- {
- sys_mode_flag=MODE_IAP_DEVICE;
- Status=SD_Init();
- if(Status==SD_OK)
- {
- /*-----------------ReadCSD/CIDMSDregisters------------------*/
- Status=SD_GetCardInfo(&SDCardInfo);
- }
- if(Status==SD_OK)
- {
- show_sdcard_info();
- /*-----------------SelectCard--------------------------------*/
- Status=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));
- }
- if(Status==SD_OK)
- {
- Status=SD_EnableWideBusOperation(SDIO_BusWide_4b);
- }
- /*SetDeviceTransferModetoDMA*/
- if(Status==SD_OK)
- {
- Status=SD_SetDeviceMode(SD_DMA_MODE);
- }
- disk_initialize(0);
- f_mount(0,&fs);
- OSInit();
- OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);//創(chuàng )建起始任務(wù)
- OSStart();
- }
- }
從main函數可以看出,上電如果按下組合按鍵,進(jìn)入USB讀卡器模式,可以在PC上將SD卡識別成可以移動(dòng)磁盤(pán)。沒(méi)按組合鍵,則將SD卡,通過(guò)FATFS文件系統掛載。
[cpp]view plaincopy
- //掃描path錄下的所有BIN文件
- voidscan_files(u8*path)
- {
- OS_CPU_SRcpu_sr;
- FRESULTres;
- FILINFOfinfo;
- charlfn[50];//用于存長(cháng)文件名
- DIRdirs;
- char*result;
- u8i=0;
- finfo.lfsize=sizeof(lfn);
- finfo.lfname=lfn;
- OS_ENTER_CRITICAL();
- res=f_opendir(&dirs,(constTCHAR*)path);/*打開(kāi)工作目錄*/
- if(res==FR_OK)
- {
- printf("workingdirectory:%srn",path);
- fcount=0;
- while(f_readdir(&dirs,&finfo)==FR_OK)/*依次讀取文件名*/
- {
- if(finfo.fattrib&AM_ARC)/*判斷是否為存檔型文檔*/
- {
- if(finfo.lfname[0]==NULL&&finfo.fname!=NULL)/*當長(cháng)文件名稱(chēng)為空,短文件名非空時(shí)轉換*/
- {
- finfo.lfname=finfo.fname;
- }
- /*文件名為空即到達了目錄的末尾,退出*/
- if(!finfo.lfname[0])
- {
- break;
- }
- result=strstr(finfo.lfname,".bin");
- if(result!=NULL)
- {
- printf("rn第%d個(gè)文件:rn",fcount);
- printf("fname:%srn",finfo.lfname);
- printf("fsize:%drn",finfo.fsize);
- if(fcount
- {
- strcpy((char*)fileList[fcount],finfo.lfname);
- }
- else//大于最多的存儲量
- {
- break;
- }
- fcount++;
- }
- }
- }
- }
- qsort(fileList,fcount,sizeof(fileList[0]),cmp);
- printf("rn--------------------aftersort--------------------rn");
- for(i=0;i
- {
- printf("rn第%d個(gè)文件:rn",i);
- printf("fname:%srn",(char*)fileList[i]);
- }
- OS_EXIT_CRITICAL();
- }
這個(gè)函數用于掃描某個(gè)目錄下面的文件,支持英文長(cháng)文件名。關(guān)于FATFS的長(cháng)文件名,只需配置ffconf.h中
#define _CODE_PAGE437
#define_USE_LFN1/* 0 to 3 */
然后讀取文件的時(shí)候使用finfo.lfname進(jìn)行操作。
上面代碼對讀出來(lái)的文件名進(jìn)行了排序。使用stdlib.H標準庫中的函數qsort進(jìn)行。
下面是串口調式的打印信息
剩下的就是讀取文件,CAN發(fā)送數據的功能。
評論