找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2387|回复: 5
打印 上一主题 下一主题
收起左侧

Keil STM32L151 Bin文件的分层设计 boot app设计

[复制链接]
跳转到指定楼层
楼主
前言
  最近正在做一个使用STM32芯片开发一款门锁的项目,大致需求为锁有人脸、NFC、指纹、密码和蓝牙、4G通讯。
1 需要通过蓝牙发送升级包来进行升级门锁的功能
2 通过4G通讯远程视频对讲
3 有人靠近后通过PIR启动人脸识别
4 门锁锁芯为全自动上/解锁功能
5 电源为锂电池4.2V供电
  项目计划选用STM32L151VDTX芯片,该芯片具有384kb Flash和48kb RAM,计划将Flash分区如下
----------------------------------------------------------------------------------------------------
                                                  Flash分区


Flash分区:
  [Boot-20K] + [App-150K] + [AppBak-150K] + [Account-50K] + [Info-2K] + [Reserved-10K] + [Updata-2K]


门锁分区:
  [Account-25K] + [Key-25K] + [Info-2K]
----------------------------------------------------------------------------------------------------

在使用中发现蓝牙传输时(AES128加密)只能一次传输100多字节的包(96字节的负载包)再大发现手机app接收到的包将会分包收到导致部分包无法解密出来,所以在使用蓝牙升级门锁的app固件时将会有最大150Kb 的包大小需要传输,测试发现升级一次需要总时间为8分钟左右。如果有一种方式将门锁的app固件与常用的驱动等分离开来,后续升级将会快很多,所以有必要开发出一种固件分层并有boot、app、drive的工程。

设计思路:新建一个boot工程,一个app工程,一个没有main函数的drive工程供app调用,甚至boot也可以调用。

一、bootloader工程

boot工程负责在MCU复位后判断是否需要切换启动分区(升级app)或者更新drive固件。在设计boot工程时考虑到工程不应该与具体的芯片品台有关联,所以工程的启动文件需要修改成不调用SystemInit这个函数
; Reset handler routine
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  __main
        ;IMPORT  SystemInit  
                 ;LDR     R0, =SystemInit
                 ;BLX     R0              
                 LDR     R0, =__main
                 BX      R0
                 ENDP

工程项目如上图所示





Lib.c文件中通过函数指针将drive工程中的函数映射到本工程,LibLoad()函数在main中调用后即可使用函数指针直接调用,代码如下:
main.c文件如下:

int main(void)
{
        LibLoad();
        RW_And_ZI_Init();
        BspInit();
                        
        printf("Bootloader\r\n");
        if(IsApplicationTrue())//判断是否有App
        {
                printf(">Go App Success!\r\n");               
                AppMain();
        }
        else
        {
                printf("App addr Error\r\n");
        }
        while(1);
}


Lib.c文件如下:

#include "Lib.h"

pFunction RW_And_ZI_Init;
pFunction Num_Inc;
pFunction Num_Dec;
pFunction Get_Num;
pFunction Get_Num1;
pFunction Get_Num_Addr;
pFunction Swap_Num;
pFunction My_Men_Copy;
pFunction BspInit;
SysTick SysTickInit;
pFunctionParam LogSendByte;
pFunction AppMain;
pFunctionReturn IsApplicationTrue;

void LibLoad(void)
{
  RW_And_ZI_Init =  (pFunction)*(uint32_t*)(0x0802A800+4*0);
        Num_Inc        =  (pFunction)*(uint32_t*)(0x0802A800+4*1);
        Num_Dec        =  (pFunction)*(uint32_t*)(0x0802A800+4*2);
        Get_Num        =  (pFunction)*(uint32_t*)(0x0802A800+4*3);
        Get_Num1       =  (pFunction)*(uint32_t*)(0x0802A800+4*4);
        Get_Num_Addr   =  (pFunction)*(uint32_t*)(0x0802A800+4*5);
        Swap_Num       =  (pFunction)*(uint32_t*)(0x0802A800+4*6);
        My_Men_Copy    =  (pFunction)*(uint32_t*)(0x0802A800+4*7);
        BspInit        =  (pFunction)*(uint32_t*)(0x0802A800+4*8);
        LogSendByte    =  (pFunctionParam)*(uint32_t*)(0x0802A800+4*9);
        AppMain           = (pFunction)       *(uint32_t*)(0x0802A800+4*10);
        IsApplicationTrue = (pFunctionReturn) *(uint32_t*)(0x0802A800+4*11);
        SysTickInit    =  (SysTick)*(uint32_t*)(0x0802A800+4*12);
}


Lib.h文件如下:

#include "stdio.h"
#include "string.h"
#include "stdarg.h"
#include "stdlib.h"
#include "stdint.h"
#include "string.h"

typedef  int (*pFunction)(void);
typedef  void (*SysTick)(uint32_t frequency,void *);
typedef void(*pFunctionParam)(char ch);
typedef uint8_t (*pFunctionReturn)(void);

extern pFunction RW_And_ZI_Init;
extern pFunction Num_Inc;
extern pFunction Num_Dec;
extern pFunction Get_Num;
extern pFunction Get_Num1;
extern pFunction Get_Num_Addr;
extern pFunction Swap_Num;
extern pFunction My_Men_Copy;
extern pFunction BspInit;
extern SysTick SysTickInit;
extern pFunctionParam LogSendByte;
extern pFunction AppMain;
extern pFunctionReturn IsApplicationTrue;

void LibLoad(void);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:151861 发表于 2021-8-26 19:50 | 只看该作者
自己顶起来
回复

使用道具 举报

板凳
ID:599571 发表于 2021-9-4 06:59 | 只看该作者
谢谢分享,开拓了思路
回复

使用道具 举报

地板
ID:1066731 发表于 2023-6-27 10:52 | 只看该作者
lib.c中函数地址是keil内存映射的地址吗
回复

使用道具 举报

5#
ID:375798 发表于 2023-6-27 16:09 | 只看该作者
谢谢分享,值得学习!有个实例就好了
回复

使用道具 举报

6#
ID:375798 发表于 2023-6-27 16:10 | 只看该作者
谢谢分享,有实例就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表