您的位置 首页 芯闻

STM32常见过错

一、在Debug选项卡下设置好仿真器的类型后,下载程序时却提示NoULINKDevicefound.解决办法:KeilMDK默认使用ULINK仿真器下载…

一、 在“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悉数增加到工程即可。

三、调试器不能衔接到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。

在运用时,必定要注意该关键!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/276894.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部