mirror of
https://gitee.com/dlmu-cone/tronone-h7-scaffold
synced 2026-07-24 03:27:45 +08:00
修复了吗?没有,很难的啦111
This commit is contained in:
@@ -42,9 +42,9 @@ void MX_FDCAN1_Init(void)
|
|||||||
hfdcan1.Instance = FDCAN1;
|
hfdcan1.Instance = FDCAN1;
|
||||||
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
||||||
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
|
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
|
||||||
hfdcan1.Init.AutoRetransmission = ENABLE;
|
hfdcan1.Init.AutoRetransmission = DISABLE;
|
||||||
hfdcan1.Init.TransmitPause = DISABLE;
|
hfdcan1.Init.TransmitPause = DISABLE;
|
||||||
hfdcan1.Init.ProtocolException = ENABLE;
|
hfdcan1.Init.ProtocolException = DISABLE;
|
||||||
hfdcan1.Init.NominalPrescaler = 3;
|
hfdcan1.Init.NominalPrescaler = 3;
|
||||||
hfdcan1.Init.NominalSyncJumpWidth = 10;
|
hfdcan1.Init.NominalSyncJumpWidth = 10;
|
||||||
hfdcan1.Init.NominalTimeSeg1 = 29;
|
hfdcan1.Init.NominalTimeSeg1 = 29;
|
||||||
@@ -54,11 +54,11 @@ void MX_FDCAN1_Init(void)
|
|||||||
hfdcan1.Init.DataTimeSeg1 = 29;
|
hfdcan1.Init.DataTimeSeg1 = 29;
|
||||||
hfdcan1.Init.DataTimeSeg2 = 10;
|
hfdcan1.Init.DataTimeSeg2 = 10;
|
||||||
hfdcan1.Init.MessageRAMOffset = 0;
|
hfdcan1.Init.MessageRAMOffset = 0;
|
||||||
hfdcan1.Init.StdFiltersNbr = 1;
|
hfdcan1.Init.StdFiltersNbr = 14;
|
||||||
hfdcan1.Init.ExtFiltersNbr = 0;
|
hfdcan1.Init.ExtFiltersNbr = 0;
|
||||||
hfdcan1.Init.RxFifo0ElmtsNbr = 32;
|
hfdcan1.Init.RxFifo0ElmtsNbr = 4;
|
||||||
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
||||||
hfdcan1.Init.RxFifo1ElmtsNbr = 0;
|
hfdcan1.Init.RxFifo1ElmtsNbr = 4;
|
||||||
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
||||||
hfdcan1.Init.RxBuffersNbr = 0;
|
hfdcan1.Init.RxBuffersNbr = 0;
|
||||||
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
||||||
@@ -90,9 +90,9 @@ void MX_FDCAN2_Init(void)
|
|||||||
hfdcan2.Instance = FDCAN2;
|
hfdcan2.Instance = FDCAN2;
|
||||||
hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
||||||
hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
|
hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
|
||||||
hfdcan2.Init.AutoRetransmission = ENABLE;
|
hfdcan2.Init.AutoRetransmission = DISABLE;
|
||||||
hfdcan2.Init.TransmitPause = DISABLE;
|
hfdcan2.Init.TransmitPause = DISABLE;
|
||||||
hfdcan2.Init.ProtocolException = ENABLE;
|
hfdcan2.Init.ProtocolException = DISABLE;
|
||||||
hfdcan2.Init.NominalPrescaler = 3;
|
hfdcan2.Init.NominalPrescaler = 3;
|
||||||
hfdcan2.Init.NominalSyncJumpWidth = 10;
|
hfdcan2.Init.NominalSyncJumpWidth = 10;
|
||||||
hfdcan2.Init.NominalTimeSeg1 = 29;
|
hfdcan2.Init.NominalTimeSeg1 = 29;
|
||||||
@@ -102,11 +102,11 @@ void MX_FDCAN2_Init(void)
|
|||||||
hfdcan2.Init.DataTimeSeg1 = 29;
|
hfdcan2.Init.DataTimeSeg1 = 29;
|
||||||
hfdcan2.Init.DataTimeSeg2 = 10;
|
hfdcan2.Init.DataTimeSeg2 = 10;
|
||||||
hfdcan2.Init.MessageRAMOffset = 853;
|
hfdcan2.Init.MessageRAMOffset = 853;
|
||||||
hfdcan2.Init.StdFiltersNbr = 1;
|
hfdcan2.Init.StdFiltersNbr = 14;
|
||||||
hfdcan2.Init.ExtFiltersNbr = 0;
|
hfdcan2.Init.ExtFiltersNbr = 0;
|
||||||
hfdcan2.Init.RxFifo0ElmtsNbr = 0;
|
hfdcan2.Init.RxFifo0ElmtsNbr = 4;
|
||||||
hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
||||||
hfdcan2.Init.RxFifo1ElmtsNbr = 32;
|
hfdcan2.Init.RxFifo1ElmtsNbr = 4;
|
||||||
hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
||||||
hfdcan2.Init.RxBuffersNbr = 0;
|
hfdcan2.Init.RxBuffersNbr = 0;
|
||||||
hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
||||||
@@ -138,9 +138,9 @@ void MX_FDCAN3_Init(void)
|
|||||||
hfdcan3.Instance = FDCAN3;
|
hfdcan3.Instance = FDCAN3;
|
||||||
hfdcan3.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
hfdcan3.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
|
||||||
hfdcan3.Init.Mode = FDCAN_MODE_NORMAL;
|
hfdcan3.Init.Mode = FDCAN_MODE_NORMAL;
|
||||||
hfdcan3.Init.AutoRetransmission = ENABLE;
|
hfdcan3.Init.AutoRetransmission = DISABLE;
|
||||||
hfdcan3.Init.TransmitPause = DISABLE;
|
hfdcan3.Init.TransmitPause = DISABLE;
|
||||||
hfdcan3.Init.ProtocolException = ENABLE;
|
hfdcan3.Init.ProtocolException = DISABLE;
|
||||||
hfdcan3.Init.NominalPrescaler = 3;
|
hfdcan3.Init.NominalPrescaler = 3;
|
||||||
hfdcan3.Init.NominalSyncJumpWidth = 10;
|
hfdcan3.Init.NominalSyncJumpWidth = 10;
|
||||||
hfdcan3.Init.NominalTimeSeg1 = 29;
|
hfdcan3.Init.NominalTimeSeg1 = 29;
|
||||||
@@ -150,11 +150,11 @@ void MX_FDCAN3_Init(void)
|
|||||||
hfdcan3.Init.DataTimeSeg1 = 29;
|
hfdcan3.Init.DataTimeSeg1 = 29;
|
||||||
hfdcan3.Init.DataTimeSeg2 = 10;
|
hfdcan3.Init.DataTimeSeg2 = 10;
|
||||||
hfdcan3.Init.MessageRAMOffset = 1706;
|
hfdcan3.Init.MessageRAMOffset = 1706;
|
||||||
hfdcan3.Init.StdFiltersNbr = 1;
|
hfdcan3.Init.StdFiltersNbr = 14;
|
||||||
hfdcan3.Init.ExtFiltersNbr = 0;
|
hfdcan3.Init.ExtFiltersNbr = 0;
|
||||||
hfdcan3.Init.RxFifo0ElmtsNbr = 0;
|
hfdcan3.Init.RxFifo0ElmtsNbr = 4;
|
||||||
hfdcan3.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
hfdcan3.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
|
||||||
hfdcan3.Init.RxFifo1ElmtsNbr = 32;
|
hfdcan3.Init.RxFifo1ElmtsNbr = 4;
|
||||||
hfdcan3.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
hfdcan3.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
|
||||||
hfdcan3.Init.RxBuffersNbr = 0;
|
hfdcan3.Init.RxBuffersNbr = 0;
|
||||||
hfdcan3.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
hfdcan3.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ Dma.USART3_TX.10.SyncEnable=DISABLE
|
|||||||
Dma.USART3_TX.10.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
|
Dma.USART3_TX.10.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
|
||||||
Dma.USART3_TX.10.SyncRequestNumber=1
|
Dma.USART3_TX.10.SyncRequestNumber=1
|
||||||
Dma.USART3_TX.10.SyncSignalID=NONE
|
Dma.USART3_TX.10.SyncSignalID=NONE
|
||||||
FDCAN1.AutoRetransmission=ENABLE
|
FDCAN1.AutoRetransmission=DISABLE
|
||||||
FDCAN1.CalculateBaudRateNominal=1000000
|
FDCAN1.CalculateBaudRateNominal=1000000
|
||||||
FDCAN1.CalculateTimeBitNominal=1000
|
FDCAN1.CalculateTimeBitNominal=1000
|
||||||
FDCAN1.CalculateTimeQuantumNominal=25.0
|
FDCAN1.CalculateTimeQuantumNominal=25.0
|
||||||
@@ -338,17 +338,18 @@ FDCAN1.DataPrescaler=3
|
|||||||
FDCAN1.DataSyncJumpWidth=10
|
FDCAN1.DataSyncJumpWidth=10
|
||||||
FDCAN1.DataTimeSeg1=29
|
FDCAN1.DataTimeSeg1=29
|
||||||
FDCAN1.DataTimeSeg2=10
|
FDCAN1.DataTimeSeg2=10
|
||||||
FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,DataPrescaler,DataTimeSeg1,DataTimeSeg2,TxFifoQueueMode,RxFifo0ElmtsNbr,TxFifoQueueElmtsNbr,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth
|
FDCAN1.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,DataPrescaler,DataTimeSeg1,DataTimeSeg2,TxFifoQueueMode,RxFifo0ElmtsNbr,TxFifoQueueElmtsNbr,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,RxFifo1ElmtsNbr
|
||||||
FDCAN1.NominalPrescaler=3
|
FDCAN1.NominalPrescaler=3
|
||||||
FDCAN1.NominalSyncJumpWidth=10
|
FDCAN1.NominalSyncJumpWidth=10
|
||||||
FDCAN1.NominalTimeSeg1=29
|
FDCAN1.NominalTimeSeg1=29
|
||||||
FDCAN1.NominalTimeSeg2=10
|
FDCAN1.NominalTimeSeg2=10
|
||||||
FDCAN1.ProtocolException=ENABLE
|
FDCAN1.ProtocolException=DISABLE
|
||||||
FDCAN1.RxFifo0ElmtsNbr=32
|
FDCAN1.RxFifo0ElmtsNbr=4
|
||||||
FDCAN1.StdFiltersNbr=1
|
FDCAN1.RxFifo1ElmtsNbr=4
|
||||||
|
FDCAN1.StdFiltersNbr=14
|
||||||
FDCAN1.TxFifoQueueElmtsNbr=32
|
FDCAN1.TxFifoQueueElmtsNbr=32
|
||||||
FDCAN1.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION
|
FDCAN1.TxFifoQueueMode=FDCAN_TX_FIFO_OPERATION
|
||||||
FDCAN2.AutoRetransmission=ENABLE
|
FDCAN2.AutoRetransmission=DISABLE
|
||||||
FDCAN2.CalculateBaudRateNominal=1000000
|
FDCAN2.CalculateBaudRateNominal=1000000
|
||||||
FDCAN2.CalculateTimeBitNominal=1000
|
FDCAN2.CalculateTimeBitNominal=1000
|
||||||
FDCAN2.CalculateTimeQuantumNominal=25.0
|
FDCAN2.CalculateTimeQuantumNominal=25.0
|
||||||
@@ -356,17 +357,18 @@ FDCAN2.DataPrescaler=3
|
|||||||
FDCAN2.DataSyncJumpWidth=10
|
FDCAN2.DataSyncJumpWidth=10
|
||||||
FDCAN2.DataTimeSeg1=29
|
FDCAN2.DataTimeSeg1=29
|
||||||
FDCAN2.DataTimeSeg2=10
|
FDCAN2.DataTimeSeg2=10
|
||||||
FDCAN2.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth
|
FDCAN2.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,RxFifo0ElmtsNbr
|
||||||
FDCAN2.MessageRAMOffset=853
|
FDCAN2.MessageRAMOffset=853
|
||||||
FDCAN2.NominalPrescaler=3
|
FDCAN2.NominalPrescaler=3
|
||||||
FDCAN2.NominalSyncJumpWidth=10
|
FDCAN2.NominalSyncJumpWidth=10
|
||||||
FDCAN2.NominalTimeSeg1=29
|
FDCAN2.NominalTimeSeg1=29
|
||||||
FDCAN2.NominalTimeSeg2=10
|
FDCAN2.NominalTimeSeg2=10
|
||||||
FDCAN2.ProtocolException=ENABLE
|
FDCAN2.ProtocolException=DISABLE
|
||||||
FDCAN2.RxFifo1ElmtsNbr=32
|
FDCAN2.RxFifo0ElmtsNbr=4
|
||||||
FDCAN2.StdFiltersNbr=1
|
FDCAN2.RxFifo1ElmtsNbr=4
|
||||||
|
FDCAN2.StdFiltersNbr=14
|
||||||
FDCAN2.TxFifoQueueElmtsNbr=32
|
FDCAN2.TxFifoQueueElmtsNbr=32
|
||||||
FDCAN3.AutoRetransmission=ENABLE
|
FDCAN3.AutoRetransmission=DISABLE
|
||||||
FDCAN3.CalculateBaudRateNominal=1000000
|
FDCAN3.CalculateBaudRateNominal=1000000
|
||||||
FDCAN3.CalculateTimeBitNominal=1000
|
FDCAN3.CalculateTimeBitNominal=1000
|
||||||
FDCAN3.CalculateTimeQuantumNominal=25.0
|
FDCAN3.CalculateTimeQuantumNominal=25.0
|
||||||
@@ -375,15 +377,16 @@ FDCAN3.DataPrescaler=3
|
|||||||
FDCAN3.DataSyncJumpWidth=10
|
FDCAN3.DataSyncJumpWidth=10
|
||||||
FDCAN3.DataTimeSeg1=29
|
FDCAN3.DataTimeSeg1=29
|
||||||
FDCAN3.DataTimeSeg2=10
|
FDCAN3.DataTimeSeg2=10
|
||||||
FDCAN3.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,ClockCalibrationCCU
|
FDCAN3.IPParameters=CalculateTimeQuantumNominal,CalculateTimeBitNominal,CalculateBaudRateNominal,DataPrescaler,DataTimeSeg1,DataTimeSeg2,NominalPrescaler,NominalTimeSeg1,NominalTimeSeg2,RxFifo1ElmtsNbr,TxFifoQueueElmtsNbr,MessageRAMOffset,StdFiltersNbr,AutoRetransmission,ProtocolException,NominalSyncJumpWidth,DataSyncJumpWidth,ClockCalibrationCCU,RxFifo0ElmtsNbr
|
||||||
FDCAN3.MessageRAMOffset=1706
|
FDCAN3.MessageRAMOffset=1706
|
||||||
FDCAN3.NominalPrescaler=3
|
FDCAN3.NominalPrescaler=3
|
||||||
FDCAN3.NominalSyncJumpWidth=10
|
FDCAN3.NominalSyncJumpWidth=10
|
||||||
FDCAN3.NominalTimeSeg1=29
|
FDCAN3.NominalTimeSeg1=29
|
||||||
FDCAN3.NominalTimeSeg2=10
|
FDCAN3.NominalTimeSeg2=10
|
||||||
FDCAN3.ProtocolException=ENABLE
|
FDCAN3.ProtocolException=DISABLE
|
||||||
FDCAN3.RxFifo1ElmtsNbr=32
|
FDCAN3.RxFifo0ElmtsNbr=4
|
||||||
FDCAN3.StdFiltersNbr=1
|
FDCAN3.RxFifo1ElmtsNbr=4
|
||||||
|
FDCAN3.StdFiltersNbr=14
|
||||||
FDCAN3.TxFifoQueueElmtsNbr=32
|
FDCAN3.TxFifoQueueElmtsNbr=32
|
||||||
FREERTOS.FootprintOK=true
|
FREERTOS.FootprintOK=true
|
||||||
FREERTOS.IPParameters=Tasks01,configENABLE_FPU,FootprintOK,configUSE_NEWLIB_REENTRANT,configCHECK_FOR_STACK_OVERFLOW,configUSE_MALLOC_FAILED_HOOK,configTOTAL_HEAP_SIZE,configMINIMAL_STACK_SIZE
|
FREERTOS.IPParameters=Tasks01,configENABLE_FPU,FootprintOK,configUSE_NEWLIB_REENTRANT,configCHECK_FOR_STACK_OVERFLOW,configUSE_MALLOC_FAILED_HOOK,configTOTAL_HEAP_SIZE,configMINIMAL_STACK_SIZE
|
||||||
|
|||||||
@@ -78,24 +78,26 @@ static void CANAddFilter(FDCANInstance *_instance)
|
|||||||
fdcan_filter_conf.IsCalibrationMsg = 0;
|
fdcan_filter_conf.IsCalibrationMsg = 0;
|
||||||
//fdcan_filter_conf.RxBufferIndex=0;
|
//fdcan_filter_conf.RxBufferIndex=0;
|
||||||
|
|
||||||
// ================== 【核心修复区】 ==================@todo:有问题 我要验牌
|
// // ================== 【核心修复区】 ==================@todo:有问题 我要验牌
|
||||||
// 1. 强制让 FDCAN 进入 INIT 模式,否则无法写入 Message RAM
|
// // 1. 强制让 FDCAN 进入 INIT 模式,否则无法写入 Message RAM
|
||||||
HAL_FDCAN_Stop(_instance->can_handle);
|
// HAL_FDCAN_Stop(_instance->can_handle);
|
||||||
|
//
|
||||||
|
// // 2. 写入过滤器配置
|
||||||
|
// HAL_FDCAN_ConfigFilter(_instance->can_handle, &fdcan_filter_conf);
|
||||||
|
//
|
||||||
|
// // 3. 重新启动 FDCAN
|
||||||
|
// HAL_FDCAN_Start(_instance->can_handle);
|
||||||
|
//
|
||||||
|
// // 4. 【救命稻草】HAL_FDCAN_Stop 关闭了所有中断,必须在这里重新激活!
|
||||||
|
// uint32_t FDCAN_RXActiveITs = FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO0_FULL |
|
||||||
|
// FDCAN_IT_RX_FIFO0_WATERMARK | FDCAN_IT_RX_FIFO0_MESSAGE_LOST |
|
||||||
|
// FDCAN_IT_RX_FIFO1_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_FULL |
|
||||||
|
// FDCAN_IT_RX_FIFO1_WATERMARK | FDCAN_IT_RX_FIFO1_MESSAGE_LOST;
|
||||||
|
// HAL_FDCAN_ActivateNotification(_instance->can_handle, FDCAN_RXActiveITs, 0);
|
||||||
|
// // ====================================================
|
||||||
|
|
||||||
// 2. 写入过滤器配置
|
|
||||||
HAL_FDCAN_ConfigFilter(_instance->can_handle, &fdcan_filter_conf);
|
HAL_FDCAN_ConfigFilter(_instance->can_handle, &fdcan_filter_conf);
|
||||||
|
|
||||||
// 3. 重新启动 FDCAN
|
|
||||||
HAL_FDCAN_Start(_instance->can_handle);
|
|
||||||
|
|
||||||
// 4. 【救命稻草】HAL_FDCAN_Stop 关闭了所有中断,必须在这里重新激活!
|
|
||||||
uint32_t FDCAN_RXActiveITs = FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO0_FULL |
|
|
||||||
FDCAN_IT_RX_FIFO0_WATERMARK | FDCAN_IT_RX_FIFO0_MESSAGE_LOST |
|
|
||||||
FDCAN_IT_RX_FIFO1_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_FULL |
|
|
||||||
FDCAN_IT_RX_FIFO1_WATERMARK | FDCAN_IT_RX_FIFO1_MESSAGE_LOST;
|
|
||||||
HAL_FDCAN_ActivateNotification(_instance->can_handle, FDCAN_RXActiveITs, 0);
|
|
||||||
// ====================================================
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
CAN_FilterTypeDef can_filter_conf;
|
CAN_FilterTypeDef can_filter_conf;
|
||||||
static uint8_t can1_filter_idx = 0, can2_filter_idx = 14; // 0-13给can1用,14-27给can2用
|
static uint8_t can1_filter_idx = 0, can2_filter_idx = 14; // 0-13给can1用,14-27给can2用
|
||||||
|
|||||||
@@ -13,14 +13,15 @@ static XidiPowerMeterInstance *power_meter_instance = NULL;
|
|||||||
* @brief 功率计数据解码函数
|
* @brief 功率计数据解码函数
|
||||||
* @param _instance FDCAN实例指针
|
* @param _instance FDCAN实例指针
|
||||||
*
|
*
|
||||||
* @note 数据格式:
|
* @note 新版数据格式 (大端模式):
|
||||||
* DATA[0]: 电流数值低8位
|
* DATA[0]: 电压高8位
|
||||||
* DATA[1]: 电流数值高8位
|
* DATA[1]: 电压低8位
|
||||||
* DATA[2]: 电压数值低8位
|
* DATA[2]: 电流高8位
|
||||||
* DATA[3]: 电压数值高8位
|
* DATA[3]: 电流低8位
|
||||||
* DATA[4]-DATA[7]: 保留
|
* DATA[4]: 功率高8位
|
||||||
*
|
* DATA[5]: 功率低8位
|
||||||
* 电压电流数值均为放大100倍后的整数,需要除以100.0得到实际值
|
* DATA[6]: 标识符
|
||||||
|
* DATA[7]: 校验和
|
||||||
*/
|
*/
|
||||||
void XidiPowerMeterDecode(FDCANInstance *_instance)
|
void XidiPowerMeterDecode(FDCANInstance *_instance)
|
||||||
{
|
{
|
||||||
@@ -39,18 +40,20 @@ void XidiPowerMeterDecode(FDCANInstance *_instance)
|
|||||||
// 计算时间间隔
|
// 计算时间间隔
|
||||||
measure->dt = DWT_GetDeltaT(&power_meter_instance->feed_cnt);
|
measure->dt = DWT_GetDeltaT(&power_meter_instance->feed_cnt);
|
||||||
|
|
||||||
// 解析电流数据 (放大100倍,需要除以100)
|
// 1. 解析电压 (高8位在前,低8位在后)
|
||||||
auto current_raw = (int16_t) ((rxbuff[1] << 8) | rxbuff[0]);
|
uint16_t voltage_raw = (rxbuff[0] << 8) | rxbuff[1];
|
||||||
measure->current = (float) current_raw / 100.0f;
|
|
||||||
|
|
||||||
// 解析电压数据 (放大100倍,需要除以100)
|
|
||||||
auto voltage_raw = (int16_t) ((rxbuff[3] << 8) | rxbuff[2]);
|
|
||||||
measure->voltage = (float) voltage_raw / 100.0f;
|
measure->voltage = (float) voltage_raw / 100.0f;
|
||||||
|
|
||||||
// 计算功率
|
// 2. 解析电流 (高8位在前,低8位在后)
|
||||||
measure->power = measure->voltage * measure->current;
|
uint16_t current_raw = (rxbuff[2] << 8) | rxbuff[3];
|
||||||
|
measure->current = (float) current_raw / 100.0f;
|
||||||
|
|
||||||
// 计算累计能量 (功率 × 时间)
|
// 3. 解析功率 (高8位在前,低8位在后)
|
||||||
|
// 既然协议里直接发了功率,我们就直接读硬件算好的,比自己用 U*I 算更准
|
||||||
|
uint16_t power_raw = (rxbuff[4] << 8) | rxbuff[5];
|
||||||
|
measure->power = (float) power_raw / 100.0f;
|
||||||
|
|
||||||
|
// 4. 计算累计能量 (功率 × 时间)
|
||||||
measure->energy += measure->power * measure->dt * 0.001f; // dt单位是ms,转换为秒
|
measure->energy += measure->power * measure->dt * 0.001f; // dt单位是ms,转换为秒
|
||||||
|
|
||||||
measure->update_cnt++;
|
measure->update_cnt++;
|
||||||
@@ -79,7 +82,7 @@ XidiPowerMeterInstance *XidiPowerMeterInit(XidiPowerMeter_Init_Config_s *XidiPow
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 2. 分配内存并清零
|
// 2. 分配内存并清零
|
||||||
power_meter_instance = (XidiPowerMeterInstance *)malloc(sizeof(XidiPowerMeterInstance));
|
power_meter_instance = (XidiPowerMeterInstance *) malloc(sizeof(XidiPowerMeterInstance));
|
||||||
if (power_meter_instance == NULL)
|
if (power_meter_instance == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ static float current_energy_j = 0.0f;
|
|||||||
// 1. 定义为静态变量(static),确保它的内存空间常驻,防止底层指针悬垂!
|
// 1. 定义为静态变量(static),确保它的内存空间常驻,防止底层指针悬垂!
|
||||||
static XidiPowerMeter_Init_Config_s xidi_pm_config = {
|
static XidiPowerMeter_Init_Config_s xidi_pm_config = {
|
||||||
.can_config = {
|
.can_config = {
|
||||||
.can_handle = &hfdcan1, // 原来直接传的句柄,现在放进结构体里
|
.can_handle = &hfdcan2, // 原来直接传的句柄,现在放进结构体里
|
||||||
.rx_id = 0x213, // 接收 ID
|
.rx_id = 0x213, // 接收 ID
|
||||||
.tx_id = 0x000, // 发送 ID (不发送填0)
|
.tx_id = 0x000, // 发送 ID (不发送填0)
|
||||||
},
|
},
|
||||||
@@ -52,16 +52,7 @@ void CmdTask(void *argument)
|
|||||||
DaemonReload(chassis_power_meter->daemon);
|
DaemonReload(chassis_power_meter->daemon);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (chassis_power_meter != NULL)
|
DaemonReload(chassis_power_meter->daemon);
|
||||||
{
|
|
||||||
current_power_w = XidiPowerMeterGetPower(chassis_power_meter);
|
|
||||||
current_voltage_v = XidiPowerMeterGetVoltage(chassis_power_meter);
|
|
||||||
current_energy_j = XidiPowerMeterGetEnergy(chassis_power_meter);
|
|
||||||
|
|
||||||
// 你可以将获取到的功率写入要发送给底盘的 cmd 中,例如限制最大速度
|
|
||||||
// chassis_cmd_send.real_power = current_power_w;
|
|
||||||
}
|
|
||||||
|
|
||||||
osDelay(10); // 根据实际需要调整读取频率
|
osDelay(10); // 根据实际需要调整读取频率
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user