打印
[STM32F3]

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

[复制链接]
3660|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大佬,今天开始用HAL库写CAN通讯程序,就回环模式都始终不能发送数据,一调用HAL_CAN_AddTxMessage函数就进入HardFault_Handler,求各位大佬赐教,不胜感激!
初始化是由CubMX 5.1 (默认的固件库是STM32Cube_FW_F3_V1.10.0)自动生成的代码,在keil里边自动升级的固件库是Keil.STM32F3xx_DFP.2.1.0Cub.pack;并在CAN的初始化代码里边加了过滤器初始化代码:
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();
  }

}



在调用库函数
HAL_RetVal=HAL_CAN_AddTxMessage(&HCAN1,&TxHeader,TxData,(uint32_t*)CAN_TX_MAILBOX0);
时进入硬件错误中断。根据单步调试,具体是在执行库函数里边的以下赋值语句出现错误。
hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) |pHeader->RTR);
在执行以上语句前时,数据如下:

执行过后



使用特权

评论回复
沙发
linsure5136|  楼主 | 2019-8-6 15:17 | 只看该作者
难道是定义hcan的位置不合适,导致访问超界了么?敬请各位大拿给支支招啊,看论坛里边用HAL库做CAN通讯好顺利的样子,我这个为什么会出这样的幺蛾子呢?芯片是STM32F373RCT6

使用特权

评论回复
板凳
linsure5136|  楼主 | 2019-8-6 15:35 | 只看该作者
引脚是复用的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 */
  }
}

使用特权

评论回复
地板
linsure5136|  楼主 | 2019-8-6 16:09 | 只看该作者
        还是因为没搞清楚库函数的参数意义,问题出在了调用参数的赋值上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必须要是一个已定义数据的地址,或者给出的一个满足条件的地址才行

使用特权

评论回复
5
CallThewind| | 2019-10-25 12:03 | 只看该作者
linsure5136 发表于 2019-8-6 16:09
还是因为没搞清楚库函数的参数意义,问题出在了调用参数的赋值上HAL_StatusTypeDef HAL_CAN_AddTxM ...

请问是要自己重新给这个地址定义数据吗?

使用特权

评论回复
6
james008| | 2019-12-2 18:52 | 只看该作者
请问楼主问题解决了吗,我调试STM32F303CC,也是到这句话后死机,进入错误中断。

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝