您的位置 首页 电子

STM32 IAP 规划实例 (二)

上一篇介绍了IAP的实现。这里开始介绍主机的一个设计实例。目标功能:STM32做主机,硬件接口主要包括SDcard,USB,CAN,LCD,按键。…

上一篇介绍了IAP的完成。这儿开端介绍主机的一个规划实例。

方针功用:STM32做主机,硬件接口首要包含SD card, USB,CAN, LCD,按键。

首要功用:

1,经过USB链接到PC,将用于更新的APP程序的BIN文件,放入SD中。

2,STM32经过FATFS读写SD卡中的文件。

3,经过CAN接口发送数据给从机。

4,LCD和按键用于人机交互。

PC经过STM32 USB读取SD卡的部分功用直接运用运用了神州三号开发板中的例程。移植FATFS参阅了网上的一些比如,比较乱。

[cpp]view plaincopy

  1. intmain(void)
  2. {
  3. uint16_tStatus=0;
  4. delay_init();//延时初始化
  5. NVIC_Configuration();//设置NVIC中止分组2:2位抢占优先级,2位呼应优先级
  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指示灯状况
  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);//创立开始使命
  58. OSStart();
  59. }
  60. }

从main函数能够看出,上电假如按下组合按键,进入USB读卡器形式,能够在PC大将SD卡识别成能够移动磁盘。没按组合键,则将SD卡,经过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];//用于存长文件名
  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:%s\r\n”,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(“\r\n第%d个文件:\r\n”,fcount);
  36. printf(“fname:%s\r\n”,finfo.lfname);
  37. printf(“fsize:%d\r\n”,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(“\r\n——————–aftersort——————–\r\n”);
  53. for(i=0;i
  54. {
  55. printf(“\r\n第%d个文件:\r\n”,i);
  56. printf(“fname:%s\r\n”,(char*)fileList[i]);
  57. }
  58. OS_EXIT_CRITICAL();
  59. }

这个函数用于扫描某个目录下面的文件,支撑英文长文件名。关于FATFS的长文件名,只需装备ffconf.h中
#define _CODE_PAGE437

#define_USE_LFN1/* 0 to 3 */

然后读取文件的时分运用finfo.lfname进行操作。

上面代码对读出来的文件名进行了排序。运用stdlib.H规范库中的函数qsort进行。

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

剩余的便是读取文件,CAN发送数据的功用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/265685.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部