写第一个STM32程序常见错误及解决方法
- 格式:doc
- 大小:179.00 KB
- 文档页数:8
STM32 单片机常见的工作异常现象分析及解决方案贴了两块样板,烧写同样的固件。
其中一块工作正常,但是另外一块出现了很奇怪的现象:在线调试正常;每次烧写完后工作正常;重新上电有时候工作正常,有时候工作不正常;工作不正常时,按下复位按键,恢复正常。
工作异常现象:main 函数中的系统运行指示灯不闪烁,但是初始化过程中点的一个灯是亮的!说明程序运行一段时间后,不工作了。
由于在线调试模式,板子工作正常,无法通过在线调试的方式判断程序运行的异常状态。
分析可能的原因:1、初始化过程中,程序陷入死循环。
但程序初始化过程中,没有while (1)死循环的代码。
2、板子上电后不断复位,导致无法进入main 函数中的while(1)循环。
问题查找:硬件:1、确认BOOT0 管脚接10kΩ欧电阻下拉到地;2、RC 上电延时复位电路中,R 为10kΩ,C 由0.1uF 改为10uF,现象依旧;3、MCU 3.3V 电源纹波很小,排除电源问题。
好像从硬件上查不出什幺问题。
只能从板子上唯一点亮的灯下手了。
软件:1、好像跟硬件复位没什幺关系,为了确认板子是不是在不停复位,在点亮的那个灯前加了100ms 延时,如果是在复位,那灯就应该不停闪烁。
但那个灯还一直是亮的,说明是程序运行出错,不运行了。
2.不断修改led 灯在初始化代码中的位置,最终定位到导致运行出错的代码:配置一个GPIO 为外部中断,跳变沿触发,上拉。
把上拉改为NOPULL,工作一切正常。
问题定位:配置为外部中断的GPIO 悬空导致。
之前工作正常的样板是一直有连接到那个IO 脚的外接模块,这个工作不正常的没有接,导致IO 管脚电平不确定。
由于电平的不确定,在初始化的瞬间有一个跳变沿,导致程序进入外部中断服务函数。
在中断服务函数中,要读取一个定时器的寄存器的值,但是要读取的定时器可能还没有完成初始化,导致读取失败,程序运行异常。
解决办法:1、PULL 模式有PULLRISING 改为NOPULL;2、timer 在这个外部中断之前进行初始化。
stm32 error_handler 处理技巧文章题目: STM32 error_handler 处理技巧导言:STM32是一款常用的嵌入式系统开发板,无论是初学者还是经验丰富的嵌入式开发者,都有可能在使用中遇到各种错误,并且经常需要处理这些错误。
本文将详细介绍STM32 error_handler处理技巧,向读者展示如何高效地处理错误,提高嵌入式系统的稳定性和可靠性。
第一部分: STM32 error_handler 概述1.1 简介当STM32系统运行过程中发生错误时,MCU会通过中断或者其他方式发送错误信号。
此时,error_handler函数会被调用,它的主要责任是打印错误信息和采取相应措施,以防止错误的进一步蔓延和导致系统崩溃。
1.2 error_handler 原理error_handler函数是一段特定的代码段,它会在系统发生错误时被调用。
该函数不仅负责处理错误,还需要将错误信息传递给开发者。
主要的目标是根据错误类型采取适当的措施,并尽可能地恢复系统的正常运行。
第二部分: STM32 error_handler 处理方法2.1 确定错误类型在处理错误之前,首先需要确定错误的类型。
这可以通过查看相关文档和参考手册来实现。
常见的错误类型包括内存溢出、外设故障、软件bug 等。
通过确定错误类型,可以更加准确地采取相应的解决措施。
2.2 错误信息打印一旦确定了错误类型,就需要将错误信息打印出来,以便更好地排查和修复错误。
在错误信息中应该包含当前错误发生的位置、错误的原因和可能的解决方案。
这些信息可以通过串口输出,或者使用调试工具实现。
2.3 采取适当的措施根据错误类型和错误信息,选择适当的措施来处理错误。
这些措施可能包括重启系统、重新初始化外设、软件Bug修复等。
确保在采取措施之前备份关键数据,以防止数据丢失和其他未知问题发生。
第三部分: STM32 error_handler 最佳实践3.1 检查错误处理代码编写错误处理代码时,务必对其进行仔细检查和测试。
STM32 新手常见的一个错误并给出解决方法STM32 新手常见的一个错误并给出解决方法程序错误解决:1...\OutProj\test.axf: Error: L6218E: Undefined symbol SystemInit(referred from startup_stm32f10x_md.o).这个错误很明显提示我们错误就是:没有定义SystemInit这个符号,然后参考startup_stm32f10x_md.o但是这个是由startup_stm32f10x_md.s 生成的,一般.o 文件是由.c 或者.s 生成当找到错误的原因,我们就可以进去startup_stm32f10x_md.s 文件中找到定义SystemInit 这个文件。
在此文件里面可以找到SystemInit 的所在:Reset handlerReset_Handler PROCEXPORTReset_Handler [WEAK]IMPORT __mainIMPORT SystemInit LDR R0, =SystemInit BLX R0LDR R0, =__mainBXR0ENDP原来在复位中断服务函数里面,调用了SystemInit 这个函数,而这个函数在.s 文件里面没有定义。
所以解决的办法有下面三个1.在外部(其他任何.c 文件里面)定义SystemInit 这个函数,哪怕是个空函数也可以。
2.把IMPORT SystemInitLDR R0, =SystemInitBLXR0这两句话注释掉或者去掉。
3.可以添加system_stm32f10x.c 这个库文件,到工程里面,也可以解决。
但是第三种方法比较麻烦,因为如果你自己定义了一些函数,也许和system_stm32f10x.c 有冲突那么就要改成一样的函数名字或者变量名。
不推荐使用这种方法。
4.当然你也可以重新编写startup_stm32f10x_md.s 这个文件。
最近一段时间一直在学习STM32和ucos的移植,使用的开发环境是keil u4版本。
仿真器是80元买的jlink。
在学习了STM32固件库和ucos内核与移植相关的程序之后,写了一个流水灯程序,准备下载到板子上看看情况。
哪知程序还没有下进去,在debug时,keil 的错误提示到:Error: Flash download failed-"Cortex-M3"感觉这么错误很普遍,也是初学者常常遇到的错误,下面我就将这个错误产生的原因和解决方法赘述一下:错误产生的原因和分析,解决。
首先,我们看到提示信息是有关flash的,那么我们来查看一下STM32F103XB的数据手册关于这部分的描述(我使用的芯片是STM32F103RB,有128kflash。
)知道了原来flash在此芯片中的地址是从0x0800 0000到0x0801 FFFF 这段,也就是说这段存储空间是用来存储程序。
而在STM32芯片方面,它又有一个规则,那就是芯片启动的方式,如果你把程序下载到了flash中,那么在复位芯片之前或者通电之前,要将boot0,boot1两个引脚拉到高电平,这样在启动时,芯片初始化之后,运行程序代码才是从flash 地址开始执行的。
于是,我们来查看一下keil中仿真器的设置,是不是正确,设置的选项在keil软件的project-options for target中的Utilities中,先来查看下仿真器是否选对,然后点settings,弹出如下菜单:查看一下programming Algorism 下的flash地址是否正确,如果不正确则会引起开始那个错误的提示信息,如果正确还是出现那个错误,那么按照官方给的解决方法是,删除现有的flash 地址,重新配置一下,记得要选对芯片型号和地址空间。
配置好之后点击OK退出。
然后再查看一下Target中的地址,是否跟你重新添加的一致,如果一致,那么点OK退出。
stm32error_handler处理技巧错误处理是嵌入式系统开发中非常重要的一部分,它帮助开发者在出现异常情况时能够提供适当的处理方式,避免系统崩溃或者产生不可预知的结果。
在STM32系列中,使用Error_Handler函数来处理错误是常见的做法。
下面我将为你详细介绍一些STM32的error_handler处理技巧。
1.全局异常处理:在STM32中,可以通过重写`Error_Handler(`函数来实现全局异常处理。
该函数默认定义在文件`stm32l4xx_hal.c`中。
在该函数中,你可以根据不同的错误类型进行相应的处理。
例如,在发生硬件错误时,可以通过重启系统来恢复正常操作,或者发送错误信息到串口输出等。
以下是一个例子,展示了如何在发生硬件错误(比如硬件初始化失败)时重启系统:```cvoid Error_Handler(void)while(1)HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED灯HAL_Delay(500); // 延时500msHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 熄灭LED灯HAL_Delay(500); // 延时500msNVIC_SystemReset(; // 重启系统}```你可以根据实际需求,在需要处理的错误类型下添加相应的代码。
2.中断异常处理:在STM32中,中断异常也是常见的错误类型。
当中断异常发生时,你也可以通过重写`Error_Handler(`函数来进行处理。
例如,你可以在该函数中记录并输出错误日志,以便后期分析和调试。
以下是一个示例代码,展示了如何在发生中断异常时记录错误日志到串口输出:```cvoid Error_Handler(void)printf("Error: Interrupt Exception Occurred!\n");printf("Error Details: %s\n", error_message); // 这里需要自己定义error_message变量while(1) {} // 系统停止在此处```你可以根据实际需求,在不同的中断异常发生时添加相应的处理代码。
STM32学习总结编译出错问题1、..\FWlib\src\stm32f10x_flash.c(984): warning: #223-D: function"assert_param" declared implicitly解决方法:是表示该函数没有声明,一般是因为stm32f10x_flash.c头文件没有包含stm32f10x_conf.h导致的,只要在文件首位加上#include “stm32f10x_conf.h”就可以了2、VotageMeasure.c(440): warning: #223-D: function "power_all_on" declaredimplicitly解决方法:是power_all_on函数没有定义或者没有在头文件里面声明,添加定义或者声明就可以了3、... /Keil/ARM/INC/ST/STM32F10x/stm32f10x_type.h(23): error: #256: invalidredeclaration of type name "s32" (declared at line 470 of " ... /stm32f10x.h")”解决方法:一般是因为版本库不同,我的解决方案是添加自己的头文件#include “stm32f10x_conf.h”ADC采集错位问题,解决方案:如下图最后一栏中说明,此处使用了1、2的方法查了一下,归纳了一些人的方法:1,对ADC初始化时,先复位一下ADC1设备ADC_DeInit(ADC1);2.在ADC初始化后,开始软件转换ADC_SoftwareStartConvCmd()后才执行DMA_Cmd(DMA_Channel1,ENABLE);3.在系统进入休眠模式,停止ADC时,执行ADC1_CR2&=0XFFFFFEFC之后的以前的。
stm32学习之错误汇总(仅仅就我学习过程中所遇到的)1.Error:Flash Download Failed-"Cortex-M3"出现这处问题通常是MDK中的Flash的编程算法没有配置或没有配置正确,通俗的讲,就是我们没有配置好下载的环境,导致程序⽆法下载在这⾥,主要指的是没有添加cpu⽀持的flash错误点击mdk中的对进⾏配置,点击flashdownload,点击add 添加cpu⽀持的flash,根据⾃⼰的stm32来配对,我的是stm32f10x high-density flash 512k,此条错误解决2.程序编译成功,下载成功,但是开发板不显⽰效果mdk没有对j-link进⾏匹配点击mdk中的,点击debug,选择j-link/j-trace cortex,程序下载成功,效果实现3.Error:target dll has been cancelled.debugger aborted表⾯意思⽬标DLL已经cancelled.debugger中⽌可能是硬件仿真未匹配,解决1. 7⽉28⽇,不过奇怪的是昨天我把这⼀栏改了的,但今天重新开程序,它⼜变成了4.7.29学习LCD -FSMC彩屏显⽰的时候出现passing 'char[16]' to parameter of type 'const u8*' (aka 'const unsigned char*') converts between pointers to interger types with different signs 相关的类似报错的原因就是输⼊显⽰屏的字符串变量⼀定要是char,不能是u8,unsigned char我把所有相关的函数变量参数的类型改成char就解决对了问题.5.8.3学习定时APP\瀹氭椂鍣╘time.h(4): warning: #1295-D: Deprecated declaration time_init - give arg types使⽤函数前⼀定要声明APP\瀹氭椂鍣╘time.c(23): warning: #1-D: last line of file ends without a newlineAPP \瀹氭椂鍣╘time.c(23):警告:#⼀维:⽂件的最后⼀⾏没有换⾏符结束。
一、在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.”解决办法:Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。
二、编译工程时提示如下信息:main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10 x_nvic.o).main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvi c.o).main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f 10x_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_n vic.o).解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。
三、调试器不能连接到STM32的问题与解决办法很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。
STM32串口通讯,第一个数据出错问题的排除STM32串口通讯,第一个数据出错问题的排除使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。
换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。
错误依旧。
故障排除过程:1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。
2、使用单步调试,单步运行各个发送指令,都正常。
能收到0x01 0x02 0x03 0x04的数据。
间接的排除了不是电脑软件的问题,而是其他的错误。
3、单步调试运行虽然正常了,但连续运行时,错误依旧。
现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下USART_SendData(USART2,0x01); //Awhile(USART_GetFlagStatus(USART2, USART_FLAG_TC) ==RESET); //BUSART_SendData(USART2,0x02); //Cwhile(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);USART_SendData(USART2, 0x03);while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);USART_SendData(USART2, 0x04);while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。
●main.c: Error: command-line: #992: invalid macro definition: 答案: STM32F10X_E_STDPERIPH_DRIVER宏定义标识符错误。
输入要正确,逗号隔开●..\USER\stm32f10x.h(96): error: #35: #error directive: "Pleaseselect first the target STM32F10x device used in your application (in stm32f10x.h file)“答案:第一个宏定义标识符“STM32F10X_HD”书写错误。
● ..\STM32F10x_FWLib\src\misc.c(178): warning: #223-D: function“assert_param” declared implicitly同时还有一堆定义找不到。
答案:第二个宏定义标识符” USE_STDPERIPH_DRIVER”书写错误●..\STM32F10x_FWLib\src\stm32f10x_tim.c(23): error: #5: cannotopen source input file "stm32f10x_tim.h": No such file or directory 头文件路径找不到。
加入path的路径为inc子目录,不是src子目录。
或者inc根本就没有加入头文件路径。
● SYSTEM文件夹,库函数模板必须从库函数实例中复制,不能从寄存器实例中复制。
●严格按照步骤来。
不要马虎●跟光盘中的模板对比,每一步去核对,文件是否加对了,路径是否对了,配置是否对了。