本帖最后由 Fordhs168 于 2024-9-20 22:20 编辑
#技术资源#
STM32-APM32 芯片内部存在一个固化的ISP固件,用于串口升级,固件存放在芯片系统存储区,每款芯片的系统存储区地址不同(具体可以查看对应芯片手册),系统存储区大小以及ISP固件大小也有差异。
使用ISP升级,一般需要硬件配合,BOOT0拉到高电平,结合ISP上位机使用串口实现程序升级。本章主要描述无视BOOT0的状态,使用软件直接跳转到内部ISP固件区,实现程序升级。
以APM32F030C8为例,系统存储区地址为0x1FFFEC00,大小为3K。具体芯片对应系统存储区地址查手册! ISP第一个握手信号是0x7F,MCU的ISP固件接收到且正确后会回复0x79。具体详细通信协议可以使用抓包工具查看,或者查看ISP协议资料(可以查看STM32的AN3155、AN2606等应用笔记)
uint8_t data[1];
#define ISP_ADDR 0x1FFFEC00
typedef void (*pFunction)(void);//定义一个指针,指向程序入口
pFunction Jump_To_ISPlication;
void Jump_to_ISP(void)
{
uint32_t address;
uint32_t JumpAddress;
// FMC_Unlock();
address = ISP_ADDR;
JumpAddress = *(__IO uint32_t*)(address + 4);
Jump_To_ISPlication = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) address);
Jump_To_ISPlication();
}
int main(){
//系统时钟初始化
//串口1初始化,PA9 PA10
//配置串口中断接收,将接收到的数据赋值给data[0]
while (1)
{
if(data[0]==0x7f)//此处根据具体应用,可以设置按键进入等
{
__disable_irq();
Jump_to_ISP();
}
}
}
|