写第一个STM32程序常见错误及解决方法

合集下载

STM32单片机常见的工作异常现象分析及解决方案

STM32单片机常见的工作异常现象分析及解决方案

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 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新手常见的一个错误并给出解决方法

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在keil下使用jlink时产生错误的解决方法 (1)

STM32在keil下使用jlink时产生错误的解决方法 (1)

最近一段时间一直在学习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处理技巧

stm32error_handler处理技巧

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编译出错处理

STM32编译出错处理

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学习之错误汇总(仅仅就我学习过程中所遇到的)

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)

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):警告:#⼀维:⽂件的最后⼀⾏没有换⾏符结束。

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

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

一、在“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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
出现这个错误是因为SystemInit这个符号没有定义,这个其实是一个函数,定义在system_stm32f10x.c中,但是这个文件却在Keil的安装路径下。
解决办法:
还是右击lib_src,然后如图提示:
然后打开目录如下图:
然后把找到的system_stm32f10x.c添加进去。再点Build,就会发现所有错误都已经被解决掉了。这时就可以生成下载.hex文件了。如图:
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure PE.0,PE.1,PE.2,PE.3,PE.4,PE.5,PE.6,PE.7 as Output push-pull */
GPIO_InitStructure.GPIO_Pin = 0x00ff ;
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2); /
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Delay_ms(uint16_t counts)
{
uint16_t i;
while(counts--)
{
i=2000;
while(i--);
}
}
void main(void)
{
RCC_Config();
GPIO_Config();
while(1)
{
GPIO_SetBits(GPIOA,0xff);
Delay_ms(500);
GPIO_ResetBits(GPIOA,0xff);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /
RCC_PLLCmd(ENABLE);
Delay_ms(500);
}
}
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2); /
C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(96): error: #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
点击 ,打开的界面中选择 ,然后 前面的勾选上。再重新点击Build,就可以生成烧录文件了。
最后整个程序如下:
#include "stm32f10x.h"
void RCC_Configtus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
这是说stm32f10x.h中要求工程在预编译时通过一个字符串,来识别所用的芯片FLASH大小,然后确定头文件中哪些语句有效。ST把STM32按FLASH大小尺寸来归类的,具体在STM32参考手册里面有。
解决办法:请点击
中的
打开的界面中选到 选项,然后Define里面输入STM32F10X_MD(因为这个实验板上用的STM32F103C8T6对应这个“中等容量的FLASH”,换做其他芯片不一定是这个字符串),如图:
然后点击OK。
再 ,然后会出第二个错误:
C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(8297): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /
RCC_PLLCmd(ENABLE);
1.启动KEIL,创建工程以后,先用 创建文件,然后什么也不干,直接点击保存,保存到你的工程文件夹下面,命名为main.c(其他也可以,命名为main.c是为了方便你同其他的C文件快速区分开来)。
然后输入以下几行代码:
#include "stm32f10x.h"
void main(void)
{
}
然后点击 Build,会有以下报错信息:
再点击OK。然后再Build,你会发现第二个错误已经解决了,但是出现了一个新错误,这个错误我们先不管。
2.我们先添加下面这么一段代码:
void RCC_Config(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
}
先不解释这上面代码的意义。在main函数中调用:
void main(void)
{
RCC_Config();
while(1)
{
}
}
然后点击Build,会出现15处错误。
之所以会出现如此多错误,是因为上面代码中用到的一些函数没有被声明或者定义过。这些函数来自于STM32的标准外设库函数(通常称之为固件库),在stm32f10x_conf.h这个头文件中包含了所有外设的头文件.h,每个外设头文件都有一个对应的.c源文件与之对应。
解决办法:
右键点击
然后Add Group,重命名文件夹为比如lib_src。再右击该文件夹,出现:
选择 ,然后打开STM32F10x_StdPeriph_Driver文件夹下的src文件夹,添加以下几个文件:
然后重新Build以后,还会出现一个错误:
.\LED.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).
这说明文件包含的路径没有设置好。
解决办法:
按上面所述选到 选项。然后在
下选择 ,再点击 ,然后打开目录找到固件库里面的
这个文件(最好能把这个文件夹复制出来保存到一个纯英文路径的目录下),然后选择中里面的inc文件夹,然后再如法炮制选中里面的src文件夹。然后点击确定。效果如图:
点击OK,然后出现下图,再点OK保存
相关文档
最新文档