一个关于STM32 CAN出错恢复的话题
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之CAN---错误管理分析
1 几个重要概念根据ISO11898有如下几个重要的与CAN相关的定义:Fault confinement(错误界定)CAN nodes shall be able to distinguish short disturbances from permanent failures. Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.CAN节点可以区分常规错误和永久故障。
有故障的发送节点将切换到离线状态。
离线意味着在逻辑上与总线断开,既不能发送也不能接收。
Error-active(主动错误)An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .处于主动错误状态的节点能正常参与总线通信的收发和当检测到错误时将发送错误标志,错误标志由6个连续的显示位组成(这种连续的6个显示位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。
Error-passive(被动错误)An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent. The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .处于被动错误状态的节点不能发送主动错误标志。
stm32 can2设置问题
stm32 can2设置问题在stm32的互联型产品中,有两个can接口,一个主,一个从,主接口一般正常配置,网上资料比较多,但是从接口在配置的时候经常是只能发送,不能接收,一般原因都在于过滤器没有设置,如上图所示,在互联型产品中,会有0~28个过滤器组,而寄存器CAN_FMR的CAN2SB[5:0]代表了从can的过滤器开始组,由于其复位值为0x2A1C 0E01,所以可以判断CAN2SB[5:0]的开机复位值为14,从而在互联型产品中,can2的默认过滤器开始值为14,所以在进行can2的初始化过程中需要调用以下代码:/* CAN2 filter init */CAN_FilterInitStructure.CAN_FilterNumber=14;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);这样设置后,其他设置可以跟can1的设置一样,就可以在接受到数据后产生中断,从而进行进一步处理。
一个 STM32 芯片异常复位之案例分析
一个STM32芯片异常复位之案例分析前言本篇主要是介绍一种处理问题的思路,即当我们在做STM32应用开发过程中,遇到芯片异常复位,或者进入了异常处理时,如何通过集成开发环境,如IAR,KEIL等查看相应的ARM内核寄存器,定位出应用软件产生异常的地方!问题描述某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。
复位后程序继续运行,但是还会继续复位,原因不详!问题分析针对于此类问题,我们可以按照一个统一的思路去处理。
分析本案例的大致步骤如下:1、初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断;2、查看复位状态寄存器了解复位大方向,然后做进一步得拆解分析。
3、目前客户项目的复位原因是因为看门狗复位,即客户使用了IWDG,但由于某种原因没有及时喂狗,导致IWDG超时复位。
初步怀疑由于客户软件的问题,程序跑飞,进入异常处理。
因为客户的异常处理函数中并没有做任何动作,导致独立看门狗IWDG复位。
基于此,我们先关闭IWDG,然后在所有的异常处理中,先加入死循环并打上断点,对异常原因进行捕捉。
4、正如我们所猜测,的确是由于程序跑飞导致。
程序停在了void HardFault_Handler(void) 。
通过查看SP以及回溯栈里面的内容,找到了对应的LR,具体方法如下:当中断产生时,按照上图所示的顺序进行压栈,同时栈指针SP--,即: R0, R1, R2, R3, R12, LR, PC, xPSR。
如上图所示,当产生异常时,如果call stack窗口显示不出来的话,只能根据core的寄存器手动回溯栈,以找到出错时的指针。
根据ARM core的说明,SP+6,即红框的部分,为中断处理后LR和PC,据此可以追溯函数异常时的位置!5、根据出错时的PC和LR,发现是浮点运算的函数,初步判断是因为浮点运算导致,比如没有对齐导致的Hardfault,但实际检查发现,并不是浮点运算的问题!6、问题一时陷入了僵局。
浅析CAN总线错误分析与解决
浅析CAN总线错误分析与解决CAN(Controller Area Network)总线是一种常用于汽车及工业场合的通信协议,它能够实现多个节点之间的高速数据传输。
然而,在实际应用中,由于各种原因,CAN总线可能会出现错误,影响通信的稳定性和可靠性。
本文将对CAN总线错误进行分析,并提出一些解决方案。
首先,CAN总线错误可以大致分为以下几类:1. 位错误(Bit Error):CAN总线中的数据传输是基于二进制编码的,位错误是指在传输过程中由于电磁干扰、线路质量差等原因,导致数据位传输错误。
位错误的情况较为常见,可以通过提高线路质量、增强抗干扰能力或使用差分传输方式等方式来解决。
2. 标志位错误(Frame Error):在CAN总线中,每个数据帧的开始和结束位置都有一个标志位。
标志位错误是指这个标志位被错误地接收或丢失,导致数据帧无法正确识别。
标志位错误通常是由于通信速率设置有误、线路中存在干扰或接地问题等原因导致的。
解决这个问题可以从通信参数设置和线路质量等方面入手。
3. 校验错误(Checksum Error):在数据帧中,发送节点会携带一个校验码,用于校验数据传输的正确性。
如果接收节点计算出的校验码与发送节点携带的校验码不一致,则会产生校验错误。
校验错误通常是由于数据传输中发生位错误导致的,可以通过提高错误检测和纠错能力来减少校验错误。
4. 故障给出错误(Error Passive):当CAN总线上的错误数量达到一定限制时,节点会进入故障给出(Error Passive)状态,不再主动发送数据。
故障给出错误通常是由于线路质量差、硬件故障或软件错误等原因导致的。
解决故障给出错误可以通过检查硬件连接、调整通信参数或修复软件故障等方式。
针对CAN总线错误,可以采取以下解决方案:1.提高线路质量:CAN总线的线路质量直接影响通信的稳定性和可靠性。
可以采用屏蔽线缆、增加终端电阻、加强接地等方式来提高线路质量,减少电磁干扰和信号失真。
stm32error_handler处理技巧
stm32error_handler处理技巧在使用STM32进行开发时,可能会遇到各种错误。
当出现错误时,通常需要使用错误处理器(error handler)来处理这些错误。
错误处理器是一个特殊的函数,用于捕获和处理发生的错误。
在STM32上,错误处理器的实现可以有多种方式。
下面是一些错误处理的技巧,可以帮助您更好地处理STM32上的错误。
1. 使用断言(assertion):断言是一种在代码中插入的检查,用于验证程序的逻辑和状态是否正确。
可以使用它来检查指针是否为空、变量是否处于预期范围内等。
当断言失败时,可以在错误处理器中打印错误信息或执行其他相关操作。
2. 使用错误码(error code):为不同类型的错误定义错误码,可以方便地识别错误类型。
当发生错误时,错误处理器可以根据错误码执行相应的操作,例如打印错误信息、返回错误码等。
3. 使用异常处理:异常是一种在程序运行时发生的错误,可以用于捕获并处理异常情况。
对于STM32,可以使用CMSIS库提供的异常处理函数,例如HardFault_Handler(、BusFault_Handler(等。
当发生异常时,可以在异常处理器中执行一些操作,例如打印异常信息、保存堆栈信息等。
4. 使用断点(breakpoint):在调试过程中,可以使用断点来暂停代码的执行,以便检查变量的值和程序的状态。
在错误处理器中设置断点可以方便地跟踪错误发生的位置和上下文信息。
5.记录错误信息:在错误处理器中,可以通过打印日志信息或将错误信息保存到外部存储器等方式记录错误信息。
这有助于分析错误发生的原因和调试错误的源头。
6.打印调试信息:在错误处理器中,可以使用串口或其他通信方式将调试信息输出到终端或其他设备。
这可以让开发者更方便地了解错误发生的原因和上下文信息。
7.使用硬件故障检测:一些STM32芯片提供了硬件故障检测功能,可以检测和处理硬件故障,例如电源异常、时钟失频等。
CAN出错管理
出错管理CAN协议描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR寄存器里的TEC域),和接收错误计数器(CAN_ESR寄存器里的REC域)来实现,其值根据错误的情况而增加或减少。
关于TEC和REC管理的详细信息,请参考CAN标准。
软件可以读出它们的值来判断CAN网络的稳定性。
此外,CAN_ESR寄存器提供了当前错误状态的详细信息。
通过设置CAN_IER寄存器(比如ERRIE位),软件可以灵活地控制中断的产生――当检测到出错时。
离线恢复当TEC对于255时,bxCAN就进入离线状态,同时CAN_ESR寄存器的BOFF位被置’1’。
在离线状态下,bxCAN无法接收和发送报文。
根据CAN_MCR寄存器的ABOM位的设置,bxCAN可以自动或在软件的请求下,从离线状态恢复(变为错误主动状态)。
在这两种情况下,bxCAN都必须等待一个CAN标准所描述的恢复过程(CAN RX引脚上检测到128次11个连续的隐性位)。
如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程。
如果ABOM位为’0’,软件必须先请求bxCAN进入然后再退出初始化模式,随后恢复过程才被开启。
注:在初始化模式下,bxCAN不会监视CAN RX引脚的状态,这样就不能完成恢复过程。
为了完成恢复过程,bxCAN必须工作在正常模式STM32之CAN---错误管理分析∙Fault confinement(错误界定)CAN nodes shall be able to distinguish short disturbances from permanent failures. Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.CAN节点可以区分常规错误和永久故障。
STM32新手常见的一个错误并给出解决方法
STM32新手常见的一个错误并给出解决方法在使用STM32微控制器进行开发时,新手常常会遇到一些常见的错误。
以下是一些常见错误以及对应的解决方法,帮助新手更好地克服这些问题。
1.芯片未正确连接:通常情况下,STM32芯片应与开发板正确连接。
新手可能会出现错误的连接方式,例如将芯片倒置或错位连接。
解决这个问题的方法是仔细查看芯片的引脚图并确保正确地连接所有的引脚。
2.引脚配置错误:STM32微控制器具有多功能引脚,可以根据需要进行不同功能的配置。
新手可能会错误地配置引脚,导致功能无法正常工作。
解决这个问题的方法是仔细阅读芯片的数据手册,以确定正确的引脚功能和配置设置。
3.时钟配置错误:STM32微控制器依赖于准确的时钟源以确保正常运行。
新手可能会忽视时钟配置,导致系统无法启动或无法正常工作。
解决这个问题的方法是仔细配置时钟源,并确保时钟频率与所需的系统时钟频率相匹配。
4.软件驱动错误:在使用STM32微控制器进行开发时,需要正确的软件驱动程序来控制硬件功能。
新手可能会遗漏或错误地使用关键的驱动程序,导致无法实现预期的功能。
解决这个问题的方法是仔细阅读相关的软件库文档,并确保正确使用所有必需的软件驱动程序。
5.中断配置错误:STM32微控制器支持多种中断,并需要正确配置以实现正确的中断处理。
新手可能会忽略或错误地配置中断,导致系统无法正确响应中断事件。
解决这个问题的方法是仔细阅读关于中断配置和处理的文档,并确保正确配置所有中断。
6.电源和电源管理问题:STM32微控制器需要稳定和适当的电源供应以确保正常运行。
新手可能会遇到电源不稳定或不足的问题,导致系统无法正常工作。
解决这个问题的方法是确保提供稳定的电源,并使用适当的电源管理技术,例如使用电容和稳压器等来提供稳定和适当的电源。
7.调试问题:在使用STM32微控制器进行开发时,调试是非常重要的。
新手可能会遇到调试问题,例如无法正确读取或显示调试信息。
stm32 can发送失败处理逻辑
stm32 can发送失败处理逻辑下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!STM32 CAN发送失败处理逻辑在STM32微控制器的CAN通信中,发送数据时可能会出现发送失败的情况。
STM32F103CAN收发问题_接收中断无法进入_201608190
STM32F103CAN收发问题_接收中断无法进入_201608190STM32F103XX CAN收发问题——接收中断无法进入Author:lu.hongboDate:2016-08-19内容不多,点到即止。
相信很多人买过一个STM32F103类型的开发板,例如“红牛开发板”这个开发板所提供的例程有很多。
但是有问题的例程也很多。
这里我就简单介绍一个问题例程——CAN收发。
CAN总体说来还是挺复杂的,然而复杂的不是应用。
而是控制器设计,不过这已经在STM32F103类型的芯片中集成了。
用的时候,越简单越好。
STM32也提供了外设库文件。
我就单说说这个<【12】红牛板_CAN (2013.7.31)>例程。
首先,可以肯定的说——这个例程有问题。
1、CAN端口复用的时候没有使用GPIO映射函数——对于使用PB8/PB9进行通信的用户一定很苦恼,为啥例程不能直接运行。
注意这个GPIO映射函数——GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalStateNewState)需要在CAN端口配置的时候调用。
2、请注意对应GPIO组的时钟是不是开启了,因为时钟如果没开,配置将无效3、请注意一个叫做AFIO的模块是不是开启时钟了,如果没有开启,端口影射将会无效4、在有需要注意的就是中断向量表,__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD MemManage_Handler ; MPU Fault HandlerDCD BusFault_Handler ; Bus Fault HandlerDCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD SysTick_Handler ; SysTick Handler; External InterruptsDCD WWDG_IRQHandler ; Window WatchdogDCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; TamperDCD RTC_IRQHandler ; RTCDCD RCC_IRQHandler ; RCCDCD EXTI0_IRQHandler ; EXTI Line 0DCD EXTI1_IRQHandler ; EXTI Line 1DCD EXTI2_IRQHandler ; EXTI Line 2DCD EXTI3_IRQHandler ; EXTI Line 3DCD EXTI4_IRQHandler ; EXTI Line 4DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 DCD ADC1_2_IRQHandler ; ADC1 & ADC2DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 DCD CAN1_RX1_IRQHandler ; CAN1 RX1 DCD CAN1_SCE_IRQHandler ; CAN1 SCEDCD EXTI9_5_IRQHandler ; EXTI Line 9..5DCD TIM1_BRK_IRQHandler ; TIM1 BreakDCD TIM1_UP_IRQHandler ; TIM1 UpdateDCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture CompareDCD TIM2_IRQHandler ; TIM2DCD TIM3_IRQHandler ; TIM3DCD TIM4_IRQHandler ; TIM4DCD I2C1_EV_IRQHandler ; I2C1 EventDCD I2C1_ER_IRQHandler ; I2C1 ErrorDCD I2C2_EV_IRQHandler ; I2C2 EventDCD I2C2_ER_IRQHandler ; I2C2 ErrorDCD SPI1_IRQHandler ; SPI1DCD SPI2_IRQHandler ; SPI2DCD USART1_IRQHandler ; USART1DCD USART2_IRQHandler ; USART2DCD USART3_IRQHandler ; USART3DCD EXTI15_10_IRQHandler ; EXTI Line 15..10DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend DCD TIM8_BRK_IRQHandler ; TIM8 BreakDCD TIM8_UP_IRQHandler ; TIM8 UpdateDCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation DCD TIM8_CC_IRQHandler ; TIM8 Capture CompareDCD ADC3_IRQHandler ; ADC3DCD SDIO_IRQHandler ; SDIODCD TIM5_IRQHandler ; TIM5DCD SPI3_IRQHandler ; SPI3DCD UART4_IRQHandler ; UART4DCD UART5_IRQHandler ; UART5DCD TIM6_IRQHandler ; TIM6DCD TIM7_IRQHandler ; TIM7DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5如下中断向量表的名字是不是和你的中断函数名相同。
STM32串口偶尔会出现异常误码
STM32串 口 偶 尔 会 出 现 异 常 误 码
串口偶尔会出现误码,可以从以下方面考虑 1、串口的接线是否可靠,GND是否连接 2、检查外部晶振,时钟配置 如果外部晶振没有问题,检查一下时钟树是否正确配置。注意选择HSE作为PLL的源,如果选择HSI,单片机内部RC震荡器产生的时钟 精度不够,有可能会造成串口误码 3、波特率是否过高 4、接线是否过长
can线通讯偶发故障,重启恢复
can线通讯偶发故障,重启恢复
当涉及到CAN线通讯偶发故障并需要重启来恢复时,我们需要
从多个角度来考虑这个问题。
首先,CAN线通讯故障可能是由多种
因素引起的,包括但不限于电气干扰、线路连接问题、节点故障等。
因此,我们需要对可能的原因进行全面的分析。
首先,我们可以考虑检查CAN线路的物理连接,确保连接牢固,没有断路或短路,并且接地良好。
此外,我们还需要检查CAN信号
的质量,包括信号干净度和波特率是否正确。
如果发现问题,可以
尝试重新连接或更换线路来解决问题。
其次,我们需要考虑节点设备的状态。
如果可能,可以通过诊
断工具检查每个节点的状态,确保节点设备工作正常。
有时候节点
设备可能会出现故障或者意外关闭,导致通讯故障,因此需要重启
节点设备来恢复通讯。
另外,电气干扰也是CAN通讯故障的常见原因之一。
在车辆或
工业设备等复杂环境中,可能会受到来自电机、继电器等设备的干扰,导致通讯故障。
这时候可以考虑使用屏蔽线或者滤波器来减少
电气干扰,从而恢复通讯。
最后,重启通常是一种简单而有效的解决方法。
通过重启整个系统或者单独重启受影响的节点设备,可以清除临时故障并恢复通讯。
但需要注意的是,重启只是一种临时解决方案,如果问题频繁发生,还需要进一步分析原因并采取长期的解决措施。
综上所述,针对CAN线通讯偶发故障需要重启恢复的问题,我们可以从线路连接、节点设备状态、电气干扰等多个方面进行全面的分析和处理,以确保通讯系统的稳定和可靠。
STM32单片机常见的工作异常现象分析及解决方案
STM32单片机常见的工作异常现象分析及解决方案
STM32 单片机常见的工作异常现象分析及解决方案
贴了两块样板,烧写同样的固件。
其中一块工作正常,但是另外一块出现了很奇怪的现象:在线调试正常;每次烧写完后工作正常;重新上电有时候工作正常,有时候工作不正常;工作不正常时,按下复位按键,恢复正常。
工作异常现象:main 函数中的系统运行指示灯不闪烁,但是初始化过程中点的一个灯是亮的!说明程序运行一段时间后,不工作了。
由于在线调试模式,板子工作正常,无法通过在线调试的方式判断程序运行的异常状态。
分析可能的原因:
1、初始化过程中,程序陷入死循环。
但程序初始化过程中,没有while (1)死循环的代码。
2、板子上电后不断复位,导致无法进入main 函数中的while(1)循环。
stm32 error_handler 处理技巧 -回复
stm32 error_handler 处理技巧-回复错误处理是软件开发过程中非常重要的一环,尤其是在嵌入式系统领域。
在STM32微控制器中,提供了一个错误处理的机制,即error_handler。
本文将详细介绍STM32 error_handler的使用技巧,并提供一些在处理错误时的实用建议。
I. 什么是error_handler?在STM32中,error_handler是一个用于处理错误的函数。
当系统发生不可恢复的错误时,由error_handler函数来接管程序的控制权。
error_handler可以用来展示错误信息,记录错误日志或进行其他适当的操作,以便用户能够快速发现并解决问题。
II. 如何配置error_handler?1. 创建error_handler函数首先,需要在代码中创建一个函数用于处理错误。
这个函数通常被命名为error_handler,并且具有以下原型:void error_handler(void);2. 注册error_handler接下来,需要将error_handler函数与STM32的默认错误处理函数关联起来。
在大多数情况下,error_handler函数应该被注册为硬件异常的默认处理函数。
这可以通过以下代码实现:void SysTick_Handler(void){error_handler函数将在这里被调用error_handler();}需要注意的是,SysTick_Handler函数是由STM32的系统滴答时钟(SysTick)中断触发的。
因此,将error_handler注册到SysTick_Handler 中可以确保在系统发生错误时立即被调用。
III. 如何使用error_handler?1. 显示错误信息在error_handler函数中,可以使用外设(如串口)或其他方式来显示错误信息。
例如,可以通过LCD屏幕、LED灯或终端窗口来输出错误消息。
STM32编译报错 修改方法
************************************************
keil中警告:invalid multibyte character sequence
【note】stm32 keilMDK出现warning:function XX declared implicitly .
2014-08-26 14:50 985人阅读评论(0)收藏举报
warning: #223-D: function "CLR_TX_DATA" declared implicitly
个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.
5. warning: #177-D: variable "temp" was declared but never referenced
描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning:
#550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.
解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用.
与该警告类似的还有warning: #177-D: function "MACProcessBeacon" was declared but never
为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:
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程序常见错误及解决方法
1.启动KEIL,创建工程以后,先用创建文件,然后什么也不干,直接点击保存,保存到你的工程文件夹下面,命名为main.c(其他也可以,命名为main.c是为了方便你同其他的C文件快速区分开来)。
然后输入以下几行代码:#include "stm32f10x.h"void main(void){}然后点击Build,会有以下报错信息: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)"这是说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这说明文件包含的路径没有设置好。
解决办法:按上面所述选到选项。
然后在下选择,再点击,然后打开目录找到固件库里面的这个文件(最好能把这个文件夹复制出来保存到一个纯英文路径的目录下),然后选择中里面的inc文件夹,然后再如法炮制选中里面的src文件夹。
STM32的CAN总线使用指南
CAN基本知识:CAN协议的特点:1、多主机控制。
在总线空闲时,所有单元都可以发送消息,若两个以上同时开始发送消息,根据标识符来决定优先级。
优先级高的先发送。
2、系统的若软性。
与总线相连的单元没有类似地址的信息。
因此在总线上增加单元时,应用层程序基本不需要改变。
3、通信速度快,通信距离远。
最高1Mbps(距离小于40M),最远可达10Km(速率低于5Kbps)。
4、具有错误检测、错误通知和错误恢复功能。
所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。
前置结束发送的单元会不断反复地重新发送该消息直到发送成功。
5、故障封闭功能。
CAN可以判断出错误的类型是总线上的数据错误还是持续的数据错误。
由此功能,当总线上发生持续数据错误时,可以将引起此故障的单元从总线上隔离出去。
6、连接节点多。
CAN总线是可同时连接多个单元的总线。
可连接的单元总数理论上是没有限制的。
单实际上受到时间延迟和电气负载的限制。
降低通信速度,可连接单元增加。
反之,反之。
STM32的CAN 时间特性(有关波特率):与CAN2.0B的协议内容相比,STM32的CAN时间特性稍微有些区别。
STM32把传播时间段和相位缓冲段1合并了,因此STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。
STM的BS1段可以设置为1-16个时间单元,刚好等于传播时间段和相位缓冲段1之和。
波特率=1/正常的位时间正常的位时间=1×tq+tbs1+tbs2其中:tbps1=tq×(TS1[3:0]+1)tbps2=tq×(TS2[3:0]+1)tq=(BRP[9:0]+1)×tpclktq是一个时间单元tpclk是APB时钟的时间周期因此,我们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为36MHz),就可以方便的计算出波特率。
一个关于CAN出错中断重复出现的话题
一个关于CAN出错中断重复出现的话题某日,有一客户反映他们在做STM32F407的CAN通信的出错测试时,发现出现类似死机的现象。
后来跟踪调试发现是开启了出错中断,因其不停中断导致的貌似死机现象。
纳闷的是,经过进一步测试,发现即使清除了中断请求标志后也无效。
大致情形如下:在CAN通讯时候让某节点做插拔、断电等测试,人为的产生一些CAN总线错误,看看能否让总线恢复正常。
结果测试发现,如果总线出现错误,并且打开了CAN错误中断处理的话,通过仿真器调试发现CPU一直在处理CAN错误中断,其他程序得不到处理而呈死机状态。
先是怀疑CAN控制器因为各类错误条件而进入错误中断后,虽在错误中断里清除了相关中断状态标志,但由于计数器值没有清零的原因,马上又产生新的错误中断,这样循环反复,导致其他程序得不到调度。
然后继续做实验,将CAN_IER寄存器中的LECIE和EWGIE这两种中断使能关闭掉,发现还是有这个问题。
客户觉得这样有点奇怪。
从客户粗略描述的现象来看,很像没有清除中断标志导致中断没完没了。
经进一步的沟通了解,客户除了开启相关收发中断外,还使能了LECIE、EWGIE、EPVIE、BOFIE、ERRIE跟出错有关的中断,当然SLKIE和WKUIE没有使能。
结合CAN_IER和CAN_ESR寄存器的相关描述,可以看出即使关闭了LECIE、EWGIE两个出错条件,但还有EPVIE、BOFIE两种情形可能导致CAN出错中断。
跟CAN出错中断有关的寄存器主要涉及到3个,分别是CAN主控状态寄存器CAN_MSR,CAN中断使能寄存器CAN_IER,CAN错误状态寄存器CAN_ESR.说实在的,这个跟CAN出错中断有关的东西还是有点复杂。
看看下图,蓝色方。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个关于STM32 CAN 出错恢复的话题
最近有个STM32 用户咨询:最近在使用stm32f105 做双can 通信,can 驱动
芯片使用的TJA1042,发现将canH canL 短路再放开以后,can 出错恢复不回来?之前在K40 上使用的时候没有这个问题,不知道这个情况大家有什么指导
建议啊?另外,他还附上了基于STM32CUBEMX 工具配置的相关代码如下:
hcan1.Instance = CAN1; hcan1.Init.Prescaler = 2; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SJW = CAN_SJW_1TQ; hcan1.Init.BS1 = CAN_BS1_8TQ; hcan1.Init.BS2 = CAN_BS2_7TQ; hcan1.Init.TTCM = DISABLE; hcan1.Init.ABOM = DISABLE; hcan1.Init.AWUM = DISABLE; hcan1.Init.NART = DISABLE; hcan1.Init.RFLM = DISABLE; hcan1.Init.TXFP = DISABLE; HAL_CAN_Init(&hcan1);从用户的描述来看,应该是CANH/CANL 短路时导致
错误而进入离线状态。
其实,CAN 硬件是具备出错管理和离线恢复功能的。
在STM32 参考手册的
CAN 出错管理章节有相关描述。
CAN 协议所描述的出错管理,完全由硬件通过发送错误计数器(CAN_ESR 寄
存器里的TEC 域),和接收错误计数器(CAN_ESR 寄存器里的REC 域)来实现,
其值根据出错情况作增加或减少。
关于TEC 和REC 管理的详细信息,需参考
CAN 标准。
此外,CAN_ESR 寄存器提供了当前错误状态的详细信息。
通过设
置CAN_IER 寄存器(比如ERRIE 位),当检测到出错时软件可以灵活地控制中
断的产生。
关于离线恢复当TEC 大于255 时,bxCAN 就进入离线状态,同时
CAN_ESR 寄存器的BOFF 位被置1。
在离线状态下,bxCAN 无法接收和发送
报文。
根据CAN_MCR 寄存器中ABOM 位的设置,bxCAN 可以自动或在软件的请。