STM32开发常见问题解决方法汇总(不断更新)

*配置问题

1. 使用STLINKV2,在keil中首次使用下载程序时没有异常,但后边再下载时会出现

No target Connected!
Error: Flash Download failed - Target DLL has been cancelled
或在STM32cubeIDE中调试时出现Failed to start GDB server

在这里插入图片描述

首先排查引脚设置,确保STM32的SW引脚(SWDIO、SWCLK)配置正确,且在SYS mode 的debug选择Serial Wire,不然下载一次后就无法在下载了,只能通过配置BOOT引脚重新烧录。
在这里插入图片描述

如果仍然有问题 ,一般情况下是因为我们用STLINKV2直接给板子供电,但山寨调试器通常性能不稳定,会导致STM32芯片因供电不足而写保护。你可以通过以下方法判断:
*STLINK连接板子,按住“复位”键的时候,MDK魔术手里点击setting,STLINK识别了芯片。
*STLINK连接板子,BOOT0上拉,MDK魔术手里点击setting,STLINK识别了芯片。
如果以上两种情况都出现了,那就说明确实是芯片写保护了。

怎么解决呢?首先,下载STM32 ST-LINK Utility,打开软件,点击connect to the target后立即按住复位键,2s后松开复位键,让STLINK识别芯片;
在这里插入图片描述
正确识别后,点击Target->Erase Chip,完成芯片擦除。
在这里插入图片描述
重新用MDK查看STLINK是否连接板子,没问题了!

  • 当然,还有一种比较不正常的情况,就是一切配置都是正确的,STM32 ST-LINK
    Utility也能链接和擦写,但下载几次后莫名的就报错下载不了了,我的经验是重启电脑。解决!

2.STlink下载后不自动运行,需要复位后才能运行

一般大家都会在软件配置中选择Reset and Run
在这里插入图片描述
但有时会发现不起作用,那是因为在配置的Pack页中,debug description中勾选了enable,取消选择后才能生效。
在这里插入图片描述

3.STM常用的固件烧录方式

常用的烧录方式有ICP、IAP、ISP三种方式。

在这里插入图片描述

  • ICP【In circuit programming】

即在电路编程或在线编程,一般是指利用调试器通过调试接口将程序代码写进芯片存储器的过程。调试器可以是ST官方的STLINK或其它公司的产品,比如JLINK,ULink等。 这里的调试端口可以是SWD或JTAG接口。针对ICP编程方式,ST官方有提供相应的软件工具,比如STLINK_Utility,keil和STM32cubeIDE也集成了烧录工具,至于其它公司的调试器,也有配套的软件工具。
在使用STLINK时,在SWD模式下,只需要4根接线,分别为VCC、GND、SWCLK、SWDIO,但建议不连接VCC,板子单独供电,以免因供电不足出错;在JTAG模式下,JTMS、JTCK、JTDI、JTDO、JNTRST五个引脚,板卡必须单独供电。

  • IAP【In application programming】

即在应用编程。一般是指芯片里已经存在具有升级更新功能的代码在里面了,用户基于该部分功能代码再将另外的程序代码写进芯片存储器的过程。也就是说芯片里平常有两套代码,一套用于实现代码的更新升级,往往称之为用户引导代码或启动代码。另外一套就是芯片平常运行的功能代码,我们称之为用户应用代码。

  • ISP【In system programming】

即在系统编程。我们可以把该模式看做一种特殊的IAP模式,只是片内的启动代码是由芯片厂家这个特定用户出厂时写好提供的。一般来讲该段代码位于特定存储位置、用户不可更改。使用ISP方式编程的话,可以选择内嵌系统启动代码认可的通信接口,比如USART,I2C,SPI,CAN,USB等,借助于芯片厂家或第三方提供的软件工具来实现。
具体到STM32系列芯片,软件工具可以使用ST官方提供的Stm32CubeProgrammer或IDE。对于STM32芯片的ISP方式烧录编程,往往需要对硬件BOOT脚做合适的电平设置,以及对选项字进行正确配置,确保芯片从系统存储区启动、运行。另外,烧录完毕后,记得将相关BOOT脚电平进行调整,以保证下次芯片启动后运行在正确的程序空间,一般是指调整回芯片主程序区。
在这里插入图片描述
以串口烧录ISP为例,首先,计算机串口连接单片机的U1_RX、U1_TX和GND,设置Boot0接VCC,Boot1接GND,需要在烧写软件中选择 DTR的低电平复位,RTS高电平进bootloader,按复位按键,进行下载;下载完成后,Boot0接GND,Boot1接任意,按一次复位开始运行。

4.运行或调试时出现提示 break at address “0x1ffff020” with no debug information available,or outside of program code.

或者是No source available for “_end() at 0x200001e0” 等问题
在这里插入图片描述

首先,请检查自己的电路连接,是否存在ST-Link供电和其他供电同时供电的情况,如果是,请只保留一个供电。
其次,查看启动模式选择引脚BOOT0和BOOT1是否配置正确。
BOOT0 = 0时,从主flash空间启动用户程序,这是正常的启动模式;
BOOT0 = 1,BOOT1 = 0时,从系统存储器启动,当程序出现严重错误导致无法下载程序时,可尝试该启动方式;
BOOT0 = 1,BOOT1 = 1时,从内部SRAM启动,多用于调试。
如果上述方式无法解决,请重新创建工程,重新配置。极大的可能就是工程配置参数出现异常导致的。

5.生成独立的初始化c文件

如果希望生成独立的初始化文件,可在下列配置中勾选选项。
在这里插入图片描述

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

*编程中的常见问题

1.外部中断(EXTI)

先来说明一下中断和事件的理解:
事件分为可见和不可见,可见就是我们可以通过寄存器查询到其状态值,不可见就是没有查询的接口,我们无法获知。绝大多数的事件都是不可见的,但多数与中断相关联,我们可以通过中断来使用相应的事件。事件可以触发中断,也可以触发其他事件。EXTI可以捕获外部出入线电平变化等事件,还可以生成EXTI中断等中断请求。
中断会产生中断请求,并执行对应的中断处理程序.
而事件则是向其它模块发送触发信号,对于其它模块如何处理这个信号,则由模块自己来决定.
在这里插入图片描述
上图是STM芯片的外部中断事件线,可以看出,A-G端口的相同位,也就是相同编号的引脚,共用外部中断事件线,所以在引脚配置时,不能将不同端口的相同编号的引脚同时配置为外部中断。

2.使用HAL库编程,在main函数中必须首先调用HAL_Init函数,初始化HAL库

主要内容包括FLASH预读取、配置中断优先级、配置systick产生1ms时基、调用HAL_MspInit()初始化底层硬件。
HAL_MspInit()在"stm32f1xx_hal_msp.c"中进行定义。

3.对各个底层硬件的初始化,通常调用HAL_xxx_Init

该函数再回调HAL_xxx_MspInit函数实现具体初始化内容。

5.使用硬件IIC无输出

网上说是硬件bug,经过以下操作忽然可以用来,记录一下,但没有复现bug。

  1. 将HAL_I2C_MspInit函数中的__HAL_RCC_I2C1_CLK_ENABLE()提前到__HAL_RCC_GPIOB_CLK_ENABLE()前面。
  2. 提高系统时钟频率。后来尝试降回内部时钟的8MHz,bug没有复现,所以可能还会出问题,再研究。

6.PWM1模式下,只有CCR>ARR才能输出占空比100%

7.芯片内部晶振虽好用,但是精度还是和外部晶振有差距的

在秒表点灯试验中就可以明现感受到不准,所以用户时间测量、频率测量时还是要加外部晶振。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值