STM32 固件库移植出错

发布者:万童洁最新更新时间:2019-07-26 来源: eefocus关键字:STM32  固件库  移植出错 手机看文章 扫描二维码
随时随地手机看文章

1 问题描述

最近项目上需要用到STM32F103VET6芯片。之前一直使用的是8年前的库,决定更新为最新版的固件库。在建立新工程编译时出现了以下错误:“..OBJNH3N STM32.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.” 

这里写图片描述


2 问题分析

2.1 问题定位


双击出错信息,Keil跳转到如下窗口: 


这里写图片描述

错误出现在“xxxx.sct”文件,sct文件,全名scatter file,中文名分散加载文件,是ARM程序链接时的输入参数。默认设置下,Keil会自动生成.sct文件。出错的的“NH3N STM32.sct”文件就是keil自动生成的。


2.2 分散加载机制(sct文件)


分散加载机制允许为链接器指定映像的存储器映射信息,可实现对映像组件分组和布局的全面控制。分散加载区域分两类:


加载区:该映像文件开始运行前存放的区域,即当系统启动或加载时应用程序存放的区域。


执行区:映像文件运行时的区域,即系统启动后,应用程序进行执行和数据访问的存储器区域。


2.3 本工程sct文件分析


对于本工程生成的.sct文件来说。


6  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address


加载区,指定了程序映像在存储区存放的起始地址:0x08000000,总共的大小为0x00080000。这与图3中的存放代码的Flash区域地址一致。上电后,从此地址处加载代码。


11  RW_IRAM1 0x20000000 0x00010000  {  ; RW data


执行区,指定了运行时临时存放代码的地方。起始地址:0x20000000,总共的大小:0x00010000。这与图3中的SRAM区域地址一致。上电后,程序在此区域内运行。

这里写图片描述

上边说了Keil在编译工程时会自动生成.sct文件。那么Keil是怎样知道加载区(ROM)起始地址以及执行区(RAM)起始地址的呢?


其实我们新建工程时第一步就是选择芯片的具体型号,Keil会根据我们设置的芯片型号加载默认的ROM、RAM起始地址和存储区大小。


在“Options for Target…”的“Target”选项卡可以看到默认的设置。下图即是我的工程keil的默认设置。从图中可知IROM1就是程序映像存储区参数,IRAM1就是运行时临时代码存放区参数。两个名称前边都加了“I”,代表内部存储区的意思,对应图标“on-chip”。如果系统有外部扩展的ROM和RAM,还需要在“off-chip”对应的区域设置存储区起始地址和大小。“Startup”单选框用于选择系统启动起始区域。通过和生成的.scf文件对比,此默认设置和.sct文件中的代码表述一致。

这里写图片描述

另外,可以设置多个IROM、ROM、IRAM和RAM区,这和.sct文件支持多个不连续的加载区和运行区相对应。但是启动加载区只能选择一个。


报错的代码行是:


7   *.o (RESET, +First)


这一行代码指定了启动代码的首次执行地址。RESET标号表示的地址就是启动地址。其中First属性符表示把RESET代表的代码放在最开始处,也就是指定RESET代表的地址为启动地址。


2.4 报错原因


报错信息中的“no section to be FIRST/LAST”也就是说没有找到FIRST或者LAST对应的区域,也就是说没有找到RESET标号对应的代码。RESET标号对应的代码也就是单片机复位之后执行的代码。因此可以判断keil没有找到STM32的启动文件。


3 问题解决

3.1 启动文件存放位置


通过以上的分析,找到STM32的启动文件,并加载到工程中就可以解决问题了。 

在官方库文件中可以找到启动文件,文件存放路径:STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm。在此路径下总共有8个启动文件。


这里写图片描述

3.2 启动文件适用环境


这8个启动文件分别适用于什么场合?对于本工程应该选择哪一个启动文件?


仔细查看可知这8个文件的文件名都是startup_stm32f10x_xx.s 格式的。这些启动文件分别适用于不同类型及flash大小的器件。


文件名 适用类别 适用型号

startup_stm32f10x_cl.s 互联型的器件 STM32F105xx,STM32F107xx

startup_stm32f10x_hd.s 大容量器件 STM32F101xx,STM32F102xx,STM32F103xx

startup_stm32f10x_hd_vl.s 大容量器件 STM32F100xx

startup_stm32f10x_ld.s 小容量器件 STM32F101xx,STM32F102xx,STM32F103xx

startup_stm32f10x_ld_vl.s 小容量器件 STM32F100xx

startup_stm32f10x_md.s 中容量器件 STM32F101xx,STM32F102xx,STM32F103xx

startup_stm32f10x_md_vl.s 中容量器件 STM32F100xx

startup_stm32f10x_xl.s Flash在512K到1024K字节器件 STM32F101xx,STM32F102xx,STM32F103xx

3.3 STM32 内部Flash容量等级划分规则


那么STM32内部Flash是按照什么样的标准划分大、小、中容量的?


每种系列的器件的划分标准是不太一样的。可能从芯片数据手册中找到划分标准。对于STM32F103xx系列的划分标准如下图所示。


这里写图片描述

3.4 找到合适的启动文件


由数据手册中的选型部分可知STM32F103VET6的Flash大小为512Kbytes,属于大容量系列,因此应该选择启动文件:startup_stm32f10x_hd.s 。


使用notepad++打开此启动文件,启动文件采用汇编语言编写,主要完成系统底层初始化并找到程序main函数执行入口。在启动文件中可以找到如下代码:


; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY

                EXPORT  __Vectors

                EXPORT  __Vectors_End

                EXPORT  __Vectors_Size

这里写图片描述


可以看到这就是.scf文件要找的RESET标号对应的代码。


3.5 往工程中添加启动文件


(以下操作以我自己的工程为例)


把启动文件startup_stm32f10x_hd.s拷贝到工程文件里的CMSIS文件夹里。然后在keil工程树中右击“CMSIS”,在弹出菜单中选择“Manage Project Items”,在弹出的“Manage Project Items”窗口中,在“CMSIS”group中点击“Add Files…”添加刚才的拷贝的启动文件。 

这里写图片描述

这里写图片描述

3.6 编译验证


启动文件添加好后,重新编译工程,编译顺利通过。 


这里写图片描述

【参考】 

1、Keil sct分散加载文件 http://blog.csdn.net/kobesdu/article/details/38258449 

2、关于arm启动代码的启动流程 https://www.cnblogs.com/blackeyes/articles/4742264.html 

3、STM32F10x 启动代码文件选择 https://wenku.baidu.com/view/263f7f5c0066f5335b81215f.html

关键字:STM32  固件库  移植出错 引用地址:STM32 固件库移植出错

上一篇:STM32编译错误汇总(一)
下一篇:关于keil uvision5 Debug调试和调试STM32HAL库出现的问题

推荐阅读最新更新时间:2024-11-08 11:42

STM32学习笔记之点亮LED灯
实验程序: /*******************************led.c*********************************/ #include stm32f4xx.h //在SYSTEM目录下可以找到,把ST官方的部分库抽取出来,组成了一个SYSTEM目录 #include sys.h void LED_Init(void){ RCC- AHB1ENR = 1 5; //使能GPIO端口的F时钟 /* 方法一: */ // GPIOF- ODR |= 0x1 9; // GPIOF- MODER |= 0x1 18; /
[单片机]
<font color='red'>STM32</font>学习笔记之点亮LED灯
stm32程序升级SD卡读取hex文件写入flash
日期:2019,1,14 芯片:STM32F1ZET6 参考文献: 1、了解hex文件: https://wenku.baidu.com/view/930d6583ec3a87c24028c403.html 2、stm32SD卡hex文件升级:看这位博客的【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码): https://blog.csdn.net/niepangu/article/details/50683754 【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码) 3、boot与app的切换可以了解一下正点原子的教程: www.openedv.com/posts/list/11494.htm 4、st
[单片机]
STM32 大小端模式 与 堆栈及其增长方向分析
栈增长和大端/小端问题是和CPU相关的两个问题. 1,首先来看:栈(STACK)的问题. 函数的局部变量,都是存放在 栈 里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以 战舰 stm32 开发板 为例,在startup_stm32f10x_hd.s里面,开头就有: Stack_Size EQU 0x00000800 表示栈大小是0X800,也就是2048字节.这样,CPU处理任务的时候,函数局部变量做多可占用的大小就是:2048字节,注意:是所有在处理的函数,包括函数嵌套,递归,等等,都是从这个 栈 里面,来分配的. 所以,如果一个函数的局部变量过多,比如在函数里面定义一个u8
[单片机]
<font color='red'>STM32</font> 大小端模式 与 堆栈及其增长方向分析
STM32】双堆栈的使用
首先了解一下双堆栈的知识,下面的图片来自《Cortex-M3权威指南》,有点枯燥,但还是要看的。 总结: 1.系统复位后默认使用的是MSP,复位后的状态是特权级线程状态,在这个状态下是允许修改寄存器 CONTROL (见上面的图片)的。进入到用户特权以后就不能修改这些寄存器了。 2.用户特权的情况(也就是用户建立的非中断服务程序)下可以使用MSP或PSP,特权模式(中断服务程序)只能使用MSP。 3.还有很重要的一条就是.假如在用户模式下使用的是PSP,那么寄存器的数值被保存到任务堆栈的空间,进入中断程序后就开始使用MSP,如果还有一个高
[单片机]
【<font color='red'>STM32</font>】双堆栈的使用
智能化STM32 F7微控制器如何满足嵌入式系统更高处理性能需求
意法半导体(ST)推出业界首款基于ARM最新Cortex-M7内核的STM32 F7系列微控制器,其性能远超ST之前的32位STM32F4微控制器,通过无缝升级路径可将处理性能和DSP性能提高一倍。 “作为STM32微控制器产品家族的高端产品,STM32 F7使内存和外存的性能达到一个新的水平,给开发人员带来新的创新机会,保证他们不需要再根据存储器性能调整代码。”ST微控制器市场总监Daniel Colonna表示,“而之所以能够在业内率先推出基于Cortex-M7的产品,首先得益于ST与ARM密切的合作关系。其次,ST也与第三方客户保持着广泛的合作,确保他们能够及时得到ARM最新的技术支持并推出新产品。强大的开发生态系统结合多元
[单片机]
智能化<font color='red'>STM32</font> F7微控制器如何满足嵌入式系统更高处理性能需求
STM32】独立看门狗概述、寄存器、库函数(IWDG一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第17章 独立看门狗 独立看门狗概述 看门狗的定义 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 简单点说:看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。
[单片机]
【<font color='red'>STM32</font>】独立看门狗概述、寄存器、库函数(IWDG一般步骤)
STM32 | TCP通信实例分析
准备相关工程 硬件:小熊派开发板。 软件:STM32+RT-Thread 开发工具:RT-Thread Studio V1.1.0。 实验前提是我们的开发板与我们的PC所处的网络环境在同一网段内。 我们的开发板联网模块时ESP8266。这里需要使用RTT的at_device软件包,这在之前的笔记中已经有介绍:【RT-Thread笔记】onenet软件包的使用。 RT-Thread的网络框架 在编写代码之前有必要先了解一下RT-Thread的网络框架结构(图片来源:RT-Thread官网): 从下往上看: 第 1 层:与硬件相关的一些网络模块,这里我们用的是ESP8266。 第 2~4 层:一些中间层。本次实验中我
[单片机]
<font color='red'>STM32</font> | TCP通信实例分析
Stm32固件库中关于NART的误解
Stm32 固件库中关于NART的误解 禁止自动重传模式(NART) 该模式主要用于满足CAN标准中,时间触发通信选项的需求。通过对CAN_MCR寄存器的NART位置’1’,来让硬件工作在该模式。 在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。 网上有很多can的程序在注释的时候有这样的错误: 将 CAN_InitStructure.CAN_NART=DISABLE理解成为失能自动重传 但是NART的英文全称应该是no automatic retransmission,也就是没有自动重传。 那么CAN_InitStructure.CAN_NART=DISABLE的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved