大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是飞思卡尔Kinetis MCU开发板板载OpenSDA调试器(上篇)

  众所周知,嵌入式软件开发几乎离不开调试器,因为写一个稍有代码规模(5K行以上)的嵌入式应用程序一般不可能一次性搞定,没有任何bug,出了bug并不可怕,只要我们能尽快定位bug并修复即可,调试器就是定位bug的利器,有了调试器我们便可以进入系统主控芯片内部一窥究竟,控制芯片执行代码的动作,实时查看芯片内部状态,辅以各种调试技巧让bug无处藏身。
  飞思卡尔Kinetis MCU属于ARM Cortex-M系列芯片,因此本文主要介绍的Cortex-M系列芯片调试器,目前市面上Cortex-M调试器种类(这里主要指的是硬件生产商)非常多,主要分为如下两大阵营:

  • 第三方公司出品:SEGGER的J-Link、IAR的I-jet、ARM的ULINK、开源项目OpenJTAG等
  • 半导体厂商出品:Freescale的OpenSDA、NXP的LPC-Link、ST的ST-LINK、TI的Stellaris ICDI、Nuvoton的Nu-Link等。

  本文要讲的主角OpenSDA属于阵营里的后者,其一般不单独存在,都是附着在飞思卡尔Kinetis官方开发板上,你可以理解为OpenSDA调试器是专为Kinetis芯片设计的(但其实其firmware设计是可以做到通用于所有Cortex-M芯片的),今天痞子衡就为大家介绍OpenSDA项目的来龙去脉,让大家对OpenSDA项目有一个整体认识。

一、OpenSDA项目背景

  OpenSDA全称是Open-standard Serial and Debug Adapter,从名字上来看,这个项目是要做一个开放标准的串口与调试适配器,该项目主要是为了Kinetis芯片配套官方开发板而设计的,直接板载在Kinetis官方开发板上,用于取代传统的第三方仿真器(比如J-Link)+开发板的开发调试模式。
  众所周知,ARM公司于2010年2月正式发布Cortex-M4内核,飞思卡尔于2010年8月推出其第一款ARM Cortex-M内核芯片Kinetis K60,这也是业界一款Cortex-M4内核的芯片。OpenSDA项目并不是从Kinetis诞生之初便存在的,不信你可以查看最早的Kinetis Tower开发板 TWR-K60D100M 原理图(该板通用于Kinetis K10、K20、K60芯片),早期的Kinetis开发板板载调试器为OSBDM/OSJTAG,这是一种早已普遍应用于飞思卡尔HCS12、DSC、PowerPC系列芯片开发板上的调试器,OSBDM/OSJTAG调试器主芯片为MC9S08JM60CLD(S08JM系列)。

  随着Kinetis芯片的不断推出,OpenSDA项目逐渐酝酿成熟,尤其是2012年随着飞思卡尔Cortex-M0+内核Kinetis L系列芯片的走红,OpenSDA调试器开始大面积应用于Kinetis L系列芯片配套的Freedom开发板上,从此取代OSBDM/OSJTAG成为Kinetis开发板上的标准调试器,大家可以看一下下面这款经典的 FRDM-KL25Z 原理图,其板载调试器即为OpenSDA调试器(V1),OpenSDA调试器主芯片选用的MK20DX128VFM5(Kinetis K20系列)。

二、OpenSDA硬件电路

  概括来说,OpenSDA调试器主要由硬件和软件两部分组成,其中硬件主要分为主芯片和外围接口电路,下面痞子衡分别为大家介绍OpenSDA的主芯片和外围接口电路。

2.1 不可撼动的男主(MK20DX128VFM5)

  对于一个调试器项目来说,主芯片的选用至关重要,这直接决定了调试器的性能。OpenSDA调试器主芯片选用的是MK20DX128VFM5,这是一款Cortex-M4内核,主频50MHz,16KB SRAM,160KB ROM(128KB Flash,32KB FlexNVM(最大2KB EEPROM)),内置1个USBFS控制器,QFN32封装的芯片。
  为何选择Kinetis芯片作为调试器主控?当然是为了进一步推广Kinetis系列的知名度,毕竟飞思卡尔的Cortex-M芯片推出较晚。那么为何选择Kinetis K2x系列芯片呢?这要从下面Kinetis K系列的特性表里才能找到答案,从下表可以我们看出K2x系列是支持USB接口的入门芯片,而调试器主控是必须要支持USB接口的。

  为何选择型号为MK20DX128VFM5的K2x芯片呢?虽然这款芯片属于K2x系列里最低配型号(考虑到调试器将随着开发板大面积推广,成本也是一个不可忽略的因素),但是其外设(USBFS, UART, SPI)与存储(16KB RAM,160KB ROM)方面是满足调试器项目要求的。有人可能会问,50MHz主频会不会有点低,从而影响调试器性能?痞子衡可以明确地告诉你,性能是够的,作为对比SEGGER J-Link V7/V8里的主控是Atmel AT91SAM7S64(ARM7TDMI内核, 55MHz主频)。

2.2 几经搬迁的行宫(V1/V2/V2.1/V2.2)

  确定了调试器主芯片,下一步便是设计调试器外围接口电路,实际上外围电路发展至今不止一个版本,我们可以在飞思卡尔官网 OpenSDA项目主页 里的Download – OpenSDA Bootloader and Application下面找到如下各版本典型的开发板:

  不过这些版本主要都是硬件设计细节方面的小改动,而对于调试器软件开发而言其实并没有变化,因为接口Pinout并没有改变,痞子衡将上述各开发板原理图里的OpenSDA电路仔细查看对比整理出了如下通用的OpenSDA硬件原理简图:

  从上面原理简图我们可以看出,OpenSDA电路其实非常简洁,除了电源、晶振、主芯片K20自身的调试接口外,其他跟OpenSDA调试器功能相关的主要有五部分电路:

  1. 蓝色LED: 指示OpenSDA调试器工作状态,主要有两种状态,一种是常亮(正常运行模式),另一种是闪烁(自身Firmware更新模式)。
  2. Boot按键: 用于辅助进入OpenSDA调试器自身Firmware更新模式(也叫MSD Bootloader模式),电路上电前按下Boot按键不放即可进入MSD Bootloader模式(可在PC里看到新增名为BOOTLOADER的磁盘),往磁盘里拷贝相应调试器Firmware文件即可完成更新。
  3. USB接口: 与上位机PC连接,完成后续USB转串口(可到PC设备管理器看到新增串口设备), SWD调试交互功能。
  4. UART接口: 与目标MCU连接。
  5. SWD接口: 与目标MCU连接。

三、OpenSDA软件设计

  随着OpenSDA项目的不断迭代,目前(2018年9月)OpenSDA调试器版本已经更新到V2.2,飞思卡尔官网有 OpenSDA项目主页,在主页上我们可以看到如下OpenSDA项目版本对比:

3.1 软件架构

  不管是哪个版本的OpenSDA,其软件架构是一致的,如下图所示,OpenSDA软件主要由两部分组成:MSD Bootloader、OpenSDA Application(Firmware),其中MSD Bootloader占据调试器主控K20芯片内部Flash的上半区,K20芯片上电永远先执行MSD Bootloader程序,MSD Bootloader功能比较单一,就是用来更新OpenSDA Firmware,这样使得调试器软件升级比较容易。
  OpenSDA Firmware则是调试器的核心,调试器的主要功能(SWD调试、USB转串口)均是这个应用程序实现的,OpenSDA Firmware占据K20芯片内部Flash的下半区,其本身不能上电自动执行,必须由MSD Bootloader引导执行。

3.2 后宫佳丽有三个(软件服务商)

  说到OpenSDA Firmware的供应商,主要有三个,分别是P&EMicro、ARM Mbed、SEGGER,且听痞子衡一一道来:

3.2.1 原配P&E Micro

  P&EMicro公司是OpenSDA项目最早的Firmware软件服务商,其Firmware软件专为OpenSDA设计,我们可以从下面网站下载到其开发的Firmware和配套上位机驱动:

  不过比较遗憾的是P&EMicro公司并不开源其开发的Firmware源码,而在OpenSDA这个立志要开源的调试器项目里,Firmware不开源是一件比较奇怪的事,因此P&EMicro版本的Firmware逐渐没落。

3.2.2 新欢ARM Mbed(DAPLink)

  ARM公司(Mbed)是OpenSDA项目第二个Firmware软件服务商,虽然ARM官方已经设计了自己的ULINK调试器(ULINK主控为Cypress增强8051内核芯片AN2131QC、ULINK2主控为NXP公司ARM7内核芯片LPC2148FB064,ULINKpro主控为Xilinx VIRTEX FPGA),但为了ARM芯片的开放生态,其也同时主导了DAPLink项目(早期叫CMSIS-DAP项目,后来更名为DAPLink),下面是其官网:

  DAPLink项目是完全开源的,目前支持的主控芯片主要有5款:K20DX, KL26, LPC11U35, LPC4322, SAM3U2C,其中K20DX即是应用于OpenSDA的主控,另外4款芯片分别用于其他类型的调试器,此处不再展开。DAPLink版Firmware因其开放的生态使其大受欢迎,是目前的主流。

3.2.3 野花SEGGER(J-Link)

  SEGGER公司是OpenSDA项目第三个Firmware软件服务商,虽然SEGGER设计已久的通用型J-Link调试器是目前市场上最流行的,但SEGGER并没有因此固步自封,SEGGER看到OpenSDA调试器在Kinetis开发板上大面积推广,想到了一个非常聪明的策略,那便是免费为OpenSDA设计一个与J-Link软件兼容的Firmware,使OpenSDA摇身一变成为一个简配版J-Link。

  由于SEGGER公司是个靠软件服务收费的商业公司,因此SEGGER版Firmware并不开源,并且调试功能上也受一定限制,但这并不影响SEGGER版Firmware的流行,因此J-Link调试器实在是太普及了,J-Link上位机软件功能(J-Link Commander等)也非常强大。

  至此,飞思卡尔Kinetis MCU开发板板载OpenSDA调试器(上篇)痞子衡便介绍完毕了,掌声在哪里~~~

痞子衡嵌入式:飞思卡尔Kinetis开发板OpenSDA调试器那些事(上)- 背景与架构的更多相关文章

  1. 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...

  2. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  3. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...

  4. 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  5. 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  6. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.6)- 串行NOR Flash下载算法(MCUXpresso IDE篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE开发环境下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行N ...

  7. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(2)- Boot配置(ISP_Pin, OTP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRTx ...

  8. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的OTP. 在i.MXRTxxx启动系列第二篇文章 Boot配置(ISP Pin, OTP) 里痞子 ...

  9. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...

随机推荐

  1. 解决iPhone Safari 兼容性CSS背景显示不全问题

    https://jingyan.baidu.com/article/ca2d939d014ccbeb6c31ceb7.html 看到了这个文章解决的.中心部分小于980的时候回出现.苹果手机中的saf ...

  2. mpvue-docs基于vue来开发微信小程序

    http://mpvue.com/和https://tencent.github.io/wepy/

  3. 查找更改的PeopleCode

    当我们做工程包迁移时,经过会遗漏部分更改过的定义.我们可以用下面的SQL来查找变更项 变量 &OPRID =代码变更者 变量 &PROJECT 项目工程名 SELECT * FROM ...

  4. [LeetCode] Length of Longest Fibonacci Subsequence 最长的斐波那契序列长度

    A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 ...

  5. node.js搭建Web服务器

    Node.js 博客搭建 一. 学习需求 Node 的安装运行 会安装node,搭建node环境 会运行node. 基础模块的使用 Buffer:二进制数据处理模块 Event:事件模块 fs:文件系 ...

  6. ubuntu安装输入法

    sudo apt-get install ibus-pinyin sudo ibus-setup

  7. Json----简单介绍

    Json 先分享一个网站http://www.bejson.com/,这个是用来检测Json文件的错误的,Json文件一般不好查找错误. 看懂Json只需要四句话: 对象表示为键值对 数据由逗号分隔 ...

  8. JS基础整理面试题

    1.DOM和BOM的区别 DOM:document object model;文档对象模型,提供操作页面元素的方法和属性BOM:browser object model;浏览器对象模型,提供一些属性和 ...

  9. 作为小白,如何学习Web前端开发?

    作为一个已经写码这么多年的人,我不会告诉你我最初的时候是自学的,因为刚开始自己学真的特别无聊枯燥,实在学不下去,所以就自己报了一个培训(上元教育)的地方,毕竟是交了钱的,本着不服气的精神,硬是把自己生 ...

  10. 基于Java的ArrayList和LinkedList的实现与总结

    一.定义MyList接口,包含列表常见方法: import java.util.Iterator; /** * 线性表(列表)的接口定义 */ public interface MyList<T ...