gd32 bootloader里__set_MSP作用
typedef void (*Jump_Fun)(void);
Jump_Fun JumpToApp;
void IAP_ExecuteApp (uint32_t address)
{
// 检查栈顶是否合法,,确保栈顶落在0x2000 0000 - 0x2000 1FFF 之间,刚好在GD32E230的RAM范围内
if ( ( ( * ( __IO uint32_t * ) address ) & 0x2FFE0000 ) == 0x20000000 ) //检查栈顶地址是否合法.
{
if (((*(__IO uint32_t*)(address + 4)) & 0x8FE0000 ) == 0x08000000 )
{ usart_disable(USART0);
JumpToApp =(Jump_Fun) * ( __IO uint32_t * )(address + 4); //用户代码区第二个字为程序开始地址(复位地址)
__set_MSP( * ( __IO uint32_t * ) address ); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
JumpToApp(); //跳转到APP.
}
}
}
但如果改成Jump_Fun JumpToApp这句放进去下面这样就无法跳转,但下面这种删去__set_MSP( * ( __IO uint32_t * ) address )这句又能跳转了,请问为什么会发生这种现象?
typedef void (*Jump_Fun)(void);
void IAP_ExecuteApp (uint32_t address)
{
// 检查栈顶是否合法,,确保栈顶落在0x2000 0000 - 0x2000 1FFF 之间,刚好在GD32E230的RAM范围内
// uint32_t JumpAddress;
if ( ( ( * ( __IO uint32_t * ) address ) & 0x2FFE0000 ) == 0x20000000 ) //检查栈顶地址是否合法.
{
Jump_Fun JumpToApp;
if (((*(__IO uint32_t*)(address + 4)) & 0x8FE0000 ) == 0x08000000 )
{ usart_disable(USART0);
JumpToApp =(Jump_Fun) * ( __IO uint32_t * )(address + 4); //用户代码区第二个字为程序开始地址(复位地址)
__set_MSP( * ( __IO uint32_t * ) address ); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
JumpToApp(); //跳转到APP.
}
}
}
其实注释已经解释得很清楚了