历史上的今天
今天是:2024年10月08日(星期二)
2019年10月08日 | STM32 中 CAN进入错误回调函数后无法接收问题(HAL库)
2019-10-08 来源:eefocus
CPU进入错误回调函数后 ,无法接收新的数据包
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
经检查,如果CPU在进入错误回调函数之前,我们调用
HAL_CAN_Receive_IT(&Can1Handle, CAN_FIFO0);
一般来说,我们会认为CPU一直处于可以接收新的can包的状态,但是只要CPU进入错误回调函数之后,就无法接收新的数据包,进debug 单步运行后 得到问题的原因
void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan)
{
...................................................
/* Call the Error call Back in case of Errors */
if(hcan->ErrorCode != HAL_CAN_ERROR_NONE)
{
/* Clear ERRI Flag */
hcan->Instance->MSR = CAN_MSR_ERRI;
/* Set the CAN state ready to be able to start again the process */
hcan->State = HAL_CAN_STATE_READY;
/* Disable interrupts: */
/* - Disable Error warning Interrupt */
/* - Disable Error passive Interrupt */
/* - Disable Bus-off Interrupt */
/* - Disable Last error code Interrupt */
/* - Disable Error Interrupt */
/* - Disable FIFO 0 message pending Interrupt */
/* - Disable FIFO 0 Overrun Interrupt */
/* - Disable FIFO 1 message pending Interrupt */
/* - Disable FIFO 1 Overrun Interrupt */
/* - Disable Transmit mailbox empty Interrupt */
__HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG |
CAN_IT_EPV |
CAN_IT_BOF |
CAN_IT_LEC |
CAN_IT_ERR |
CAN_IT_FMP0|
CAN_IT_FOV0|
CAN_IT_FMP1|
CAN_IT_FOV1|
CAN_IT_TME );
/* Call Error callback function */
HAL_CAN_ErrorCallback(hcan);
}
}
CPU在感知到错误时,进入中断,在回调之前, 已经把hcan->State 设置为 HAL_CAN_STATE_READY
我们原先
HAL_CAN_Receive_IT(&Can1Handle, CAN_FIFO0);
把 hcan->State 设置为 HAL_CAN_STATE_BUSY_RX0或其他,在这里就会被覆盖,所以CAN无法接收新的数据包;
改正方法很简单,就是在错误回调函数中重新添加
HAL_CAN_Receive_IT(&Can1Handle, CAN_FIFO0);
史海拾趣
|
万用电路板是一种按照标准IC间距(2.54mm)布满焊盘、可按自己的意愿插装元器件及连线的印制电路板,俗称“洞洞板”。相比专业的PCB制版,洞洞板具有以下优势:使用门槛低,成本低廉,使用方便,扩展灵活。比如在学生电子设计竞赛中,作品通常需要 ...… 查看全部问答> |
|
系统为WINCE 5.0 + S3C2451 液晶的配置参数为RGB565格式.从芯片手册上可知,显存有两种格式: (BSWP = 0, HWSWP = 0) D[31:16] D[15:0] 000H P1   ...… 查看全部问答> |
|
如题,在ADS1.2的工程设置中,我把linktype设置为simple,RO Base:0x30008000(我查过,这个地址应该不会有错)之后,当对结构体变量赋值时,总是出错,赋不进想要的值。但当我把linktype设置为scattered,并使用scat文件,就能正确赋值了,这是什 ...… 查看全部问答> |
|
c# DDE(动态数据交换) 客户端程序,如何设置Server与Topic 如题。 由于DDE是一个很老的技术了,已经被OPC代替。但是有些事情还是得用到DDE。 .net 已经不支持DDE,还好,我找到了封装好的API , 下面是我写的一个测试DDE客户端,要与DDE服务器,或者说是DDE服务(service) 连接。 对于输入的service 与t ...… 查看全部问答> |
|
要求是从本地读取一副位图显示在picture control控件里。因为位图的大小不确定所以应该对图像做些缩放处理。请问用什么方法处理?试过用LoadImage()方法,但是显示的图片一片空白。代码如下: CRect mainrect; this->m_BtTouXiang.GetWindowRect( ...… 查看全部问答> |
|
我的扳子上有一块sdram, 我发现,不能把段定位到sdram中去,只要把段定位到sdram中, 在load的时候,就会提示\\"data verification failed at address 0x80000000. 请问一般是什么原因呢?是不是在EMIF 中sdram相关寄存设置的不对? 而且,我在ti的cc ...… 查看全部问答> |




