打印
[应用相关]

STM32L151C8T6的Bootloader设计

[复制链接]
1023|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
思想:
FLASH分三个区:

Bootloader区: 校验备份程序,若满足条件将用备份程序替换用户程序,否者运行用户程序.

运行区:运行用户程序,程序中要求能接受用户程序到备份区,接收完后,在备份区的程序头内打上标记,然后启动Bootloader,由Bootloader完成程序替换

备份区:用户程序在此接受


使用特权

评论回复
沙发
八层楼|  楼主 | 2019-7-6 12:38 | 只看该作者
4.1 空间分区
STM32L151C8T6有64KB的FLASH空间,每4KB是一个区,每个区有16个页,程序编程是按页来编程的.

程序的Vector是按512的整数倍偏移的, 空间划分如下图, 后续所示的设置都是基于这个空间划分来配置的.

程序头的含义是这个新程序正文的标签,标记了当前程序的版本号,程序总校验,程序总包数,程序的适用设备类型,等信息.



使用特权

评论回复
板凳
八层楼|  楼主 | 2019-7-6 12:38 | 只看该作者
4.2 Bootloader需要设定的地方4.2.1 设置Bootloader的ROM空间

Bootloader最好是扇区的整数倍!


使用特权

评论回复
地板
八层楼|  楼主 | 2019-7-6 12:39 | 只看该作者
4.2.2 设置JLINK的烧写空间区间


使用特权

评论回复
5
八层楼|  楼主 | 2019-7-6 12:39 | 只看该作者
4.2.3 设置烧写文件输出

注意第六步是要选择是STM32L15x LowPower FLASH,不能选择STM32F的类型哦!!!


使用特权

评论回复
6
八层楼|  楼主 | 2019-7-6 12:39 | 只看该作者
4.2.4 使用JLIN在线烧写Bootloader


使用特权

评论回复
7
八层楼|  楼主 | 2019-7-6 12:40 | 只看该作者
4.2.5 要点
连接JLINK后再点LOAD按键,就可将Bootloader烧写进设定好的Bootloader区,而不会影响任何其地址空间的FLASH.



如果Bootloader空间划分不是扇区的整数倍,MDK会按Bootloader占用的扇区擦写,如Bootloader占用4.2KB,实际MDK会先擦除8KB空间



Bootloader程序最好先关闭中断,在用户程序中由用户开启


使用特权

评论回复
8
八层楼|  楼主 | 2019-7-6 12:40 | 只看该作者
4.3 用户程序需要设定4.3.1 设置用户运行程序的FLASH


使用特权

评论回复
9
八层楼|  楼主 | 2019-7-6 12:40 | 只看该作者
4.3.2 设置JLINK烧写地址

使用特权

评论回复
10
八层楼|  楼主 | 2019-7-6 12:41 | 只看该作者
4.3.3 设置输出文件




输入内容: fromelf.exe --bin -o  $L@L.bin


使用特权

评论回复
11
八层楼|  楼主 | 2019-7-6 12:41 | 只看该作者
4.3.4 烧写用户程序

点击LOAD按钮可烧写编译好的用户程序到程序运行区,而不会干预任何其他区.


使用特权

评论回复
12
八层楼|  楼主 | 2019-7-6 12:42 | 只看该作者
4.3.5 用户程序要点
由Bootloader存在的用户程序需要在用户的main程序中添加如下信息,不加这些信息程序会死机的哦!!!

int main(void)

{   

   NVIC_SetVectorTable(0x08001200,0);            //设置中断向量表

    __enable_irq();                                                       //允许全局中断



//以下是用户代码

……

}


使用特权

评论回复
13
yanxuntao| | 2024-1-2 17:20 | 只看该作者
NVIC_SetVectorTable(0x08001200,0);你好,你这个函数是怎么样的?我这边直接用void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
  /* Check the parameters */
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));  

SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);

},仿真查看SCB->VTOR寄存器的值是变了的,boot能跳转到user,但是用户程序里面的中断运行不了。你这边有遇到这样的问题吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

91

主题

4146

帖子

2

粉丝