STM32H723 CANFD配置、调试
1cubemx配置
Fdcan时钟频率选择80Mhz(可以根据需求配置);
选择要配置的fdcan,配置好初始化参数
2初始化FDcan
2.1初始化示例:
void MX_FDCAN1_Init(void) { hfdcan1.Instance = FDCAN1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;//设置FDCAN的帧格式为灵活数据频率(FD)帧 hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;//FDCAN的工作模式设置为正常模式 hfdcan1.Init.AutoRetransmission = DISABLE;//关闭自动重传功能。 hfdcan1.Init.TransmitPause = DISABLE;//禁用发送暂停功胿 hfdcan1.Init.ProtocolException = DISABLE;//关闭协议异常处理 hfdcan1.Init.NominalPrescaler = 1;//仲裁段分频 hfdcan1.Init.NominalSyncJumpWidth = 1;//仲裁段跳转宽度 hfdcan1.Init.NominalTimeSeg1 = 127;//仲裁段时间段1 hfdcan1.Init.NominalTimeSeg2 = 32;//仲裁段时间段2 hfdcan1.Init.DataPrescaler = 1;//数据段分频 hfdcan1.Init.DataSyncJumpWidth = 1;//数据段跳转宽庿 hfdcan1.Init.DataTimeSeg1 = 15;//数据段时间段1 hfdcan1.Init.DataTimeSeg2 = 4;//数据段时间段2 hfdcan1.Init.MessageRAMOffset = 0;//RAM偏移量 hfdcan1.Init.StdFiltersNbr = 4;//标准id过滤器个数 hfdcan1.Init.ExtFiltersNbr = 4;//扩展id过滤器个数 hfdcan1.Init.RxFifo0ElmtsNbr = 1;//fifo0个数 hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64; hfdcan1.Init.RxFifo1ElmtsNbr = 1; hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64; hfdcan1.Init.RxBuffersNbr = 4;接收缓冲区个数 hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64; hfdcan1.Init.TxEventsNbr = 0;//tx事件缓冲区个数 hfdcan1.Init.TxBuffersNbr = 1;//发送缓冲区个数 hfdcan1.Init.TxFifoQueueElmtsNbr = 1;//txfifohuotx队列缓冲区个数 hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;//选择TXFIFO模式或TX队列模式 hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;//发送数据的字节数 } |
2.2初始化参数配置
FrameFormat :FDCAN_FRAME_FD_BRS(用于设置CAN格式)
#define FDCAN_FRAME_CLASSIC ((uint32_t)0x00000000U) /* 经典CAN模式 */ #define FDCAN_FRAME_FD_NO_BRS ((uint32_t)FDCAN_CCCR_FDOE) /* FD CAN不带可变波特率 */ #define FDCAN_FRAME_FD_BRS ((uint32_t)(FDCAN_CCCR_FDOE | FDCAN_CCCR_BRSE)) /* FD CAN带可变波特率 */ |
Mode :FDCAN_MODE_NORMAL(用于设置CAN操作模式)
#define FDCAN_MODE_NORMAL ((uint32_t)0x00000000U) /*!< 正常模式 */ #define FDCAN_MODE_RESTRICTED_OPERATION ((uint32_t)0x00000001U) /*!< 有限制的操作模式 */ #define FDCAN_MODE_BUS_MONITORING ((uint32_t)0x00000002U) /*!< 总线监测模式 */ #define FDCAN_MODE_INTERNAL_LOOPBACK ((uint32_t)0x00000003U) /*!< 内部环回模式 */ #define FDCAN_MODE_EXTERNAL_LOOPBACK ((uint32_t)0x00000004U) /*!< 外部环回模式 */ |
AutoRetransmission:DISABLE(使能自动重传模式。使能ENABLE或者禁止DISABLE)。
TransmitPause:DISABLE(使能或者禁止传输暂停特性。ENABLE使能或者DISABLE禁止)。
ProtocolException:DISABLE(使能或者禁止协议异常管理。ENABLE表示使能,DISABLE表示禁止)。
NominalPrescaler:1(用于CAN FD仲裁阶段分频设置,产生标称位时间量,参数范围1-512)。
NominalSyncJumpWidth:1(设置FD CAN仲裁阶段最大支持的时间量来加长或者缩短一个bit来实现再同步,参数范围1-128)。
NominalTimeSeg1:127(设置仲裁阶段Bit Segment 1的时间量,范围2 – 256)。
NominalTimeSeg2:32(设置仲裁阶段Bit Segment 2的时间量,范围2 – 128)。
DataPrescaler:1(用于CAN FD数据阶段分频设置,范围1-32)。
DataSyncJumpWidth:1(设置FD CAN数据阶段最大支持的时间量来加长或者缩短一个bit来实现数据再同步,参数范围1-16)。
DataTimeSeg1:15(设置数据阶段Data Bit Segment 1的时间量,范围1 – 32)。
DataTimeSeg2:4(设置数据阶段Data Bit Segment 2的时间量,范围1 – 16)。
MessageRAMOffset:0(设置消息RAM起始地址,范围0到2560)。
StdFiltersNbr:4(标准ID过滤个数,范围0到128)。
ExtFiltersNbr:4(扩展ID过滤个数,范围0到64)。
RxFifo0ElmtsNbr:1(RX FIFO0元素个数,范围0到64)。
RxFifo0ElmtSize:FDCAN_DATA_BYTES_64(RX FIFO0每个元素中数据大小)。
#define FDCAN_DATA_BYTES_8 ((uint32_t)0x00000004U) /*!< 8 bytes data field */ #define FDCAN_DATA_BYTES_12 ((uint32_t)0x00000005U) /*!< 12 bytes data field */ #define FDCAN_DATA_BYTES_16 ((uint32_t)0x00000006U) /*!< 16 bytes data field */ #define FDCAN_DATA_BYTES_20 ((uint32_t)0x00000007U) /*!< 20 bytes data field */ #define FDCAN_DATA_BYTES_24 ((uint32_t)0x00000008U) /*!< 24 bytes data field */ #define FDCAN_DATA_BYTES_32 ((uint32_t)0x0000000AU) /*!< 32 bytes data field */ #define FDCAN_DATA_BYTES_48 ((uint32_t)0x0000000EU) /*!< 48 bytes data field */ #define FDCAN_DATA_BYTES_64 ((uint32_t)0x00000012U) /*!< 64 bytes data field */ |
Rx