STM32高级开发(16)-CMSIS DAP调试工程

发布者:沈阳阿荣最新更新时间:2022-06-20 来源: eefocus关键字:STM32  高级开发  CMSIS  DAP 手机看文章 扫描二维码
随时随地手机看文章

最近公司的项目在等供应商的设备有点空闲的时间了,就折腾了下ARM官方开源的CMSIS DAP调试器的方案,用的是X893大神的方案,下面附上他的个人主页和在GitHub上的项目链接(我是用的是其中stlinkv2.1的软硬件方案):


[http://akb77.com/g/stm32/cmsis-dap-adapter/](http://akb77.com/g/stm32/cmsis-dap-adapter/)

[https://github.com/x893/CMSIS-DAP](https://github.com/x893/CMSIS-DAP)


这个调试器方案可以说极具性价比,SWD接口速度可以达到10M的全速,还附带一个最高支持到115200bps的串口,而且连接一根线就可以识别为两个设备,既可以单独的作为一个调试器使用,也可以集成到其他项目的PCB板上作为板载调试器和USART转串口功能电路。


在 Keil 中使用 CMSIS DAP

在我测试的过程中,貌似只有Keil5能够成功识别CMSIS DAP,其设置方法基本和其他调试器使用方法无异,因为CMSIS DAP 是把自身标记为一个 USB HID 和 CDC ACM 设备使用的,前者是调试功能的接口,后者是串口接口,在 Windows 都可以自动识别,不需要安装驱动。不过记得如果没有在硬件调试口上设置硬件复位口的话,要在 Keil 的调试器设置中 Connect & Reset Option 中将Reset设置为系统软中断。

这里写图片描述

这里写图片描述

至于串口的功能,直接使用串口助手打开调试器对应的COM口就可以了。


在Ubuntu中使用OpenOCD + CMSIS DAP

使用过程中的问题

作为这个系列中一篇自然在 Ubuntu 中的内容才是我们要讲述的重点。开始的时候我在接上硬件使用新的 OpenOCD 配置时,我得到的是无法连接 CMSIS DAP 的问题。


openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg


仔细研究了一晚上,Google了几个问题的关键词,最后还是在抱着尝试的态度安装一个新的 OpenOCD 的过程中我发现了之前的问题。原来在当时安装 OpenOCD 的时候有两个问题:


OpenOCD 编译安装时的参数


在我们下载下来 OpenOCD 的源代码编译之前会使用 ./configure 的指令配置编译参数,而它默认的编译配置只使能了 stlink jlink 等常见的几个调试器,并没有添加对 CMSIS DAP 的支持。


usb rule.d 的问题


在 ubuntu 或是 Linux 中我们使用 /etc/udev/rules.d/ 目录下的规则文件来识别USB设备提供其接口给 libusb 使用,然后 libusb 在提供接口给 openocd 连接使用。所以在我们必须在这个文件内添加新的 DAP CMSIS 的库才能正常使用。


重新安装 OpenOCD

说完问题我们接下来就要介绍说解决方法了。


首先显然的我们需要重新配置编译并安装 OpenOCD 启动其中对 CMSIS DAP 的支持代码,但在此之前我们先需要安装一个的 hid 库,因为Linux上默认是没有HID设备驱动的。


$ sudo apt-get install libhidapi-dev


在安装完成后,进入OpenOCD 的源代码路径,使用指令配置其编译参数


$ ./configure --enable-cmsis-dap


在等待配置脚本完成后会显示如下内容:


OpenOCD configuration summary

--------------------------------------------------

MPSSE mode of FTDI based devices        yes (auto)

ST-Link JTAG Programmer                 yes (auto)

TI ICDI JTAG Programmer                 yes (auto)

Keil ULINK JTAG Programmer              yes (auto)

Altera USB-Blaster II Compatible        yes (auto)

Versaloon-Link JTAG Programmer          yes (auto)

OSBDM (JTAG only) Programmer            yes (auto)

eStick/opendous JTAG Programmer         yes (auto)

Andes JTAG Programmer                   yes (auto)

USBProg JTAG Programmer                 yes (auto)

Raisonance RLink JTAG Programmer        yes (auto)

Olimex ARM-JTAG-EW Programmer           yes (auto)

CMSIS-DAP Compliant Debugger            yes

Cypress KitProg Programmer              yes (auto)

Altera USB-Blaster Compatible           no

ASIX Presto Adapter                     no

OpenJTAG Adapter                        no

SEGGER J-Link Programmer                yes (auto)


可以看到其中 CMSIS-DAP 已经被启用,之后我们使用指令编译并安装新的 OpenOCD (不需要删除旧版)


$ sudo make 

$ sudo make install


在安装完成后我们进入 contrib 目录使用指令将 60-openocd.rules 文件复制入 /etc/udev/rules.d/ 目录下


$ sudo cp  60-openocd.rules /etc/udev/rules.d/


因为这个文件中包含了所有支持调试器的 USB 接口描述,所以我们还需要删除以前复制进入这个文件内的规则文件,比如 49-stlinkv1.rules 49-stlinkv2.rules 49-stlinkv2-1.rules 99-jlink.rules 等


$ rm 49-stlinkv1.rules 49-stlinkv2.rules 49-stlinkv2-1.rules 99-jlink.rules 


重启系统来重新加载规则。再使用 OpenOCD 指令连接,大功告成~。


使用调试器

重启系统后我们再次使用指令连接目标板


$ openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg

Open On-Chip Debugger 0.10.0+dev-00197-g2168c47 (2017-10-14-08:41)

Licensed under GNU GPL v2

For bug reports, read

    http://openocd.org/doc/doxygen/bugs.html

Info : auto-selecting first available session transport "swd". To override use 'transport select '.

adapter speed: 1000 kHz

adapter_nsrst_delay: 100

none separate

cortex_m reset_config sysresetreq

Info : CMSIS-DAP: SWD  Supported

Info : CMSIS-DAP: Interface Initialised (SWD)

Info : CMSIS-DAP: FW Version = 1.0

Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1

Info : CMSIS-DAP: Interface ready

Info : clock speed 1000 kHz

Info : SWD DPIDR 0x1ba01477

Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints


连接成功~


PS:如果显示连接失败的话试试重新插拔下 CMSIS DAP 的USB接口,我之前就遇到这样的问题了。


设置串口

由于使用的是 CDC ACM 的驱动,所以我们的串口名称不是 ttyUSB0 而是 ttyACM0 ,使用指令来更改 Minicom 的配置


$ sudo minicom -s


Ctrl+a,o。设置串口参数。在serial port setup中我们设置,串口设备号和波特率及奇欧校验位等参数,然后选中save setup as dfl后重启minicom,就完成串口的设置了。

这里写图片描述

关键字:STM32  高级开发  CMSIS  DAP 引用地址:STM32高级开发(16)-CMSIS DAP调试工程

上一篇:STM32高级开发(7)-浅析样例工程的Makefile
下一篇:STM32高级开发(5)-gcc-arm-none-eabi

推荐阅读最新更新时间:2024-11-10 10:15

STM32 串口 通信 中断
一、数据发送与接收。 (1)、STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。 当向该寄存器写数据的时候,串口就会自动发送; 当收到数据的时候,也是存在该寄存器内。 1)STM32 库函数操作 USART_DR 寄存器发送数据的函数是: void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);通过该函数向串口寄存器 USART_DR 写入一个数据。 2)STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是: uint16_t USART_ReceiveData(USART_Ty
[单片机]
STM32系统时钟配置及时钟树
参考资料:《 STM32F4xx 中文参考手册》 RCC 章节。 STM32时钟可大致分为系统时钟和其它时钟两大类,总共包含5个时钟源 HSI(High Speed Internal Clock)、HSE(High Speed External Clock)、LSI(low Speed Internal Clock)、LSE(Low Speed External Clock )、PLL(Phase Locked Loop Clock)。 下图即为STM32时钟树,黄色标识部分即为系统时钟部分,橙色即为其它时钟部分。 一、系统时钟 ①HSE(High Speed External Clock)高速外部时钟信号
[单片机]
<font color='red'>STM32</font>系统时钟配置及时钟树
STM32自学笔记EXTI(外部中断)寄存器
外部中断通用I/O映像 中断处理函数分配 EXTI寄存器一览 以下图片全部摘自STM32中文参考手册 中断屏蔽寄存器(EXTI_IMR) 往对应的位写1就是开启中断,写0就是关闭中断 例如开放来自线0上的中断请求 EXTI- IMR|=1 0;//开放来自线0上的中断请求 事件屏蔽寄存器(EXTI_EMR) 参考**中断屏蔽寄存器(EXTI_IMR)**的操作 上升沿触发选择寄存器(EXTI_RTSR) 设置对应的外部中断触发事件为上升沿 上升沿就是电平从0到1 例如允许输入线0上的上升沿触发 EXTI- RTSR|=1 0;//允许输入线0上的上升沿触发 下降沿触发选择寄存器(
[单片机]
<font color='red'>STM32</font>自学笔记EXTI(外部中断)寄存器
嵌入式STM32学习笔记(3)——pwm波及呼吸灯
写pwm波函数可以调用stm32固件库函数直接生成,也可以通过中断来写pwm波;下面就介绍这两种方法,这里先说一下呼吸灯,其原理就是让LED灯由暗变亮再由亮变暗循环,类似呼吸的效果,亮-暗是一个大周期,而LED灯亮或暗是由其刷新的占空比决定,高电平时间占比长则亮,反之则暗; stm32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出。关于映射及原理大家可查手册吧,这里不做具体叙述了;个人见解:很多知识用到再仔细
[单片机]
嵌入式<font color='red'>STM32</font>学习笔记(3)——pwm波及呼吸灯
基于STM32单片机对跑马灯的控制
基于学习STM32有一段时间了,特意写下一篇关于一个简单的跑马灯 的例程,梳理思路,也希望我自己的理解能帮到一些学习STM32的初学者 //======================================================// 首先,GPIO的配置种类有8种。分别为模拟输入、浮空输入,上拉输入、下拉输入、开漏输出、推挽输出、复用开漏输出、复用推挽输出。 下面将以实例的方式讲解GPIO的设置及实现过程。 事例1:跑马灯实验 跑马灯实验的功能:LED灯进行有规律闪烁。(下面的LED灯的数量都为2个,所以关于寄存器的配置也将以两组的方式进行讲解) 首先要知道普通的IO就两种功能一个为输入,一个为输出
[单片机]
基于<font color='red'>STM32</font>单片机对跑马灯的控制
STM32系统总线
一 ARM架构 ARM架构如图所示,ARM公司只提供内核技术,而其他外设则为芯片商设计并使用,ARM收取其专利费用而不参与其他经济活动,而我们使用的STM32F103芯片则使用了ARM架构下的Cortex-M3内核,ARM架构不光光只有Cortex-M3,还有其他高中低端的内核供我们使用,简而言之,ARM只提供结构专利技术。 ARM架构不光光只有Cortex-M3,还有其他高中低端的内核供我们使用,对于具体选型可以参考其选型手册。简而言之,ARM只提供结构专利技术。 二 系统架构 ICode总线:将Cortex-M3内核指令与FLASH闪存存储器连接,指令预取在此完成 DCode总线:将Cortex-M3内核数据与
[单片机]
<font color='red'>STM32</font>系统总线
STM32再学习——时钟初始化
STM32F系列微处理器,或者说是Cortex-M3内核的MCU内,都集成了一个叫PLL的东西。PLL就是锁相回路或锁相环(PhaseLockedLoop),用来统一整合时脉讯号,使内存能正确的存取资料。PLL用于振荡器中的反馈技术,将外部的输入信号与内部的振荡信号同步,锁相环路的基本方框图如下图所示。一句话,PLL用来控制STM32F的时钟频率的。总而言之,STM32F系列MCU使用了这个东西,而我们在MCU上电之后,也就要对其正确的初始化,这样,我们才能得到我们需要的时钟配置。 本文引用地址:http://www.eepw.com.cn/article/182408.htm 在ST公司的外设固件库的示例里,对于工
[单片机]
<font color='red'>STM32</font>再学习——时钟初始化
stm32若干技巧
技巧1:关于串口接收 对于串口数据帧到检测,对于串口接收有判定帧头、尾 FIFO缓存等方式,推荐采用超时判断来确定一帧数据接收完成,尤其对于处理GPS,3G模块数据效,比判断帧头、尾效果好的多。参考网友模式 //检测超时函数 供定时器中断调用-1ms一次 // t为超时时间 __inline void Chk_TimeOut(u8 t) { if(!uartRMsg.rcOK && (uartRMsg.rcIndex =8) && (++uartRMsg.rcS =t) ) //超时之后,开始重新解码 uartRMsg.rcOK = true; } //接收函数, 供USART中断调用 __inline void Recie
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved