相关文章推荐
通讯 , CAN , TE , Filter , LTE 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
希望有高手帮忙看看,问题出在哪?
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 然后再去掉,会把默认的中断优先级全删除了,导致中断不能用; 我是在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();
sky1479 发表于 2019-10-29 15:49
您好,我遇到了和您这个帖子一样的问题 https://bbs.21ic.com/icview-2830100-1-1.html    任务发送没有问题 ...

请问,你结局了吗?我也加了过滤器,在回环模式下,打断点看,接收中断进不去,也不知道什么原因
sky1479 发表于 2020-4-20 14:37
现在CAN1收发没问题,按照CAN1配置CAN3,回环,CAN3寄存器里面已经收到FIFO1的数据,但是不出发中断。CAN ...

您好,请问最后CAN1的收发是怎么解决的,我也遇到了无法进入接收中断的问题。
sky1479 发表于 2020-4-20 14:37
现在CAN1收发没问题,按照CAN1配置CAN3,回环,CAN3寄存器里面已经收到FIFO1的数据,但是不出发中断。CAN ...

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

本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助

京ICP备11013301号

京公网安备 11010802024343号

 
推荐文章