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,>_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
希望有高手帮忙看看,问题出在哪?
|