范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

教程一文搞懂STM32启动文件

  本文启动文件位STM32G030的启动文件(.s为结尾的文件),其他型号单片机大同小异,可以直接参考。
  我们先来看下启动文件的,开头说明;****************************************************************************** ;* File Name          : startup_stm32g030xx.s ;* Author             : MCD Application Team ;* Description        : STM32G030xx devices vector table for MDK-ARM toolchain. ;*                      This module performs: ;*                      - Set the initial SP ;*                      - Set the initial PC == Reset_Handler ;*                      - Set the vector table entries with the exceptions ISR address ;*                      - Branches to __main in the C library (which eventually ;*                        calls main()). ;*                      After Reset the CortexM0 processor is in Thread mode, ;*                      priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> ;******************************************************************************  ;* @attention ;* ;* Copyright (c) 2019 STMicroelectronics. All rights reserved. ;* ;* This software component is licensed by ST under Apache License, Version 2.0, ;* the "License"; You may not use this file except in compliance with the ;* License. You may obtain a copy of the License at: ;*                        opensource.org/licenses/Apache-2.0 ;* ;******************************************************************************  ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ;  Stack Configuration ;    Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ;  1、说明
  说明里除了版权的声明外主要说明了启动文件的主要功能:
  1) 设置堆栈指针SP = __initial_sp。
  2) 设置PC指针 = Reset_Handler。
  3) 设置中断向量表。
  4) 配置系统时钟。
  5) 配置外部SRAM/SDRAM用于程序变量等数据存储(这是可选的)。
  6) 跳转到C库中的 __main ,最终会调用用户程序的main()函数。
  Cortex-M内核处理器复位或者上电后,处于线程模式,指令权限为最高级别的特权级别,堆栈设置为使用主堆栈MSP。2、启动流程
  单片机在复位或者重新上电之后,CPU首先将0X08000000位置存放的堆栈栈顶地址存放到SP中(MSP),当然这个的前提是我们的程序存储到了flash里。之后将0X08000004位置存放的向量地址放入PC程序计数器中。
  这时候CPU从PC寄存器指向的地址取出指令并执行,这个执行的程序是复位中断的服务程序 Reset_Handler。
  复位中断服务程序中调用了SystemInit()函数,这个函数的作用是配置系统时钟、配置FMC总线上的外部SRAM/SDRAM。调用完SystemInit()函数之后,跳转到了C库中的__main 函数。这个时候任务就交给了C库中的__main函数,__main函数对用户的程序进行初始化操作,然后__main函数会调用我们自己写的main函数执行程序。3、程序分析Stack_Size		EQU     0x400                  AREA    STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem       SPACE   Stack_Size __initial_sp
  1)这里EQU是个伪指令,和我们C中的#define比较像,编译器编译不会生成二进制代码。0X400表示栈的大小。
  2)AREA STACK, NOINIT, READWRITE, ALIGN=3 这句话表示,下面开始定义一个代码段或者数据段。此处是定义数据段。AREA 后面的关键字表示这个段的属性。
  STACK :这个是代表这个数据段的名字,当然我们可以取任意名字。
  NOINIT:表示此数据段不需要填入初始数据。
  READWRITE:表示此段可读可写。
  ALIGN=3 :表示首地址按照 2 的 3 次方对齐,即按照 8 字节对齐(地址对8求余数等于0)。
  4)SPACE 这行指令告诉编译器给 STACK (前面命名的名称)段分配 0x00000400 字节的连续内存空间。
  5) __initial_s表示了栈顶地址。__initial_sp 只是一个标号,标号主要用于表示一片内存空间的某个位置,等价于 C 语言中的"地址"概念。地址仅仅表示存储空间的一个位置,从 C 语言的角度来看,变量的地址,数组的地址或是函数的入口地址在本质上并无区别。Heap_Size      EQU     0x200                  AREA    HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem        SPACE   Heap_Size __heap_limit
  6)这部分代码实现开辟堆(heap)空间,主要用于动态内存分配,也就是说用 malloc,calloc, realloc等函数分配的变量空间是在堆上。这里和上面的类似,首先分配一片连续的内存空间这里的名字叫 HEAP,即分配堆的空间,大小是0X200。__heap_base 表示堆的开始地址。__heap_limit 表示堆的结束地址(只是标号)。                PRESERVE8                 THUMB   ; Vector Table Mapped to Address 0 at Reset                 AREA    RESET, DATA, READONLY                 EXPORT  __Vectors                 EXPORT  __Vectors_End                 EXPORT  __Vectors_Size
  7)PRESERVE8 指定当前文件保持堆栈八字节对齐。
  8)THUMB表示后面的指令是THUMB指令集 ,我们的内核使用的THUMB指令集。
  9)AREA定义一块代码段,只读,段名字是 RESET。
  10)EXPORT语句将 3 个标号申明为可被外部引用, 主要提供给链接器用于连接库文件或其他文件。__Vectors       DCD     __initial_sp                   ; Top of Stack                 DCD     Reset_Handler                  ; Reset Handler                 DCD     NMI_Handler                    ; NMI Handler                 DCD     HardFault_Handler              ; Hard Fault Handler                                此处省略若干代码                 DCD     0                              ; Reserved                 DCD     RTC_TAMP_IRQHandler            ; RTC through EXTI Line                 DCD     FLASH_IRQHandler               ; FLASH                 DCD     RCC_IRQHandler                 ; RCC                 DCD     EXTI0_1_IRQHandler             ; EXTI Line 0 and 1                 DCD     EXTI2_3_IRQHandler             ; EXTI Line 2 and 3                 DCD     EXTI4_15_IRQHandler            ; EXTI Line 4 to 15                                此处省略若干代码                 DCD     I2C1_IRQHandler                ; I2C1                 DCD     I2C2_IRQHandler                ; I2C2                 DCD     SPI1_IRQHandler                ; SPI1                 DCD     SPI2_IRQHandler                ; SPI2                 DCD     USART1_IRQHandler              ; USART1                                此处省略若干代码
  11)我们可以看到这里就是我们的中断向量表了,DCD 表示分配 1 个 4 字节的空间。每行 DCD 都会生成一个 4 字节的二进制代码。中断向量表存放的实际上是中断服务程序的入口地址。当异常(也即是中断事件)发生时,CPU 的中断系统会将相应的入口地址赋值给 PC 程序计数器,之后就开始执行中断服务程序。这里地址定义到了代码断的最前面。具体的物理地址由链接器的配置参数(IROM1 的地址)决定。我们的程序在 Flash 运行,中断向量表的起始地址是 0x08000000。
  __Vectors_Size  EQU  __Vectors_End - __Vectors                  AREA    |.text|, CODE, READONLY  ; Reset handler routine Reset_Handler    PROC                  EXPORT  Reset_Handler                 [WEAK]         IMPORT  __main         IMPORT  SystemInit                    LDR     R0, =SystemInit                  BLX     R0                  LDR     R0, =__main                  BX      R0                  ENDP
  12)AREA 定义一块代码段,只读,段名字是 .text 。READONLY 表示只读。
  13)利用 PROC、ENDP 这一对伪指令把程序段分为若干个过程,使程序的结构加清晰。
  14)WEAK 声明其他的同名标号优先于该标号被引用,就是说如果外面声明了的话会调用外面的。 这个声明很重要,它让我们可以在C文件中任意地方放置中断服务程序,只要保证C函数的名字和向量表中的名字一致即可。
  15)IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义。但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
  16)SystemInit 函数,主要实现RCC相关寄存器复位和中断向量表位置设置。
  17)__main 标号表示C/C++标准实时库函数里的一个初始化子程序__main 的入口地址。该程序的一个主要作用是初始化堆栈(跳转__user_initial_stackheap 标号进行初始化堆栈的,下面会讲到这个标号),并初始化映像文件,最后跳转到 C 程序中的 main函数。这就解释了为何所有的 C 程序必须有一个 main 函数作为程序的起点。因为这是由 C/C++标准实时库所规,并且不能更改。NMI_Handler     PROC                 EXPORT  NMI_Handler                    [WEAK]                                省略若干                 EXPORT  TIM14_IRQHandler               [WEAK]                 EXPORT  TIM16_IRQHandler               [WEAK]                 EXPORT  TIM17_IRQHandler               [WEAK]                 EXPORT  I2C1_IRQHandler                [WEAK]                 EXPORT  I2C2_IRQHandler                [WEAK]                 EXPORT  SPI1_IRQHandler                [WEAK]                 EXPORT  SPI2_IRQHandler                [WEAK]                 EXPORT  USART1_IRQHandler              [WEAK]                 EXPORT  USART2_IRQHandler              [WEAK]
  18)死循环,用户可以在此实现自己的中断服务程序。不过很少在这里实现中断服务程序,一般多是在其它的C文件里面重新写一个同样名字的中断服务程序,因为这里是WEEK弱定义的。如果没有在其它文件中写中断服务器程序,且使能了此中断,进入到这里后,会让程序卡在这个地方。                 IF      :DEF:__MICROLIB                   EXPORT  __initial_sp                  EXPORT  __heap_base                  EXPORT  __heap_limit                   ELSE                   IMPORT  __use_two_region_memory                  EXPORT  __user_initial_stackheap  __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                   ALIGN                   ENDIF                   END
  19)简单的汇编语言实现IF…….ELSE…………语句。如果定义了MICROLIB,那么程序是不会执行ELSE分支的代码。__MICROLIB在MDK的Target Option里面设置。__user_initial_stackheap由__main函数进行调用。

日足小将三笘薰生活美满!与妻子去年7月结婚,对方是名跳远选手谁是现在最火热的日本球员呢?答案当然是三笘薰,这位现在在布莱顿效力的日本球员,在英超赛场上表现非常的出色,在面对利物浦的时候他的发挥也丝毫不怯场,一个人直接撕碎了对方的防线。再加上陈戌源够强硬!废止蔡振华新政后又出新狠招,中超或有2队将解散中超新政的变化多端,几乎让投资人们跟不上趟。从最早的U23政策收取外援调节费使用中性名字,到限薪令,再到现在严苛的准入条件,几乎每年都有新花样。面对琳琅满目的新政策,很多俱乐部们最一方丝巾,系住春天的浪漫逐渐向暖的春天,我们除了关注衣服款式的变化,也千万不要小看配饰的作用。丝巾替代了厚重的围巾,既可带来融融暖意,又足够轻盈飘逸,理所当然地成为春季专属浪漫,方寸之间,就可以让整个人焕夫妻免票,情侣半票浪漫情人节邂逅古村群约惠指南!浪漫,不是突然的惊喜而是日复一日的陪伴情人节到了在这里祝所有的有情人终成眷属!情人节活动政策1。结婚夫妻免景区大门票(出示结婚证或户口本等有效证件)2。情侣同游,门票减半(情侣牵手嵩山龙门迷雾中吹响集结号河南日报客户端记者李悦2月7日,随着2023年职业联赛俱乐部负责人会议在香河召开,新赛季各级职业联赛的筹备工作正式提上了日程。据了解,今年中超联赛将于4月中旬开赛,赛制也恢复到了大中国乒乓之绝地反击被困住的胜利在今年春节档的七部影片中,中国乒乓之绝地反击(下文简称为中国乒乓)是最多戏的最晚定档,最早展映,迅速撤档改名,延期到大年初三上映,没过两天又再次撤档,改到2月17日上,在此期间还一中国政法大学经济法学博士我们真的跑路了,抱歉了2022年11月21日,盛大金禧在官网高调公告我们跑路了官宣跑路,言语间满是炫耀和讽刺,文中写道我们真的跑路了,抱歉了,钱已经被我们用专业的团队洗干净了,我们人也在国外了,这个国家截至目前,中国天眼发现脉冲星总数已超740颗!截至目前,中国天眼发现的脉冲星总数已经达到740颗以上。被称为中国天眼的500米口径球面射电望远镜(FAST),是目前世界上口径最大,灵敏度最高的单口径射电望远镜,其反射面面积大约Webbeds泰国旅游峰会在曼谷举行重点关注中国市场峰会现场王贤思摄中新网曼谷2月9日电(王国安王贤思)Webbeds2023年泰国旅游峰会当地时间2月8日在曼谷举行,众多泰国本地及境外旅游企业代表参会。嘉宾演讲王贤思摄嘉宾演讲王贤中国6大地域错觉没去过就很难相信,新疆被误会最多仅凭着初中地理课上学来的一鳞半爪,还远远谈不上了解世界。我们对这个世界,还存在着太多的误解和不切实际的想象。当你真正踏上梦中的土地,一些知识会被印证而有些知识,则会被彻底推翻。我以中国男篮将在香港进行两场男篮世界杯亚大区预选赛新华社香港2月9日电(记者韦骅许朗轩)就中国国家男子篮球队2月在香港的两场2023年男篮世界杯亚大区预选赛,中国香港篮球总会9日召开新闻发布会介绍了赛事筹备工作。2月9日,中国香港
海信婴幼儿洗衣机洗衣机真的是做了好久的攻略啦,实在不知道选啥,海信普通款价格不平稳,就想买美的,然后寻思不行去店里买,店里只看见海尔的跟卡萨帝的,卡萨帝唯一缺点太贵,海尔吧小红书评价一般,我就想买AITO问界M7四驱版申报增加130kW前置电机IT之家5月14日消息,华为智选AITO问界M7上个月出现在了工信部申报名单中,现在问界M7又增添了四驱版新车型。这是第二款AITO量产车型,目前还没有正式官宣上市,不过大部分参数5000mAh大电池11GBOLED大屏,跌至1599元,被低估的千元5G手机不知道大家注意到没有,目前很多千元机搭载的处理器性能都很强了,有些甚至搭载骁龙870处理器,这是高通旗舰芯片,8系列芯片均是高端处理器有的搭载天玑1200处理器,同样是旗舰芯片,它华为Nova10Pro着手备货,12512G拉低至4299,有心了在这个风云变化的智能手机市场,原本华为手机是最畅销的,即便是售价五六千的顶级旗舰Mate系列也会处于供不应求的状态对此华为的市场份额曾达到过50,成为国产领头羊,是唯一一家能够与苹2022年房子将贬值吗?懂行人3大信号原标题2022年房子将首迎贬值潮?懂行人建议3大信号建议提前看。对于多数人而言,在购买首套房的时候,多数资金依然来自父母。吃瓜群众会问了完全靠自己的能力买房,不香吗?在房产金融化的2022年即将爆发的行业有哪些?常言道逆水行舟,不进则退。在大环境不稳定的情况下,能够抓住市场当中的机遇逆流而上,极有可能成为翻身的机会。那么,2022年哪些行业会爆发?幼儿托管十四五规划中明确指出,要通过发展家iQOO数字系列发展史生而强悍1iQOO骁龙855LPDDR4XUFS2。160Hz三星AMOLED直屏4000mAh22。5W有线充电(低配版)44W有线充电后置1200万索尼IMX363主摄1300万超广角8000字详解数字化转型转什么?如何转?来源人月聊IT导读本文谈论企业数字化转型,重点围绕数字化转型的本质究竟是什么?企业如何进行数字化转型这两个关键点。云原生微服务中台等,这些仅仅是数字化转型能力框架中的技术支撑平台底索尼佳能尼康松下和富士等微单,各有什么缺点和不足?现在购买微单的小伙伴们越来越多了,不过毕竟微单属于高价格商品,而且各种不同的型号品牌存在着很大的差异,为了尽量多地全面了解自己所要购买型号的特点,很多小伙伴都从各种渠道去多方面了解谷歌Pixel6a正式发布,Pixel5命运悲惨沦为百元机让路今天上午早些时候,谷歌在谷歌IO2022大会上正式推出了Pixel6a手机。值得一提的是,由于Pixel6新机的发布,导致Pixel5价格持续走低,甚至出现价崩。据新浪科技报道,P鸿蒙3。0支持名单更新不包含新机,但老机型不用担心了现在进入五月中旬,很多手机厂商都开始了新一轮的战争,有的是针对千元机进行进攻,有的是对线下市场的机型开始努力。对于华为来说,这些战争都无暇顾及,主要有三件事,第一个是推出新机型,那