内容如题,
参考了原子哥的F4手册里面串口IAP,并且还用了hexiaolong2008网友的基于103的SDIO的IAP思路(
http://www.openedv.com/posts/list/16218.htm)
在此特提出感谢,然后想着用F4应该也是可以的,就参考着做了一个,最后发现程序下载速度确实很快,没有做屏幕显示,开机检测按键是否按下了,如果按下了就进去固件更新的程序,然后用了一个LED灯用来显示当前的状态,没有加屏幕显示,这样的话可以把bootloader做到最小。
[mw_shl_code=c,true]#define APP_START_ADDR (FLASH_BASE|0X4000)
[/mw_shl_code]
定义了APP的入口地址,具体地址的设定可以参考原子哥F4手册中对F4系列芯片地址块的分配,我用的第一个块16KB用来放BootLoader,原子哥用的是64KB,跟我这个有点不一样。
[mw_shl_code=c,true]int main(void)
{
KEY_Init();
if(KEY == 0)
{
FirmwareUpdate();
}
JumpToApp(APP_START_ADDR);
while(1)
{
}
}[/mw_shl_code]
主函数如上所示,就是检测按键是否按下,如果按下后就进入了固件更新,没有按下就跳到APP中。
其中BootLoader的地址应该配置如下图:
然后对于APP需要做以下的修改,首先是IROM1的地址:
这个修改应该和IAP.h中的宏定义一致:
[mw_shl_code=c,true]#ifndef __IAP_H
#define __IAP_H
#include "stm32f4xx.h"
#include "stm32f4flash.h"
#define APP_START_ADDR (FLASH_BASE|0X4000)
void JumpToApp(u32 AppAddr);
void FirmwareUpdate(void);
#endif
[/mw_shl_code]
然后就是APP的main函数中需要加一句话:
[mw_shl_code=c,true]SCB->VTOR=APP_START_ADDR;[/mw_shl_code]
这个是用来更改中断向量表的。
这样就可以进行IAP更新了,先按住PA0,然后再按住复位,或者按住PA0后进行上电,就会自动检测SD卡中的Update.bin是否存在,如果存在就会进行IAP的更新。
[mw_shl_code=c,true]res = f_open(&UpdateFiles,"Update.bin",FA_OPEN_EXISTING|FA_READ);[/mw_shl_code]
感觉这样更新固件的方式挺快的,就是一瞬间就完了。
现在把源代码奉上,以供参考,转载请注明openedv。
最后对hexiaolong网友和原子哥进行无比的感谢,另外可能我发错版面了,如果又必要的话,原子哥可以进行移动。
(F103由于FLASH块分配的原因并不适用这种方法,但是对于F4而言,不论是SDIO还是SPI,也只是把底层给更改后即可,都适用于这种方法)
这个问题我之前没有遇到过,是不是应该按着复位才可以进行?而且我的SD卡使用的是SPI接口的,不是SDIO接口的。
一周热门 更多>