单片机
返回首页

基于STM32从零写操作系统系列---bootloader

2019-09-10 来源:eefocus

本章主要使用汇编语言编写STM32F103(以下称为“该芯片”)的启动代码。具体结构如图:

启动模式

 该芯片可以通过设置BOOT0和BOOT1两个引脚,选择不同的启动方式,正常情况下BOOT0=0,BOOT1=0(0为低电平)。即,芯片将从Flash中加载代码启动。


当芯片上电/复位后,芯片首先从地址0x0000_0000处获取栈地址,然后将地址0x0000_0004处的值赋值给PC寄存器。按照PC寄存器的值,取第一条指令,执行......具体如图:

 地址0x0800_0205处的具体代码如图:


简单来说,地址0x0000_0004处存放的是复位处理函数的地址。当上电/复位时,芯片硬件会自动将地址0x0000_0000处的栈地址赋值给MSP寄存器;将地址0x0000_0004处的复位函数地址值赋值给PC寄存器;然后就从PC寄存器所指的地址开始执行代码。


为什么Flash的地址明明是从0x0800_0000开始,但芯片是从地址0x0000_0000处开始取数据呢?原因很简单,当我们设置BOOT0=0,BOOT1=0时,芯片会将flash的地址范围映射到0x0000_0000~0x0007_ffff的地址范围内,如图:


向量表

当发生了异常并且要响应它时,CM3 需要定位其处理例程的入口地址。这些入口地址存储在所谓的“(异常)向量表”中。缺省情况下,CM3 认为该表位于零地址处,且各向量占用 4 字节,因此每个表项占用 4 字节。如图:

 完整的向量表定义,请看源代码。


复位处理函数

用于上电/复位后,初始化芯片,让芯片能够以最好的状态运行。初始化完成后,跳转到_main函数继续执行。如图:

初始化SystemInit.s

主要是配置芯片的时钟,禁止所有中断,设置向量表位置。如图:


链接脚本

用于链接各个目标文件,定义各个代码段,数据段的位置。如图:

 这个链接脚本的作用,可以简单地理解为规划Flash。如图:

 所以,我们看到第一条指令是放在地址0x0800_0200处的。


Makefile

用于多文件编译管理。如图:


 

main.s 

在本章中,main.s只做死循环,下一章将点亮LED灯。如图:

实验步骤:

1.如下图,创建一个文件夹,在文件夹中新建如图中的文件,按照上面所分析的编辑代码。

 2.在命令行中,进入上一步创建的文件夹,输入make,编译项目。如图:


3.如无意外编译通过,然后按照前面章节讲述的步骤,将生成的.bin文件下载到芯片里。


4.简单对比.list文件与芯片flash中的数据,如图:


小结

本章到此结束,主要是简单介绍了该芯片的启动模式设置,启动流程。stm32F103的初始化没有什么复杂的设置,可以通过相关文档手册,了解向量表的内容;或参照STM32固件库v3.5的源代码。有关链接脚本,Makefile的知识,在本系列博客中不会讲解,网上有相关的资料文档。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章