打印
[STM32F4]

最新HAL库,CAN 通讯进不了中断,有高手能帮忙分析一下么

[复制链接]
7378|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
86hupeng|  楼主 | 2019-6-28 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2018年上半年的HAL库用过,   CAN_Transmit_IT,CAN_Receive_IT ,然后中断回调函数 处理,是ok的;
这次更新 STM32CubeMX Version 5.2.1、STM32Cube FW_F4 V1.24.1 之后, HAL库变化非常大;

HAL_CAN_AddTxMessage,HAL_CAN_RegisterCallback,HAL_CAN_ActivateNotification,HAL_CAN_RxFifo1MsgPendingCallback。卡在CAN中断收发上已经2天了,网上到处资料,可能是新出的库,吃螃蟹的人还少,没有找到相关说明,没有进展;但是21ic的高手多少,特来求助;

1. 现在进展:可以HAL_CAN_AddTxMessage() 发送CAN数据,已经调通,这里有一个坑,官方的初始化程序里面没有滤波器的代码,不设置滤波器,CAN不能发送数据;
2.  在启动CAN之前 配置了,回调函数,HAL_CAN_Start(&hcan1);//开启CAN1接收/发送,
    HAL_CAN_RegisterCallback(&hcan1,HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID,HAL_CAN_RxFifo0MsgPendingCallback);//配置回调函数
    DEBUG调试 确定的确进去配置了成了我自己定义 HAL_CAN_RxFifo0MsgPendingCallback,(之前的经验这个回调函数与弱回调函数同名)
3. 配置了 中断通知HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO1_MSG_PENDING|CAN_IT_RX_FIFO0_MSG_PENDING|CAN_IT_TX_MAILBOX_EMPTY);//开启CAN1中断收发
4. 初始化了CAN 参数
void vFn_Can1TXHeaderConfig(uint32_t mui_Frame,uint32_t mui_IDType,uint32_t mui_IDNum,uint32_t mui_Len)
{
    gt_Can1TxHeader.RTR = mui_Frame; //帧类型
    gt_Can1TxHeader.IDE = mui_IDType;//ID类型
    gt_Can1TxHeader.StdId = mui_IDNum;//ID号
    gt_Can1TxHeader.DLC = mui_Len;//数据长度
    gt_Can1TxHeader.TransmitGlobalTime = DISABLE;//禁止发送全局时钟
}

5. 调用的 CAN发送 :HAL_CAN_AddTxMessage(&hcan1,&gt_Can1TxHeader,gt_Can1Tx.ucha_Data1, (uint32_t *)gt_Can1Tx.ui_MailBox);
此时确定CAN有数据发送出来,用CAN分析仪能看到数据,我同步用CAN分析仪向CAN 发送数据;

6. 有5个回调函数,断点打在这5个函数上没有任何反应;
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan);

7. 最后,确定 CAN1接收的这两个中断 根本就没有进入执行,打了断点没有反应;
void CAN1_TX_IRQHandler(void)
{
  /* USER CODE BEGIN CAN1_TX_IRQn 0 */

  /* USER CODE END CAN1_TX_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan1);
  /* USER CODE BEGIN CAN1_TX_IRQn 1 */

  /* USER CODE END CAN1_TX_IRQn 1 */
}

/**
  * @brief This function handles CAN1 RX1 interrupt.
  */
void CAN1_RX1_IRQHandler(void)
{
  /* USER CODE BEGIN CAN1_RX1_IRQn 0 */

  /* USER CODE END CAN1_RX1_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan1);
  /* USER CODE BEGIN CAN1_RX1_IRQn 1 */

  /* USER CODE END CAN1_RX1_IRQn 1 */
}


8. 不知道是哪个地方错了,真不知道错在哪。能怀疑的只有3个地方,一个是CAN初始的位置,一个是滤波器设置,一个是宏定义,
中断初始化:
void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
    /* CAN1 interrupt Init */
    HAL_NVIC_SetPriority(CAN1_TX_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);
    HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);


滤波器设置:
    CAN_FilterTypeDef sFilterConfig;
    HAL_StatusTypeDef HAL_Status;

    sFilterConfig.FilterIdHigh=0;
    sFilterConfig.FilterIdLow=0;   
    sFilterConfig.FilterMaskIdHigh=0;
    sFilterConfig.FilterMaskIdLow=0;
    sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO1;
    sFilterConfig.FilterBank=0;
    sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterActivation=ENABLE;
    sFilterConfig.SlaveStartFilterBank=1;
    HAL_Status = HAL_CAN_ConfigFilter(hcan,&sFilterConfig);

    HAL_Status = HAL_CAN_Start(&hcan1);//开启CAN1接收/发送
    if(HAL_Status != HAL_OK)
    {
        Error_Handler();
    }


宏定义:这个说要定义,我在stm32f4xx_hal_can.h 定义的
#define USE_HAL_CAN_REGISTER_CALLBACKS 1

希望有高手帮忙看看,问题出在哪?

使用特权

评论回复
沙发
86hupeng|  楼主 | 2019-6-28 09:32 | 只看该作者
整个工程上传不上来,除去系统相关的代码,自己新加的CAN相关的代码都在附件 Can_Config 文件里面

Comfigs.zip

2.64 KB

使用特权

评论回复
板凳
Guoyl| | 2019-7-2 16:12 | 只看该作者
我也是这两天在用HAL库开发F4,使用MX为5.2.1,HAL固件库为1.24.1,使用F407和F429两个开发板都无法调通,和楼主描述一样,可以发送,不能接收,也不能触发接收中断。但我没有设置滤波器,也可以正常发送。ST官方更新完都不测的吗?

使用特权

评论回复
地板
86hupeng|  楼主 | 2019-7-22 20:15 | 只看该作者
Guoyl 发表于 2019-7-2 16:12
我也是这两天在用HAL库开发F4,使用MX为5.2.1,HAL固件库为1.24.1,使用F407和F429两个开发板都无法调通, ...

#define USE_HAL_CAN_REGISTER_CALLBACKS 1
上面这条语句不要用,然后用自带的 回调函数; 可以进入中断;
然后另一个大坑,大大坑,就是选了freertos 然后再去掉,会把默认的中断优先级全删除了,导致中断不能用;

使用特权

评论回复
5
sky1479| | 2019-10-29 15:49 | 只看该作者
您好,我遇到了和您这个帖子一样的问题 https://bbs.21ic.com/icview-2830100-1-1.html    任务发送没有问题。中断接收 进不去中断,打断点 已经调试,始终进不去 您这个问题解决了么?可以请教一下么!微信 17702135345  谢谢!!!十分感谢!!!

使用特权

评论回复
6
mansing| | 2019-11-22 20:56 | 只看该作者
我是在STM32F042上遇到一样的情况,在发送函数加入HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY);  既可,如下;


        HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY);//开启中断
        if (HAL_CAN_AddTxMessage(&hcan, &TxMessage, Can_Tx_Tab, &TxMailbox) != HAL_OK)
        {
                /* Transmission request Error */
                Error_Handler();
        }

使用特权

评论回复
7
1156807738| | 2020-3-30 17:56 | 只看该作者
sky1479 发表于 2019-10-29 15:49
您好,我遇到了和您这个帖子一样的问题 https://bbs.21ic.com/icview-2830100-1-1.html    任务发送没有问题 ...

请问,你结局了吗?我也加了过滤器,在回环模式下,打断点看,接收中断进不去,也不知道什么原因

使用特权

评论回复
8
sky1479| | 2020-4-20 14:37 | 只看该作者
1156807738 发表于 2020-3-30 17:56
请问,你结局了吗?我也加了过滤器,在回环模式下,打断点看,接收中断进不去,也不知道什么原因 ...

现在CAN1收发没问题,按照CAN1配置CAN3,回环,CAN3寄存器里面已经收到FIFO1的数据,但是不出发中断。CAN2依赖CAN1,CAN2的初始化过程,软件清除MCR中的SLEEP后,HAL判断MSR中的睡眠状态bit但是显示没有退出SLEEP。初始化失败。暂时没找到结局,你怎么样了?237810399  我的QQ ,可以加一下 沟通一下。

使用特权

评论回复
9
liuzhaoming5954| | 2020-5-11 09:02 | 只看该作者
sky1479 发表于 2020-4-20 14:37
现在CAN1收发没问题,按照CAN1配置CAN3,回环,CAN3寄存器里面已经收到FIFO1的数据,但是不出发中断。CAN ...

您好,请问最后CAN1的收发是怎么解决的,我也遇到了无法进入接收中断的问题。
非常感谢

使用特权

评论回复
10
朱宇阳| | 2020-9-22 18:26 | 只看该作者
作者你好,现在知道怎么解决了吗?我是新手 我也遇到这样的问题了。

使用特权

评论回复
11
天意无罪| | 2020-9-23 08:51 | 只看该作者
没进入中断,说明没有接收到数据,检查你CAN分析仪设置的帧类型和你ST CAN的帧类型设置是否一致,帧类型不一致的话,CAN接收器是不会接收的。

使用特权

评论回复
12
sfgdzouwei| | 2022-1-20 11:33 | 只看该作者
sky1479 发表于 2020-4-20 14:37
现在CAN1收发没问题,按照CAN1配置CAN3,回环,CAN3寄存器里面已经收到FIFO1的数据,但是不出发中断。CAN ...

您好,我也遇到了CAN无法进入中断的问题,希望能请教一下你是怎么解决的

使用特权

评论回复
13
sfgdzouwei| | 2022-1-20 11:34 | 只看该作者
您好,我也遇到了无法进入CAN中断的问题,您是怎么解决的,希望向您请教一下

使用特权

评论回复
14
HansLeonardo| | 2022-8-9 09:17 | 只看该作者
同问!!请问解决了嘛

使用特权

评论回复
评论
86hupeng 2023-4-6 14:50 回复TA
这个问题早就解决了;答案在4楼; #define USE_HAL_CAN_REGISTER_CALLBACKS 1 上面这条语句不要用,然后用自带的 回调函数; 可以进入中断; 然后另一个大坑,大大坑,就是新建工程的时候选了freertos 然后再去掉,会把默认的中断优先级全删除了,导致中断不能用; 
15
SantaBunny| | 2023-2-23 20:27 | 只看该作者
用示波器看板子接收端的波形了吗

使用特权

评论回复
16
bestwell| | 2023-5-5 12:56 | 只看该作者
这个我应该开启中断吧              

使用特权

评论回复
17
loutin| | 2023-5-5 18:28 | 只看该作者
进入HAL_CAN_Receive_IT()函数

使用特权

评论回复
18
averyleigh| | 2023-5-5 19:56 | 只看该作者
只有手动开启之后才能进入中断。              

使用特权

评论回复
19
belindagraham| | 2023-5-5 22:18 | 只看该作者
CAN通讯的中断接收                 

使用特权

评论回复
20
wangdezhi| | 2023-5-5 23:31 | 只看该作者
HAL库中,无论何种类型的UART中断,都会进入:在此函数中判断具体是何种中断,再调用相应的中断服务函数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:精通光栅类传感器设计全套技术,精通电永磁技术,熟悉电机变频,电涡流传感器,画画原理图,布布电路板,写写程

15

主题

233

帖子

2

粉丝