您现在的位置是:首页 > 正文

STM32常见错误

2024-02-01 03:00:44阅读 2
一、 在“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。 

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

网站文章

  • sql server中的存储过程调试

    调试: 在SQL QUERY中—》对象浏览器—》存储过程—》选择要调试的存储过程—》右击—》选择调试(debug)—》输入参数—》--设置完你的参数值后--点击执行,就是出现一个浮动工具条,上面有单步执行,断点设置等 ---跟踪 : 开始->程序->MS SQLSERVER->事件探查器(SQL Profiler)-->文件-->新建-->跟踪就可以...

    2024-02-01 03:00:39
  • error LNK2005: 找到一个或多个多重定义的符号已经在xxxx.obj中定义的解决方法

    总结一下,当我们在进行C/C++编程时,如果出现error LNK2005错误提示"找到一个或多个多重定义的符号已经在xxxx.obj中定义"时,通常表示在多个源文件中定义了相同的...

    2024-02-01 02:59:52
  • 【题解】UVA1252:Twenty Questions

    @vjudge 状压 可以这样设计状态 dfs(s,a)dfs(s,a)dfs(s,a)表示当前已经猜测的集合,目前还没有确定的数在sss集合里面的共同特征为aaa,还要猜几次 枚举下一次猜的位为kk...

    2024-02-01 02:59:43
  • 什么是loadsh

    什么是loadsh这个概念真不知道?但是如果你说防抖和节流那是必须知道,用别的名字我反而不知是何东东。js call、apply、bind_如花菇凉的博客-CSDN博客================...

    2024-02-01 02:59:34
  • 防止表单重复提交

    比如在购物网站支付的时候,就要避免表单重复提交。解决这个问题,可以从两个方面考虑。(1)前端a.提交之后,利用js将提交按钮禁用掉。b.提交之后,在一个新标签页打开一个页面,也就是用户的当前页面已经不再是提交页面了。(2)后端a。在提交页中隐藏一个字段值,然后在后端页面中,根据这个值来判断是否已经提交过了。b。利用数据库来防止重复提交。例如,购物账单,付款之后,会往数据

    2024-02-01 02:59:00
  • LeetCode爬楼梯

    LeetCode爬楼梯

    2024-02-01 02:58:47
  • 解决docker中/etc/default/docker配置DOCKER_OPTS 失效问题

    docker安装在桌面版ubuntu的时候,默认的配置文件/etc/default/docker 里的配置是无效的(14.04 server版并无问题),导致之前的很多工作进展缓慢,这个问题在官方文档中有出现,但是在安装步骤中,不循着问题根本找不到,非常坑爹。 解决办法是:打开/lib/systemd/system/docker.service 文件 添加一行 EnvironmentF

    2024-02-01 02:58:19
  • Python asyncio异步编程常见问题

    Python asyncio异步编程常见问题

    今天继续给大家介绍Python相关知识,本文主要内容是Python asyncio异步编程常见问题。一、asyncio编程简单示例二、asyncio编程常见问题三、报错原因及解决方案

    2024-02-01 02:58:12
  • L2-033 简单计算器(Python3)

    L2-033 简单计算器(Python3)

    团体程序设计天梯赛-练习集

    2024-02-01 02:58:06
  • 基于CART树的银行贷款风控模型实现

    基于CART树的银行贷款风控模型实现

    基于CART树的银行贷款风控模型实现

    2024-02-01 02:57:36