STM32G474之双FDCAN收发(已验证)

 

一、前言

STM32G474RET6,CANFD配置,报文64字节,波特率2M,FDCAN1发送FDCAN2接收,通过USART1打印收发报文进行验证,其中CAN收发芯片为ISO1042。


一、STM32CubeMX配置

1.配置RCC

2.配置SYS

3.配置FDCAN(FDCAN2和FDCAN1相同)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是基于STM32G474FDCAN中断收发代码示例: 首先需要配置FDCAN的时钟和GPIO引脚,然后配置FDCAN中断并初始化FDCAN。下面是一个简单的例子: ```c #include "stm32g4xx_hal.h" #include "stm32g4xx_hal_fdcan.h" /* FDCAN handle structure */ FDCAN_HandleTypeDef hfdcan1; /* FDCAN RX message structure */ FDCAN_RxHeaderTypeDef RxHeader; uint8_t RxData[8]; /* FDCAN TX message structure */ FDCAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8]; /* FDCAN interrupt callback function */ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan) { /* Get RX message */ HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData); /* Process RX message */ // ... } void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes) { /* Process TX message */ // ... } /* FDCAN initialization function */ void FDCAN_Init(void) { /* FDCAN clock enable */ __HAL_RCC_FDCAN_CLK_ENABLE(); /* FDCAN GPIO configuration */ // ... /* FDCAN interrupt configuration */ HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn); /* FDCAN initialization */ hfdcan1.Instance = FDCAN1; hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; hfdcan1.Init.AutoRetransmission = ENABLE; hfdcan1.Init.TransmitPause = DISABLE; hfdcan1.Init.ProtocolException = ENABLE; hfdcan1.Init.NominalPrescaler = 1; hfdcan1.Init.NominalSyncJumpWidth = 1; hfdcan1.Init.NominalTimeSeg1 = 13; hfdcan1.Init.NominalTimeSeg2 = 2; hfdcan1.Init.DataPrescaler = 1; hfdcan1.Init.DataSyncJumpWidth = 1; hfdcan1.Init.DataTimeSeg1 = 13; hfdcan1.Init.DataTimeSeg2 = 2; hfdcan1.Init.StdFiltersNbr = 1; hfdcan1.Init.ExtFiltersNbr = 0; hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; hfdcan1.Init.TxFifoQueueSize = 1; hfdcan1.Init.RxFifo0Operation = FDCAN_RX_FIFO_OPERATION; hfdcan1.Init.RxFifo0Size = 1; hfdcan1.Init.RxFifo0ElmtsNbr = 1; hfdcan1.Init.RxFifo1Operation = DISABLE; hfdcan1.Init.RxFifo1Size = 0; hfdcan1.Init.RxFifo1ElmtsNbr = 0; hfdcan1.Init.TxEventFifoOperation = DISABLE; hfdcan1.Init.TxEventFifoSize = 0; hfdcan1.Init.TxEventFifoElmtsNbr = 0; HAL_FDCAN_Init(&hfdcan1); /* FDCAN filter configuration */ FDCAN_FilterTypeDef filter; filter.IdType = FDCAN_STANDARD_ID; filter.FilterIndex = 0; filter.FilterType = FDCAN_FILTER_MASK; filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; filter.FilterID1 = 0x111; filter.FilterMask1 = 0x7FF; filter.FilterID2 = 0x000; filter.FilterMask2 = 0x7FF; HAL_FDCAN_ConfigFilter(&hfdcan1, &filter); } /* FDCAN transmit function */ void FDCAN_Transmit(void) { /* FDCAN message transmission */ TxHeader.Identifier = 0x111; TxHeader.IdType = FDCAN_STANDARD_ID; TxHeader.TxFrameType = FDCAN_DATA_FRAME; TxHeader.DataLength = FDCAN_DLC_BYTES_8; TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; TxHeader.BitRateSwitch = FDCAN_BRS_OFF; TxHeader.FDFormat = FDCAN_CLASSIC_CAN; TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; TxHeader.MessageMarker = 0; TxData[0] = 0x55; TxData[1] = 0xAA; TxData[2] = 0x55; TxData[3] = 0xAA; TxData[4] = 0x55; TxData[5] = 0xAA; TxData[6] = 0x55; TxData[7] = 0xAA; HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); } int main(void) { /* FDCAN initialization */ FDCAN_Init(); /* FDCAN message transmission */ FDCAN_Transmit(); /* Infinite loop */ while (1) { // ... } } ``` 在上面的代码中,我们定义了一个FDCAN句柄结构体,一个FDCAN RX消息结构体和一个FDCAN TX消息结构体。然后,在FDCAN初始化函数中,我们配置了FDCAN的时钟和GPIO引脚,配置了FDCAN中断,并初始化了FDCAN。在FDCAN初始化完成后,我们可以在主函数中调用FDCAN_Transmit函数来发送FDCAN消息。 在FDCAN中,我们需要使用中断来处理接收和发送操作。因此,在FDCAN初始化函数中,我们注册了两个回调函数:HAL_FDCAN_RxFifo0Callback和HAL_FDCAN_TxBufferCompleteCallback。当FDCAN RX FIFO0中有新的消息时,HAL_FDCAN_RxFifo0Callback函数将被调用。在HAL_FDCAN_TxBufferCompleteCallback函数中,我们可以处理FDCAN TX消息的结果。 请注意,上面的代码仅提供了一个FDCAN中断收发的框架。具体实现需要根据具体的应用进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值