<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 IAP 設計實例 (二)

          STM32 IAP 設計實例 (二)

          作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
          上一篇介紹了IAP的實現(xiàn)。這里開始介紹主機的一個設計實例。

          本文引用地址:http://www.ex-cimer.com/article/201611/318459.htm

          目標功能:STM32做主機,硬件接口主要包括SD card, USB,CAN, LCD,按鍵。

          主要功能:

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

          2,STM32通過FATFS讀寫SD卡中的文件。

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

          4,LCD和按鍵用于人機交互。

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

          [cpp]view plaincopy
          1. intmain(void)
          2. {
          3. uint16_tStatus=0;
          4. delay_init();//延時初始化
          5. NVIC_Configuration();//設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
          6. LED_Init();//初始化與LED連接的硬件接口
          7. KEY_Init();
          8. uart_init(9600);
          9. if(KEY2==0&&KEY3==0)//按著組合按鍵啟動,進入讀卡器模式
          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();//設置USB接口時鐘
          19. USB_Init();//USB接口初始化
          20. while(bDeviceState!=CONFIGURED)
          21. {
          22. ;//reserved
          23. }
          24. USB_Configured_LED();//設置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)建起始任務
          58. OSStart();
          59. }
          60. }


          從main函數(shù)可以看出,上電如果按下組合按鍵,進入USB讀卡器模式,可以在PC上將SD卡識別成可以移動磁盤。沒按組合鍵,則將SD卡,通過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];//用于存長文件名
          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);/*打開工作目錄*/
          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)/*當長文件名稱為空,短文件名非空時轉換*/
          24. {
          25. finfo.lfname=finfo.fname;
          26. }
          27. /*文件名為空即到達了目錄的末尾,退出*/
          28. if(!finfo.lfname[0])
          29. {
          30. break;
          31. }
          32. result=strstr(finfo.lfname,".bin");
          33. if(result!=NULL)
          34. {
          35. printf("rn第%d個文件: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//大于最多的存儲量
          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個文件:rn",i);
          56. printf("fname:%srn",(char*)fileList[i]);
          57. }
          58. OS_EXIT_CRITICAL();
          59. }


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

          #define_USE_LFN1/* 0 to 3 */

          然后讀取文件的時候使用finfo.lfname進行操作。

          上面代碼對讀出來的文件名進行了排序。使用stdlib.H標準庫中的函數(shù)qsort進行。

          下面是串口調式的打印信息

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



          關鍵詞: STM32IA

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();