没有合适的资源?快使用搜索试试~ 我知道了~
首页STM32实现跨bin文件调用函数(Firmware)
一、技术背景 以前我用过一款庆科的WiFi模组——EMW3162,它由一块STM32F205RG芯片 + SDIO接口的射频芯片组成,有趣的是官方将这颗STM32芯片内部Flash做了很多块的划分,如下图所示。 EMW316x FLASH分配情况 可以看到1MB的Flash被分割成了5部分,分别是: 1. Bootloader,一段引导代码,一般用于更新APP程序。 2. 信息区,存放OTA的一些信息和用户参数。 3. 用户应用区,也就是APP区,用户可以二次开发后将代码烧录到此处。 4. OTA暂存区,接收OTA数据,接收完成后再复制到用户应用区。 5. 射频驱动区,用于存放SDIO射频模组
资源详情
资源评论
资源推荐

STM32实现跨实现跨bin文件调用函数文件调用函数(Firmware)
一、技术背景一、技术背景
以前我用过一款庆科的WiFi模组——EMW3162,它由一块STM32F205RG芯片 + SDIO接口的射频芯片组成,有趣的是官方将这颗STM32芯片内部Flash做了很多块的划分,
如下图所示。
EMW316x FLASH分配情况
可以看到1MB的Flash被分割成了5部分,分别是:
1. Bootloader,一段引导代码,一般用于更新APP程序。
2. 信息区,存放OTA的一些信息和用户参数。
3. 用户应用区,也就是APP区,用户可以二次开发后将代码烧录到此处。
4. OTA暂存区,接收OTA数据,接收完成后再复制到用户应用区。
5. 射频驱动区,用于存放SDIO射频模组的驱动,供上层使用。
这样划分的好处是显而意见的,厂家不用提供射频驱动的源码,甚至连LIB库都不用提供,并且用户在OTA时,仅需更新应用区的代码,无疑加快了OTA的速度。缺点嘛也是
有的,因为每个区都要预留一些Flash空间,所以划分得越细,浪费的空间也就越多。当然相比起优点,这点缺点还是可以接受的。下文提供了一种方法来实现这种应用,可
能和庆科的实现方式不一样,仅可作为一种思路。
二、技术方案二、技术方案
以下将用户业务层称为App,将驱动层称为Driver,我们要实现的是将Driver编译成一个固定的bin文件,即Firmware.bin,让App能够跨bin文件调用Driver中的函数,而且要求
Driver层的更新不能影响App的访问。
我们知道,C语言中的函数名实际上是个地址,只要知道了函数的地址、函数的格式,就可以调用这个函数。所以关键点在于如何让App知道Firmware.bin中各个函数的地
址。以下提供了几种不同的方案,为了方便说明,下文所有所述内容均不包括Bootloader区、Param区,仅有App区和Driver区。
方案一:在Driver工程中,声明一个结构体,结构体成员为供App使用的函数指针,然后定义一个初始化函数,该函数用于完成上述结构体指针的初始化,然后将该函数放到
某一约定好的地址,App需要根据该地址调用这个初始化函数,这样App就获得了所需的Driver中的函数指针。
方案二:将Driver中的对外函数地址按4字节对齐,顺序地排列到Driver区的起始地址上,App层声明一个结构体,结构体成员为所需的函数指针,然后定义一个该结构体指
针,强制指向Driver区的起始地址,因为STM32中的函数指针是4字节的,所以这个结构体指针的成员实际已经指向了Driver层对应的函数。
由于方案二更简洁,所以本文使用方案二来实现目的。
三、技术原理三、技术原理
3.1 核心思想核心思想
根据方案二所述,最大的难点在于如何将函数地址按顺序排列到Driver区的起始地址上。事实上,答案就在ST提供的启动文件里,启动文件为中断向量表分配了固定的Flash
空间,我们完全可以仿照这一方法。对启动文件不熟悉的读者可以参考我的另一篇文章:STM32启动流程详解。
下面的例子使用的是Keil MDK编译平台,芯片为STM32F103RCT6,Flash和Ram分配如下:

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论1