查看: 2531|回复: 3

STM32再学习——启动流程分析

[复制链接]
  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-13 12:45:48 | 显示全部楼层 |阅读模式
    分享到:
      我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。
      无论是STM32ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相应的启动文件,本文将采用KEIL MDK自带的启动文件STM32F10x.s进行分析。
      1 启动模式的选择
      STM32芯片自带的启动方式有3种如下表

    启动模式选择引脚
    启动模式
    说明
    BOOT1
    BOOT0
    X
    0
    主闪存存储器
    主闪存存储器作为启动区域
    0
    1
    系统存储器
    系统存储器作为启动区域
    1
    1
    内置SRAM
    内置SRAM作为启动葡萄
      STM32的启动选择,通过设置BOOT1、BOOT0的引脚的高低电平即可选择。其中主闪存启动是将程序下载到内置的Flash进行启动(该flash可运行程序),该程序可以掉电保存,下次开机可自动启动;系统存储器启动是将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。内置SRAM启动,由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。
      就程序的启动而言,采用以上3种方式启动,但对于一个嵌入式系统的程序来说,如果程序执行文件很大,而STM32内置的存储空间有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存储在flash中,程序执行在SDRAM中,既节约了成本有提高了运行效率。如果采用外置的Flash+SDRAM的方式,就需要一个更加复杂的启动文件(bootloader),需要考虑flash的COPY,Flash的驱动,内存的管理,通信机制等,本文暂不涉及此内容,以后有机会专门讲述。
      2 启动文件STM32F10x.s分析
      关于STM32F10x.s的启动文件,主要做了3个工作:分配和初始化堆、栈;定义复位向量并初始化;中断向量表及其相应的异常处理程序。
      2.1 定义堆、栈及其初始化
      堆和栈是能够运行C语言的前提,如以下程序:
      定义栈:
      Stack_Size EQU 0x00000200
      AREA STACK, NOINIT, READWRITE, ALIGN=3
      Stack_Mem SPACE Stack_Size
      __initial_sp
      定义堆:
      Heap_Size EQU 0x00000000
      AREA HEAP, NOINIT, READWRITE, ALIGN=3
      __heap_base
      Heap_Mem SPACE Heap_Size
      __heap_limit
      初始化堆、栈:
      _user_initial_stackheap
      LDR R0, = Heap_Mem
      LDR R1, =(Stack_Mem + Stack_Size)
      LDR R2, = (Heap_Mem + Heap_Size)
      LDR R3, = Stack_Mem
      BX LR
      2.2 定义复位向量
      Boot引脚的设置不同,复位时,起始地址的位置不同,SRAM的起始地址为0x2000000, flash的起始地址为0x8000000。Cortex-M3内核规定,起始地址必须存放堆定指针,而第二个地址必须存放复位中断入口向量。在系统复位时,内核会自动从其实地址的下一个地址(即32位)空间取出复位中断入口向量,然后跳转到复位中断服务程序,该服务程序就会跳转到main()执行程序。
      中断向量表(部分向量):
      __Vectors
      DCD __initial_sp ; Top of Stack // 初始化堆跳转
      DCD Reset_Handler ; Reset Handler // 复位中断向量跳转
      DCD NMI_Handler ; NMI Handler
      DCD HardFault_Handler ; Hard Fault Handler
      DCD MemManage_Handler ; MPU Fault Handler
      DCD BusFault_Handler ; Bus Fault Handler
      DCD UsageFault_Handler ; Usage Fault Handler
      DCD 0 ; Reserved
      DCD 0 ; Reserved
      DCD 0 ; Reserved
      DCD 0 ; Reserved
      DCD SVC_Handler ; SVCall Handler
      DCD DebugMon_Handler ; Debug Monitor Handler
      DCD 0 ; Reserved
      DCD PendSV_Handler ; PendSV Handler
      DCD SysTick_Handler ; SysTick Handler
      复位中断服务程序
      ; Reset Handler // 该程序会跳转到main()
      Reset_Handler PROC
      EXPORT Reset_Handler [WEAK]
      IMPORT __main
      LDR R0, =__main
      BX R0
      ENDP
      3 其他中断向量及服务子程序
      在启动文件中,只定义了中断向量,其相应的服务子程序跳转到空操作。为以后扩展中断服务程序做了准备。
      在以上这些都胜利跑完之后,我们的微处理器(MCU)就开始main函数之旅……

    评分

    参与人数 1与非币 +5 收起 理由
    loveeeboard + 5 三周年铜板双倍!

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    发表于 2015-10-16 17:24:14 | 显示全部楼层
    赞一个,不错。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-10-18 13:49:53 | 显示全部楼层
    写的不错                           
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-13 08:45
  • 签到天数: 190 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-3-18 11:12:00 | 显示全部楼层
    谢谢分享~~~~~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 09:30 , Processed in 0.161562 second(s), 25 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.