keil下载程序具体过程2:硬件链路

引言

        本篇博客将介绍keil下载程序的过程中,镜像文件将经过哪些硬件,以及简单的介绍他们之间的协议。

一、硬件连接

图1 硬件连接

        将PC、jlink、芯片使用ubs线、swd线连接好之后,在PC上的keil软件中,我们选择对应的仿真器,并选择下载协议。

 图2 选择仿真器

 图3 配置仿真器

        在图2中我们选择jlink下载器,在图3中可以看到,jlink的SN为20090937(图2中1)、下载接口是SW接口(图2中2)、芯片端ID为(图2中3)

        在图2中3的部分,我们可以看到0x2BA01477,这个是芯片内部SWJ-DP的ID,Device Name下的ARM CoreSight SW-DP是我们用的调试组件名字。CoreSight是ARM公司为了应对SOC中复杂的debug和trace而提出的调试架构,其包含多个组件,我们在keil中进行debug的时候,在keil的各个窗口中看到的数据、断点、单步运行等操作都是由这个架构进行支持。

二、DAP

1、SWD协议

        jlink和芯片通过SWD(Serial Wire Debug)接口连接,使用SWD协议。准确的说,SW-DP只支持SW协议,SWJ-DP支持jtag和sw协议,博主用的是sw-dp,所以下文以及后面的文章中如不特殊说明均指的是SW-DP接口。SWD可以通过传输数据包来读写芯片的寄存器。SWD是用于访问ARM调试接口的双线协议。它是ARM调试接口规范(ARM Debug Interface Architecture Specification)的一部分,是JTAG的替代品。SWD的物理层由两条线组成:

SWDIO: 双向数据线

SWCLK: host驱动的时钟线

在图1中我们可以看到,SW-DP通过DAP总线连接AHB-DP。

图4

        这一部分就是SWD接口牵扯到的硬件。 通过连接到SWDIO/SWCLK,可以直接访问串行线调试端口(SW-DP)。SW-DP可以访问一个或多个接入端口(AP),通过AP可以访问系统的其余部分寄存器。 Cortex M系列CPU的一个重要AP是AHB-AP,它是内部AHB总线上的主机。换句话说,AHB-AP可以访问内部核心的内存映射。由于内部闪存、SRAM、调试组件和外围设备都是内存映射,因此AHB-AP可以控制整个设备,包括对其进行编程。整个SWD操作过程是分级进行的,时钟信号由SWCLK 管脚输入,数据信号从SWDIO管脚输入输出。首先Debugger对SW-DP进行操作,确定AP寄存器的参数,达到对Cortex Memory Map进行操作。

2、AHB-AP

        SW-DP与AHB-AP之间通过DAP总线进行通信,DAP总线上的地址是32位的,其中高8位用于选择访问哪一个设备,由此可见,最多可以在DAP总线上面挂256个设备。在M3处理器的内部,只用掉了一个设备的地址,还剩下的255个都可以用于连接访问端口(AP)到DAP总线上。当数据传到DAP接口后,下一步就连接到了一个称为“AHB-AP”的AP设备上,它相当于一个总线桥,用于把DAP总线的命令转换为AHB总线上的数据传送,再插入到M3内部的总线网络中。这么一来,M3的整个寻址空间就都在覆盖范围之内了,连NVIC中的调试控制寄存器组也包括在内。在CoreSight系列产品中,AP设备可以有好几种类型,包括APB-AP和JTAG-AP。APB-AP顾名思义,是用于产生APB总线数据传送动作的,而JTAG-AP则用于控制传统的、基于JTAG的测试接口。

        AHB-AP位于CM3的存储器系统和调试接口模块(SWJ-DP/SW_DP)之间,充当一个总线桥的角色。对于大多数基本的在调试主机和CM3系统之间的数据传输,只需要使用AHB-AP中的3个寄存器,它们是:控制及状态字(CSW)、传输地址寄存器(TAR)、数据读/写(DRW)。

        CSW寄存器可以控制传送方向(读/写)、传送大小以及传送类型等。TAR寄存器则指令传送地址,而DRW寄存器则容纳了被传送的数据(在访问该寄存器时就启动了传送)。DRW中的数据与总线上实际显示的是一致的,所以对于半字和字节传送,必须由调试硬件把得到的数据适当移位,以对齐到LSB。例如,若欲在地址0x1002上执行一次半字传送,则需要把数据放到DRW的[31:16]上。AHB-AP可以产生非对齐传送,但是它不会根据地址偏移来自动对目标数据做圆圈移位,必须由调试软件堵上这个窟窿:要么手工圆圈移位,要么把未对齐访问分解为若干个对齐的访问。

        在AHB-AP中还有其它的寄存器,它们提供附加的功能。例如,AHB-AP中提供了4个bannked寄存器和地址自动增量的功能,用于加快在小范围连续地址中数据访问的速度。在CSW寄存器中,还有一个名为MasterType的位。通常需要把它置1,以此告知参与AHB-AP数据传送的硬件:该数据传送是调试器发起的。但是,调试器也可以清零此位来伪装成处理器内核。这样,在AHB上接收数据的硬件就会以为是内核发起的数据传送,从而正常地动作。这个功能可以用于测试目的,尤其是对于带有FIFO的外设,用于获知当它被调试器访问时,行为有什么不同。

3、ROM表

        说到这里,有一个问题还没有说明,JLink通过SW线连接SW-DP模块,那有如何得知AHB-AP在哪里呢?这里就引出了ROM表。
        ROM表是M3内核包含的调试系统的一个部分,用于自动检测在某CM3芯片中包含了哪些调试组件。
        CM3拥有一个预定义的存储器映射并且包含了标准的调试组件,但是新的Cortex-M器件可以包含不同的调试组件,并且芯片厂商在实现CM3时也可以对调试组件加以修改。为使调试工具能检测到调试系统中具体包含的组件,就提供了这张ROM表,它记录了NVIC和各个调试功能块的地址。
        ROM表位于0xE00F_F000。通过分析ROM表中的内容,可以计算出系统和调试组件在存储器系统中的位置。在检测到了调试组件后,调试器可以接下来查看它们的ID寄存器,从而判定系统中哪些组件是可用的。
        在CM3的ROM表中,第一条目的内容应当是:NVIC的入口地址相对于ROM表入口地址的偏移量。ROM表首条目的缺省值是0xFFF0F003,其中位段[1:0]的作用比较特殊:它指示本条目对应的设备是存在的,并且在本条目的后面还有后续的条目(也就是说本条目不是最后一个条目)。这样,通过第一个条目,我们就知道系统中有NVIC,并且还有第2个条目,而且还能计算出NVIC的地址为0xE00F_F000+0xFFF0_F000=0xE000_E000。
        缺省的ROM表如图所示。但是因为芯片厂商可以添加、移除以及把某些可选的组件替换成其它的CoreSigth调试组件,这时该芯片的ROM表就会与缺省的有所不同,以反映出相应的变化。

Cortex-M3缺省的ROM表。

        数值的最低两个位用于指示该设备是否存在(bit[1])以及后面还有没有其它的表项(bit[0])。在正常情况下,NVIC, DWT和FPB总是必须存在的,因此最后两位永远是1。然而,TPIU和ETM则可以被裁掉,并且可能被CoreSight家庭中其它的调试组件所取代。
        数值的高位部分用给出对应组件的入口地址相对于ROM表入口地址的偏移量。例如,NVIC入口地址= 0xE00F_F000 + 0xFFF0_F000 = 0xE000_E000(进位位被忽略)
        在开发调试工具时,有必要从ROM表中一一查兑各调试组件,因为难免会有些另类的CM3芯片会自定义调试组件,并且修改ROM表,而通过计算ROM表得到的地址是可以拿去拍板的。

        到这里,可以知道,keil点击Download按钮之后,JLink会通过SW线连接芯片的SW-DP接口,和内部的AHB-AP接口进行通信,AHB-AP和总线进行通信,进而访问整个4G地址空间(芯片的所有地址都可以访问)。

三、flash

        数据传输到AHB总线上之后(AHB总线、APB总线,二者通过总线桥连接),就可以传输到M3内核上整个4G地址空间了,可以访问M3内核上的所有资源,flash就是挂载到AHB总线上。一般储存程序的flash都是挂载到AHB总线上,因为AHB总线比APB总线快很多,低速外设如uart、timer等会挂载到APB上,但镜像文件(前面一直说的都是镜像文件,后面会对这个词进行说明)中包含程序的代码,自然访问速度越快越好,挂载到AHB总线上。flash连接总线以及与M4内核(M3、M4内核差距并不是很大,本文中也不牵扯二者差异的地方,读者可以在本系列文章中认为二者一样)连接图如图所示。

 

         M3内核有3条总线:指令总线(I-BUS)、数据总线(D-BUS)、系统总线(System-BUS)。三条总线都有自己的地址总线、数据总线、控制总线。M3内核是哈弗结构,因此有指令总线和数据总线,二者并行取值。指令总线通过总线矩阵连接的XIP接口,从FLASH中取数据(指令)、数据总线通过XIP从flash取数据和从RAM中读写数据,系统总线访问其他的资源。这里请记者上图中的ROM,后面的文章会介绍它的作用。

        到这里,我们用到的硬件以及其使用的协议都介绍了一下,博主本人为SWD、DAP等协议并没用进行深入的研究,其和本文主旨相关性并不是很强,更多的介绍的是数据的流通过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣 518. 零钱兑换 II

题目来源:https://leetcode.cn/problems/coin-change-ii/description/ C题解(来源代码随想录): 这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。但本题和纯完全背包不一样&#xff0c…

【Tomcat】tomcat的多实例和动静分离

多实例: 在一台服务器上有多台Tomcat;就算是多实例 安装telnet服务,可以用来测试端口通信是否正常 yum -y install telnettelnet 192.168.220.112 80 tomcat的日志文件 cd /usr/local/tomcat/logsvim catalina.out Tomcat多实例部署&…

MAUI+Blazor 如何开启浏览器调试工具

文章目录 前言如何开启调试模式输入快捷键打开浏览器有什么意义? 前言 MAUIBlazor其实就是浏览器套壳,我觉得很有意义,因为现在性能已经不是主要的限制了,很多时候讲究的快速开发。而且MAUIBlazor跨平台的未来感觉实在是太香了。…

Java课题笔记~ Servlet编程

1.Servlet编程基础 (1)什么是Servlet Servlet是基于Java语言的Web编程技术,部署在服务器端的Web容器里,获取客户端的访问请求,并根据请求生成响应信息返回给客户端。 创建Servlet的方式,有 如下图:一般创建Servlet都…

skynet 网络模块解析

文章目录 前言环境准备sneak peek线程数据结构会话对象:持有基础套接字,封装了套接字的基础操作。会话管理器:持有并管理会话池,给外部模块提供网络接口。 网络模块管理会话管理器的生命周期管理工作模式 总结技术点原子数据管道描…

opencv实战项目 手势识别-手势控制键盘

手势识别是一种人机交互技术,通过识别人的手势动作,从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪(定位手部关键点) 2.opencv实战项目 实现手势跟踪并返回位置信息(封装调用&am…

计算机竞赛 - 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,…

Java基础入门篇——修饰符

在Java中,修饰符(Modifiers)是一种用于修改类、方法、变量和其他实体的访问权限、行为或特性的关键字。Java提供了一组修饰符,可以用于实现对代码的封装、继承、多态和访问控制等功能。 1、访问修饰符(Access Modifie…

【Spring Boot】夺名连环问(持续更新ing)

Spring的了解与特性 简单介绍:快速开发Spring项目的脚手架。简化Spring应用的初始搭建以及开发过程。 特性 提供了很多内置的Starter结合自动配置,对主流框架的无配置集成、开箱即用。即不需要自己去引入很多依赖。 并且管理了常用的第三方依赖的版本&…

Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚文件写入🐇writeFile 异步写入🐇writeFileSync 同步写入🐇appendFile / appendFileSync 追加写入🐇createWriteStrea…

LeetCode150道面试经典题--验证回文串(简单)

1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是 回文串 ,返回 true ;否…

pve组网实现公网访问pve,访问电脑,访问pve中的openwrt同时经过openwrt穿透主路由地址nginx全公网访问最佳办法测试研究...

一台路由器 做主路由 工控机 装pve虚拟机 虚拟机里面装一个openwrt, 外网可以直接访问pve,可以访问pve里的openwrt 一台主机 可选择连 有4个口,分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 ,没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界…

TCP协议的报头格式和滑动窗口

文章目录 TCP报头格式端口号序号和确认序号确认应答(ACK)机制超时重传机制 首部长度窗口大小报文类型URGACKSYNPSHFINRST 滑动窗口滑动窗口的大小怎么设定怎么变化滑动窗口变化问题 TCP报头格式 端口号 两个端口号比较好理解,通过端口号来找…

el-tree-select那些事

下拉菜单树形选择器 用于记录工作及日常学习涉及到的一些需求和问题 vue3 el-tree-select那些事 1、获取el-tree-select选中的任意层级的节点对象 1、获取el-tree-select选中的任意层级的节点对象 1-1数据集 1-2画面 1-3代码 1-3-1画面代码 <el-tree-selectv-model"s…

ELK常见部署架构以及出现的问题及解决方案

ELK常见部署架构以及出现的问题及解决方案 ELK 已经成为目前最流行的集中式日志解决方案&#xff0c;它主要是由Beats 、Logstash 、Elasticsearch 、 Kibana 等组件组成&#xff0c;来共同完成实时日志的收集&#xff0c;存储&#xff0c;展示等一站式的解决方案。本文将会介…

Stable Diffusion - 哥特 (Goth) 风格服装与背景的 LoRA 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132177882 图像来源于 Goth Clothing 的 LoRA 效果&#xff0c;配合哥特 (Goth) 风格服饰的相关提示词。 测试模型&#xff1a;DreamShaper 8 哥…

STM32CubeMX之freeRTOS互斥量

这是大哥保护小弟的故事 高中低等级的任务 互斥量就是谁要敢插我小弟的队&#xff0c;我就要打他&#xff0c;不能让其他人插我小弟的队 互斥量的使用是默认开启的不用手动开启&#xff01; 最高优先级任务&#xff1a;延时&#xff08;10ms&#xff09;再上厕所 中间&#x…

【网络编程·传输层】UDP和TCP的经典八股文

目录 一、端口号划分 二、部分指令 1、pidof&#xff08;用于查看进程id&#xff09; 2、netstat&#xff08;查看网络状态&#xff09; 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

hive修改表或者删除表时卡死问题的解决(2023-08-08)

背景&#xff1a;前阶段在做hive表的改表名时&#xff0c;总是超时&#xff0c;表是内部表&#xff0c;数据量特别大&#xff0c;无论你是修改表名还是删除表都是卡死的状态&#xff0c;怎么破&#xff1f; 终于&#xff1a;尝试出来一个新的方法 将内部表转化成外部表&#…