STM32 IAP固件升级设计/ U盘升级固件

电脑杂谈  发布时间:2020-08-28 06:01:31  来源:网络整理

u盘刷希捷硬盘固件_金士顿u盘升级工具_u盘固件升级

固件升级的基本思路是: 将stm32闪存分为两个区域:

1. Bootloader区域: 存储Bootloader代码. 引导加载程序代码的主要功能是确定外部条件. 如果需要更新固件,则从指定位置(外部U盘?板上的外部存储器,例如SD卡,NandFlash等)读取bin文件并将其写入stm32 Flash的APP区域. 完成后,跳至APP区域以执行更新的代码. 如果不需要更新,请直接跳至APP区域以执行主程序代码.

2. APP区域: 存储应用程序代码,这是我们产品的固件.

已经做出了两种升级方法,它们都是USB:

一个是USB主机: 引导进入引导,引导检测是否插入了U盘,U盘是否包含APP的bin文件(如果包含),更新并跳转到APP;一种是USB设备: 在APP区域中,做USB设备的代码使用板上的nandflash作为U盘的内存,并通过USB电缆连接到PC,然后PC显示U盘. 将APP的bin文件复制到U盘并设置徽标文件,然后在下次启动时启动. 它将在nandfalash中判断是否需要更新固件. 如果是这样,请将存储在nandflash中的APPbin文件写入stm32 flash的APP区域,并在更新完成后跳转.

引导加载程序代码的重点:

u盘固件升级_金士顿u盘升级工具_u盘刷希捷硬盘固件

1. 需要包括USB Host,nandflash和fatfs文件系统驱动程序代码. (这部分需要仔细研究,因此我不再赘述)

2. 关于Bootloader区域: 我使用stm32f429,并且bootlaoder代码已编译约50K,因此我使用flash 0x80000000〜0x8000FFFF,这是一个64K区域. 请注意,引导加载程序代码必须从闪存起始地址0x80000000开始,因此在引导时首先运行引导程序.

keil中的特定设置是设置目标中闪光灯的起始地址和大小;在调试设置中,为Flash选择1M(我的429为1Mflash),然后在下面的开始和结束地址中输入正确的地址;

3. 关于APP区域: 使用剩余的0x80010000〜0x800FFFFF区域,keil的具体设置与2相同.

4. 关于读写bin文件到flash: 如上所述,这更加灵活. 您可以将bin文件从存储器将bin文件读取到存储器buf,然后写入闪存. 具体代码可以参考官方固件库中的示例.

5. 关于跳跃: 您可以看到官方代码

u盘固件升级_u盘刷希捷硬盘固件_金士顿u盘升级工具

pFunction Jump_To_Application;

uint32_t JumpAddress;

JumpAddress = *(__ IO uint32_t *)(APPLICATION_ADDRESS + 4);

Jump_To_Application =(pFunction)JumpAddress;

/ *初始化用户应用程序的堆栈指针* /

__ set_MSP(*(__ IO uint32_t *)APPLICATION_ADDRESS);

u盘固件升级_u盘刷希捷硬盘固件_金士顿u盘升级工具

Jump_To_Application();

有关具体分析,请参阅Internet上其他人的详细说明. 我在这里遇到的问题是: 频繁跳转后机器直接崩溃. 可能存在以下情况:

1. 必须输入APP代码主要功能中的第一句话

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);

__ enable_irq();

将向量表偏移地址设置为我们的0x10000;

u盘固件升级_金士顿u盘升级工具_u盘刷希捷硬盘固件

2. 关于中断,在跳转之前可能会打开一些中断,而在跳转之后可能会产生中断,但是APP代码中没有与该中断相对应的中断处理功能,因此会直接崩溃;

一些与Internet对应的方法是在跳转之前关闭所有中断: __disable_irq();

在APP中设置偏移地址后,再次打开所有中断: __enable_irq();

有些人发现跳入APP后,许多中断都没有响应. 可能是中断在跳转之前已关闭,但APP没有再次打开.

我一开始就以这种方式使用它,并且每次从USB闪存驱动器更新固件后它都崩溃,从nandflash跳出毫无问题. 我参考了一些资料,

推测__disable_irq()没有关闭USB中断,或者在关闭之后,仍然设置了某个USB中断. 在APP中再次打开中断后,直接查找USB中断服务程序,如果找不到,它将崩溃. 上

为了更加安全,我决定在跳动之前关闭引导中使用的所有设备,但只使用了一个句子

NVIC_DisableIRQ(OTG_FS_IRQn);

之后,一切都很好.

但是,在编写启动程序时,建议您在跳动之前关闭所有外设时钟并禁用中断.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/sanxing/article-308504-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...