新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 IAP 設(shè)計(jì)實(shí)例 (二)

        STM32 IAP 設(shè)計(jì)實(shí)例 (二)

        作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
        上一篇介紹了IAP的實(shí)現(xiàn)。這里開(kāi)始介紹主機(jī)的一個(gè)設(shè)計(jì)實(shí)例。

        本文引用地址:http://www.104case.com/article/201611/318459.htm

        目標(biāo)功能:STM32做主機(jī),硬件接口主要包括SD card, USB,CAN, LCD,按鍵。

        主要功能:

        1,通過(guò)USB鏈接到PC,將用于更新的APP程序的BIN文件,放入SD中。

        2,STM32通過(guò)FATFS讀寫(xiě)SD卡中的文件。

        3,通過(guò)CAN接口發(fā)送數(shù)據(jù)給從機(jī)。

        4,LCD和按鍵用于人機(jī)交互。

        PC通過(guò)STM32 USB讀取SD卡的部分功能直接使用使用了神州三號(hào)開(kāi)發(fā)板中的例程。移植FATFS參考了網(wǎng)上的一些例子,比較亂。

        [cpp]view plaincopy
        1. intmain(void)
        2. {
        3. uint16_tStatus=0;
        4. delay_init();//延時(shí)初始化
        5. NVIC_Configuration();//設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
        6. LED_Init();//初始化與LED連接的硬件接口
        7. KEY_Init();
        8. uart_init(9600);
        9. if(KEY2==0&&KEY3==0)//按著組合按鍵啟動(dòng),進(jìn)入讀卡器模式
        10. {
        11. sys_mode_flag=MODE_CARD_READ;
        12. GPIO_Config();
        13. /*MAL配置*/
        14. MAL_Config();
        15. /*中斷配置*/
        16. Interrupts_Config();
        17. /*USB接口初始化*/
        18. Set_USBClock();//設(shè)置USB接口時(shí)鐘
        19. USB_Init();//USB接口初始化
        20. while(bDeviceState!=CONFIGURED)
        21. {
        22. ;//reserved
        23. }
        24. USB_Configured_LED();//設(shè)置USB接口的LED指示燈狀態(tài)
        25. while(1)
        26. {
        27. ;
        28. }
        29. }
        30. else
        31. {
        32. sys_mode_flag=MODE_IAP_DEVICE;
        33. Status=SD_Init();
        34. if(Status==SD_OK)
        35. {
        36. /*-----------------ReadCSD/CIDMSDregisters------------------*/
        37. Status=SD_GetCardInfo(&SDCardInfo);
        38. }
        39. if(Status==SD_OK)
        40. {
        41. show_sdcard_info();
        42. /*-----------------SelectCard--------------------------------*/
        43. Status=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));
        44. }
        45. if(Status==SD_OK)
        46. {
        47. Status=SD_EnableWideBusOperation(SDIO_BusWide_4b);
        48. }
        49. /*SetDeviceTransferModetoDMA*/
        50. if(Status==SD_OK)
        51. {
        52. Status=SD_SetDeviceMode(SD_DMA_MODE);
        53. }
        54. disk_initialize(0);
        55. f_mount(0,&fs);
        56. OSInit();
        57. OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);//創(chuàng)建起始任務(wù)
        58. OSStart();
        59. }
        60. }


        從main函數(shù)可以看出,上電如果按下組合按鍵,進(jìn)入U(xiǎn)SB讀卡器模式,可以在PC上將SD卡識(shí)別成可以移動(dòng)磁盤(pán)。沒(méi)按組合鍵,則將SD卡,通過(guò)FATFS文件系統(tǒng)掛載。

        [cpp]view plaincopy
        1. //掃描path錄下的所有BIN文件
        2. voidscan_files(u8*path)
        3. {
        4. OS_CPU_SRcpu_sr;
        5. FRESULTres;
        6. FILINFOfinfo;
        7. charlfn[50];//用于存長(zhǎng)文件名
        8. DIRdirs;
        9. char*result;
        10. u8i=0;
        11. finfo.lfsize=sizeof(lfn);
        12. finfo.lfname=lfn;
        13. OS_ENTER_CRITICAL();
        14. res=f_opendir(&dirs,(constTCHAR*)path);/*打開(kāi)工作目錄*/
        15. if(res==FR_OK)
        16. {
        17. printf("workingdirectory:%srn",path);
        18. fcount=0;
        19. while(f_readdir(&dirs,&finfo)==FR_OK)/*依次讀取文件名*/
        20. {
        21. if(finfo.fattrib&AM_ARC)/*判斷是否為存檔型文檔*/
        22. {
        23. if(finfo.lfname[0]==NULL&&finfo.fname!=NULL)/*當(dāng)長(zhǎng)文件名稱為空,短文件名非空時(shí)轉(zhuǎn)換*/
        24. {
        25. finfo.lfname=finfo.fname;
        26. }
        27. /*文件名為空即到達(dá)了目錄的末尾,退出*/
        28. if(!finfo.lfname[0])
        29. {
        30. break;
        31. }
        32. result=strstr(finfo.lfname,".bin");
        33. if(result!=NULL)
        34. {
        35. printf("rn第%d個(gè)文件:rn",fcount);
        36. printf("fname:%srn",finfo.lfname);
        37. printf("fsize:%drn",finfo.fsize);
        38. if(fcount
        39. {
        40. strcpy((char*)fileList[fcount],finfo.lfname);
        41. }
        42. else//大于最多的存儲(chǔ)量
        43. {
        44. break;
        45. }
        46. fcount++;
        47. }
        48. }
        49. }
        50. }
        51. qsort(fileList,fcount,sizeof(fileList[0]),cmp);
        52. printf("rn--------------------aftersort--------------------rn");
        53. for(i=0;i
        54. {
        55. printf("rn第%d個(gè)文件:rn",i);
        56. printf("fname:%srn",(char*)fileList[i]);
        57. }
        58. OS_EXIT_CRITICAL();
        59. }


        這個(gè)函數(shù)用于掃描某個(gè)目錄下面的文件,支持英文長(zhǎng)文件名。關(guān)于FATFS的長(zhǎng)文件名,只需配置ffconf.h中
        #define _CODE_PAGE437

        #define_USE_LFN1/* 0 to 3 */

        然后讀取文件的時(shí)候使用finfo.lfname進(jìn)行操作。

        上面代碼對(duì)讀出來(lái)的文件名進(jìn)行了排序。使用stdlib.H標(biāo)準(zhǔn)庫(kù)中的函數(shù)qsort進(jìn)行。

        下面是串口調(diào)式的打印信息

        剩下的就是讀取文件,CAN發(fā)送數(shù)據(jù)的功能。



        關(guān)鍵詞: STM32IA

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 泾川县| 樟树市| 巍山| 大丰市| 高淳县| 普兰店市| 大邑县| 海宁市| 民县| 澄江县| 安顺市| 宝鸡市| 大埔区| 台北市| 区。| 荥经县| 会同县| 金湖县| 望江县| 花莲县| 盐津县| 武义县| 莎车县| 工布江达县| 永寿县| 济南市| 莱西市| 安塞县| 黎川县| 鄯善县| 上犹县| 松潘县| 榆树市| 井冈山市| 蒙自县| 航空| 海淀区| 农安县| 望都县| 旌德县| 襄樊市|