日期 作者 版本 说明
2020.11.03 Tao V0.0 完成主体内容的撰写

目录

  • BootLoader程序介绍
  • 源码实现
    • 源文件
    • stm32f4_flash.ld
  • 使用指南
    • 设置用户程序下载位置(stm32f4_flash.ld)
    • 修改中断向量表偏移量

BootLoader程序介绍

BootLoader其实就是一段启动程序,它在芯片启动的时候首先被执行,它可以用来做一些硬件的初始化,当初始化完成之后跳转到对应的应用程序中去。例如,我们可以将Flash分为两个区,一个是启动程序区(0x0800 0000 - 0x0800 2000)大小为8K Bytes,剩下的为应用程序区(0x0800 2000 - 0x0801 0000)。芯片上电时先运行启动程序,然后跳转到应用程序区执行应用程序。

参考资料

源码实现

基本的BootLoader程序仅实现了代码跳转的功能,因此全部在main.c文件中实现。

源文件

/*******************************************************************************
File:     main.c
Info:     Generated by Atollic TrueSTUDIO(R) 9.3.0   2020-09-07The MIT License (MIT)
Copyright (c) 2019 STMicroelectronicsPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.*******************************************************************************//* Includes */
#include "stm32f4xx.h"
#include "delay.h"
/* Private macro *///用户扇区从第5扇区的起始位置开始启动
#define FLASH_APP_ADDR          0x08010000#define MCU_LED                       GPIOA_OUT(15)/* Private variables */
typedef  void (*UserApplication)(void);             //定义一个函数类型的参数.UserApplication userApp;/* Private function prototypes */
void ConfigLED( );
void SystemBooting(uint8_t times, uint16_t msDelay);
void IAPLoadApp(u32 appxaddr);/* Private functions *//****===========================================================================****  Abstract: main program****===========================================================================*/
int main(void)
{/***  IMPORTANT NOTE!*  The symbol VECT_TAB_SRAM needs to be defined when building the project*  if code has been located to RAM and interrupts are used.*  Otherwise the interrupt table located in flash will be used.*  See also the <system_*.c> file and how the SystemInit() function updates*  SCB->VTOR register.*  E.g.  SCB->VTOR = 0x20000000;*//* TODO - Add your application code here */delay_init();ConfigLED();SystemBooting(5,100);//从第五扇区起始位置开始加载应用程序IAPLoadApp(FLASH_APP_ADDR);while(1);
}void ConfigLED( )
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/*** System State LED*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void SystemBooting(uint8_t times, uint16_t msDelay)
{for (uint8_t i = 0; i < times; i++){MCU_LED = 0;delay_ms(msDelay);MCU_LED = 1;delay_ms(msDelay);}
}void IAPLoadApp(u32 appxaddr)
{if(((*(vu32*)appxaddr)&0x2FF00000)==0x20000000)              //检查栈顶地址是否合法.{userApp=(UserApplication)*(__IO vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)__set_MSP(*(__IO uint32_t*) appxaddr);                          //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)userApp();                                                                      //跳转到APP.}
}

stm32f4_flash.ld

设置BootLoader程序在flash中的位置为第1~2扇区,共32K空间。在笔者的项目中,第3~4扇区用来实现EEPROM的软件仿真,用户程序将从第5扇区开始启动。

/* Specify the memory areas */
MEMORY
{FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 32KRAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128KMEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0KCCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

使用指南

用户程序需要从第5扇区的起始位置开始下载,同时需要设置中断向量的偏移地址。

设置用户程序下载位置(stm32f4_flash.ld)

在笔者的项目中,设置BootLoader程序在flash中的位置为第1~2扇区,共32K空间。第3~4扇区用来实现EEPROM的软件仿真,共32K空间。用户程序将从第5扇区开始启动。

/* Memories definition */
MEMORY
{FLASH (rx)    : ORIGIN = 0x8010000,   LENGTH = 448KRAM (xrw)     : ORIGIN = 0x20000000,  LENGTH = 128KCCMRAM (xrw)  : ORIGIN = 0x10000000,  LENGTH = 64K
}

修改中断向量表偏移量

在"system_stm32f4xx.c"文件中,修改宏定义:

/*!< Uncomment the following line if you need to relocate your vector Table inInternal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x10000 /*!< Vector Table base offset field.This value must be a multiple of 0x200. */

void SystemInit(void)中将会根据上述宏定义,设置中断向量表的偏移量:

/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

STM32开发项目:STM32F407的BootLoader程序相关推荐

  1. 野火stm32开发板给定一个脉冲程序_STM32开发板哪个好,推荐一款高性价比stm32MP157开发板...

    一款能跑Linux的STM32开发板: 一款既可以玩Linux又可以玩单片机的开发板: 一款可同时学习A7和M4的双核异构开发板: 一款支持最新的Linux 5.4.31系统和u-boot 20200 ...

  2. 微信小程序云开发项目——多肉植物销售小程序

    前言 此项目为本人在大学的毕业设计作品,基于微信小程序云开发技术进行开发,暂未商用和托管.编写文章意在为求职做准备,亦乐于与大家进行经验交流分享,欢迎进行评论咨询哦. 简介 用户角色分为:一般顾客.商 ...

  3. STM32开发项目:定时器预装载寄存器(ARR)

    项目背景 笔者在进行某项目开发时,需要实时调节定时器的周期,以控制定时器下次更新中断的时间. 预装载寄存器 自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值.当计数 ...

  4. STM32开发项目:借助DMA传输高效的使用ADC

    目录 项目背景 DMA简介 DMA请求 DMA通道 DMA仲裁 DMA配置 从哪里来到哪里去 要传多少,单位是什么 什么时候传输完成 代码示例 配置GPIO 相关变量定义 配置ADC 配置DMA 获取 ...

  5. STM32开发项目:GPIO的位带操作

    目录 背景介绍 GPIO位带操作的实现 使用指南 背景介绍 位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见.51 单片机中通过关键字 sbit 来实现位定义,STM32-M3, ...

  6. STM32开发项目:一些模拟电子开关的介绍与驱动

    日期 作者 版本 说明 2020.09.29 Tao V1.0 撰写了ADG408.DG467芯片的简介与驱动 2020.09.30 Tao V1.1 撰写了WAS3157B芯片的简介与驱动 2020 ...

  7. 野火stm32开发板给定一个脉冲程序_STM32学习之旅~~~~~~~~~蜂鸣器实例

    在前面章节中我们已经介绍了如何控制 STM32 的 IO 口输出高低电平,本章我们通过另外一个实验来讲述 STM32 IO 口的输出.通过 STM32F1 芯片的一个 IO口控制板载有源/无源蜂鸣器, ...

  8. VS Code 搭建stm32开发环境

    MCU免费开发环境 一般芯片厂家会提供各种开发IDE方案,通常其中就包括其自家的集成IDE,如: 意法半导体 STM32CubeIDE NXP Codewarrior TI CCS 另外也可以用ecl ...

  9. 嵌入式IAP开发笔记之一:面向STM32的BootLoader程序

    对于很多人来说,BootLoader并不是一个陌生的词,甚至会经常用到它.因为在很多情况下我们都需要BootLoader程序,比如我们需要对系统在线升级时就需要它,还有当我们需要在外部存储器中运行程序 ...

最新文章

  1. 比PCA更好用的监督排序—LDA分析、作图及添加置信-ggord
  2. html贪吃蛇自动走,分享一个用html5实现的贪吃蛇特效代码
  3. 全球及中国光伏建筑一体化(BIPV)产业专项可行性与容量规模预测报告2022版
  4. xcode:关于Other Linker Flags
  5. 142-练习8和9 for循环的嵌套调用和随机数的生成
  6. 华为服务器部署项目,服务器部署项目
  7. SQL数据库语言基础之SqlServer表数据的插入、更新与删除
  8. 调试Python的方式
  9. netstat 查看网络状态
  10. 第七章 Git操作 7.1利用gitee提交代码
  11. Hutool常用工具
  12. android手机如何拥有苹果表情包,怎样让安卓emoji显示iPhone的emoji样式
  13. 推荐四款在线富文本编辑器
  14. 使用百度地图API进行Android地图应用开发(Eclipse)
  15. 学妹面试拼刀刀被问Java策略模式是什么鬼?哈哈哈哈
  16. 截至9月28日聚合支付牌照知多少,附名单
  17. 虎胆龙威5java7723,汉米尔顿腕表联手《虎胆龙威5》再度演绎热血豪情
  18. eclipse鼠标变成十字架
  19. 百度AI,和“吴文俊奖”同行的十二年、千丈山、万里路
  20. 谷歌浏览器打不开github网址

热门文章

  1. pycharm中scrapy库的安装以及创建
  2. js实现点击下载文件
  3. TrackingMore API C# 调用示例
  4. -牧野- OpenGL文章收集
  5. 浅谈前端工程师的职业生涯の(上篇)
  6. C/C++ 费诺编码实现
  7. 一个拿到人人网和淘宝网offer的大四学生的Android学习经历
  8. 视频教程-Android Material Design 新控件-Android
  9. iap升级问题 stm32f103r8_STM32在线升级OTA,看这一篇就够啦~
  10. 各种手机处理器排行榜_手机处理器排行前十位,分别是什么?