【ARM Cortex-M 开发实战指南(入门篇)】第6章 Cortex-M下载程序及调试

6.1 Cortex-M的启动模式

Cortex-M三种启动模式对应的存储介质均是芯片内置的,它们是:

1)用户闪存 = 芯片内置的Flash。
2)SRAM = 芯片内置的RAM区,就是内存啦。
3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通

常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM(只读)区。

在每个Cortex-M的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:

LAyw1e.md.png

在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。

在从待机模式退出时, BOOT引脚的值将被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后, CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。

因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。Cortex-M微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。

根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:

 从主闪存存储器启动(Main Flash memory)
主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问, 0x00000000或0x0800 0000。Cortex-M内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

 从系统存储器启动(System memory)
系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(互联型产品原有地址为0x1FFF B000,其它产品原有地址为0x1FFF F000)访问它。
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。

系统存储器是芯片内部一块特定的区域,芯片在出厂时,由各个厂家在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。

一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:

Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,Cortex-M才可以从Flash中启动

可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验。

 从内置SRAM启动(Embedded Memory)
只能在0x2000 0000开始的地址区访问SRAM。

注意: 当从内置SRAM启动,在应用程序的初始化代码中,必须使用NVIC的异常表和偏移寄存器,重新映射向量表至SRAM中。

内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。

LAyHA0.png

综上所述,最简单的硬件设计就是将BOOT0和BOOT1通过一个10k的下拉电阻,直接接地。当然了也可以设计复杂的ISP电路一键下载。

6.2固件下载与调试

Cortex-M系列的MCU一般都有多种烧录方法,可在调试和生产等阶段进行便捷的烧录。目前主要烧录方法有ISP烧录、 SWD/JTAG下载与调试。

◼ ISP烧录:使用串口或USB即可烧录,无需特殊工具支持。可根据协议自行定制下载方式,
需要控制BOOT0引脚电平选择启动模式。
◼ SWD/JTAG在线下载:无需切换MCU启动方式,使用仿真器等可进行下载。需使用仿真器
和上位机进行操作。

当然还有脱机烧录,这个方式适用于大批量的产线生产,烧录过程无需PC和软件,可脱机进行烧录,批量烧录效率高。

6.2.1 ISP下载

ISP:In System Programing,在系统编程,通过MCU片内的引导程序进行Flash编程。
Cortex-M芯片的片内有一个只读信息块,用于存放引导装载程序,引导程序在MCU出厂前就会提前烧录好。

复位时MCU通过BOOT0引脚电平状态选择进入Flash启动模式还是ISP升级模式。目前所有系列均支持通过UART对Flash进行编程,无需其他外围设备。ISP常用电路如下:

LA6MUP.png

ISP 电路使用到 CH340G 芯片,它是一个 USB 转串口 IC,这里使用MCU的USART1, 用到 PA9 和 PA10 引脚,开发板出厂默认 JP1 和 JP2 跳线帽为接入的。当MCU被设置为从系统代码启动后,通过通信设定后,可以接收 USART1数据更新内部 Flash 内容,这样达到程序下载目的,当再次从内部 Flash 启动时就可以运行新程序。

当BOOT0 为 1(高电平)、BOOT1 为 0(低电平,默认已为 0)时MCU会从系统代码启动,电路,BOOT0 需要为高, 则只需要 RTS#引脚为低电平,此时 Q2 三极管导通就把 BOOT0 拉高, 这样 MCU就可以进入 ISP 下载模式,注意这里是可以进入,事实上并不会马上进入,因为只有系统复位后才会读取 BOOT 引脚电平才会决定启动模式,所以现在需要让MCU进行一次复位, 这时就要看 DTR#引脚的功能了。当 DRT#为高电平时 Q1 三极管导通,原本 RTS#引脚就为低电平,Q1导通后 U4 的第2引脚(标识为“Z”)也是低电平,而U4是74HC1G66GW 芯片,实际上是一个双向开关器件,即 Z 引脚和 Y 引脚电平是一样的,综上,RESET#引脚也为低电平,此时 MCU进入复位状态。
74HC1G66GW 芯片在这里起到系统上电后延时 RTS#引脚信号对 RESET#引脚的影响作用,只有在开发板上电阶段才起作用。

在成功复位之后就可以需要把 DTR#引脚拉高,此时 RESET#引脚也被拉高,现在 ISP 下载软件就可以对MCU下载程序。等程序下载完之后,RTS#引脚被设置为高电平,此时 BOOT0 引脚为低电平,这样等一切就绪之后,在复位一下 MCU就可以从 Flash 启动,并运行新程序。

当然还有一种更加简单的方式,如下图所示:

LA6aEq.md.png

上述方式需要BOOT0配合,在下载程序时需要手动将BOOT0置高,当程序下载程序完成后再将BOOT0拉低。

接下来笔者按照第一种方式下载固件。

第一步:打开mcuisp软件搜索串口

LA6BCT.png

第二步:设置如下图所示,选择要下载的hex,单击开始编程

LA6cr9.png

下载成功后出现下图所示情况

LA6RV1.png

OK,下载成功,按复位键就可执行程序了!

如果使用第二种方式,无需配置DTR和RTS。

综上,第一种下载方式是通过硬件+软件来实现BOOT控制,无需手动控制BOOT开关;第二方式电路简单,需要手动控制BOOT。

ISP烧写程序的通过工具是FlyMCU,每个MCU厂家一般也会开发自己的下载工具。

当然啦,要想方便那还得用仿真器,首推J-link,不仅Cortex-M系列的芯片可以使用功能,其他的芯片也能使用,可以说,J-link是嵌入式开发者的必备工具。

6.2.2仿真器在线下载与调试

仿真器很多,每个MCU厂家都会有自己的仿真器,STM32有ST-Link,GD32有GD-Link,CH32有CH-Link等,当通用的仿真器就是J-Link,下面就使用J-Link下载程序并调试程序。
J-Link及相应的软件下载地址如下:

下载地址

LA67KH.md.png

在使用任何仿真器之前,都需要安装相应的驱动及工具,根据自己系统自行下载安装,笔者就不赘述了。

1.在线调试

写好程序编译通过后,连接好J-Link仿真器。如果没有配置Debug选项,需要事先配置,在上一章笔者已经讲解过了。

LAcYRO.md.png

如果代码编译无误,单击Debug(crtl+F5)进行在线调试程序,如下图所示。

LAcdLd.png

调试程序出现的调试界面。

LAc0eA.md.png

ST-link和J-Link在线调试是一样的,只是需要配置下工具。

LAcDot.md.png

如果是GD-Link等其他国产工具,一般选择CMSIS-DAP工具,关于DAP调试工具的开发,笔者在后面也会讲解,敬请期待!

2.固件下载

当程序编译无误后,即可在线下载程序。

LAcRyQ.md.png

以上表示程序编译成功,接下来就可以下载程序了。

LAcTYV.md.png

LAcqlF.md.png

然后复位即可看到实验现象。

6.2.3仿真器离线下载

这里就用J-link下载程序到STM32开发板中。打开J-Flash,在安装完J-Link驱动就会有该软件。

首次使用就需要新建工程,如图所示。

LAcvwR.md.png

然后就选择相应的芯片。

LAgV0A.md.png

根据板子的芯片类型选择即可。

LAg1XQ.md.png

接下来将前面编译好的程序拖动进入J-Flash。

LAgtkq.md.png

然后点击‘Connect’。

LAgw1U.md.png

然后按F7或者点击‘Production Programming’即可下载。

LAgrnJ.md.png

值得注意的是,要想生成HEX文件,需要在Keil配置输出文件。

LAg2h6.md.png

如果要想生成bin文件,需要在KEIL的User选项中,如下图添加这两项:

fromelf –bin –output=../Output/YS_STM32.bin ../Output/YS_STM32.axf

LAgf1O.md.png

编译完成后就会在Output目录下生成bin文件。

LAgbNt.md.png

GCC版本已经实现了HEX和bin文件的输出,直接使用即可。

值得注意的是,bin文件下载需要填写程序的起始地址。

LAgvjg.md.png

默认即可,当然也会改变,在IAP升级的时候会讲到,一般下载程序时默认地址即可。

当然啦,除了使用J-Link工具,也可使用各个厂家的官方工具。

比如ST-Link的ST-LINK Utility和STM32CubeProgrammer,GD32的GD-Link Programmer,使用方法都差不多,导入固件->连接->下载程序,非常方便,相对J-Link,各个厂家下载工具少了选择型号的步骤,使用起来更方便,但是J-Link更通用。根据自己习惯选择吧!


欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎


资源获取方式

1.关注公众号[嵌入式实验楼]
2.在公众号回复关键词[Cortex-M]获取资料提取码

Related posts

Leave a Comment