(1) GD32e230的iap程序一般开始会有判断,比如按键判断,当满足IO口电平条件时,将直接跳转到App程序,不进行程序的升级。
if(RESET == gpio_input_bit_get(GPIOA, GPIO_PIN_0))
{
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
usart_disable(USART0);
dma_channel_disable(DMA_CH2);
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
(2) 判 断 语 句 if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)。显然 0x10000 转换为 10进制计算,其大小为 64KB,如果应用代码使用内部 SRAM 没超过 128KB,或者本身 SRAM没超过 128KB,&0x2FFE0000 即堆栈地址是否落在:0x20000000~0x2001ffff 区间中,这个区间的大小为 128K。
|