<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

STM32 IAP 設計實(shí)例 (二)

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

本文引用地址:http://dyxdggzs.com/article/201611/318459.htm

目標功能: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
  1. intmain(void)
  2. {
  3. uint16_tStatus=0;
  4. delay_init();//延時(shí)初始化
  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)//按著(zhù)組合按鍵啟動(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();//設置USB接口時(shí)鐘
  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 )建起始任務(wù)
  58. OSStart();
  59. }
  60. }


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

[cpp]view plaincopy
  1. //掃描path錄下的所有BIN文件
  2. voidscan_files(u8*path)
  3. {
  4. OS_CPU_SRcpu_sr;
  5. FRESULTres;
  6. FILINFOfinfo;
  7. charlfn[50];//用于存長(chá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)/*當長(cháng)文件名稱(chēng)為空,短文件名非空時(shí)轉換*/
  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個(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//大于最多的存儲量
  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è)函數用于掃描某個(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ā)送數據的功能。



關(guān)鍵詞: STM32IA

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>