• 大小: 11.29MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-22
  • 语言: 其他
  • 标签: stm32  bootloader  U盘  IAP  

资源简介

网上很多关于bootloader的例程,一直没找到利用U盘更新的,这里提供一个通过U盘更新APP程序的例程,测试环境是ALIENTEK STM32F407开发板。 其中值得注意的是U盘中断问题,更新完程序后要及时关闭中断跳转到APP后才能正常运行,否则可能会死在上有中断未处理的地方。

资源截图

代码片段和文件信息

#include “string.h“
#include “exfuns.h“
#include “fattester.h“
#include “malloc.h“
#include “usart.h“
//////////////////////////////////////////////////////////////////////////////////  

//FATFS 扩展代码    
  
////////////////////////////////////////////////////////////////////////////////// 
#define FILE_MAX_TYPE_NUM 7 //最多FILE_MAX_TYPE_NUM个大类
#define FILE_MAX_SUBT_NUM 4 //最多FILE_MAX_SUBT_NUM个小类

 //文件类型列表
u8*const FILE_TYPE_TBL[FILE_MAX_TYPE_NUM][FILE_MAX_SUBT_NUM]=
{
{“BIN“} //BIN文件
{“LRC“} //LRC文件
{“NES“} //NES文件
{“TXT““C““H“} //文本文件
{“WAV““MP3““APE““FLAC“}//支持的音乐文件
{“BMP““JPG““JPEG““GIF“}//图片文件
{“AVI“} //视频文件
};
///////////////////////////////公共文件区使用malloc的时候////////////////////////////////////////////
FATFS *fs[_VOLUMES];//逻辑磁盘工作区.  
FIL *file;    //文件1
FIL *ftemp;    //文件2.
UINT brbw; //读写变量
FILINFO fileinfo; //文件信息
DIR dir;   //目录

u8 *fatbuf; //SD卡数据缓存区
///////////////////////////////////////////////////////////////////////////////////////
//为exfuns申请内存
//返回值:0成功
//1失败
u8 exfuns_init(void)
{
u8 i;
for(i=0;i<_VOLUMES;i++)
{
fs[i]=(FATFS*)mymalloc(SRAMINsizeof(FATFS)); //为磁盘i工作区申请内存
if(!fs[i])break;
}
file=(FIL*)mymalloc(SRAMINsizeof(FIL)); //为file申请内存
ftemp=(FIL*)mymalloc(SRAMINsizeof(FIL)); //为ftemp申请内存
fatbuf=(u8*)mymalloc(SRAMIN512); //为fatbuf申请内存
if(i==_VOLUMES&&file&&ftemp&&fatbuf)return 0;  //申请有一个失败即失败.
else return 1;
}

//将小写字母转为大写字母如果是数字则保持不变.
u8 char_upper(u8 c)
{
if(c<‘A‘)return c;//数字保持不变.
if(c>=‘a‘)return c-0x20;//变为大写.
else return c;//大写保持不变
}       
//报告文件的类型
//fname:文件名
//返回值:0XFF表示无法识别的文件类型编号.
//  其他高四位表示所属大类低四位表示所属小类.
u8 f_typetell(u8 *fname)
{
u8 tbuf[5];
u8 *attr=‘\0‘;//后缀名
u8 i=0j;
while(i<250)
{
i++;
if(*fname==‘\0‘)break;//偏移到了最后了.
fname++;
}
if(i==250)return 0XFF;//错误的字符串.
  for(i=0;i<5;i++)//得到后缀名
{
fname--;
if(*fname==‘.‘)
{
fname++;
attr=fname;
break;
}
   }
strcpy((char *)tbuf(const char*)attr);//copy
  for(i=0;i<4;i++)tbuf[i]=char_upper(tbuf[i]);//全部变为大写 
for(i=0;i {
for(j=0;j {
if(*FILE_TYPE_TBL[i][j]==0)break;//此组已经没有可对比的成员了.
if(strcmp((const char *)FILE_TYPE_TBL[i][j](const char *)tbuf)==0)//找到了
{
return (i<<4)|j;
}
}
}
return 0XFF;//没找到      
}  

//得到磁盘剩余容量
//drv:磁盘编号(“0:“/“1:“)
//total:总容量  (单位KB)
//free:剩余容量  (单位KB)
//返回值:0正常.其他错误代码
u8 exf_getfree(u8 *drvu32 *totalu32 *free)
{
FATFS *fs1;
u8 res;
    u32 fre_clust=0 fre_sect=0 tot_sect=0;
    //得到磁盘信息及空闲簇数量
    res =(u32)f_getfree((const TCHAR*)drv (DWORD*)&fre_clust &fs1);
    if(res==0)
{    
    tot_sect=(fs1->n_fatent-2)*fs1->csize; //得到总扇区数
    fre_sect=fre_clust*fs1->csize; //得到空闲扇区数    
#if _MAX_SS!=512    //扇区大小不是512字节则转换为512字节
tot_sect*=fs1->ssize/512;
fre_sect*=fs1->ssize/512;
#endif   
*t

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2015-09-28 16:54  bootloader测试成功\
     文件         711  2015-09-29 10:32  bootloader测试成功\readme.txt
     目录           0  2015-09-28 14:55  bootloader测试成功\U盘bootloader\
     目录           0  2015-09-28 12:36  bootloader测试成功\U盘bootloader\CORE\
     文件      109142  2014-07-17 21:52  bootloader测试成功\U盘bootloader\CORE\core_cm4.h
     文件       22735  2014-07-17 21:52  bootloader测试成功\U盘bootloader\CORE\core_cm4_simd.h
     文件       29605  2014-08-02 00:12  bootloader测试成功\U盘bootloader\CORE\startup_stm32f40_41xxx.s
     目录           0  2015-09-28 16:28  bootloader测试成功\U盘bootloader\FATFS\
     目录           0  2015-09-29 10:44  bootloader测试成功\U盘bootloader\FATFS\exfuns\
     文件        3452  2015-09-29 10:44  bootloader测试成功\U盘bootloader\FATFS\exfuns\exfuns.c
     文件        1564  2014-08-29 15:13  bootloader测试成功\U盘bootloader\FATFS\exfuns\exfuns.h
     文件        7722  2014-08-29 15:14  bootloader测试成功\U盘bootloader\FATFS\exfuns\fattester.c
     文件        1225  2014-05-15 17:20  bootloader测试成功\U盘bootloader\FATFS\exfuns\fattester.h
     文件        4652  2015-09-29 10:44  bootloader测试成功\U盘bootloader\FATFS\exfuns\mycc936.c
     目录           0  2015-09-29 10:42  bootloader测试成功\U盘bootloader\FATFS\src\
     文件        7340  2015-09-29 10:42  bootloader测试成功\U盘bootloader\FATFS\src\diskio.c
     文件        2567  2014-01-15 00:31  bootloader测试成功\U盘bootloader\FATFS\src\diskio.h
     文件      156975  2014-08-29 15:02  bootloader测试成功\U盘bootloader\FATFS\src\ff.c
     文件       13391  2014-07-25 11:34  bootloader测试成功\U盘bootloader\FATFS\src\ff.h
     文件        9978  2015-09-12 11:55  bootloader测试成功\U盘bootloader\FATFS\src\ffconf.h
     文件         706  2015-09-12 11:55  bootloader测试成功\U盘bootloader\FATFS\src\integer.h
     目录           0  2015-09-28 12:36  bootloader测试成功\U盘bootloader\FWLIB\
     目录           0  2015-09-28 12:36  bootloader测试成功\U盘bootloader\FWLIB\inc\
     文件        6924  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\misc.h
     文件       32880  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_adc.h
     文件       27318  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_can.h
     文件        2416  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_crc.h
     文件       14481  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_cryp.h
     文件       14946  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_dac.h
     文件        4296  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_dbgmcu.h
     文件       12977  2014-08-01 23:18  bootloader测试成功\U盘bootloader\FWLIB\inc\stm32f4xx_dcmi.h
............此处省略534个文件信息

评论

共有 条评论