学习了一段时间,特分享个F4的SPI接口FATFS的SD卡IAP程序

2019-07-20 06:37发布

内容如题, 参考了原子哥的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,也只是把底层给更改后即可,都适用于这种方法)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
STM32F103
1楼-- · 2019-07-21 02:45
q27488 发表于 2015-12-31 16:29
你这个程序,为什么我每次烧进去之后,想再次下载都会出现 Invalid ROM Table,只能通过 ISP 擦出芯片才能再 ...

这个问题我之前没有遇到过,是不是应该按着复位才可以进行?而且我的SD卡使用的是SPI接口的,不是SDIO接口的。
闫焱
2楼-- · 2019-07-21 04:01
 精彩回答 2  元偷偷看……
合六斗
3楼-- · 2019-07-21 07:48
过来学习下。
wkz2018
4楼-- · 2019-07-21 13:24
你好我移植你的程序遇到问题可否加QQ请教一下谢谢了(467200539),已经卡在这个问题好几天了
zuoyi
5楼-- · 2019-07-21 13:47
 精彩回答 2  元偷偷看……
xiaosong06
6楼-- · 2019-07-21 17:07
感谢分享

一周热门 更多>