浅析STM32调试过程中的几个相关问题

发布者:daasddla最新更新时间:2023-09-01 来源: elecfans关键字:STM32  调试过程  IDE 手机看文章 扫描二维码
随时随地手机看文章

总的来讲,单片机调试是单片机开发工作必不可少的环节。不管你愿不愿意,调试过程中总会有各种不期而遇的问题出现在我们面前来磨砺我们。这里分享几点STM32调试过程中与开发工具及IDE有关的几个常见问题,以供参考。


1、做低功耗调试时连接不上目标板

默认情况下,当MCU进入低功耗模式后,内核时钟停止工作,调试连接将中断。不过,通过设置DBGMCU寄存器控制位,即使进入低功耗模式,还是可以进行一定程度的调试。

在保证DGBMCU控制位正确配置前提下,还需注意SWD调试脚没有被配置为【analog state】模拟输入状态。我们在具体应用时为了降低功耗可能会将芯片的包括SWD调试脚在内的GPIO配置为模拟功能,这样会到导致调试器连接不上情况。此时在连接前先做下复位,有时可能多做几次复位才连接得上。

当然,上面是指低功耗模式下连接不上目标板的情况。如果是一般性的连接不上,原因就更多了,比方硬件器件、连接线路、驱动程序、用户代码本身等,这些要结合具体情况来分析。关于低功耗模式的调试支持,请参考各个系列参考手册的相关描述。


2、打印输出失败

通常我们可以借助于串口助手做打印输出。如果使用STM32虚拟串口,注意PC端的虚拟串口驱动程序安装正常。相应软件包编号是STSW-STM32102。

再就是注意配置UART相关参数配置时,字长是包含了校验位的。比方8位字长,它是由 7个数据位,1个校验位组成。还有,VCP不支持字长在8位以下的传输。

另外,对于那些基于ARM CORTEX M3/M4/M7内核的STM32芯片,我们可以使用SWO方式做打印输出。

这里要注意的是:

a、不是所有MCU系列都支持SWO打印输出;目前仅基于ARM Cortex M3/M4/M7内核的芯片支持;

b、目前只支持SWD模式,不支持JTAG模式;

c、在调试环境里需做适当配置和代码补充,涉及到DBG_MCU_CR寄存器的控制位。

3、低功耗应用中功耗数据异常

这个原因很多,比方,测量方面的原因,不属于MCU的功耗也算进来了;有些外设及管脚没处理好,导致漏电流还在产生; 或者低功耗模式选择不对,或者进了低功耗模式马上又醒了而误测误判等等。

这里再提醒1点:

设置进入低功耗模式后,确认是否还在调试模式。即检查DBGMCU寄存器中与低功耗调试配置有关的寄存器控制位,确保关闭了低功耗调试状态。做低功耗数据测试时,最好不要还连接着调试器,给我们带来困扰。前不久就有人反映,用别的调试器连接着STM32目标板测得功耗与用STLINK调试器连接着测得功耗大不 一样,改用STLINK就合理了。

4、在Normal/System Reset模式下SWD连接不上目标板

此时我们可以尝试换个连接模式,比如Connect Under Reset,或者换个复位模式,比如Hardware Reset 。

如果说借助STLINK,即使使用Connect Under Reset或Hardware Reset方式还连接不上呢?我们可以查看下STLINK的NRST脚与目标板上的MCU的NRST脚是否相连了。如果是nucleo板的话,还需确认下跳线SB12是否为连接状态。

5、MCO脚无时钟信号输出

我们在STM32调试过程中,有时需要引出主时钟进行输出监视,即将主时钟通过MCO脚引出观察。

要想正确输出,MCO做正确配置是必须的了。当然用CubeMx配置的话一般不会有啥大问题 。不过有个地方要注意,那个GPIO的输出速率参数要合适配置,不同STM32系列的GPIO最大可输出速率在数据手册上都明确出来了。当MCO输出时钟频率较高以至于超过GPIO的输出能力时,这时需要考虑先做分频后再来做观察。

一般来讲,当MCO的输出频率在1Mhz以上时,如果观察到的波形带有很严重的噪声或者扁平的小幅度信号,甚至看不到输出的时候,我们可以考虑下是否那个OSPEED参数设置得太小了;如果说看到周期较长、幅度较大带有明显上下峰值过冲情形的波形,我们可以考虑下是否那个OSPEED参数设置得太大了。

6、没法对某些变量进行计算和监控或无法设置断点

这个原因较多,具体到调试环境,很可能跟你编译环境的优化等级配置有关。

我们在MCU调试过程中,往往会用到编译器的优化功能来提升芯片的性能和精简代码空间。不过,经过代码优化,往往可能给我们调试带来些影响,主要体现在下面几个方面:

a、 设置断点方面出现障碍,有些代码行没法做断点的设置;

b、 无法对某些变量进行观察;

c、 单步调试时出现代码运行“不连续”的情形,即执行到的地方和我看到的地方不一致;

因此,为了实现有效调试,我们在通过编译器做优化时要选择合适的优化等级。基本原则是不影响调试体验的前提下保障编译效率。一般来讲,在调试时建议将优化等级设置在较低水平。比方KEIL MDK 推荐调试时将优化等级设置在-O1, IAR 推荐调试时将优化等级设置在-None,GCC推荐调试是将优化等级设置在-Og.其实,编译器的优化等级设置越高,对代码的规范性要求以及我们对编译器的了解程度也越高。经常有人代码优化前程序运行得好好的,代码优化等级调高好程序功能变得面目全非了。

上面提到的几个问题及应对措施,都是些可能性的提示或提醒,仅供参考,毕竟调试过程中出现的一个故障现象往往可以映射出多种应用情形及具体原因。


关键字:STM32  调试过程  IDE 引用地址:浅析STM32调试过程中的几个相关问题

上一篇:如何使用STM32通用Bootloader让OTA更加Easy
下一篇:STM32单片机对CAN过滤器的设置方法

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

iar下的stm32启动代码分析
使用的芯片是 STM32F103VET,编译器使用 IAR ARM V5.5 设置头文件查找路径,例如: $PROJ_DIR$.. $PROJ_DIR$......LibrariesCMSISCM3CoreSupport $PROJ_DIR$......LibrariesCMSISCM3DeviceSupportSTSTM32F10x $PROJ_DIR$......LibrariesSTM32F10x_StdPeriph_Driverinc 预定义的symbol 为,HD为high desity 的意思 USE_STDPERIPH_DRIVER STM32F10X_HD 有两个符号是系统默认的,看名字就应该知道什么了
[单片机]
STM32入门之旅(第一天)-------stm32概述
博主这几天面试几家嵌入式有些受挫,可能是因为自己一开始给自己的定位太高,高估了自己,所以这几天静下心来整理以前的知识,当成复习吧,小伙伴们一起见证。跑春招的小伙伴可以看看,可能面试官就喜欢问这些。下面就不发牢骚了,开始第一天的学习。 以STM32F407ZET6 为例 ARM Cortex™-M4 处理器是由 ARM 专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场。高效的信号处理功能与 Cortex-M 处理器系列的低功耗、低成本和易于使用的优点的组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音视频和工业自动化市场的新兴类别的灵活解决方案。 ARM 的Cort
[单片机]
小窥STM32内部时钟
在电子设计竞赛中,我们有时候希望能够对机器人云台发射机构的摩擦轮进行测速,一是为了摩擦轮斜坡启动不至于启动电流过大,二是为了防止摩擦轮在发射子弹过程中转速受到拨弹的影响以致转速波动。 在初期,我们的方案有两个,一是使用AS5048编码器测量转速,二是使用霍尔传感器测量转速。在对两个方案进行代码验证时,由于AS5048在国内的使用较少,资料很少,硬着头皮看它的英文资料,发现AS5048实际上是绝对式编码器,并不适于测量转速如此之快的摩擦轮,但是鉴于STM32F4的强大(高频处理能力),最后还是使用两次平均的方法求取出了摩擦轮的转速,关于AS5048的相关测速方法以及代码有机会再说。 接着好好谈一下我们所使用的霍尔传感器测速。在深入了
[单片机]
小窥<font color='red'>STM32</font>内部时钟
STM32 硬件I2C外设
I2C 框图 通信引脚   输入的引脚有三个,SDA 数据传输引脚,SCL 时钟引脚, SMBA用于SMBUS警告,在 I2C 中并未用到。这些引脚实际对应的硬件引脚可以在 数据手册 的引脚定义中查到。这里小结如下: 时钟控制   时钟控制决定了 SCL 的时钟频率,决定了数据的传输速率。其对应的的寄存器是 CCR 可以配置 I2C的模式。   这个寄存器的15位确定 I2C 处于什么模式,11:0位具体配置频率。 数据控制   发送数据,数据先被写入数据寄存器,移到数据移位寄存器,再一位一位交由数据控制从 SDA 端口发送出去。   而框图下面的比较器,是在STM32作为从机,主机呼叫时用于比较。再下面的地址寄
[单片机]
<font color='red'>STM32</font> 硬件I2C外设
STM32 HAL 库学习笔记之-------(系统时钟配置)
使用CubeMX工具,让开发者不用理会底层的实现,是整个配置变简单 一、准备工具STM32_CubeMX ST官网可下载 http://www.st.com/content/st_com/en/search.html#q=cubemx-t=tools-page=1 二、打开STM32_CubeMX开始配置,使用内部RC,最大倍频至64MHZ,芯片大于64MHZ,应该选择HSE 已STM32F103为例子 HSI配置 HSE配置 三、以下是STM32F103 HES 72MHZ配置例子: 工具生成基本直接可以使用,需要注意是,外部晶振源,有8khz(默认),12khz,可以在System_stm32f1xx.h修改
[单片机]
STM32入门学习经验总结
1、为什么要把时间花在“犹豫”上? 经验总结:每当我们在入门之前(ARM是这样,DSP也一样),总会会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。 大家一般都是从51单片机过来的,回想一下,我们之前学单片机时如何入门呢?实际上都是先看书(理论),再玩板子(实践)。严格地说,应该是模仿实验。熟悉之后才会自己写程序代码实现某个功能。因此,如果你正在咨询STM32;如果你正对STM32心潮澎湃;如果你想入门STM
[单片机]
STM32生态系统—SBSFU初体验
准备工作 下载SBSFU固件 启动SBSFU固件的运行 首次运行SBSFU 首次下载用户固件 用户应用运行 生成新版本用户应用代码 从用户程序(版本A)下载新用户程序(版本B) 重启后运行新版本用户程序 (版本B) 同时下载sbsfu和初始用户代码 下载SBSFU_UserApp.bin 启动SBSFU_UserApp.bin的运行 下载SBSFU_UserApp.bin后,启动 从SBSFU下载新用户程序(版本D)
[单片机]
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