历史上的今天
返回首页

历史上的今天

今天是:2025年07月08日(星期二)

正在发生

2019年07月08日 | 基于STM32从零写操作系统系列---bootloader

2019-07-08 来源: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的知识,在本系列博客中不会讲解,网上有相关的资料文档。



推荐阅读

史海拾趣

DSP Group Inc公司的发展小趣事

在智能语音领域,DSP Group凭借其深厚的技术积累和创新能力,取得了显著的突破。公司推出了一系列智能语音处理技术和产品,如SmartVoice系列语音处理芯片和算法套件等。这些技术和产品不仅为用户提供了更加自然、智能的语音交互体验,还为智能家居、汽车电子等领域的发展提供了有力支持。

鑫雁公司的发展小趣事

聚洵半导体始终坚持以市场为导向、以创新为驱动的发展理念。公司不断加大新产品研发投入,致力于在低功耗运放、高速运放、仪表放大器等领域取得更多技术突破。同时,聚洵还积极关注行业动态和市场趋势,针对医疗电子、工业控制、汽车电子等新兴领域推出了一系列创新产品。展望未来,聚洵将继续保持专注和创新精神,致力于成为国内领先的信号链模拟芯片设计公司之一,为电子行业的发展贡献更多力量。

Excel-Display Corporation公司的发展小趣事

Excel-Display Corporation(以下简称EDC)成立于XX世纪初,由一群富有远见的电子工程师和企业家共同创立。他们看到了当时显示技术领域的巨大潜力,决定成立一家专注于研发和生产高质量显示器的公司。

EDC在创立初期就注重技术研发和产品质量,投入大量资金引进先进的生产设备和技术人才。经过几年的努力,EDC成功推出了一系列性能稳定、画质优良的显示器产品,逐渐在市场上崭露头角。

与此同时,EDC也积极开拓国际市场,与多家国际知名企业建立了合作关系。这些合作不仅为EDC带来了技术上的支持,也为其产品的国际化推广奠定了坚实的基础。

FCI [First Components International]公司的发展小趣事

Excel-Display Corporation(以下简称EDC)成立于XX世纪初,由一群富有远见的电子工程师和企业家共同创立。他们看到了当时显示技术领域的巨大潜力,决定成立一家专注于研发和生产高质量显示器的公司。

EDC在创立初期就注重技术研发和产品质量,投入大量资金引进先进的生产设备和技术人才。经过几年的努力,EDC成功推出了一系列性能稳定、画质优良的显示器产品,逐渐在市场上崭露头角。

与此同时,EDC也积极开拓国际市场,与多家国际知名企业建立了合作关系。这些合作不仅为EDC带来了技术上的支持,也为其产品的国际化推广奠定了坚实的基础。

EUCHNER公司的发展小趣事

EUCHNER公司一直是一个家族企业,其企业精神和创新精神在家族成员中得以传承。随着公司的发展,EUCHNER逐渐扩张其业务范围,不仅在欧洲市场建立了稳固的地位,还开始进军全球市场。公司通过不断的技术创新和产品升级,逐渐在工控配件领域建立了良好的声誉。

ALCOA公司的发展小趣事

近年来,随着环保意识的提高,ALCOA积极推动可持续发展和环保倡议。公司致力于减少生产过程中的能源消耗和废弃物排放,同时也在研发更环保的铝材和生产工艺。这些努力不仅提升了公司的社会形象,也为其在电子行业中的长期发展奠定了坚实的基础。

以上五个故事,只是ALCOA公司发展历程中的一部分。然而,这些故事足以展现出这家公司在电子行业中的卓越成就和持续创新的精神。

问答坊 | AI 解惑

arm资料

ARM应用系统开发详解——基于S3C4510B的…

查看全部问答>

问个变压器问题~

1。变压器的电压比是5:4,但是应用时输出电压远远达不到这个值,实际输出电压比理论值要低差不多20V。比如说:我输入个AC 220V 50Hz的电压(量了,是正确的),输出电压理论值应该为 220*0.8=196V,但实际输出电压才173V。整个电路电流在15mA以内 ...…

查看全部问答>

xilinx usb 下载线

Xilinx platform cable usb(Xilinx 下载线) 1.目标器件VCC兼容 1.5V--5V 2.可配置所有Xilinx器件 3.支持iMPACT 和ChipScope 4.支持JTAG和Slave Serial配置模式 5.目标器件下载时钟可选,最高可达24 MHz 6.LED状态指示灯指示目标器件电 ...…

查看全部问答>

eboot中的main.c中的InitLDI_LTV350和Write_LDI_LTV350起什么作用的?

SMDK2450 FMD版的: InitDisplay里的代码: #elif (BSP_TYPE == BSP_SMDK2450) void Delay(void) {     volatile int i;     for(i=0 ; i < 1000 ; i++)     {     } } static void InitDisplay(void) ...…

查看全部问答>

ce 系统分区

Windows CE Firmware Init INFO: Initializing system interrupts... INFO: Initializing system clock(s)... INFO: Initializing driver globals area... SDMMC config set rGPGCON: fd96f5b6 OEMInit Done... Sp=ffffc7cc NandFlash FMD_I ...…

查看全部问答>

关于USB驱动的问题

想在PXA270板子上使用内置USB设备,涉及驱动结构 USBFNUSBD|HCD 如果我想用外接USB设备,就要涉及USB ROOT HUB的驱动, 请问USB ROOT HUB驱动是在上述结构的什么位置? USBFN里面对内置和外置USB设备处理有没有不同? 小弟初学,表述不周还请 ...…

查看全部问答>

简单但你却不一定能说得通的JTAG接口

JTAG接口        1JTAG(Joint Test Action Group;联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4 ...…

查看全部问答>

瑞嵌NXPLPC11XX文件详解

对NXPLPC11XX.H文件的解释…

查看全部问答>

关于STM32的JTAG口

请问如果把JTAG端口全部禁止后是不是就不能下载和仿真了呢? 如果JTAG口锁定了如何解除锁定呢?…

查看全部问答>

f2818中sprintf()函数可用吗?

char buff[40]; sprintf(buff, \\"%f\\", 5.252); 我想用sprintf()函数实现浮点数的显示,程序编译没问题,我单步调试中发现buff数组的值没有被更新!! 同时我也试了ltoa()函数,也同样不起作用!! 是不是库函数都可用??   &nb ...…

查看全部问答>