21.国民技术N32G45X例程之-U盘模式IAP升级固件

文章目录

  • 前言
  • 一、准备工作
    • 1.国民技术N32G45X提供的库
    • 2.下载本作者原创BIN文件合成软件
    • 3.为什么要合成BIN文件?
  • 二、U盘模式IAP升级实现之读写
    • 1.宏定义之一次读写大小512字节
    • 2.定义RAM大小用于存贮FAT文件系统
    • 3.FAT文件系统识别写入RAM
    • 4.FAT文件系统识别读取RAM
    • 5.固件写入FLASH之识别BIN头信息
    • 6.固件写入FLASH之擦除2K
    • 7.固件写入FLASH之地址偏移
  • 三、U盘模式IAP升级实现之跳转到APP
  • 四、软件下载

前言

提示:21.国民技术N32G45X例程之-U盘模式IAP升级固件,本例程为作者原创,利用模拟U盘方式做固件升级,配合“国民技术N32G45X例程之-C-Free5合成BIN文件”可以适应WIN7和WIN10电脑系统,本例程使用了N32G45X内部RAM存贮FAT文件系统,大大减少FLASH的使用,最大只使用24K的FLASH空间,例程已经在成熟项目中使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、准备工作

1.国民技术N32G45X提供的库

在国民技术N32G45X提供的库的USB例程中,找到Mass_Stroage_DataFlash例程,这是USB模式U盘的例程。

2.下载本作者原创BIN文件合成软件

“国民技术N32G45X例程之-C-Free5合成BIN文件”用于合成BIN文件

3.为什么要合成BIN文件?

这是因为不同的系统在识别U盘时,会在U盘中生成隐藏文件,这些隐藏文件占据了FLASH的地址,不同的系统在BIN文件拷贝到U盘时,所在的起始地址是不一样的。

合成BIN文件有一个可以识别的头信息,当U盘识别到这个头信息时,可以把BIN文件放在固定的没有被占用的FLASH地址上,这样就避免了不同系统被占用的地址不一样的问题。

例如:起始地址0X8006000
WIN7系统在识别U盘时没有隐藏文件,那正常拷贝没有加工过的BIN文件会从0X8006000开始。
WIN10系统在识别U盘是会有6K的隐藏文件,那正常拷贝没有加工过的BIN文件会从0X8007800开始。

这时如果是合成BIN文件会有一个头信息,在拷贝BIN文件时如果识别到这个头信息,就把BIN文件都从起始地址0X8007800开始存,这样就避免了上面的问题。

二、U盘模式IAP升级实现之读写

1.宏定义之一次读写大小512字节

代码如下(示例):

#define  FLASH_PAGE_SIZE        0x200       // 2K per page N32G435一页2K

为什么是512字节,N32G45X是2K,这里要说明只是读写,N32G45X是2K一页只是在擦除的时候要一次2K,所以会在擦除的时候处理成2K一次。

定义读写大小为512字节,是因为FAT文件系统是以512字节做为数据存在,这样可以减少在电脑识别U盘时隐藏文件占用FLASH的大小。
比如,如果读写2K,在WIN10识别U盘时会有6K的占用,如果是512字节,就只有2K不到的占用。

2.定义RAM大小用于存贮FAT文件系统

代码如下(示例):
这里要说明一点:
如果定义读写大小2K,在WIN7下文件系统是20K, WIN10系统下是24K。
如果定义读写大小为512字节,在WIN7下文件系统是20K, WIN10系统下是21.5K。
所以预留22K空间。

uint32_t  FatRam[22*256]; //FAT预留22K的RAM

3.FAT文件系统识别写入RAM

代码如下(示例):
说明:虽然我们把FAT文件系统存在RAM中,但是在地址还是会按FLASH偏移。也就是Memory_Offset偏移地址

     //文件系统部分:Memory_Offset = 0x0000~0X5400共21K//写入RAM中。if(Memory_Offset<FAT_ADDR){    for( i = 0; i < Transfer_Length; i+=4 ){ wrteAdr = Memory_Offset/4 + (i>>2);FatRam[wrteAdr] = Writebuff[i>>2];  }Basic_Offset =0;Basic_Flag =0;}

4.FAT文件系统识别读取RAM

代码如下(示例):

//Memory_Offset = 0x0000~0x5400共24K,文件系统放在RAM中
if(Memory_Offset<FAT_ADDR)
{//Transfer_Length =2048,每次2K数据//(i>>2):相当i/4,地址移动了,数组Readbuff要(i>>2)以达到一个个接收//Memory_Offset/4: uint32_t为4个字节for( i=0; i < Transfer_Length; i+=4 ){ReadAdr = Memory_Offset/4 + (i>>2);Readbuff[i>>2] = FatRam[ReadAdr];}}

5.固件写入FLASH之识别BIN头信息

代码如下(示例):

//检测BIN文件16字节License
if(0== strncmp(License_Data, (char*)Writebuff,16))
{Basic_Offset =  Memory_Offset;Basic_Flag =1;Page_Offset=0x00;
}

6.固件写入FLASH之擦除2K

代码如下(示例):

//擦除用户区,每次一页2K,因为读写是512B,所以要四次才是2K
if(Page_Offset==0x00)
{                      for( i = 0; i < Transfer_Length; i += FLASH_PAGE_SIZE ){   if( FLASH_WaitForLastOpt(FLASH_WAIT_TIMEOUT) != FLASH_TIMEOUT ){FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPERR);}FLASH_EraseOnePage(OFFSET_ADDR + (Memory_Offset - Basic_Offset) + i); }
}

7.固件写入FLASH之地址偏移

OFFSET_ADDR:APP在写入的地址

Basic_Offset:地址偏移,是由FAT占用的偏移地址0x5400,加主BIN文件2K的头信息组成。

(Memory_Offset - Basic_Offset):保证APP写入地址都是从OFFSET_ADDR开始

//接收BIN文件数据
for( i = 0; i < Transfer_Length; i+=4 )
{            if( FLASH_WaitForLastOpt(FLASH_WAIT_TIMEOUT) != FLASH_TIMEOUT ){FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPERR); }FLASH_ProgramWord(OFFSET_ADDR + (Memory_Offset - Basic_Offset) + i, Writebuff[i>>2]);
}

该处使用的url网络请求的数据。


三、U盘模式IAP升级实现之跳转到APP

首先,bootloader编译出来大小在15K左右,为了方便功能扩展,就预留到18K.
第二,隐藏文件预留4K。
第三,合成BIN文件会在18K+4K= 0X8005800开始。
第四,合成BIN文件中有2K是头信息,所以真正APP在18K+4K+2K= 0X8006000开始。


uint32_t  AppAddress  =0x08006000;JumpAddress = *(__IO uint32_t*)(AppAddress+4); Jump_To_Application = (pFunction) JumpAddress;               __set_MSP(*(__IO uint32_t*)AppAddress);Jump_To_Application();

四、软件下载

21.国民技术N32G45X例程之-U盘模式IAP升级固件

https://download.csdn.net/download/suqingxiao/69434102

21.国民技术N32G45X例程之-U盘模式IAP升级固件相关推荐

  1. 1.国民技术N32G45X例程之-串口打印

    国民技术N32G45X例程之-串口打印 提示:use MicroLIB,printf串口打印 文章目录 前言 一.国民技术N32G45X串口配置 二.printf函数 1.国民技术N32G45X官方库 ...

  2. 国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作

    IAP升级 Bootloader的制作 1.上节提到Flash的分区,0x8000000-0x8004000为Boot分区,我们的bootloader就烧录到此分区. Bootloader很简单,新建 ...

  3. 飞利浦系统服务器更新,简介固件升级准备升级步骤通过内部闪存盘升级固件-Philips.PDF...

    简介固件升级准备升级步骤通过内部闪存盘升级固件-Philips.PDF 简介: 飞利浦将不断努力,让您以最佳的方式体验我们的产品.要获得最佳性能和最新功能,我们强烈建 议您升级平板电脑的固件. 您可以 ...

  4. STM32F105实现U盘IAP升级程序

    1.理论分析 理论依据很重要,这里稍微介绍一下原理和数据的操作过程.实际实现U盘的IAP升级一共分为两个部分,一部分是bootloader程序,这部分需要使用烧录器或者串口烧写进芯片.另一部分是用户的 ...

  5. HC32F460 实现模拟U盘导入python脚本在19264点阵屏上绘图--U盘模式

    1.将usb U盘模式库文件添加到工程中 2.将usb_dev_msc例程中source目录下的文件复制到本项目source目录下,然后添加到工程中 3.添加相关引用 4.修改文件usb_dev_ms ...

  6. STM32F407开发板的HTTP模式IAP远程升级之官方例程移植

    版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/wbdxz/article/details/82859237 关于远程升级的模板建立,可以参考下面的博文 ST ...

  7. android手机连接PC后怎样切换为U 盘模式

    android手机连接PC后怎样切换为U 盘模式 之前已经发过关于 APK文件怎样安装程序到手机上  已经介绍过了怎样通过手机与 PC 的连接将软件安装至手机.这一次再来讲解一下怎样将你的手机变为&q ...

  8. ZYNQ7010 CAN的官方例程改为XCANPS_MODE_NORMAL模式,程序没跑通

    项目场景: 项目需要用到CAN来进行数据传输: 采用官方例程,为XCANPS_MODE_LOOPBACK自环回模式,改为XCANPS_MODE_NORMAL普通模式,与外部进行收发测试. 问题描述: ...

  9. 使用ARM-LPC3131上的nandflash实现U盘模式心得(一)

    使用ARM-LPC3131上的nandflash实现U盘模式心得(一) 项目是基于NXP的LPC3131的,之前实现了NANAFLASH启动的BOOTLOADER,使用的KEIL,话说NANDFLAS ...

最新文章

  1. 防止asp.net页面多次提交数据
  2. Train Wreck 模拟-建树-优先队列
  3. spring mvc @ModelAttribute 基本类型 自定义对象解析流程
  4. 解析mediaTypes+viewResolvers+viewResolvers
  5. mysql锁机制(Innodb引擎)
  6. 里加一列为1_9月1号新宠物食品法规实施啦,辣鸡宠物食品遭殃,你也可能违法...
  7. 如何使用异步Servlet来提高性能
  8. 信息学奥赛C++语言:尼克的岁数
  9. C语言窗口布局,Android开发入门之学习笔记(四):程序窗口的布局(二)
  10. 奇特的Local System权限(转载)
  11. Backdooring a OS VM
  12. 取本周日期 C# .net
  13. 一款基于NFine.Framework升级的新框架
  14. Android 蓝牙终端交互管理
  15. HTML5+CSS期末大作业:个人网站设计——响应式个人简历介绍网页(5页) HTML+CSS+JavaScript
  16. 网络信息安全攻防实验室 脚本关第二关
  17. 探真无阻塞加载javascript脚本技术
  18. Flyme应用中心应用认领
  19. 【C语言】C语言函数
  20. STC11/10xx系列单片机独立波特率发生器设置

热门文章

  1. 读《众病之王 癌症传》
  2. 科一2022新规笔记
  3. 买股票的最佳时机--dp问题
  4. 3A企业信用评级的好处
  5. php workerman window,workman集成为windows的系统服务
  6. Nutanix是超融合厂商?原来我们都误会了……
  7. Recurrent Dynamic Embedding for Video Object Segmentation
  8. nodesj的addon模块配置使用报错处理
  9. 你认为,世界上最无聊的工作是什么?
  10. PANDAS: 新手教程 一