上一篇介绍了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
- intmain(void)
- {
- uint16_tStatus=0;
- delay_init();//延时初始化
- NVIC_Configuration();//设置NVIC中止分组2:2位抢占优先级,2位呼应优先级
- LED_Init();//初始化与LED衔接的硬件接口
- KEY_Init();
- uart_init(9600);
- if(KEY2==0&&KEY3==0)//按着组合按键发动,进入读卡器形式
- {
- sys_mode_flag=MODE_CARD_READ;
- GPIO_Config();
- /*MAL装备*/
- MAL_Config();
- /*中止装备*/
- Interrupts_Config();
- /*USB接口初始化*/
- Set_USBClock();//设置USB接口时钟
- USB_Init();//USB接口初始化
- while(bDeviceState!=CONFIGURED)
- {
- ;//reserved
- }
- USB_Configured_LED();//设置USB接口的LED指示灯状况
- 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);//创立开始使命
- OSStart();
- }
- }
从main函数能够看出,上电假如按下组合按键,进入USB读卡器形式,能够在PC大将SD卡识别成能够移动磁盘。没按组合键,则将SD卡,经过FATFS文件体系挂载。
[cpp]view plaincopy
- //扫描path录下的一切BIN文件
- voidscan_files(u8*path)
- {
- OS_CPU_SRcpu_sr;
- FRESULTres;
- FILINFOfinfo;
- charlfn[50];//用于存长文件名
- DIRdirs;
- char*result;
- u8i=0;
- finfo.lfsize=sizeof(lfn);
- finfo.lfname=lfn;
- OS_ENTER_CRITICAL();
- res=f_opendir(&dirs,(constTCHAR*)path);/*翻开作业目录*/
- if(res==FR_OK)
- {
- printf(“workingdirectory:%s\r\n”,path);
- fcount=0;
- while(f_readdir(&dirs,&finfo)==FR_OK)/*顺次读取文件名*/
- {
- if(finfo.fattrib&AM_ARC)/*判别是否为存档型文档*/
- {
- if(finfo.lfname[0]==NULL&&finfo.fname!=NULL)/*当长文件名称为空,短文件名非空时转化*/
- {
- finfo.lfname=finfo.fname;
- }
- /*文件名为空即抵达了目录的结尾,退出*/
- if(!finfo.lfname[0])
- {
- break;
- }
- result=strstr(finfo.lfname,”.bin”);
- if(result!=NULL)
- {
- printf(“\r\n第%d个文件:\r\n”,fcount);
- printf(“fname:%s\r\n”,finfo.lfname);
- printf(“fsize:%d\r\n”,finfo.fsize);
- if(fcount
- {
- strcpy((char*)fileList[fcount],finfo.lfname);
- }
- else//大于最多的存储量
- {
- break;
- }
- fcount++;
- }
- }
- }
- }
- qsort(fileList,fcount,sizeof(fileList[0]),cmp);
- printf(“\r\n——————–aftersort——————–\r\n”);
- for(i=0;i
- {
- printf(“\r\n第%d个文件:\r\n”,i);
- printf(“fname:%s\r\n”,(char*)fileList[i]);
- }
- OS_EXIT_CRITICAL();
- }
这个函数用于扫描某个目录下面的文件,支撑英文长文件名。关于FATFS的长文件名,只需装备ffconf.h中
#define _CODE_PAGE437
#define_USE_LFN1/* 0 to 3 */
然后读取文件的时分运用finfo.lfname进行操作。
上面代码对读出来的文件名进行了排序。运用stdlib.H规范库中的函数qsort进行。
下面是串口调式的打印信息
剩余的便是读取文件,CAN发送数据的功用。