解决OpenOCD烧录STM32失败, 无法通过SWD连接的问题

发布者:DelightfulSmile最新更新时间:2022-08-16 来源: csdn关键字:STM32  SWD连接 手机看文章 扫描二维码
随时随地手机看文章

OpenOCD烧录STM32失败的问题

Linux下使用 OpenOCD 烧录 STM32, 出现了 Error: init mode failed (unable to connect to the target) 错误.


如果在代码中, 不小心将 PA13,PA14 的 SWD 功能关闭, 例如使用了下面的代码


rcc_periph_clock_enable(RCC_GPIOA);         // Need GPIOA clock

gpio_primary_remap(

    AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF,      // Optional

    AFIO_MAPR_TIM2_REMAP_NO_REMAP);         // This is default: TIM2.CH2=GPIOA1

或者在 STM32CubeMX 中忘记勾选 PA13/PA14 的串口调试功能, 都会导致后续烧录和连接失败, 出现


Uploading .pio/build/bluepill_f103c8/firmware.elf

xPack OpenOCD x86_64 Open On-Chip Debugger 0.11.0+dev (2021-10-16-21:15)

Licensed under GNU GPL v2

For bug reports, read

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

debug_level: 1


hla_swd

none separate


Error: init mode failed (unable to connect to the target)

in procedure 'program'

** OpenOCD init failed **

shutdown command invoked


*** [upload] Error 1

STLINK 工具 st-flash 和 st-info

首先检查一下系统中是否有st-flash和st-info命令, 没有的话需要安装


安装步骤


git clone https://github.com/stlink-org/stlink.git

cd stlink/

make

# 如果报 libusb 错误, 就安装一下 libusb-1.0-0-dev, 再make

sudo apt install libusb-1.0-0-dev

make clean

make

cd build/Release/

sudo make install

如果运行 st-info 出现下面的错误


st-info: error while loading shared libraries: libstlink.so.1: cannot open shared object file: No such file or directory

运行一下sudo ldconfig可以解决问题


通过 st-info 检查 会提示无法进入 SWD 模式


$ st-info --probe

Failed to parse flash type or unrecognized flash type

Failed to enter SWD mode

Found 1 stlink programmers

  version:    V2J37S7

  serial:     56FF6B064966485627161123

  flash:      0 (pagesize: 0)

  sram:       0

  chipid:     0x000


detected chip_id parametres


# Device Type: unknown

# Reference Manual: RM0000

#

chip_id 0x0

flash_type 0

flash_size_reg 0x0

flash_pagesize 0x0

sram_size 0x0

bootrom_base 0x0

bootrom_size 0x0

option_base 0x0

option_size 0x0

flags 0


  dev-type:   unknown

使用 st-flash 和 st-info 解决 STM32 烧录失败

在网上搜到的大部分方案, 例如这个stackoverflow的解答, 都是要到Windows下, 通过 ST-link utility 去重置擦除, 这里介绍一下 Linux 下的处理方法


st-info 使用 --connect-under-reset 参数

此时需要使用--connect-under-reset参数, 按住开发板的 RESET 键之后, 执行下面的命令, 就能正确检测到芯片信息


$ st-info --probe  --connect-under-reset

Failed to parse flash type or unrecognized flash type


detected chip_id parametres


# Device Type: STM32F1xx_MD

# Reference Manual: RM0008

#

chip_id 0x410

flash_type 1

flash_size_reg 0x1ffff7e0

flash_pagesize 0x400

sram_size 0x5000

bootrom_base 0x1ffff000

bootrom_size 0x800

option_base 0x1ffff800

option_size 0x10

flags 2


Found 1 stlink programmers

  version:    V2J37S7

  serial:     56FF6B064966485627161123

  flash:      0 (pagesize: 1024)

  sram:       20480

  chipid:     0x410


detected chip_id parametres


# Device Type: STM32F1xx_MD

# Reference Manual: RM0008

#

chip_id 0x410

flash_type 1

flash_size_reg 0x1ffff7e0

flash_pagesize 0x400

sram_size 0x5000

bootrom_base 0x1ffff000

bootrom_size 0x800

option_base 0x1ffff800

option_size 0x10

flags 2


  dev-type:   STM32F1xx_MD

如果是这种情况, 说明是PA13/PA14的功能复用问题, 可以通过固件擦除解决问题


st-flash 擦除固件

st-flash 同样地要加上--connect-under-reset参赛, 在按住 RESET 键后执行下面的命令


$ st-flash --connect-under-reset erase

st-flash 1.7.0-184-g468b1d2

Failed to parse flash type or unrecognized flash type

2022-02-14T22:51:20 ERROR common.c: Soft reset failed: timeout


detected chip_id parametres


# Device Type: STM32F1xx_MD

# Reference Manual: RM0008

#

chip_id 0x410

flash_type 1

flash_size_reg 0x1ffff7e0

flash_pagesize 0x400

sram_size 0x5000

bootrom_base 0x1ffff000

bootrom_size 0x800

option_base 0x1ffff800

option_size 0x10

flags 2


2022-02-14T22:51:20 INFO common.c: STM32F1xx_MD: 20 KiB SRAM, 0 KiB flash in at least 1 KiB pages.

Mass erasing

在出现Mass erasing后, 不能立即断电, 需要等待一小段时间, 之后用st-info --probe检查是否成功, 如果还显示Failed to enter SWD mode, 就再重复一遍上面的操作.


如果st-info --probe能直接检测到芯片, 就说明SWD功能已经恢复, 可以继续在 Linux 下用 OpenOCD 愉快地烧录 STM32 了.


关键字:STM32  SWD连接 引用地址:解决OpenOCD烧录STM32失败, 无法通过SWD连接的问题

上一篇:沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录
下一篇:PlatformIO 创建 libopencm3 + FreeRTOS 项目

推荐阅读最新更新时间:2024-11-07 12:13

STM32STM32端口复用和重映射(AFIO辅助功能时钟)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) 端口复用功能 端口复用的定义 STM32有许多的内置外设(如串口、ADC、DCA等等),这些外设的外部引脚都是和GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫复用。详细的可以参考《STM32F103ZET6数据手册》p30的内容,表格的倒数第二栏就表示端口复用功能。 比如说,STM32的串口1的引脚对应的I/O位PA9、PA10。而PA9、PA10默认的功能都是GPIO,所以说当PA9、PA10引脚作为串口1使用的时候就是端口复用。
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>端口复用和重映射(AFIO辅助功能时钟)
STM32在keil下使用jlink时产生错误的解决方法
当STM32在keil下使用jlink时产生错误得时候该怎么办? 最近一段时间一直在学习STM32和ucos的移植,使用的开发环境是keil u4版本。仿真器是80元买的jlink。 在学习了STM32固件库和ucos内核与移植相关的程序之后,写了一个流水灯程序,准备下载到板子上看看情况。哪知程序还没有下进去,在debug时,keil的错误提示到:Error: Flash download failed- Cortex-M3 感觉这么错误很普遍,也是初学者常常遇到的错误,下面我就将这个错误产生的原因和解决方法赘述一下: 错误产生的原因和分析,解决。 首先,我们看到提示信息是有关flash的,那么我们来查看一下STM3
[单片机]
<font color='red'>STM32</font>在keil下使用jlink时产生错误的解决方法
STM32 ST-LINK Utility介绍、下载、安装、使用方法
Ⅰ、写在前面 本文讲述的内容是STM32 ST-LINK Utility介绍、下载、安装、使用方法,如需要了解更多关于STM32相关的文章,可以到我博客,或微信公众号查看并下载。 STM32 ST-LINK Utility这个软件工具其实主要就是配套“ST-LINK”这个下载工具一起使用的上位机软件。因此使用STM32 ST-LINK Utility上位机软件需要有一个ST-LINK工具才行。它的功能和J-Link对应的工具类似,用于烧写代码。 STM32 ST-LINK Utility工具在产品开发过程中测试一些其他版本的代码,可以直接下载hex,而不用打开工程再编译去下载。 当你开发完一个STM32产品,需要量产的
[单片机]
<font color='red'>STM32</font> ST-LINK Utility介绍、下载、安装、使用方法
浅析STM32 FSMC操作LCD的过程
FSMC称为灵活的静态存储器,它能够与同步或异步存储器和16位PC存储器卡连接,STM32F4的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。 FSMC框图 从FSMC框图可以看到,FSMC将外部设备分为2类:NOR/PSRAM设备和NAND/PC卡设备。所有外部存储器共享地址、数据和控制信号,但有各自的片选信号。FSMC 一次只能访问一个外部器件。 NE4相连,即利用FSMC_NE4实现对LCD的片选;另外SRAM芯片的片选接口与FSMC_NE3相连,即利用FSMC_NE3实现对SRAM芯片的片选。FSMC本身就是静态存储器控制器,通过FSMC接口访问SRAM是理所当然的
[单片机]
浅析<font color='red'>STM32</font> FSMC操作LCD的过程
STM32 通用定时器 介绍
STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 时钟源问题: 名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在 APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个
[单片机]
<font color='red'>STM32</font> 通用定时器 介绍
STM32 Keil查看程序占用ROM和RAM
1. 编译生成的map文件中code , RO ,RW, ZI 表示内容 Code为程序代码部分 RO-data 表示 程序定义的常量const temp; RW-data 表示 已初始化的全局变量 ZI-data 表示 未初始化的全局变量 Program Size: Code= 18248 RO-data=320 RW-data=260 ZI-data=3952 Code, RO-data,RW-data ............flash RW-data, ZIdata...................RAM 2. 编译生成的文件中有一个map类型的文件,使用记事本打开该文件,下滑到最下面
[单片机]
<font color='red'>STM32</font> Keil查看程序占用ROM和RAM
stm32的堆与栈
首先我们来认识一下堆与栈的含义(): ​(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。 (2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。 (3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。 (4)文字常量区:常量字符串就是存放在这里的。 (5)程序代码区:存放函数体的二进制代码。 解释的名词有点多了,但这不是重点,重点是看例子!
[单片机]
stm32之SPI学习
SPI应用是相当的广了,同步串行总线,同步同步当然需要时钟信号来统一了,这样通讯双方通讯时就比较默契没那么延迟了。应用于中低速场合。 学起来从哪些地方入手呢?如下: SPI概念与特点:不多说,串行,需要同步信号 主从结构的 CS(片选) SCK SDI SDO 全双工 一主控多从 8或16位数据通信 其它特点:8个主模式波特率预分频系数 fpcll/2 主模式和从模式下快速通行 并支持切换 编程MSB 或LSB在前 专用发送和接受标志可促发中断 有SPI忙标志位 支持硬件CRC校验,发送模式下crc值作为最后一个字节被发送,接受模式下最后一字节自动CRC校验
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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