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

2023-10-21 03:46:21 字數 3355 閱讀 2663

一、 在“debug选项卡”下设置好**器的类型后,**程序时却提示“no ulink device found.”

解决办法: keil mdk默认使用ulink**器**程序,在“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全部添加到工程即可。 jacob注:注意官方提供的那几个。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。 在使用时,一定要注意该要点!

索要stm32相关电子元器件规格书或申请样片测试。

常见的Python面试问题

以下是一些常见的 python 面试问题以及简要说明 .什么是python,它的主要特性是什么?python 是一种高级解释性编程语言,以其可读性和简单性而闻名。主要功能包括动态类型 自动内存管理和庞大的标准库。.解释python 和python 之间的区别 python 是遗留版本,不再受支持,而...

尚普咨询 消费者调研常见问题和解决方案

一 消费者调研的意义和目的 消费者调研是指通过各种方法和手段,收集和分析消费者的信息,以了解消费者的需求 偏好 行为和满意度等方面的情况,从而为企业的市场营销提供依据和指导。消费者调研可以帮助企业 识别目标市场和目标客户,定位产品或服务的特征和优势 分析市场环境和竞争态势,发现市场机会和威胁 设计和...

孤独症孩子的常见问题行为表

孤独症孩子的一些日常行为,与其说是问题行为,其实不过是孩子暂时能力有限的情况下被迫使用的一种表达方式,与其说成让孩子 改正 不如说是我们帮孩子找寻更多的出口。 大发脾气 不要孩子一发脾气你就冷处理,或许他是因为环境因素刺激到身体而不舒服呢。先猜测原因,若是情有可原,那么帮孩子解决并教他正确的表达方法...