GD32(7)程序烧录及运行

目录

  • 简介
  • 启动方式
    • Boot0=0,Boot1=x
    • Boot0=1,Boot1=0
    • Boot0=1,Boot1=1
  • 烧录方式
    • ICP
    • ISP
    • IAP
      • IAP的作用
      • IAP与ICP、ISP的运行差别
      • IAP的Bootloader程序实现
      • IAP的APP程序实现

简介

       微控制器在硬件中作为核心,通过执行保存在内部存储器中的程序,运行各种外设,并通过引脚,控制其它电路,而将程序保存在微控制器内部存储器的过程,被称为烧录。

       烧录的方式可分为以下三种:

  • ICP(In-Circuit Programmer,在电路编程)
  • ISP(In-System Programming,在系统编程)
  • IAP(In-Application Programming,在应用编程)

       在介绍不同烧录方式的区别前,先介绍一下微控制器的启动方式。

启动方式

       微控制器的启动方式有引脚Boot0和Boot1的电平决定,一般通过拨码开关或引脚+跳线帽的方式控制,根据组合有以下三种启动方式,其中‘x‘表示高电平或低电平(即高低电平皆可)。

GD32(7)程序烧录及运行

IAP

        IAP(In-Application Programming)指在应用编程,不需要通过烧录器、USB等设备与计算机连接,但需要从SD卡等存储设备获取新程序(bin文件)进行自我更新(当然,通过USB、UART等接口获取的程序也可行)。

       IAP烧录方式的烧录逻辑是:在内部Flash的最前面烧录第1个程序(称为Bootloader程序),其次在相对0800 0000具有偏移的位置存储第2个程序(称为APP程序)。在Bootloader程序中,完成APP程序的更新,以及跳转至APP程序执行。

APP程序则和上述两种烧录方式烧录的程序相同,为正式运行的程序。

IAP的作用

       IAP一般可以用于产品的程序更新,避免更新时需要对其进行收回、拆解等步骤,并且方便用于自行操作。

IAP与ICP、ISP的运行差别

       ICP和ISP都是将1个程序存储到内部Flash中并运行,程序在内部Flash中的存储空间分布如下图所示,最前面是栈顶地址,其次是各个中断向量,然后是各个中断向量对应的中断程序入口,最后是main函数入口。

       程序运行时,栈指针指向复位中断向量,其次通过该向量跳转至复位中断程序中运行,复位中断程序一般在startupxx.s文件中定义,用于初始化系统并跳转至main函数运行,最后进入main函数执行循环。当中断请求出现时,栈指针指向对应中断向量,并通过该向量跳转至对应的中断程序中运行,运行结束后再回到原位置,继续运行循环中的内容。

GD32(7)程序烧录及运行

IAP的Bootloader程序实现

       Bootloader程序主要完成APP程序的更新以及跳转,其中APP程序的更新即从接口或存储设备中获取后存放在内部Flash对应区域中接口(相对首地址有偏移量)。

       APP程序的跳转可参考以下代码,其中并与0x20000000判断是否相等,表示该地址在0x20000000 ~ 0x2001 0000之间(理论上可修改,在内部SRAM中即可)。

       其中SetMSP为汇编程序编写的函数,如下所示,其中r0为addr的地址,具体可参考ARM架构基本寄存器一文及该专栏。

IAP的APP程序实现

       APP程序为用户程序,实际上任意程序都可以,但需要进行相应的配置,配置步骤如下:

  1. 设置起始地址和存储空间
           在keil中设置起始地址和存储空间的大小,如下图所示,在Options for Target ‘Target1’对话框中,打开Target标签页,勾选IROM1选项,并将起始地址设置为0x8010000,大小为0x70000(即448KB,可修改,用于存放APP程序),此时APP程序代码存放地址即为Flash起始地址加上相对偏移量X(这里将偏移量X设置为10000),即0x08010000。

GD32(7)程序烧录及运行

       设置结束后点击编译,即可在上面填写的bin文件路径中找到对应的bin文件。

来源:凯之~

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年8月1日
下一篇 2022年8月1日

相关推荐