diff --git a/firmware/Core/Src/main.c b/firmware/Core/Src/main.c index c20f764..f2a1ff9 100644 --- a/firmware/Core/Src/main.c +++ b/firmware/Core/Src/main.c @@ -105,6 +105,7 @@ modPowerElectronicsPackStateTypedef packState; uint16_t LED_Blink_Delay; uint64_t TIM_Clock; +uint64_t TIM3_Clock; uint64_t Led_Timer; uint64_t HTTP_timer; uint8_t service_sw; @@ -265,6 +266,7 @@ SPI_HandleTypeDef hspi3; UART_HandleTypeDef huart2; TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim6; uint8_t OVP_counter = 0; @@ -280,6 +282,12 @@ uint64_t shunt_charging_contractor_clock = 0; uint64_t can1_transmit_clock = 0; uint64_t can2_transmit_clock = 0; +uint8_t* can1_transmit_queue = 0; +uint8_t* can2_transmit_queue = 0; + +uint16_t can1_transmit_queue_size = 0; +uint16_t can2_transmit_queue_size = 0; + #define __MA_WIN_SIZE (500) #define __MA_ARRAY_QTY 2 @@ -297,6 +305,7 @@ static void MX_SPI1_Init(void); //static void MX_SPI3_Init(void); static void MX_USART2_UART_Init(void); static void MX_TIM6_Init(void); +static void MX_TIM3_Init(void); static void MX_TIM2_Init(void); uint8_t SS_status(uint8_t type, Time_Struct* Event_time); @@ -305,6 +314,10 @@ void Status_Clear(uint8_t Type); void Save_data_to_Backup(); void Restore_shutdown_data(); void updateLimitsFromMem(); + +void addCanPacketToQueue(uint16_t id, uint8_t* data, uint8_t** queue, uint16_t* queueSize); +void transmitCanPacketFromQueue(uint8_t** queue, uint16_t* queueSize, CAN_HandleTypeDef* hcan); + void modem_init(); uint8_t SS_param(Battery_Data_Struct* Source_Data); @@ -361,30 +374,30 @@ void usbTIM(uint8_t OnOff) { void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { -// testsi++; + if (htim->Instance == TIM2) + { + TimeoutMng(); + TIM_Clock++; + } + else if (htim->Instance == TIM3) + { + CAN_TransmitRTR(0x500, 8, &hcan2); + if (TIM3_Clock % 2) + { + transmitCanPacketFromQueue(&can1_transmit_queue, &can1_transmit_queue_size, &hcan1); + } + else + { + transmitCanPacketFromQueue(&can2_transmit_queue, &can2_transmit_queue_size, &hcan2); + } - if (htim->Instance == TIM2) + TIM3_Clock++; + } + else if (htim->Instance == TIM6) { - TimeoutMng(); - TIM_Clock++; - } - else if (htim->Instance == TIM6) - { - libPacketTimerFunc(); - // HAL_TIM_Base_Stop_IT(&htim6); - // HAL_GPIO_TogglePin(HL3_GPIO_Port, HL3_Pin); - // if(USB_On_Flag){ - // if(USB_On_Flag){ - modUARTTask(); - // } -// } - - - //TimeoutMng(); - - - // HAL_TIM_Base_Start_IT(&htim6); + libPacketTimerFunc(); + modUARTTask(); } } @@ -1270,30 +1283,41 @@ void transmitCan2Packet() uint8_t buffer[8] = {0}; - // sending heartbeat command - memset(buffer, 0xFF, sizeof(buffer)); - CAN_Transmit(0x500, buffer, 8, &hcan2); - // sending common current and voltage command memcpy(buffer, &packState.packCurrent, sizeof(packState.packCurrent)); memcpy(buffer + 4, &packState.packVoltage, sizeof(packState.packVoltage)); - CAN_Transmit(0x501, buffer, 8, &hcan2); + addCanPacketToQueue(0x501, buffer, &can2_transmit_queue, &can2_transmit_queue_size); // sending charge voltages (start, end) command - memcpy(buffer, &generalConfig->cellLCSoftUnderVoltage, sizeof(generalConfig->cellLCSoftUnderVoltage)); - memcpy(buffer + 4, &generalConfig->cellSoftOverVoltage, sizeof(generalConfig->cellSoftOverVoltage)); - CAN_Transmit(0x502, buffer, 8, &hcan2); + const float startVoltage = generalConfig->cellHardUnderVoltage * generalConfig->noOfCellsSeries; + const float endVoltage = generalConfig->cellHardOverVoltage * generalConfig->noOfCellsSeries; + memcpy(buffer, &startVoltage, sizeof(startVoltage)); + memcpy(buffer + 4, &endVoltage, sizeof(endVoltage)); + addCanPacketToQueue(0x502, buffer, &can2_transmit_queue, &can2_transmit_queue_size); // sending fault voltages (under, over) command - memcpy(buffer, &generalConfig->cellHardUnderVoltage, sizeof(generalConfig->cellHardUnderVoltage)); - memcpy(buffer + 4, &generalConfig->cellHardOverVoltage, sizeof(generalConfig->cellHardOverVoltage)); - CAN_Transmit(0x503, buffer, 8, &hcan2); + const float startFaultVoltage = generalConfig->cellLCSoftUnderVoltage * generalConfig->noOfCellsSeries; + const float endFaultVoltage = generalConfig->cellSoftOverVoltage * generalConfig->noOfCellsSeries; + memcpy(buffer, &startFaultVoltage, sizeof(startFaultVoltage)); + memcpy(buffer + 4, &endFaultVoltage, sizeof(endFaultVoltage)); + addCanPacketToQueue(0x503, buffer, &can2_transmit_queue, &can2_transmit_queue_size); + + // sending charge starting and ending command + float chargeStartingCurrent = 15; // TODO move to generalConfig + float chargeEndingCurrent = 5; // TODO move to generalConfig + + memcpy(buffer, &chargeStartingCurrent, sizeof(chargeStartingCurrent)); + memcpy(buffer + 4, &chargeEndingCurrent, sizeof(chargeEndingCurrent)); + addCanPacketToQueue(0x504, buffer, &can2_transmit_queue, &can2_transmit_queue_size); + + // sending charge permission, charge ending, charge/discharge state and table current command + const uint8_t chargeAllowed = packState.chargeAllowed ? 0xFF : 0x00; + const uint8_t chargeEnding = packState.SoC > 95 ? 0xFF : 0x00; + const uint8_t chargeSwitchState = charge_switch_state ? 0xFF : 0x00; - // sending charge current command const int socIndex = getIndexBySoc(); const int temperatureIndex = getIndexByTemperature(); float tableCurrent = 0; - float chargeEndingCurrent = 5; // TODO move to generalConfig if (socIndex != -1 && temperatureIndex != -1) { @@ -1302,20 +1326,38 @@ void transmitCan2Packet() tableCurrent = pureCurrent ? tableValue : generalConfig->batteryCapacity * tableValue; } - memcpy(buffer, &tableCurrent, sizeof(tableCurrent)); - memcpy(buffer + 4, &chargeEndingCurrent, sizeof(chargeEndingCurrent)); - CAN_Transmit(0x504, buffer, 8, &hcan2); - - // sending charge permission, charge ending and charge/discharge state command - const uint8_t chargeAllowed = packState.chargeAllowed ? 0xFF : 0x00; - const uint8_t chargeEnding = packState.SoC > 95 ? 0xFF : 0x00; - const uint8_t chargeSwitchState = charge_switch_state ? 0xFF : 0x00; - memset(buffer, '\0', sizeof(buffer)); memcpy(buffer + 0, &chargeAllowed, sizeof(chargeAllowed)); memcpy(buffer + 1, &chargeEnding, sizeof(chargeEnding)); memcpy(buffer + 2, &chargeSwitchState, sizeof(chargeSwitchState)); - CAN_Transmit(0x505, buffer, 8, &hcan2); + memcpy(buffer + 4, &tableCurrent, sizeof(tableCurrent)); + addCanPacketToQueue(0x505, buffer, &can2_transmit_queue, &can2_transmit_queue_size); +} + +void addCanPacketToQueue(uint16_t id, uint8_t* data, uint8_t** queue, uint16_t* queueSize) +{ + *queueSize += 10; + *queue = (uint8_t*)realloc(*queue, *queueSize); + + memcpy(*queue + *queueSize - 10, &id, 2); + memcpy(*queue + *queueSize - 8, data, 8); +} + +void transmitCanPacketFromQueue(uint8_t** queue, uint16_t* queueSize, CAN_HandleTypeDef* hcan) +{ + if (*queueSize < 10) + return; + + uint16_t id = 0; + uint8_t data[8] = {}; + + memcpy(&id, *queue + *queueSize - 10, 2); + memcpy(data, *queue + *queueSize - 8, 8); + + *queueSize -= 10; + *queue = (uint8_t*)realloc(*queue, *queueSize); + + CAN_Transmit(id, data, 8, hcan); } void modem_init(){ @@ -2112,6 +2154,7 @@ void SD_Update_Filename(SD_CARD_Global_Struct* source ){ void Total_DeInit(){ MX_FATFS_DeInit(); HAL_TIM_Base_DeInit(&htim2); + HAL_TIM_Base_DeInit(&htim3); HAL_TIM_Base_DeInit(&htim6); MX_USB_DEVICE_DeInit(); HAL_UART_DeInit(&huart2); @@ -2201,7 +2244,9 @@ int main(void) // MX_SPI3_Init(); MX_USART2_UART_Init(); MX_USB_DEVICE_Init(); + MX_TIM6_Init(); + MX_TIM3_Init(); MX_TIM2_Init(); MX_FATFS_Init(); @@ -2228,6 +2273,7 @@ int main(void) Battery_Serial = generalConfig->serialNumber; HAL_TIM_Base_Start_IT(&htim6); + HAL_TIM_Base_Start_IT(&htim3); HAL_TIM_Base_Start_IT(&htim2); SimStatus_Struct.Status_flag[__STATUS_CHARGING_DISCONNECT]=1; @@ -2545,6 +2591,40 @@ static void MX_TIM2_Init(void) } +static void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 71; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 999; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + +} + static void MX_TIM6_Init(void) { diff --git a/firmware/Core/Src/modFlash.c b/firmware/Core/Src/modFlash.c index 5cad0d6..f90b6ae 100644 --- a/firmware/Core/Src/modFlash.c +++ b/firmware/Core/Src/modFlash.c @@ -132,6 +132,7 @@ static const uint32_t flash_addr[FLASH_PAGES] = { }; TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim6; UART_HandleTypeDef huart2; @@ -350,6 +351,7 @@ void deinitEverything() { //-- reset peripherals to guarantee flawless start of user application HAL_TIM_Base_Stop_IT(&htim2); + HAL_TIM_Base_Stop_IT(&htim3); HAL_TIM_Base_Stop_IT(&htim6); MX_USB_DEVICE_DeInit(); MX_FATFS_DeInit(); diff --git a/firmware/Core/Src/stm32f1xx_hal_msp.c b/firmware/Core/Src/stm32f1xx_hal_msp.c index 831bd17..61f4324 100644 --- a/firmware/Core/Src/stm32f1xx_hal_msp.c +++ b/firmware/Core/Src/stm32f1xx_hal_msp.c @@ -492,6 +492,22 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM6_MspInit 1 */ } + + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + + HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM3_IRQn); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } + if(htim_base->Instance==TIM2) { /* USER CODE BEGIN TIM6_MspInit 0 */ @@ -506,7 +522,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM6_MspInit 1 */ } - } /** @@ -532,6 +547,21 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) /* USER CODE END TIM6_MspDeInit 1 */ } + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + + /* TIM6 interrupt DeInit */ + HAL_NVIC_DisableIRQ(TIM3_IRQn); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + if(htim_base->Instance==TIM2) { /* USER CODE BEGIN TIM6_MspDeInit 0 */ diff --git a/firmware/Core/Src/stm32f1xx_it.c b/firmware/Core/Src/stm32f1xx_it.c index 6e933db..ca60e72 100644 --- a/firmware/Core/Src/stm32f1xx_it.c +++ b/firmware/Core/Src/stm32f1xx_it.c @@ -70,6 +70,7 @@ void USART2_IRQHandler(void) /* External variables --------------------------------------------------------*/ extern PCD_HandleTypeDef hpcd_USB_OTG_FS; extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim6; /* USER CODE BEGIN EV */ @@ -145,6 +146,16 @@ void TIM2_IRQHandler(void) /* USER CODE END TIM6_IRQn 1 */ } +void TIM3_IRQHandler(void) +{ + /* USER CODE BEGIN TIM6_IRQn 0 */ + + /* USER CODE END TIM6_IRQn 0 */ + HAL_TIM_IRQHandler(&htim3); + /* USER CODE BEGIN TIM6_IRQn 1 */ + + /* USER CODE END TIM6_IRQn 1 */ +} void TIM6_IRQHandler(void) {