首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32的BootLoader 从SD卡更新固件(4)

STM32的BootLoader 从SD卡更新固件(4)

4.2.3   实现Flash读写稍微封装一下STM32的官方库函数,就能实现Flash的读写,并验证读写是否正确,具体我实现的接口函数为以下截图,大家可以参考一下:
从SD卡更新固件">
来到这里,我们可以实现在bin文件写入Flash了,写入完后,就要跳转到App程序执行了,接下来继续介绍。
4.3       跳转到新程序运行  这一节要结合上面提到过的,Cortex-M3启动做了什么事情,然后我们的BootLoader下载App程序后,App程序就需要做同样的事情。主要有三个步骤,其中BootLoader程序需要做的是:
l      跳转到复位向量
App需要做的是:
l      重定位中断向量表
l      设置栈指针
4.3.1   跳转到复位向量BootLoader程序需要做的是跳转到复位向量,具体实现可以参考以下代码。
( (void (*)()) (Reset))();   //跳转到复位向量
注意( (void (*)()) (Reset) )();是一去就不返回的,执行完这条语句,单片机就直接跳转到App程序运行的,所以BootLoader程序下载完App后,做一些简单的处理(根据自己的应用,也可以不做任何处理),就用这条语句跳转到App执行。
4.3.2   App开始运行BootLoader跳转到App后,App需要做的是先设置栈指针,然后重定位中断向量表地址,具体可以参考以下代码。
__set_MSP( Msp);                 //设置栈指针
NVIC_SetVectorTable( base, offset);   //重定位中断向量表
其中Msp是栈指针,也就是中断向量表第一个字的内容,我们这里的内容是*((uint32_t)(0x08070000) )
base是中断向量表的基地址,一般情况下就是ROM的起始地址,这里是0x08070000
至此,BootLoader实现步骤完了,相信熟悉了这几个步骤后,大家可以自己给自己的单片机写个BootLoader。顺便说一下,Cortex-M4BootLoaderCortex-M3几乎是一样的。我在STM32上的实现完全是参考自己上次在飞思卡尔Cortex-M4上的实现。下面说一下我的主函数吧,我们再看看具体的BootLoader流程,再熟悉一下BootLoader


5.Bootloader具体流程  先看看我的主函数,再啰嗦一下具体流程,可能有的同学已经有点厌烦啦,其实感觉有点多余。
5.1       主函数流程先看截图。
从SD卡更新固件">
主函数的流程如下所示:
l      时钟初始化
l      LED初始化(无关紧要)
l      调试接口初始化(无关紧要)
l      Flash初始化(解锁Flash
l      FAT初始化(挂载文件系统)
l      我们的BootLoader(重点,下面展开继续介绍)
l      主循环(实际不会运行到这里)
然后在具体讲解BootLoader_FromSDCard函数,这就是我们的重点,传说中STM32BootLoaderSD卡更新固件。
5.2       BootLoader流程老样子,先上截图:
从SD卡更新固件">
具体流程如下所示:
l      打开bin文件,检查文件打开是否正确
l      设置Flash下载起始地址(App程序起始地址)
l      读取bin文件,检查读取是否正确
l      获取栈指针SP和复位向量PC
l      进入循环(这里是第5步),条件为如果读取bin文件字节数不为零
l      将读取到的bin写入Flash,并判写入状态
l      调整Flash地址,根据写入字节调整
l      继续读取bin文件,检查读取是否正确,回到5继续循环
来到这里已经是退出循环了,也就是说我们已经将bin写入Flash完成了,准备跳转到新程序运行
继承事业,薪火相传
返回列表