返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 GD32开发实战指南(基础篇) 第…
 中国台湾电脑显示器出货今年…
 惊艳色彩表现 丰富接口配置 …
 4k显示器的基本配置
 Win8系统电脑自动关闭显示屏…
 攀升电脑多规格27英寸显示器…
 芯片散热难题获重大突破天和…
 电脑温度过高教您几招降温
 【秒懂知识库】一文看懂如何…
 电脑突然死机是什么原因
 改善CPU占用率高的一些方法(…
 街机配置下车了ARGB风扇接线…
 小白装机完成有几个问题请教…
 CSGO电脑最低配置要求是什么…
 第一次diy没想到困难重重 请…
 csgo饰品交易平台叫什么?CS…
 内存的新战争:韩国人还能赢…
 iPhone14和14pro的区别是什么…
 qq怎么清理隐藏内存
 内存存储销量公布线K销量冠军…
 如何挑选合适内存 内存选购技…
 RTX 4080显卡功耗是多少 显存…
 RTX4070ti显卡什么水平 是几…
 30万显卡打游戏表现不如核显…
 RTX 4050显卡玩游戏够吗?_R…
 买显卡小心被这三种话术骗了
 阳光电源品牌价值突破800亿元
 安钛克 Antec NE1300W 金牌全…
 如何正确选择伺服电机和步进…
 实达科技 产品全球畅销领跑汽…
 开关电源14种拓扑计算公式大…
 扣押小米 48 亿后印度提出新…
 抖音赚钱博主的十大类型
 12代I7超值!华硕破晓2:告别…
 华硕n系列笔记本怎么样 华硕…
 笔记本电脑品牌标志有哪些 笔…
 机械硬盘消亡在即!不只是因…
 电脑为什么越来越卡?原因全…
 Dynabook推出Portégé X30L…
 苹果Mac Pro掉硬盘
 通电3年就弹警告西数为促使用…
 笔记本电脑是否可以安全回收…
 玄龙骑士G9:电竞显示器“超…
 身临其境!3D显示器原理揭秘
 小米(MI) Redmi238英寸电竞…
 A股机构动向参考|地产全面爆…
 苹果被猛击一拳:头显之战苹…
 3499 元到手:R7-5825U 处理…
 攀升暴风龙P3护眼版笔记本电…
 华硕天选4 英特尔酷睿i7 156…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
GD32开发实战指南(基础篇) 第4章 GD32启动流程详解(Keil版)
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/6/21 21:33:31 | 【字体:

  天才小捣蛋中文字幕而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已经提供了一个合适的运行环境,然而对于是没有堆栈,没有中断,更没有外围设备,这些工作是需要软件来指定的,而且不同的类型、不同大小的内存和不同种类的外设,其初始化工作都是不同的。本文将以GD32F207IK (基于Cortex-M3)为例进行讲解。

  在开始正式讲解之前,你需要了解汇编以及反编译相关的知识,这些可以参考笔者博文。

  下面我们就来具体看一下用户从Flash启动GD32的过程,主要讲解从上电复位到main函数的过程。主要有以下步骤:

  4.调用 C 库函数_main 初始化用户堆栈,然后进入 main 函数。

  首先要讲一下GD32的启动模式,因为启动模式决定了向量表的位置,GD32有三种启动模式:

  1)主闪存存储器(Main Flash)启动:从GD32内置的Flash启动(0x0800 0000-0x0807 FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。以0x08000000 对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x08000000 操作,且都是操作的同一块内存。

  2)系统存储器(System Memory)启动:从系统存储器启动(0x1FFFF000 - 0x1FFF F7FF),这种模式启动的程序功能是由厂家设置的。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存。

  3)片上SRAM启动:从内置SRAM启动(0x2000 0000-0x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。SRAM 只能通过0x20000000进行操作,与上述两者不同。从SRAM 启动时,需要在应用程序初始化代码中重新设置向量表的位置。

  用户可以通过设置BOOT0和BOOT1的引脚电平状态,来选择复位后的启动模式。如下图所示:

  启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到0x00000000地址位置);真正产生复位信号的时候,CPU还是从开始位置执行。

  值得注意的是GD32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。

  GD32F20x芯片支持嵌入式引导程序通过多种接口方式来更新Flash。可以有1或2个USART端口和标准USB端口用于GD32F205xx和GD32F207xx互联型产品。如下表所示。

  因为启动过程主要是由汇编完成的,因此GD32的启动的大部分内容都是在启动文件里。笔者的启动文件是startup_gd32f20x_cl.s。

  栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM 的大小。当程序较大时,需要修改栈的大小,不然可能会出现的HardFault的错误。

  第45行:开辟一段可读可写数据空间,ARER 伪指令表示下面将开始定义一个代码段或者数据段。此处是定义数据段。ARER 后面的关键字表示这个段的属性。段名为STACK,可以任意命名;NOINIT 表示不初始化;READWRITE表示可读可写,ALIGN=3,表示按照 8 字节对齐。

  第46行:SPACE 用于分配大小等于 Stack_Size连续内存空间,单位为字节。

  向量表是一个WORD( 32 位整数)数组,每个下标对应一种异常,该下标元素的值则是该 ESR 的入口地址。向量表在地址空间中的位置是可以设置的,通过 NVIC 中的一个重定位寄存器来指出向量表的地址。在复位后,该寄存器的值为 0。因此,在地址 0 (即 FLASH 地址 0)处必须包含一张向量表,用于初始时的异常分配。

  值得注意的是这里有个另类:0号类型并不是什么入口地址,而是给出了复位后 MSP 的初值,后面会具体讲解。

  第66行:定义一块代码段,段名字是RESET,READONLY 表示只读。

  第71行:__Vectors 表示向量表起始地址,DCD 表示分配 1 个 4 字节的空间。每行 DCD 都会生成一个 4 字节的二进制代码,中断向量表 存放的实际上是中断服务程序的入口地址。当异常(也即是中断事件)发生时,CPU 的中断系统会将相应的入口地址赋值给 PC 程序计数器,之后就开始执行中断服务程序。在60行之后,依次定义了中断服务程序的入口地址。

  复位程序是系统上电后执行的第一个程序,复位程序也是中断程序,只是这个程序比较特殊,因此单独提出来讲解。

  第187行:使用EXPORT将Reset_Handler申明为可被外部引用,后面WEAK表示弱定义,如果外部文件定义了该标号则首先引用该标号,如果外部文件没有声明也不会出错。这里表示复位程序可以由用户在其他文件重新实现。

  第188-189行:表示该标号来自外部文件,SystemInit()是一个库函数,在system_gd32f10x.c中定义的,__main 是一个标准的 C 库函数,主要作用是初始化用户堆栈,这个是由编译器完成的,该函数最终会调用我们自己写的main函数,从而进入C世界中。

  第190行:这是一条汇编指令,表示从存储器中加载SystemInit到一个寄存器R0的地址中。R0~R3 寄存器通常用于函数入参出参或子程序调用。

  第191行:汇编指令,表示跳转到寄存器R0的地址,并根据寄存器的 LSE 确定处理器的状态,还要把跳转前的下条指令地址保存到 LR。

  第192行:和190行是一个意思,表示从存储器中加载__main到一个寄存器R0的地址中。

  第193行:和191稍微不同,这里跳转到至指定寄存器的地址后,不会返回。

  值得注意的是,这里的__main和C语言中的main()不是一样东西,__main是C lib中的函数,也就是在Keil中自带的;而main()函数是C的入口,main()会被__main调用。

  我们平时要使用哪个中断,就需要编写相应的中断服务程序,只是启动文件把这些函数留出来了,但是内容都是空的,真正的中断复服务程序需要我们在外部的 C 文件里面重新实现,这里只是提前占了一个位置罢了。

  这部分没啥好说的,和服务程序类似的,只需要注意‘B .’语句,B表示跳转,这里跳转到一个‘.’,即表示无线 堆栈初始化

  如果没有定义__MICROLIB , 则会使用双段存储器模式,且声明了__user_initial_stackheap 具有全局属性,这需要开发者自己来初始化堆栈。

  这部分也没啥讲的,需要注意的是,ALIGN表示对指令或者数据存放的地址进行对齐,缺省表示4字节对齐。

  第62行:PRESERVE8 用于指定当前文件的堆栈按照 8 字节对齐。

  这时自动从0x0800 0000位置处读取数据赋给栈指针SP,然后自动从0x0800 0004位置处读取数据赋给PC,完成了复位操作,SP= 0x0200 2008,PC = 0x0800 01BD。初始化SP、PC紧接着就初始化向量表,如果感觉看HEX文件抽象,我们看看反汇编文件吧。

  是不是更容易些,是不是和《GD32F20x_User_Manual_EN_Rev2.4》中的向量表对应起来了。其实看反汇编文件更好理解GD32的启动流程,只是有些抽象。

  这段代码是个循环(BCC 0x080001e6),实际运行时候循环了两次。第一次运行的时候,读取“加载数据段的函数”的地址并跳转到该函数处运行(注意加载已初始化数据段和未初始化数据段用的是同一个函数);第二次运行的时候,读取“初始化栈的函数”的地址并跳转到该函数处运行。

  MCU上电后从0x0800 0000处读取栈顶地址并保存,然后从0x0800 0004读取中断向量表的起始地址,这就是复位程序的入口地址,接着跳转到复位程序入口处,初始向量表,然后设置时钟,设置堆栈,最后跳转到C空间的main函数,即进入用户程序。

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 GD32开发实战指南(基础篇) 第4章 GD32启动流程… (06-21)
    普通电脑内存 内存的新战争:韩国人还能赢多久? (06-21)
    普通电脑内存 iPhone14和14pro的区别是什么 是4G还是6G内存… (06-21)
    普通电脑内存 qq怎么清理隐藏内存 (06-21)
    普通电脑内存 内存存储销量公布线K销量冠军居然是光威 (06-21)
    普通电脑内存 如何挑选合适内存 内存选购技巧介绍【详解】 (06-21)
    普通电脑内存 电脑内存怎么选 电脑内存选购指南【详细介绍】 (06-20)
    普通电脑内存 电脑内存_全球百科 (06-20)
    普通电脑内存 电脑的内存指哪个(电脑内存一般是指什么) (06-20)
    普通电脑内存 电脑48g内存只有24g可用(电脑48g内存比32g快… (06-20)
    普通电脑内存 手机总是容易满内存到底是什么在占用着内存? (06-20)
    普通电脑内存 公认最好的CSGO开箱网站是指什么? CSGO电脑最… (06-20)
    普通电脑内存 世界时讯:最多玩家用的csgo网站开箱子是什么… (06-20)
    普通电脑内存 DDR5高速内存在京东618迎来黄金发展期 成交额… (06-20)
    普通电脑内存 内存条品牌内存条和固态硬盘区别 (06-20)
    普通电脑内存 将用户体验拉向新高度 京东618 DDR5高速内存成… (06-20)
    普通电脑内存 各位马自达CX-4请问这张内存卡是用来干嘛的 (06-19)
    普通电脑内存 兄弟们可以帮我看看是cpu主板或者电源的问题吗 (06-19)
    普通电脑内存 深科技的HBM技术和光通讯布局 (06-19)
    普通电脑内存 一文讲清楚 “电路反馈” (06-19)