
固件升级的基本思路是: 将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区域,并在更新完成后跳转.
引导加载程序代码的重点:

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. 关于跳跃: 您可以看到官方代码

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);

Jump_To_Application();
有关具体分析,请参阅Internet上其他人的详细说明. 我在这里遇到的问题是: 频繁跳转后机器直接崩溃. 可能存在以下情况:
1. 必须输入APP代码主要功能中的第一句话
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);
__ enable_irq();
将向量表偏移地址设置为我们的0x10000;

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
再看你是什么反应
烊烊太萌了
包括广东