[STM32F3] STM32F373使用HAL库函数进行CAN发送数据进入错误中断

[复制链接]
865|24
手机看帖
扫描二维码
随时随地手机跟帖
wyjie|  楼主 | 2021-10-19 23:14 | 显示全部楼层 |阅读模式
STM32F373使用HAL库函数进行CAN发送数据进入错误中断

使用特权

评论回复
jiajs| | 2021-10-19 23:16 | 显示全部楼层

然后呢?你是怎么应对这个的呢        

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:18 | 显示全部楼层
今天开始用HAL库写CAN通讯程序,就回环模式都始终不能发送数据,一调用HAL_CAN_AddTxMessage函数就进入HardFault_Handler

使用特权

评论回复
jiajs| | 2021-10-19 23:20 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:34 | 显示全部楼层
void MX_CAN_Init(void)
{

  HCAN1.Instance = CAN;
  HCAN1.Init.Prescaler = 64;
  HCAN1.Init.Mode =  CAN_MODE_LOOPBACK ;//CAN_MODE_NORMAL;
  HCAN1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  HCAN1.Init.TimeSeg1 = CAN_BS1_4TQ;
  HCAN1.Init.TimeSeg2 = CAN_BS2_4TQ;
  HCAN1.Init.TimeTriggeredMode = DISABLE;
  HCAN1.Init.AutoBusOff = DISABLE;
  HCAN1.Init.AutoWakeUp = DISABLE;
  HCAN1.Init.AutoRetransmission = DISABLE;
  HCAN1.Init.ReceiveFifoLocked = ENABLE;
  HCAN1.Init.TransmitFifoPriority = ENABLE;

  if (HAL_CAN_Init(&HCAN1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN 1 */
  
   //Configure the CAN Filter
  sFilterConfig.FilterBank = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x0000;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x0000;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.SlaveStartFilterBank = 14;

  if (HAL_CAN_ConfigFilter(&HCAN1, &sFilterConfig) != HAL_OK)
  {
    //Filter configuration Error
    Error_Handler();
  }

  /* Start the CAN peripheral */
  if (HAL_CAN_Start(&HCAN1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

}

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:36 | 显示全部楼层
在调用库函数
HAL_RetVal=HAL_CAN_AddTxMessage(&HCAN1,&TxHeader,TxData,(uint32_t*)CAN_TX_MAILBOX0);
时进入硬件错误中断。根据单步调试,具体是在执行库函数里边的以下赋值语句出现错误。

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:38 | 显示全部楼层
hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) |pHeader->RTR);
在执行以上语句前时,数据如下:

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:41 | 显示全部楼层
84305616ee73646f24.png

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:43 | 显示全部楼层
执行过后 62744616ee7a9f2196.png

使用特权

评论回复
zhanghqi| | 2021-10-19 23:45 | 显示全部楼层
难道是定义hcan的位置不合适

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:46 | 显示全部楼层
导致访问超界了么?

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:47 | 显示全部楼层
看论坛里边用HAL库做CAN通讯好顺利的样子,我这个为什么会出这样的幺蛾子呢?

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:48 | 显示全部楼层
芯片是STM32F373RCT6

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:50 | 显示全部楼层
引脚是复用的B口的

void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(canHandle->Instance==CAN)
  {
  /* USER CODE BEGIN CAN_MspInit 0 */

  /* USER CODE END CAN_MspInit 0 */
    /* CAN clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();
  
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**CAN GPIO Configuration   
    PB8     ------> CAN_RX
    PB9     ------> CAN_TX
    */
    GPIO_InitStruct.Pin = CAN_RX_Pin|CAN_TX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF9_CAN;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    HAL_I2CEx_EnableFastModePlus(SYSCFG_CFGR1_I2C_PB8_FMP);

    HAL_I2CEx_EnableFastModePlus(SYSCFG_CFGR1_I2C_PB9_FMP);

    /* CAN interrupt Init */
    HAL_NVIC_SetPriority(CAN_TX_IRQn, 7, 0);
    HAL_NVIC_EnableIRQ(CAN_TX_IRQn);
    HAL_NVIC_SetPriority(CAN_RX0_IRQn, 4, 0);
    HAL_NVIC_EnableIRQ(CAN_RX0_IRQn);
    HAL_NVIC_SetPriority(CAN_RX1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(CAN_RX1_IRQn);
  /* USER CODE BEGIN CAN_MspInit 1 */

  /* USER CODE END CAN_MspInit 1 */
  }
}

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:51 | 显示全部楼层
还是因为没搞清楚库函数的参数意义,问题出在了调用参数的赋值上HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox)
/**
  * @brief  Add a message to the first free Tx mailbox and activate the
  *         corresponding transmission request.
  * @param  hcan pointer to a CAN_HandleTypeDef structure that contains
  *         the configuration information for the specified CAN.
  * @param  pHeader pointer to a CAN_TxHeaderTypeDef structure.
  * @param  aData array containing the payload of the Tx frame.
  * @param  pTxMailbox pointer to a variable where the function will return
  *         the TxMailbox used to store the Tx message.
  *         This parameter can be a value of @ARG CAN_Tx_Mailboxes.
  * @retval HAL status
  */

pTxMailbox pointer必须要是一个已定义数据的地址

使用特权

评论回复
wuhany| | 2021-10-19 23:51 | 显示全部楼层
或者给出的一个满足条件的地址才行

使用特权

评论回复
shimx| | 2021-10-19 23:52 | 显示全部楼层
请问是要自己重新给这个地址定义数据吗?

使用特权

评论回复
午夜粪车| | 2021-10-19 23:52 | 显示全部楼层
请问楼主问题解决了吗,我调试STM32F303CC,也是到这句话后死机,进入错误中断。

使用特权

评论回复
wyjie|  楼主 | 2021-10-19 23:53 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
kxsi| | 2021-11-7 16:36 | 显示全部楼层
是使用的回环模式吗

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则