
我最近一直在努力. 我说得更清楚了. 写下并记录下来:
基本思想
固件升级的基本思路是: 将stm32闪存分为两个区域:
已经做出了两种升级方法,它们都是USB:
Bootloader代码的重点:

需要包含USB Host,nandflash和fatfs文件系统驱动程序代码. (这部分需要仔细研究,因此我不再赘述)
关于Bootloader区域: 我使用stm32f429,bootlaoder代码已编译约50K,所以我使用flash 0x80000000〜0x8000FFFF,总面积为64K,
请注意,Bootloader代码必须从闪存的起始地址0x80000000开始,以便引导程序将在引导时首先运行.
keil中的特定设置是设置目标中闪光灯的起始地址和大小;在调试设置中,为Flash选择1M(我的429为1Mflash),然后在下面的开始和结束地址中输入正确的地址;
关于APP区域: 使用剩余的0x80010000〜0x800FFFFF区域,keil的具体设置与2相同.

关于读写bin文件到闪存: 如上所述,这更加灵活,您可以将bin文件从外部U盘读取到内存buf,然后再将其写入闪存,
您还可以将Bin文件从板上的存储器读取到内存buf,然后将其写入闪存. 有关特定代码,请参考官方固件库中的示例.
关于跳转: 您可以看到官方代码
1
2
3
4
5
6
7
8
pFunction Jump_To_Application
uint32_t JumpAddress
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4)
Jump_To_Application = (pFunction) JumpAddress
/* Initialize user applications Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS)
Jump_To_Application()

具体分析可以是百度. 我在这里遇到的问题是: 频繁跳转后机器直接崩溃. 可能存在以下情况:
必须输入APP代码主要功能中的第一句话
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);
将向量表偏移地址设置为我们的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-308508-1.html
看看岛礁建设中还存在什么不足之处
老美没有牌了
这谢作诗教授肯定喝醉了