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

教程一文搞懂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函数进行调用。
  ​

ColorOS13安全隐私合集(二)上一期给大家带来了ColorOS13上一些保护隐私的基础功能,那么这一期,让我们来看看ColorOS13针对应用软件有哪些安全功能在日常生活中,我们常常会从应用商店,浏览器,第三方替代人工客服AI机器人还需提高情商经济观察网记者万敏李云曾在一家股份制银行的客服部门从事管理工作,互联网大潮兴起,她顺势跳槽去了一家大厂的金融业务客服部门。她见证了远程客服行业近十年来在科技改造下发生的点滴变化早期练习时长仅半年的折叠屏vivoXflod是不是推出的太仓促了?前言Hello,大家好。这里是Joaster,最近vivo又推出了自家的第二款折叠屏vivoXflod。本来我还以为看错了,欸?这vivoXflod不是4月份发不过了吗?怎么又拉出AM余桂华教授吸湿式微凝胶快速提取干旱空气中的水研究背景安全饮用水供应不足是一项严重的全球挑战。目前大部分研究致力于集中式水处理,例如海水淡化,然而这受到地理和水文条件的限制。大约12,900立方千米的大气水是一个巨大的无处不在天气慢慢变冷想要进补,但一补就上火了?这该怎么办?先来看舌像朋友们你们有没有这种情况1。舌头有齿痕,舌苔比较厚?2。秋冬季想要进补,但是一补就上火?重点来了!为什么你一补就上火?这个时候先看看你的,舌苔厚不厚?舌头上有没有齿痕?进补前一定要国米三项数据王诠释何谓技术扶贫理应感激穆里尼奥在穆里尼奥斯坦科维奇的对决里,穆帅拥抱德阳,问候语是当年他打入的华丽吊射,德阳回以我爱你,这温馨的一幕,让很多国米球迷情怀泛滥。重回意甲后,穆里尼奥经常谈到国际米兰,他对蓝黑军的感中国古代四大书院,景色宜人,值得一去我国四大书院为应天书院(今河南商丘睢阳区南湖畔)岳麓书院(今湖南长沙岳麓山)白鹿洞书院(今江西九江庐山)嵩阳书院(今河南郑州登封嵩山)几大书院虽然相距甚远,除了应天书院处于闹市,其当你去过印度富人区后,就能明白为什么印度人会觉得中国都是穷人印度这个国家给我们的印象不是很好,因为一些人去印度旅游过后回来晒出来的印度街边小吃照片有点吓人,环境很差,还特别脏,而且他们是直接用手来制作美食的,餐具也不是很干净,四周全是苍蝇。上海打响第一枪,首批氢能源网约车开始营运,比燃油车省一半新能源的发展方向不只限于纯电动车,而目前普及的纯电动车,也只是新能源领域的开端。未来要更加注重可持续发展,所以除了电动车以外,还有氢能源汽车。氢能也开始在交通方面进行普及,据了解,本泽霸王龙实至名归,恭喜本泽马斩获2022年金球奖北京时间10月17日晚间,由法国队报旗下杂志法国足球举办的金球奖颁奖典礼在法国巴黎的夏特莱剧院当中举行,当世大多数球星齐聚一堂,让整个颁奖典礼都星光璀璨,最终来自皇马的法国前锋本泽浅谈湖人为何不再续约霍华德截止今天,霍华德还是无人问津,更是无奈在采访时说,准备要去wwe参加摔跤比赛呢。为何一个可以去竞争历史最佳防守中锋的球员,新赛季竟会落得如此下场呢,今天我们就来浅浅分析一下。德怀特
塔图姆34116怀特2377凯尔特人轻取活塞!NBA常规赛2月7日继续进行,本场比赛布朗和斯玛特缺阵。最终,凯尔特人以11199战胜活塞。首节开始,霍福德和豪瑟上来连中三分帮助凯尔特人166开局!活塞迅速回敬一波90迫近比分。乔治29分快船力克篮网!卡梅隆托马斯空砍47分NBA常规赛2月7日继续进行,最终,快船以124116战胜篮网。首节开始,托马斯奥尼尔和哈里斯连中三分帮助篮网147开局!各拿6分后乔治和巴图姆接连上篮迫近,但是托马斯连拿7分浇灭基根120火箭国王客场140120大胜火箭。基根穆雷命中8记三分得到30分,均是生涯新高。萨博尼斯巴恩斯米切尔的出色发挥帮助国王首节3124领先。第二节杰伦格林的三分帮助火箭追到3942,但胡尔大凉山慢火车换装升级迎接开学季央广网北京2月12日消息(记者樊承志温晓)据中央广播电视总台中国之声新闻和报纸摘要报道,56335634次绿皮慢火车在大凉山的崇山峻岭中已经运行了50多年。为了迎接开学季,铁路部门20岁戴安娜幼稚的小心计露肩礼服故意穿小两个码,惹查尔斯不快有网友认为,时尚界穿黑色小礼服裙最为典型的人有两个,一是好莱坞女星奥黛丽赫本,另外一个就是英国已故王妃戴安娜了。确实,戴安娜虽然不是娱乐圈人物,但她却是时尚界的标杆,而且,她喜欢小JavaInteger好大一坑,一不小心就掉进去了遛马少年,一个代码写的很6的程序员,专注于技术干货分享最近,在处理线上bug的时候,发现了一个奇怪的现象业务代码大概是这样的publicstaticbooleandoSth(Int协调联动共保畅通促安全工人日报中工网记者李国通讯员杜镝谭明坤乌木桩水域下行船舶,我是航道03111,该水域一带航标设置如何?如有建议,请相关船舶及时向我们或海事部门联系!2月10日,长江重庆航道局李家沱CBA三消息巩晓彬出山执教,王治郅也出山执教,辽宁将签回朱荣振巩晓彬出山执教北京时间2月7日,根据北青体育媒体报道,前山东男篮主教练巩晓彬正式担任中国男篮U15训练营顾问兼教练员,全面接管中国男篮U15梯队的训练工作,此举也宣告巩晓彬是正式回朱琳收获职业生涯WTA巡回赛女单首冠新华社曼谷2月5日电(记者林昊)女子网球协会(WTA)华欣站比赛5日结束,中国选手朱琳在女单决赛中以20击败乌克兰选手特苏伦科,赢得个人职业生涯首个WTA巡回赛女单冠军。朱琳在半决经开区全面启动绿植养护工作人勤春来早,年后开工忙,春节过后,经开区快速响应,启动绿植养护工作,一线养护工人调整工作节奏,将春节期间以巡检管理为主的养护管理恢复为日常全面管护状态。目前,各绿化养护标段已全面复让促发展与稳就业同频共振甘肃省干部群众热议促进经济稳中有进推动高质量发展若干政策措施凝聚奋进伟力谱写陇原新篇强信心稳经济促发展让促发展与稳就业同频共振我省干部群众热议促进经济稳中有进推动高质量发展若干政策措施新甘肃甘肃日报记者文洁苏家英2月3日,省政府印发促进经济