|
本帖最后由 Psheng 于 2019-3-9 14:45 编辑
本次IAP设计中 0x0800 0000 -0x0801 0000 存放bootloader程序(64kb)
0x0801 0000 之后为APP
bootloader程序思路: 第一步进行了必要的硬件初始化,然后检查SD卡是否就位,
1.1如果没有SD,检查app地址0x0801 0000中时候有APP程序了 如果有就跳转到APP程序 没有就串口一直打印APP error
1.2检查到有SD卡后 ,挂载到FATFS上,并检查在SD卡根目录是否有 firmware.bin 文件
1.2.1如果没有这个文件 则检查app地址0x0801 0000中时候有APP程序了 如果有就跳转到APP程序 没有就串口一直打印APP error
1.2.2有这个文件,则将文件数据复制到SDRAM,并将SDRAM的数据写片内FALSH的APP位置后 删除这个文件 然后跳转到app执行
在bootloder中 函数jump2app()详解
[mw_shl_code=c,true]void jump2app(void)
{
HAL_TIM_Base_Stop_IT(&htim3);/*在本bootloder中开了定时器3的中断,所以要在这里关闭
不然在APP中开启所有的中断后 如果没有写定时器3的中断服务函数 触发定时器3的中断后
会因为没有函数跳转 导致函数卡死*/
INTX_DISABLE();//关闭所有中断
/*防止在切换中断向量时,有中断触发 不确定是进入哪个中断服务函数 引发卡死*/
MSR_MSP(APP_ADDR_START);/*设置栈顶地址*/
/*stm32 芯片的程序中 第一个32bit地址存放的是栈顶的地址
这里直接将APP的栈顶地址 复制给CPU的R14寄存器(栈顶寄存器)*/
( (void(*)()) APP_ADDR_RESET )();/*跳转到app*/
/*stm32 芯片的程序中 第二个32bit地址存放的是复位中断函数的地址
取出存放的复位中断函数的地址 并强制转换成函数 然后运行
这个时候cpu指针 就运行到APP的复位中断函数中了 在APP的复位中断函数中会
初始化时钟后 再跳转到APP的main函数中
*/
}[/mw_shl_code]
APP程序注意点:
再工程中改变整个代码的地址,偏移到0x0801 0000 也要重新设置中断向量表到这个地址 并生成这个firmware.bin文件
因为在bootloder中我们关闭了所有的中断 ,在APP中 我们设置好向量表后 要开启所有的中断
SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量 64KB之后
INTX_ENABLE(); /*开启所有中断*/APP:
FreeRTOS实验14-1 FreeRTOS二值信号量实验.rar
(17.93 MB, 下载次数: 458)
|
|