STM32 HAL库FDCAN功能深度解析

1、HAL_StatusTypeDef HAL_FDCAN_Init (FDCAN_HandleTypeDef * hfdcan)

  
    FDCAN_HandleTypeDef FDCAN1_Handler;

    FDCAN1_Handler.Instance=FDCAN1;
    FDCAN1_Handler.Init.FrameFormat=FDCAN_FRAME_CLASSIC;            //传统模式
    FDCAN1_Handler.Init.Mode=FDCAN_MODE_NORMAL;                     //标准测试
    FDCAN1_Handler.Init.AutoRetransmission=DISABLE;                 //关闭自动重传
    FDCAN1_Handler.Init.TransmitPause=DISABLE;                      //关闭传输暂停
    FDCAN1_Handler.Init.ProtocolException=DISABLE;                  //关闭协议异常处理
    FDCAN1_Handler.Init.NominalPrescaler=10;                        //分频系数
    FDCAN1_Handler.Init.NominalSyncJumpWidth=8;                    //重新同步跳跃宽度
    FDCAN1_Handler.Init.NominalTimeSeg1=31;                        //tsg1范围:2~256
    FDCAN1_Handler.Init.NominalTimeSeg2=8;                         //tsg2范围:2~128
    FDCAN1_Handler.Init.MessageRAMOffset=0;                         //信息RAM偏移
    FDCAN1_Handler.Init.StdFiltersNbr=0;                            //标准信息ID滤波器编号
    FDCAN1_Handler.Init.ExtFiltersNbr=0;                            //扩展信息ID滤波器编号
    FDCAN1_Handler.Init.RxFifo0ElmtsNbr=1;                          //接收FIFO0元素编号
    FDCAN1_Handler.Init.RxFifo0ElmtSize=FDCAN_DATA_BYTES_8;         //接收FIFO0元素大小:8字节
    FDCAN1_Handler.Init.RxBuffersNbr=0;                             //接收缓冲编号
    FDCAN1_Handler.Init.TxEventsNbr=0;                              //发送事件编号
    FDCAN1_Handler.Init.TxBuffersNbr=0;                             //发送缓冲编号
    FDCAN1_Handler.Init.TxFifoQueueElmtsNbr=1;                      //发送FIFO序列元素编号
    FDCAN1_Handler.Init.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION;    //发送FIFO序列模式
    FDCAN1_Handler.Init.TxElmtSize=FDCAN_DATA_BYTES_8;              //发送大小:8字节
    if(HAL_FDCAN_Init(&FDCAN1_Handler)!=HAL_OK) return 1;           //初始化FDCAN
  

2、HAL_StatusTypeDef HAL_FDCAN_DeInit (FDCAN_HandleTypeDef * hfdcan)

 复位FDCAN配置。

FDCAN_HandleTypeDef FDCAN1_Handler;
HAL_FDCAN_DeInit(&FDCAN1_Handler);                              

3、void HAL_FDCAN_MspInit (FDCAN_HandleTypeDef * hfdcan)

void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
{
    GPIO_InitTypeDef GPIO_Initure;
    RCC_PeriphCLKInitTypeDef FDCAN_PeriphClk;
    
    __HAL_RCC_FDCAN_CLK_ENABLE();                   //使能FDCAN1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();			        //开启GPIOA时钟
	
    //FDCAN1时钟源配置为PLL1Q
    FDCAN_PeriphClk.PeriphClockSelection=RCC_PERIPHCLK_FDCAN;
    FDCAN_PeriphClk.FdcanClockSelection=RCC_FDCANCLKSOURCE_PLL;
    HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk);
    
    GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12;       //PA11,12
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //推挽复用
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_MEDIUM;      //超高速
    GPIO_Initure.Alternate=GPIO_AF9_FDCAN1;         //复用为CAN1
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);             //初始化

}

CAN初始化回调配置,配置GPIO口和时钟 ,被函数1自动调用。

4、void HAL_FDCAN_MspDeInit (FDCAN_HandleTypeDef * hfdcan)

void HAL_FDCAN_MspDeInit (FDCAN_HandleTypeDef * hfdcan)

5、HAL_StatusTypeDef HAL_FDCAN_EnterPowerDownMode (FDCAN_HandleTypeDef * hfdcan)

进入休眠模式

FDCAN_HandleTypeDef FDCAN1_Handler;

HAL_FDCAN_EnterPowerDownMode ( &FDCAN1_Handler);

6、HAL_StatusTypeDef HAL_FDCAN_ExitPowerDownMode (FDCAN_HandleTypeDef * hfdcan)

FDCAN_HandleTypeDef FDCAN1_Handler;
HAL_FDCAN_ExitPowerDownMode (&FDCAN1_Handler);

退出休眠模式。

7、

HAL_StatusTypeDef HAL_FDCAN_ConfigFilter (FDCAN_HandleTypeDef * hfdcan, FDCAN_FilterTypeDef *
sFilterConfig)

配置滤波器。

    FDCAN_HandleTypeDef FDCAN1_Handler;
    FDCAN_FilterTypeDef FDCAN1_RXFilter;
    FDCAN1_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
    FDCAN1_RXFilter.FilterIndex=0;                                  //滤波器索引                   
    FDCAN1_RXFilter.FilterType=FDCAN_FILTER_MASK;                   //滤波器类型
    FDCAN1_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;           //过滤器0关联到FIFO0  
    FDCAN1_RXFilter.FilterID1=0x0000;                               //32位ID
    FDCAN1_RXFilter.FilterID2=0x0000;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter);

8、HAL_StatusTypeDef HAL_FDCAN_Start (FDCAN_HandleTypeDef * hfdcan)

开启FDCAN通信。

HAL_FDCAN_Start(&FDCAN1_Handler);                               //开启FDCAN

9、HAL_StatusTypeDef HAL_FDCAN_AddMessageToTxFifoQ(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData)

重要函数 使用FDCAN 发送数据。

第二个输入参数需要提供一个FDCAN_TxHeaderTypeDef类型的指针,此结构体类型用于封装CAN发送数据之外的其他必要信息。第三个参数是要发送的数据。

在以前的HAL库中 两个参数合并在了一起,现在拆分成了两部分。

FDCAN_TxHeaderTypeDef FDCAN1_TxHeader;
void FDCAN1_Send_Msg()
{	

    uint8_t msg[8] = {1,2,3,4,5,6,7,8};
    FDCAN1_TxHeader.Identifier=  0x1234;                       //32位ID
    FDCAN1_TxHeader.IdType=FDCAN_STANDARD_ID;                  //标准ID
    FDCAN1_TxHeader.TxFrameType=FDCAN_DATA_FRAME;              //数据帧
    FDCAN1_TxHeader.DataLength=8;                              //数据长度
    FDCAN1_TxHeader.ErrorStateIndicator=FDCAN_ESI_ACTIVE;            
    FDCAN1_TxHeader.BitRateSwitch=FDCAN_BRS_OFF;               //关闭速率切换
    FDCAN1_TxHeader.FDFormat=FDCAN_CLASSIC_CAN;                //传统的CAN模式
    FDCAN1_TxHeader.TxEventFifoControl=FDCAN_NO_TX_EVENTS;     //无发送事件
    FDCAN1_TxHeader.MessageMarker=0;                           
    
     HAL_FDCAN_AddMessageToTxFifoQ(&FDCAN1_Handler,&FDCAN1_TxHeader,msg);
}

10、HAL_StatusTypeDef HAL_FDCAN_GetRxMessage(FDCAN_HandleTypeDef *hfdcan, uint32_t RxLocation, FDCAN_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData)

重要函数,使用FDCAN 接收数据

同函数9一样,接收数据的时候也需要提供一个FDCAN_RxHeaderTypeDef   类型的指针。相比于FDCAN_TxHeaderTypeDef 类型的数据 ,此处声明的变量不需要配置参数,只需要读取内部数据即可。

参数三是数据返回的指针。


uint8_t buf[24];
FDCAN_RxHeaderTypeDef FDCAN1_RxHeader;

HAL_FDCAN_GetRxMessage(&FDCAN1_Handler,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,buf);

9、HAL_StatusTypeDef HAL_FDCAN_ActivateNotification(FDCAN_HandleTypeDef *hfdcan, uint32_t ActiveITs, uint32_t BufferIndexes)

开启FDCAN中断。

HAL_FDCAN_ActivateNotification(&FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
//开启FIFO 0 接收中断

10、void FDCAN1_IT0_IRQHandler(void)
FDCAN 中断服务函数

void FDCAN1_IT0_IRQHandler(void)
{
    HAL_FDCAN_IRQHandler(&FDCAN1_Handler);
}

11、void HAL_FDCAN_RxFifo0Callback (FDCAN_HandleTypeDef * hfdcan, uint32_t RxFifo0ITs)

FDCAN 接收中断的回调函数,只处理FIFO0的接收数据中断。

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
    u8 i=0;
    u8 rxdata[8];
    if((RxFifo0ITs&FDCAN_IT_RX_FIFO0_NEW_MESSAGE)!=RESET)   //FIFO1新数据中断
    {
        //提取FIFO0中接收到的数据
        HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,rxdata);
        printf("id:%#x\r\n",FDCAN1_RxHeader.Identifier);
        printf("len:%d\r\n",FDCAN1_RxHeader.DataLength>>16);
        for(i=0;i<8;i++)
        printf("rxdata[%d]:%d\r\n",i,rxdata[i]);
        HAL_FDCAN_ActivateNotification(hfdcan,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
    }
}

作者:似是燕归来

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 HAL库FDCAN功能深度解析

发表回复