STM32调试过程中常见的问题及解决方法?

发布者:Harmonious88最新更新时间:2016-10-13 来源: elecfans关键字:STM32  调试过程  解决方法 手机看文章 扫描二维码
随时随地手机看文章
STM32调试过程中常见的问题及解决方法

一、 在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.” 

   解决办法: Keil MDK默认使用ULINK仿真器下载程序,在“Project --->Option for Target 'xxx' --->Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。

二、 编译工程时提示如下信息:

main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o).

main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvic.o).

main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f10x_nvic.o).

main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x_nvic.o).

main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x_nvic.o).

main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_nvic.o).

    解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。

三、调试器不能连接到STM32的问题与解决办法

    很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。

    这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。

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

这个问题的根源是:

    1. 调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。

    2. 低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了CPU的时钟致使调试器会失去与CPU的通信。

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


    有人说“我停止调试的时候,这些模块已经停止了运行,应该不会干扰到后续的调试”,这个问题要从几方面看:

    1. 调试器是通过停止CPU核心的时钟来停止被调试程序的运行,实际上被调试芯片的硬件模块并没有被复位,它们还处于使能状态,那些能够自动运行的模块只是处于暂停状态,一旦恢复了时钟之后,它们仍会继续运行。

    2. 目前常用的调试软件,不管是IAR EWARM还是Keil MDK,调试软件界面上的"复位"按钮都不能对芯片执行硬件的复位,这个"复位"按钮只能对芯片内的程序执行软件复位,即把运行指针重新指向复位地址。

    3. 使用板上的复位按钮可以手动地进行硬件复位,使所有模块(包括那些能够自动运行的模块)停止工作并恢复到复位状态。但是当调试器需要控制CPU之前,它需要先为CPU核心提供时钟,然后需要较长的一段时间做一些初始化的动作,然后才能接管CPU核心的控制权。在调试器为CPU核心提供时钟之后,用户程序就已经开始运行起来,如果用户程序在调试器接管CPU核心的控制权之前,就初始化好硬件模块并启动运行,则仍然会产生与调试器的冲突。

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

    根据以上的分析,解决这个问题的关键是,在调试器接管CPU核心的控制权之前,必须停止所有能够自动运行模块的操作,使它们处于关闭状态,要做到这一点,可以有以下几种方案:

    1. 每次退出调试状态时,先停止所有模块的运行,比如执行该模块的DeInit()操作。

    2. 在main()函数开始时,不管各模块处于什么状态,先执行该模块的DeInit()操作,然后在程序中较晚的时间或真正需要时再开启相应的模块。这样保证在刚进入调试状态时,调试器能够有充足的时间完成初始化和下载程序的操作。先执行该模块的DeInit()操作的目的是为了关闭哪些上一次操作开启的模块。

    3. 调整BOOT0/BOOT1的设置,把启动模式改变为从内部SRAM启动,再结合手工硬件复位。由于BOOT0/BOOT1的状态只在硬件复位时是有意义的,而调试器不做硬件复位,所以这样的设置不会影响调试器下载程序到Flash中,也不会影响在Flash中调试程序。

四、调试STM32程序时,某些标志位被调试软件意外清除的问题

    在调试的过程中,使用调试软件的寄存器或存储器显示窗口,可以很方便地查看外设寄存器的状态。

    很多朋友都碰到过这样的问题:在单步调试时始终不能在显示窗口看到某些标志位的变化,应该设置这些标志位的时候,窗口中却显示为0,不少人都错误地认为这是芯片的问题。

    我们知道,不少STM32外设的状态寄存器位,可以通过对某些寄存器的读操作而清除(例如I2C的I2C_SR1中的很多标志位),在调试过程中,每当程序停止在设置的断点或单步停止时,调试软件都会自动地读出所有指定的寄存器和存储器中的内容,并刷新窗口的显示,调试软件的这个读操作恰好清除了那些标志位,造成了上面描述的现象。

    有几个简单的办法解决这个问题:

  1. 关闭寄存器或存储器显示窗口。
  2. 在寄存器或存储器显示窗口中不显示这些敏感的寄存器。
  3. 不要把断点放在对这些敏感的寄存器位操作的前面,以保证这些寄存器位不被调试软件意外地操作。
  4. 看官自己添加~~~~~

五、在使用STM32的外设时,由于IO口被用作复用功能,但是外设的初始化正确,GPIO口初始化正确,外设的时钟也已开启,但是外设无法正常运行

    其中最关键的一项,大多数使用者多没有设置,就是某个IO口被用作外设的接口时,需要开启IO口的复用功能的时钟,即进行外设、IO的时钟使能时,需要如下代码:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx | RCC_APB2Periph_AFIO, ENABLE);    /* GPIOx and AFIO clock enable */

x --- 为对应的GPIO口,如:A、B、C、D、E。

    在使用时,一定要注意该要点!

六、用JLINK下载完程序后,程序开始运行并在“Build Output”栏多出如下信息:

* JLink Info: Found SWD-DP with ID 0x1BA01477
* JLink Info: TPIU fitted.
* JLink Info: ETM fitted.
* JLink Info:   FPUnit: 6 code (BP) slots and 2 literal slots
Application running ...

    在“Project --->Option for Target 'xxx' --->Utilities--->Settings”下,去掉“Reset and Run”复选框即可。

关键字:STM32  调试过程  解决方法 引用地址:STM32调试过程中常见的问题及解决方法?

上一篇:STM32在keil下使用jlink时产生错误的解决方法
下一篇:STM32的UART的GPIO管脚配置的异常问题

推荐阅读最新更新时间:2024-03-16 15:15

stm32 按键控制实验
一旦用到按键,一个关键的问题就是消抖,如果对这个问题不管的话,会引起很多难以控制的问题,最常见的就是反复进入中断导致程序飞出。 目前我手里的这款32有四个按键,上PA0是高电,左下右PE234是低电 操作步骤: 持续胡扫描key.c #include system.h #define KEY_LEFT_Pin GPIO_Pin_2 //定义K_LEFT管脚 #define KEY_DOWN_Pin GPIO_Pin_3 //定义K_DOWN管脚 #define KEY_RIGHT_PinGPIO_Pin_4 //定义K_RIGHT管脚 #define KEY_UP_Pin GPIO_Pin_0 //定义K
[单片机]
STM32】模板建立常见错误
1.新建工程的时候编译出现如下错误(MDK4.12 使用v3.4的库) ..\CMSIS\stm32f10x.h(80): error: #35: #error directive: Please select first the target STM32F10x device used in your application (in stm32f10x.h file) 解决方法:双击错误进入出错的地方,在stm32f10x.h处 #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined(STM32F10X_MD) && !defined (S
[单片机]
【<font color='red'>STM32</font>】模板建立常见错误
STM32如何高效接收串口数据?
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的地
[单片机]
<font color='red'>STM32</font>如何高效接收串口数据?
stm32---CAN通信
can.c #include can.h /************************************************************* 函数名:CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) 功能:CAN初始化 变量: //tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq //tbs2:时间段2的时间单元. 范围:CAN_BS2_1tq~CAN_BS2_8tq; //tbs1:时间段1的时间单元. 范围:CAN_BS1_1tq ~CAN_BS1_16tq //brp :波特率分频器.范围:
[单片机]
基于STM32的带触摸屏的无线解说器
本实例是以STM32F103系列单片机作为核心处理器,利用VS1003芯片进行音频解码的一种无线解说器。通过对触摸显示屏的操作,实现手持部分和终端部分二者的无线通讯。系统采用大容量的SD卡作为存储部分,通过SPI将VS1003B与SD卡的数据与STM32进行交互通信。本解说器在播放时没有出现理论上的断续情况,音质较好,占用的软硬件资源也较少,为后续的扩展留下了很大空间。 无线讲解器通常用于工厂、博物馆、景区等室外空旷场所供参观介绍用,通过事先在场所安放无线发射模块,并控制发射模块的工作范围。听众到达景点后,手上的讲解器将自动接收各个地点的无线编码信号,经解码后即可将存储在SD卡中的语音播放,以便清晰地全程收听全部介绍内容。 1
[电源管理]
基于<font color='red'>STM32</font>的带触摸屏的无线解说器
英蓓特携手ST推出STM32 Coocox开发工具
Premier Farnell集团子公司英蓓特科技日前宣布与为各个电子应用领域提供服务的全球领先企业意法半导体(纽交所: STMicroelectronics)倾力合作,共同实现了免费开源的CooCox工具链与最新STM32系列微处理器产品之间的完美结合,使开发人员可以借助STM32产品系列中600多个MCU的支持,实现各种性能和功能的提升。 CooCox是一款免费/开源的针对ARM® Cortex®-M的软件开发工具链,包括软件工具、代码组件、硬件设计和面向ARM Cortex微控制器的社区支持。使用CooCox软件工具的开发人员可从支持设备列表中轻松选择目标设备来进行创建与编译,并对STM32微控制器进行编程。
[嵌入式]
stm32时钟系统复习
1、参考资料 《STM32F1开发指南-库函数版本》-4.3小节 时钟系统 《STM32中文参考手册V10》-第六章 复位和时钟控制 RCC 2、时钟系统总结 1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。  ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。   ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG   ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC 
[单片机]
SPI造成错误位移的解决方法
情况介绍:温湿度传感器给STM32发送时钟信号和数据信号,STM32不返回任何数据,温湿度传感器的CS端由stm32控制,但是stm32的CS端由自己控制。也就是说温湿度传感器和STM32都是从机。出现的情况是会造成莫名其妙的位移,比如在正确数据前面出现一个1或者0。 经过排查发现,使用温湿度传感器造成位移的原因是因为SPI是个板载传输方式,如果外接了数据线其实SPI很脆弱的。我曾经尝试将时钟线拉出来在桌子上随便划都能让STM32都能接受到时钟信号,从而接受到数据。所以很容易多接受到一个数据然后造成位移。要修复这个位移需要重置接受counter,清空DR寄存器。 一般标准的SPI传输是不需要关注CS端的,因为复用功能里会自
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved