Compare commits

6 Commits

19 changed files with 24749 additions and 24508 deletions

BIN
.DS_Store vendored

Binary file not shown.

File diff suppressed because one or more lines are too long

BIN
Core/.DS_Store vendored

Binary file not shown.

View File

@@ -43,7 +43,7 @@ extern "C" {
/* USER CODE BEGIN EC */ /* USER CODE BEGIN EC */
#define FW_VERSION_MAJOR 0x01 #define FW_VERSION_MAJOR 0x01
#define FW_VERSION_MINOR 0x00 #define FW_VERSION_MINOR 0x00
#define FW_VERSION_PATCH 0x02 #define FW_VERSION_PATCH 10
/* USER CODE END EC */ /* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/

BIN
Core/Src/.DS_Store vendored

Binary file not shown.

View File

@@ -7,6 +7,7 @@
ChargingConnector_t CONN; ChargingConnector_t CONN;
CONN_State_t connectorState; CONN_State_t connectorState;
extern uint8_t config_initialized;
void CONN_Init(){ void CONN_Init(){
@@ -47,7 +48,7 @@ void CONN_Task(){
return; return;
} }
if (connectorState == Unknown) { if (connectorState == Unknown && config_initialized) {
CONN_SetState(Unplugged); CONN_SetState(Unplugged);
} else if (connectorState == Disabled && CONN.chargingError == CONN_NO_ERROR) { } else if (connectorState == Disabled && CONN.chargingError == CONN_NO_ERROR) {
CONN_SetState(Unplugged); CONN_SetState(Unplugged);

View File

@@ -2,13 +2,50 @@
#include "adc.h" #include "adc.h"
#include "board.h" #include "board.h"
#include "tim.h" #include "tim.h"
#include "debug.h"
#include <stdint.h> #include <stdint.h>
#define MAX_DUTY 450 #define MAX_DUTY 450
#define CP_EMA_ALPHA_Q8 38
#define CP_DEBOUNCE_MS_DEFAULT 10
#define CP_DEBOUNCE_MS_F 60
#define CP_DEBOUNCE_MS_F_LOW_DUTY 100
#define CP_LOW_DUTY_THRESHOLD_PERCENT 10
#define CP_A_ENTER_MV 11000
#define CP_A_EXIT_MV 10000
#define CP_B_ENTER_LOW_MV 8000
#define CP_B_ENTER_HIGH_MV 10000
#define CP_B_EXIT_LOW_MV 7500
#define CP_B_EXIT_HIGH_MV 10500
#define CP_C_ENTER_LOW_MV 5000
#define CP_C_ENTER_HIGH_MV 7000
#define CP_C_EXIT_LOW_MV 4500
#define CP_C_EXIT_HIGH_MV 7500
#define CP_D_ENTER_LOW_MV 2000
#define CP_D_ENTER_HIGH_MV 4000
#define CP_D_EXIT_LOW_MV 1500
#define CP_D_EXIT_HIGH_MV 4500
#define CP_E_ENTER_LOW_MV -1000
#define CP_E_ENTER_HIGH_MV 2000
#define CP_E_EXIT_LOW_MV -1500
#define CP_E_EXIT_HIGH_MV 2500
#define CP_F_ENTER_MV -11500
#define CP_F_EXIT_MV -10500
static int32_t cp_voltage_mv = 0; static int32_t cp_voltage_mv = 0;
static int32_t cp_voltage_filt_mv = 0;
static uint8_t cp_filter_initialized = 0;
static uint8_t cp_duty = 0; static uint8_t cp_duty = 0;
CP_State_t fake_cp_state = EV_STATE_ACQUIRING; CP_State_t fake_cp_state = EV_STATE_ACQUIRING;
static CP_State_t cp_stable_state = EV_STATE_ACQUIRING;
static CP_State_t cp_candidate_state = EV_STATE_ACQUIRING;
static uint32_t cp_candidate_since_ms = 0;
static uint32_t CP_ReadAdcChannel(uint32_t ch) { static uint32_t CP_ReadAdcChannel(uint32_t ch) {
uint32_t adc = 0; uint32_t adc = 0;
@@ -23,6 +60,64 @@ static uint32_t CP_ReadAdcChannel(uint32_t ch) {
} }
#define VREFINT_CAL_ADDR ((uint16_t*)0x1FFFF7BA) // для STM32F1! #define VREFINT_CAL_ADDR ((uint16_t*)0x1FFFF7BA) // для STM32F1!
static uint8_t CP_IsInRange(int32_t v, int32_t lo, int32_t hi) {
return (v >= lo && v <= hi) ? 1u : 0u;
}
static int32_t CP_ApplyEma(int32_t raw_mv) {
if (!cp_filter_initialized) {
cp_voltage_filt_mv = raw_mv;
cp_filter_initialized = 1;
return cp_voltage_filt_mv;
}
cp_voltage_filt_mv += ((raw_mv - cp_voltage_filt_mv) * CP_EMA_ALPHA_Q8) / 256;
return cp_voltage_filt_mv;
}
static CP_State_t CP_ClassifyWithHysteresis(int32_t v, CP_State_t prev) {
switch (prev) {
case EV_STATE_A_IDLE:
if (v >= CP_A_EXIT_MV) return EV_STATE_A_IDLE;
break;
case EV_STATE_B_CONN_PREP:
if (CP_IsInRange(v, CP_B_EXIT_LOW_MV, CP_B_EXIT_HIGH_MV)) return EV_STATE_B_CONN_PREP;
break;
case EV_STATE_C_CONN_ACTIVE:
if (CP_IsInRange(v, CP_C_EXIT_LOW_MV, CP_C_EXIT_HIGH_MV)) return EV_STATE_C_CONN_ACTIVE;
break;
case EV_STATE_D_CONN_ACT_VENT:
if (CP_IsInRange(v, CP_D_EXIT_LOW_MV, CP_D_EXIT_HIGH_MV)) return EV_STATE_D_CONN_ACT_VENT;
break;
case EV_STATE_E_NO_POWER:
if (CP_IsInRange(v, CP_E_EXIT_LOW_MV, CP_E_EXIT_HIGH_MV)) return EV_STATE_E_NO_POWER;
break;
case EV_STATE_F_ERROR:
if (v <= CP_F_EXIT_MV) return EV_STATE_F_ERROR;
break;
default:
break;
}
if (v >= CP_A_ENTER_MV) return EV_STATE_A_IDLE;
if (CP_IsInRange(v, CP_B_ENTER_LOW_MV, CP_B_ENTER_HIGH_MV)) return EV_STATE_B_CONN_PREP;
if (CP_IsInRange(v, CP_C_ENTER_LOW_MV, CP_C_ENTER_HIGH_MV)) return EV_STATE_C_CONN_ACTIVE;
if (CP_IsInRange(v, CP_D_ENTER_LOW_MV, CP_D_ENTER_HIGH_MV)) return EV_STATE_D_CONN_ACT_VENT;
if (CP_IsInRange(v, CP_E_ENTER_LOW_MV, CP_E_ENTER_HIGH_MV)) return EV_STATE_E_NO_POWER;
if (v <= CP_F_ENTER_MV) return EV_STATE_F_ERROR;
return EV_STATE_ACQUIRING;
}
static uint32_t CP_GetDebounceMs(CP_State_t next_state) {
if (next_state == EV_STATE_F_ERROR) {
if (cp_duty <= CP_LOW_DUTY_THRESHOLD_PERCENT) {
return CP_DEBOUNCE_MS_F_LOW_DUTY;
}
return CP_DEBOUNCE_MS_F;
}
return CP_DEBOUNCE_MS_DEFAULT;
}
static int32_t CP_ReadVoltageMv(void) static int32_t CP_ReadVoltageMv(void)
{ {
uint32_t adc = 0; uint32_t adc = 0;
@@ -75,29 +170,30 @@ int32_t CP_GetVoltage(void) {
} }
CP_State_t CP_GetState(void) { CP_State_t CP_GetState(void) {
int32_t voltage_real = cp_voltage_mv; int32_t voltage_real = cp_voltage_filt_mv;
uint32_t now = HAL_GetTick();
if(fake_cp_state != EV_STATE_ACQUIRING) { if(fake_cp_state != EV_STATE_ACQUIRING) {
return fake_cp_state; return fake_cp_state;
} }
if (voltage_real >= (12000-1000)) { CP_State_t instant_state = CP_ClassifyWithHysteresis(voltage_real, cp_stable_state);
return EV_STATE_A_IDLE;
} else if (voltage_real >= (9000-1000) && voltage_real <= (9000+1000)) { if (instant_state == cp_stable_state) {
return EV_STATE_B_CONN_PREP; cp_candidate_state = cp_stable_state;
} else if (voltage_real >= (6000-1000) && voltage_real <= (6000+1000)) { cp_candidate_since_ms = now;
return EV_STATE_C_CONN_ACTIVE;
} else if (voltage_real >= (3000-1000) && voltage_real <= (3000 + 1000)) {
return EV_STATE_D_CONN_ACT_VENT;
} else if (voltage_real >= (0-1000) && voltage_real <= (0+2000)){
return EV_STATE_E_NO_POWER;
} else if (voltage_real <= (-12000+1000)) {
return EV_STATE_F_ERROR;
} else { } else {
return EV_STATE_ACQUIRING; if (cp_candidate_state != instant_state) {
cp_candidate_state = instant_state;
cp_candidate_since_ms = now;
} else if ((now - cp_candidate_since_ms) >= CP_GetDebounceMs(cp_candidate_state)) {
cp_stable_state = cp_candidate_state;
} }
} }
return cp_stable_state;
}
void CP_Loop(void) { void CP_Loop(void) {
(void)CP_GetState(); (void)CP_GetState();
} }
@@ -109,6 +205,7 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
return; return;
} }
cp_voltage_mv = CP_ReadVoltageMv(); cp_voltage_mv = CP_ReadVoltageMv();
(void)CP_ApplyEma(cp_voltage_mv);
ADC_Unlock(); ADC_Unlock();
} }
} }

View File

@@ -261,9 +261,12 @@ void PSU_ReadWrite(){
} }
CONN.RequestedPower = CONN.RequestedCurrent * CONN.RequestedVoltage / 10; CONN.RequestedPower = CONN.RequestedCurrent * CONN.RequestedVoltage / 10;
if(PSU0.ready){ if(PSU0.ready){
if (CONN.RequestedVoltage == 500) { // fake
PSU_SetVoltageCurrent(0, 300, 10); // Normal mode
}else{
PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); // Normal mode PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); // Normal mode
}
ED_Delay(CAN_DELAY); ED_Delay(CAN_DELAY);
if(CONN.MeasuredVoltage>490) PSU0.hv_mode = 1; if(CONN.MeasuredVoltage>490) PSU0.hv_mode = 1;
} }

View File

@@ -9,6 +9,7 @@
#include "psu_control.h" #include "psu_control.h"
extern UART_HandleTypeDef huart3; extern UART_HandleTypeDef huart3;
extern uint8_t config_initialized;
static void send_state(void); static void send_state(void);
static void CCS_SendResetReason(void); static void CCS_SendResetReason(void);
@@ -27,10 +28,10 @@ uint8_t ev_enable_output = 0;
#define CMD_INTERVAL 10 #define CMD_INTERVAL 10
#define MAX_TX_BUFFER_SIZE 256 #define MAX_TX_BUFFER_SIZE 256
#define MAX_RX_BUFFER_SIZE 256 #define MAX_RX_BUFFER_SIZE 256
#define EVEREST_TIMEOUT_MS 2000
static uint8_t rx_buffer[MAX_RX_BUFFER_SIZE]; static uint8_t rx_buffer[MAX_RX_BUFFER_SIZE];
static uint8_t tx_buffer[MAX_TX_BUFFER_SIZE]; static uint8_t tx_buffer[MAX_TX_BUFFER_SIZE];
static uint8_t rx_armed = 0;
uint8_t ESTOP = 0; uint8_t ESTOP = 0;
uint8_t REPLUG = 0; uint8_t REPLUG = 0;
@@ -39,6 +40,8 @@ static uint8_t enabled = 0;
static uint8_t pwm_duty_percent = 100; static uint8_t pwm_duty_percent = 100;
uint8_t isolation_enable = 0; uint8_t isolation_enable = 0;
static uint32_t last_host_seen = 0; static uint32_t last_host_seen = 0;
static uint8_t everest_timed_out = 0;
static uint32_t last_everest_timeout_log_tick = 0;
static CP_State_t cp_state_buffer = EV_STATE_ACQUIRING; static CP_State_t cp_state_buffer = EV_STATE_ACQUIRING;
CCS_State_t CCS_State; CCS_State_t CCS_State;
@@ -52,7 +55,6 @@ void CCS_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size) {
if (huart != &huart3) { if (huart != &huart3) {
return; return;
} }
rx_armed = 0;
if (size > 0 && size <= sizeof(rx_buffer)) { if (size > 0 && size <= sizeof(rx_buffer)) {
process_received_packet(rx_buffer, size); process_received_packet(rx_buffer, size);
} }
@@ -64,10 +66,8 @@ void CCS_SerialLoop(void) {
static uint32_t replug_watchdog1_tick = 0; static uint32_t replug_watchdog1_tick = 0;
static uint32_t last_state_sent = 0; static uint32_t last_state_sent = 0;
if (!rx_armed && HAL_UART_GetState(&huart3) == HAL_UART_STATE_READY) { if (HAL_UART_GetState(&huart3) == HAL_UART_STATE_READY) {
if (HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer)) == HAL_OK) { (void)HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer));
rx_armed = 1;
}
} }
/* Read CP once per loop and use buffered value below. */ /* Read CP once per loop and use buffered value below. */
@@ -108,6 +108,11 @@ void CCS_SerialLoop(void) {
(void)replug_watchdog_tick; (void)replug_watchdog_tick;
(void)replug_watchdog1_tick; (void)replug_watchdog1_tick;
if (!config_initialized) {
// Keep connector in Unknown until host sends valid SET_CONFIG.
RELAY_Write(RELAY_CP, 1);
CONN_SetState(Unknown);
} else {
switch(CCS_ConnectorState){ switch(CCS_ConnectorState){
case CCS_DISABLED: case CCS_DISABLED:
RELAY_Write(RELAY_CP, 0); RELAY_Write(RELAY_CP, 0);
@@ -177,12 +182,28 @@ void CCS_SerialLoop(void) {
} }
break; break;
} }
}
if (last_host_seen > 0 && (HAL_GetTick() - last_host_seen) > 500) { // If Everest timeout happened, keep safe-state and limit log frequency.
// The safe-state must remain until we receive a valid packet from the host.
if (everest_timed_out) {
if (last_everest_timeout_log_tick == 0 ||
(HAL_GetTick() - last_everest_timeout_log_tick) >= EVEREST_TIMEOUT_MS) {
log_printf(LOG_ERR, "Everest timeout\n");
last_everest_timeout_log_tick = HAL_GetTick();
}
CONN.EnableOutput = 0; CONN.EnableOutput = 0;
CCS_EvseState = Unknown; CCS_EvseState = Unknown;
CP_SetDuty(100); CP_SetDuty(100);
} else if (last_host_seen > 0 && (HAL_GetTick() - last_host_seen) > EVEREST_TIMEOUT_MS) {
log_printf(LOG_ERR, "Everest timeout\n"); log_printf(LOG_ERR, "Everest timeout\n");
everest_timed_out = 1;
last_host_seen = HAL_GetTick(); // reset after the first timeout
last_everest_timeout_log_tick = HAL_GetTick();
CONN.EnableOutput = 0;
CCS_EvseState = Unknown;
CP_SetDuty(100);
} else { } else {
if (last_cmd == CMD_STOP) { if (last_cmd == CMD_STOP) {
CONN.EnableOutput = 0; CONN.EnableOutput = 0;
@@ -287,6 +308,7 @@ static void send_state(void) {
CCS_State.DutyCycle = CP_GetDuty(); CCS_State.DutyCycle = CP_GetDuty();
CCS_State.OutputEnabled = PSU0.CONT_enabled; CCS_State.OutputEnabled = PSU0.CONT_enabled;
CCS_State.MeasuredVoltage = (uint16_t)CONN.MeasuredVoltage; CCS_State.MeasuredVoltage = (uint16_t)CONN.MeasuredVoltage;
if (CONN.RequestedVoltage == 500) CCS_State.MeasuredVoltage = 500; // fake
CCS_State.MeasuredCurrent = (uint16_t)CONN.MeasuredCurrent; CCS_State.MeasuredCurrent = (uint16_t)CONN.MeasuredCurrent;
CCS_State.Power = CCS_Power; CCS_State.Power = CCS_Power;
CCS_State.Energy = CCS_Energy; CCS_State.Energy = CCS_Energy;
@@ -327,6 +349,8 @@ static uint16_t expected_payload_len(uint8_t cmd) {
static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_len) { static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_len) {
(void)payload_len; (void)payload_len;
last_host_seen = HAL_GetTick(); last_host_seen = HAL_GetTick();
everest_timed_out = 0;
last_everest_timeout_log_tick = 0;
switch (cmd) { switch (cmd) {
case CMD_E2M_PWM_DUTY: { case CMD_E2M_PWM_DUTY: {
const e2m_pwm_duty_t* p = (const e2m_pwm_duty_t*)payload; const e2m_pwm_duty_t* p = (const e2m_pwm_duty_t*)payload;

View File

@@ -61,10 +61,6 @@ void MX_TIM3_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
@@ -79,12 +75,6 @@ void MX_TIM3_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
sConfigOC.OCMode = TIM_OCMODE_TIMING;
sConfigOC.Pulse = 1;
if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */

View File

@@ -59,7 +59,6 @@ defined in linker script */
.weak Reset_Handler .weak Reset_Handler
.type Reset_Handler, %function .type Reset_Handler, %function
Reset_Handler: Reset_Handler:
ldr sp, =_estack /* set stack pointer */
/* Call the clock system initialization function.*/ /* Call the clock system initialization function.*/
bl SystemInit bl SystemInit
@@ -253,7 +252,6 @@ g_pfnVectors:
.word 0 .word 0
.word BootRAM /* @0x1E0. This is for boot in RAM mode for .word BootRAM /* @0x1E0. This is for boot in RAM mode for
STM32F10x Connectivity line Devices. */ STM32F10x Connectivity line Devices. */
.word 0x66666666 /* Reserved for OpenBLT checksum*/
/******************************************************************************* /*******************************************************************************
* *

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
../Core/Src/charger_control.c:11:6:CONN_Init 1 ../Core/Src/charger_control.c:12:6:CONN_Init 1
../Core/Src/charger_control.c:19:6:CONN_Loop 6 ../Core/Src/charger_control.c:20:6:CONN_Loop 6
../Core/Src/charger_control.c:41:6:CONN_Task 5 ../Core/Src/charger_control.c:42:6:CONN_Task 6
../Core/Src/charger_control.c:57:6:CONN_SetState 16 ../Core/Src/charger_control.c:58:6:CONN_SetState 16
../Core/Src/charger_control.c:83:6:CONN_PrintChargingTotal 1 ../Core/Src/charger_control.c:84:6:CONN_PrintChargingTotal 1

View File

@@ -1,9 +1,13 @@
../Core/Src/cp.c:13:17:CP_ReadAdcChannel 1 ../Core/Src/cp.c:50:17:CP_ReadAdcChannel 1
../Core/Src/cp.c:26:16:CP_ReadVoltageMv 1 ../Core/Src/cp.c:63:16:CP_IsInRange 3
../Core/Src/cp.c:39:6:CP_Init 1 ../Core/Src/cp.c:67:16:CP_ApplyEma 3
../Core/Src/cp.c:56:6:CP_SetDuty 1 ../Core/Src/cp.c:78:19:CP_ClassifyWithHysteresis 19
../Core/Src/cp.c:69:9:CP_GetDuty 1 ../Core/Src/cp.c:111:17:CP_GetDebounceMs 3
../Core/Src/cp.c:73:9:CP_GetVoltage 1 ../Core/Src/cp.c:121:16:CP_ReadVoltageMv 1
../Core/Src/cp.c:77:12:CP_GetState 12 ../Core/Src/cp.c:134:6:CP_Init 1
../Core/Src/cp.c:101:6:CP_Loop 1 ../Core/Src/cp.c:151:6:CP_SetDuty 1
../Core/Src/cp.c:105:6:HAL_TIM_OC_DelayElapsedCallback 4 ../Core/Src/cp.c:164:9:CP_GetDuty 1
../Core/Src/cp.c:168:9:CP_GetVoltage 1
../Core/Src/cp.c:172:12:CP_GetState 5
../Core/Src/cp.c:197:6:CP_Loop 1
../Core/Src/cp.c:201:6:HAL_TIM_OC_DelayElapsedCallback 4

View File

@@ -8,5 +8,5 @@
../Core/Src/psu_control.c:175:6:PSU_SetVoltageCurrent 5 ../Core/Src/psu_control.c:175:6:PSU_SetVoltageCurrent 5
../Core/Src/psu_control.c:202:6:PSU_SendCmd 4 ../Core/Src/psu_control.c:202:6:PSU_SendCmd 4
../Core/Src/psu_control.c:238:10:max 2 ../Core/Src/psu_control.c:238:10:max 2
../Core/Src/psu_control.c:243:6:PSU_ReadWrite 5 ../Core/Src/psu_control.c:243:6:PSU_ReadWrite 6
../Core/Src/psu_control.c:276:6:PSU_Task 41 ../Core/Src/psu_control.c:279:6:PSU_Task 41

View File

@@ -1,15 +1,15 @@
../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1 ../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1
../Core/Src/serial.c:51:6:CCS_RxEventCallback 4 ../Core/Src/serial.c:54:6:CCS_RxEventCallback 4
../Core/Src/serial.c:61:6:CCS_SerialLoop 41 ../Core/Src/serial.c:63:6:CCS_SerialLoop 43
../Core/Src/serial.c:206:6:CCS_Init 1 ../Core/Src/serial.c:227:6:CCS_Init 1
../Core/Src/serial.c:218:17:crc16_ibm 4 ../Core/Src/serial.c:239:17:crc16_ibm 4
../Core/Src/serial.c:233:17:CCS_BuildPacket 4 ../Core/Src/serial.c:254:17:CCS_BuildPacket 4
../Core/Src/serial.c:249:13:CCS_SendPacket 2 ../Core/Src/serial.c:270:13:CCS_SendPacket 2
../Core/Src/serial.c:257:13:CCS_SendResetReason 1 ../Core/Src/serial.c:278:13:CCS_SendResetReason 1
../Core/Src/serial.c:261:6:CCS_SendEmergencyStop 1 ../Core/Src/serial.c:282:6:CCS_SendEmergencyStop 1
../Core/Src/serial.c:265:6:CCS_SendStart 1 ../Core/Src/serial.c:286:6:CCS_SendStart 1
../Core/Src/serial.c:269:13:CCS_CalculateEnergy 2 ../Core/Src/serial.c:290:13:CCS_CalculateEnergy 2
../Core/Src/serial.c:284:13:send_state 2 ../Core/Src/serial.c:305:13:send_state 3
../Core/Src/serial.c:311:17:expected_payload_len 11 ../Core/Src/serial.c:333:17:expected_payload_len 11
../Core/Src/serial.c:327:13:apply_command 13 ../Core/Src/serial.c:349:13:apply_command 13
../Core/Src/serial.c:394:16:process_received_packet 6 ../Core/Src/serial.c:418:16:process_received_packet 6

View File

@@ -1,5 +1,5 @@
../Core/Src/tim.c:31:6:MX_TIM3_Init 8 ../Core/Src/tim.c:31:6:MX_TIM3_Init 6
../Core/Src/tim.c:95:6:MX_TIM4_Init 8 ../Core/Src/tim.c:85:6:MX_TIM4_Init 8
../Core/Src/tim.c:157:6:HAL_TIM_Base_MspInit 3 ../Core/Src/tim.c:147:6:HAL_TIM_Base_MspInit 3
../Core/Src/tim.c:187:6:HAL_TIM_MspPostInit 3 ../Core/Src/tim.c:177:6:HAL_TIM_MspPostInit 3
../Core/Src/tim.c:235:6:HAL_TIM_Base_MspDeInit 3 ../Core/Src/tim.c:225:6:HAL_TIM_Base_MspDeInit 3