求大侠帮忙,最近在一个项目中需要bootloader支持,下面是我的IAP主程序
int main(void)
{
uint8_t key = 0;
BSP_Init(); /* 硬件初始化 (LED) */
BSP_UART_Init(115200); /* 串口初始化 */
BSP_Printf("Bootloader restart!
");
BSP_APP_START(APPLICATION_ADDRESS); /* 起动APP程序 */
BSP_APP_START(ORIGIBACKUP_ADDRESS); /* 起动备份APP程序 */
STM32F4_FLASH_Init(); /* 初始化flash操作 */
BSP_Timer3_Init(5999, 6); /* 定时器初始化 */
/* 如果用户区flash有写保护 */
if (STM32F4_FLASH_GetWriteProtectionStatus() == 0)
{
STM32F4_FLASH_DisableWriteProtection();
}
BSP_Printf("Flash no program, please download!
");
BSP_Printf("Enter 1 to start YModem upgrade!
");
while(1)
{
/* 等待接收字符(通过电脑键盘输入) */
key = GetKey(60000);
if (key == 0x31)
{
/* 下载新的用户代码到flash里面 */
TIM_StatusControl(TIM3, DISABLE); /* 一定要关掉打开的中断 */
Download(); /* Ymode协议接收*/
BSP_IAP(HeaderAddr);
}
if(IS_TIMEOUT_1MS(eTimUpdata, 200))
BSP_LED_Toggle(1u);
}
}
static void BSP_IAP(uint32_t Address)
{
if(((*(__IO uint32_t*)Address) & 0x2FFE0000) == 0x20000000)/* 检查栈顶地址是否合法 */
{
JumpAddress = *(__IO uint32_t*) (Address + 4);
/* 用户应用地址 */
Jump_To_Application = (pFunction) JumpAddress;
/* 初始化MSP */
__set_MSP(*(__IO uint32_t*) Address);
Jump_To_Application();
}
}
static void BSP_APP_START(uint32_t Address)
{
uint32_t data = 0;
PROGRAM program;
uint32_t crc;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE); /* CRC模块时钟初始化 */
CRC_ResetDR();
memcpy(&program, (void*)ApplicationHeaderAddress, sizeof(PROGRAM));
data = *(uint32_t*)Address;
if(data != 0xFFFFFFFF)
{
//如果有中断,一定要关中断
if(Address == APPLICATION_ADDRESS)
{
crc = CRC_CalcBlockCRC((uint32_t*)Address, program.APP.iLength);
if((program.APP.iCheck == ApplicationCheck) && (crc == program.APP.iCRC))
{
BSP_IAP(APPLICATION_ADDRESS);
}
}
else if(Address == ORIGIBACKUP_ADDRESS)
{
crc = CRC_CalcBlockCRC((uint32_t*)Address, program.BCK.iLength);
if((program.BCK.iCheck == ApplicationCheck) && (crc == program.BCK.iCRC))
{
BSP_IAP(ORIGIBACKUP_ADDRESS);
}
}
}
}
上面就是IAP启动的主代码,通过J-Link仿真IAP程序时,既可以下载APP程序也可以顺利启动APP;但是只要把board断电重启,超级终端什么信息都没有打印出来,好像程序没有运行,但是Flash中没有APP段程序的情况下,bootloader可以掉电重启运行,我的IAP范围0x08000000~0x08003fff开始,APP范围0x08010000~0x080fffff.期望大侠能帮我分析一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>