iar下的stm32启动代码分析

发布者:Asawen最新更新时间:2024-10-15 来源: elecfans关键字:iar  stm32  启动代码 手机看文章 扫描二维码
随时随地手机看文章

使用的芯片是 STM32F103VET,编译器使用 IAR ARM V5.5


设置头文件查找路径,例如:

$PROJ_DIR$..

$PROJ_DIR$......LibrariesCMSISCM3CoreSupport

$PROJ_DIR$......LibrariesCMSISCM3DeviceSupportSTSTM32F10x

$PROJ_DIR$......LibrariesSTM32F10x_StdPeriph_Driverinc


预定义的symbol 为,HD为high desity 的意思

USE_STDPERIPH_DRIVER

STM32F10X_HD


有两个符号是系统默认的,看名字就应该知道什么了。

$TOOLKIT_DIR$ $PROJ_DIR$


注意GPIO的端口操作是 16位的,否则送的数据无效

GPIOB_ODR = (uint16_t)0xff


__iar_program_start 是一个系统定义的标号,在自带的C库启动代码当中,IAR会自动连接到当然了,也可以自己定义一个


EXTERN __iar_program_start

        LDR R0, =__iar_program_start

        BX R0


另外一个必须有的符号就是 __vector_table 使用方法是

        SECTION .intvec:CODE:NOROOT(2) 

        PUBLIC __vector_table

        DATA

__vector_table

        DCD sfe(CSTACK)

        DCD Reset_Handler ; Reset Handler

        ......

首先中断向量独立在一个叫 .intvec 的段当中,这个段是 4字节对齐(2^2)所以用 DATA 来首先处理向量的入口地址为 4的倍数,然后放向量表。

需要注意的是 NOROOT(2) 和 ROOT(2) 的区别,如果NOROOT表示如果符号没有被关联的时候是被优化掉的,如果想不被优化则使用ROOT吧

其中向量表的第一个数据为堆栈的顶部,可以为一个确定的数值放在SRAM的尾部,这里演示代码使用的是使用固定连接脚本去处理,在连接脚本中定义了一个 CSTACK 的段,然后在启动代码中先声明这个段

SECTION CSTACK:DATA:NOROOT(3)

DCD sfe(CSTACK) 

然后通过 SFE 运算得到改段的结束地址,注意这个运算是在link的时候完成。所以IAR 的处理办法就是先定义一个block作为堆栈区,然后将堆栈指针放到这个block的末端,因为STM32的堆栈是向下生长的。

剩下的就是各个中断向量。接着看怎么处理

        THUMB


        PUBWEAK Reset_Handler

        SECTION .text:CODE:REORDER(2)

Reset_Handler

        LDR R0, =SystemInit

        BLX R0

        LDR R0, =__iar_program_start

        BX R0

               

        PUBWEAK NMI_Handler

        SECTION .text:CODE:REORDER(1)

NMI_Handler

        B NMI_Handler


首先,因为之前是DATA模式,所以这里先切换回THUMB模式,PUBWEAK 应该是由2个单词组成,PUBLIC 和 WEAK ,PUBLIC 表示导出标号,WEAK表示弱属性,这个属性有一个好处就是,如果用户程序定义了这个标号,那么系统自带的这个中断处理程序则丢弃,使用用户的处理程序,如果用户没有定义则使用系统默认的中断处理程序,这样处理给用户有足够的自由。

然后就装载 SystemInit 函数的地址,跳转去执行该函数,这个函数主要是设置系统的时钟。

最后装载 __iar_program_start 的地址,这个函数是在启动代码中 armsrclibthumb下面的代码中找到,是系统自带的启动模块。在项目设置属性的 linker,library中勾选 Automatic runtime library 就可以自动装载了,然后在汇编代码中声明一下 

EXTERN __iar_program_start

就可以调用这个函数了。如果将那个够选项取消后立刻提示没有找到这个标号。


至于另外一个符号 __vector_table 是有特殊意义的,所以必须注意添加进去

; The vector table is normally located at address 0.

; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.

; The name '__vector_table' has special meaning for C-SPY:

; it is where the SP start value is found, and the NVIC vector

; table register (VTOR) is initialized to this address if != 0.


还有一个最重要的标号就是 main ,初始化模块最后就是跳到 main 函数了,所以如果写C的话则写个main函数,如果写汇编的话同样也需要从main标号开始,很简单,导出一下就可以了。

        PUBLIC main

main:


连接脚本

Config/generic_cortex.icf 就是通用的 cortex M3内核连接脚本,只需要修改几个地址就OK了

首先定义可寻址的逻辑地址,ARM是4G

define memory mem with size = 4G;

然后定义 region 也就是实际的物理地址

define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];

define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];


关键字:iar  stm32  启动代码 引用地址:iar下的stm32启动代码分析

上一篇:正点原子STM32 USB读卡器代码分析
下一篇:STM32学习之ADC

推荐阅读最新更新时间:2026-02-17 10:54

iar下的stm32启动代码分析
使用的芯片是 STM32F103VET,编译器使用 IAR ARM V5.5 设置头文件查找路径,例如: $PROJ_DIR$.. $PROJ_DIR$......LibrariesCMSISCM3CoreSupport $PROJ_DIR$......LibrariesCMSISCM3DeviceSupportSTSTM32F10x $PROJ_DIR$......LibrariesSTM32F10x_StdPeriph_Driverinc 预定义的symbol 为,HD为high desity 的意思 USE_STDPERIPH_DRIVER STM32F10X_HD 有两个符号是系统默认的,看名字就应该知道什么了
[单片机]
STM32代码启动过程
分享这篇文章,谈一下STM32启动流程。如果读者朋友已经有过汇编相关基础,能够够好理解本文内容。汇编语言是比C语言更接近机器底层的编程语言,能让我们更好的理解和操纵硬件底层。 STM32三种启动模式 下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程。 STM32上电或者复位后,代码区始终从0x00000000开始,其实就是将存储空间的地址映射到0x00000000中。三种启动模式如下: 从主闪存存储器启动,将主Flash地址0x08000000映射到0x00000000,这样代码启动之后就相当于从0x08000000开始。主闪存存储器是STM32内置的Flash,作为芯片内置的
[单片机]
STM32启动解析,启动代码,__main main
启动代码看这里: http://blog.csdn.net/chehlcy/article/details/5164472 在启动文件我们看到了__main和用户写的main,这2个是有区别的,大概流程如下: 1、复位第一条指令:Reset_Handler PROC,这里指定为 LDR R0, =__main。表示调用库函数__main,当然,我们可以在__main前做点事情,比如PLL初始化等。 2、__main()的执行流程参考: 跟一下汇编,大概是__scatterload()- __rt_entry()- __user_setup_stackheap() 3、最后调用用户的main()函数。 4、可以不使用C
[单片机]
STM32 启动步骤和升级方式以及代码跳转的实现
#!/bin/sh #首先把BOOT0/Boot1 设置为 1 0, 即使用 STM32的ISP升级模式 #按下板子的reset, 硬复位进入 SYS ISP 模式(BOOTLOADER) #sudo stm32flash -w F407ZG_New.bin -v -g 0x0 /dev/ttyUSB0 sudo stm32flash -w F407ZG_Old.bin -v -g 0x0 /dev/ttyUSB0 #烧写以及验证完毕后, 自动加载 Flash的程序运行。 #把把BOOT0/Boot1 设置为 0 0, 即使用 STM32的flash模式,即用户程序模式。 #reset按键, 硬复位后自动启动新烧入的程
[单片机]
STM32启动文件startup_stm32f10x_hd.s的代码讲解
本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此文件的代码在任何一个STM32F10x工程中都可以找到。 启动文件使用的ARM汇编指令汇总 Stack——栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN= Stack_Mem SPACE Stack_Size __initial_sp 开辟栈的大小为 0X00000400(1KB),名字为 STACK, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。 栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRA
[单片机]
<font color='red'>STM32</font><font color='red'>启动</font>文件startup_stm32f10x_hd.s的<font color='red'>代码</font>讲解
STM32启动文件简介、详细步骤及代码讲解
01启动文件简介 startup_stm32f429_439xx.s是STM32的启动文件。 刚开始我一直认为STM32程序开始执行是从main函数开始。后来网上查查不是。原来在执行main函数之前,需要先执行一段汇编程序和完成C语言资源硬件的初始化工作。就是以下几个功能: 1--初始化栈指针MSP=_initial_sp。 2--初始化复位程序计数寄存器值=Reset_Handler。 3--初始化异常/ 中断向量表。 4--系统时钟配置。 5--C库函数_main初始化用户堆栈的调用 。 02文件启动步骤 1-在启动的时候,先对堆栈的大小定义,并在代码区的起始位置建立异常中断向量表。然后在复位中断中服务程序中跳转执行C标
[单片机]
<font color='red'>STM32</font><font color='red'>启动</font>文件简介、详细步骤及<font color='red'>代码</font>讲解
STM32启动代码分析问题
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢! 我现在看反汇编如下 0x08000000 0678 LSLS r0,r7,#25(查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故) 0x08000002 2000 MOVS r0,#0x00 0x08000004 1105 ASRS r5,r0,#408 0x08000006 0800 LSRS r0,r0,#00A 。。。。。。。。。。。。。。。。。。。。。。 上面应该对应 __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler
[单片机]
stm32 启动代码应用技巧
前段时间对stm32的启动代码进行了一个小小的研究,发现了一些比较好用的技巧,在这分享下! 总体上说,整个启动代码就是中断初始化为主,以及中断之后如何进行调配函数! 首先看这么一段代码:Reset_Handler ; Reset handler Reset_Handler PROC EXPORT Reset_Handler IMPORT __main IMPORT SysInit IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =SysInit BLX R0
[单片机]
<font color='red'>stm32</font> <font color='red'>启动</font><font color='red'>代码</font>应用技巧
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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