From f0c861d3d628b9f909f4104c9d619abdf4af349c Mon Sep 17 00:00:00 2001 From: Dado Mista Date: Tue, 18 Feb 2025 23:32:41 -0800 Subject: [PATCH 01/21] LED-Task for ADV2 calling LED_FLIP every 500ms I think this is for ADC3 for measuring charge voltage, but this is just a guess Signed-off-by: Dado Mista --- LCM/Code/App/task.c | 15 +++++++++++++++ LCM/Code/Drive/led.c | 2 ++ LCM/Code/Drive/led.h | 2 ++ LCM/Code/User/hk32f030m_it.c | 4 +++- LCM/Code/User/main.c | 3 +++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index 3059eec2..b283e1ce 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -49,6 +49,21 @@ static void lcmConfigReset(void) int headlight_brightnesses[] = { 0, 150, 255 }; int status_brightnesses[] = { WS2812_1_BRIGHTNESS, WS2812_2_BRIGHTNESS, WS2812_3_BRIGHTNESS }; +/************************************************** + * @brie :LED_Task() + * @note :LEDÈÎÎñ + * @param :ÎÞ + * @retval :ÎÞ + **************************************************/ +void LED_Task(void) +{ + if(LED_Counter >= 500) + { + LED_Counter = 0; + LED1_FILP; + } +} + /************************************************** * @brie :KEY1_Task() **************************************************/ diff --git a/LCM/Code/Drive/led.c b/LCM/Code/Drive/led.c index d9c47bb8..f1beca3b 100644 --- a/LCM/Code/Drive/led.c +++ b/LCM/Code/Drive/led.c @@ -1,5 +1,7 @@ #include "led.h" +uint16_t LED_Counter = 0; + /************************************************** * @brie :LED_Init() * @note :LED³õʼ»¯ diff --git a/LCM/Code/Drive/led.h b/LCM/Code/Drive/led.h index e093dcde..fb47a573 100644 --- a/LCM/Code/Drive/led.h +++ b/LCM/Code/Drive/led.h @@ -13,6 +13,8 @@ #define LED_F_ON GPIOC->BSRR = GPIO_Pin_6; #define LED_F_OFF GPIOC->BRR = GPIO_Pin_6; +extern uint16_t LED_Counter; + void LED_Init(void); #endif diff --git a/LCM/Code/User/hk32f030m_it.c b/LCM/Code/User/hk32f030m_it.c index e3cb7919..e2c62362 100644 --- a/LCM/Code/User/hk32f030m_it.c +++ b/LCM/Code/User/hk32f030m_it.c @@ -135,7 +135,9 @@ void TIM6_IRQHandler(void) if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM6, TIM_IT_Update); - +#ifdef ADV2 + LED_Counter++; +#endif WS2812_Counter++; #ifdef USE_BUZZER Buzzer_Time++; diff --git a/LCM/Code/User/main.c b/LCM/Code/User/main.c index f4a62b45..45357bfe 100644 --- a/LCM/Code/User/main.c +++ b/LCM/Code/User/main.c @@ -67,6 +67,9 @@ int main(void) } while(1) { +#ifdef ADV2 + LED_Task(); +#endif KEY1_Task(); if(WS2812_Counter >= 20) // 20ms refresh period From 7913664998427392f3b83485af18817240419256 Mon Sep 17 00:00:00 2001 From: Dado Mista Date: Mon, 24 Feb 2025 11:30:39 -0800 Subject: [PATCH 02/21] ADV2 Charge State Detection Signed-off-by: Dado Mista --- LCM/Code/App/task.c | 30 +++++++++++++++++++++++++++--- LCM/Code/App/task.h | 1 + LCM/Code/Drive/power.c | 2 ++ LCM/Code/User/main.c | 5 ++++- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index b283e1ce..c640e08c 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -587,7 +587,7 @@ void CheckPowerLevel(float battery_voltage) /************************************************** * @brie :Charge_Task() - * @note :Check for charge start/end conditions + * @note :Check for charge start/end conditions, only for ADV1 **************************************************/ #ifdef ADV void Charge_Task(void) @@ -1072,7 +1072,10 @@ void ADC_Task(void) ADC1_Val = (float)(adc1_val_sum_ave*0.0012890625); ADC2_Val = (float)(adc2_val_sum_ave*0.0012890625); - + +#ifdef ADV2 + Charge_Voltage = (float)(adc_charge_sum_ave*0.0008056640625); +#else if(V_I == 0) { if(Charge_Time>100) @@ -1087,8 +1090,8 @@ void ADC_Task(void) Charge_Voltage = (float)(adc_charge_sum_ave*0.0257080078125); } } +#endif } - break; default: @@ -1201,3 +1204,24 @@ void VESC_State_Task(void) } lcmConfig.boardOff = false; } + +#ifdef ADV2 +/************************************************** + * @brie :Charge_Detect_Task() + * @note :Detect charging state signalled by BMS + **************************************************/ +void Charge_Detect_Task(void) +{ + // NOTE from surfdado: + // Somehow Charge_Voltage will be below 3.0V when charging starts + // I guess ADC3 is just a signal from the BMS? + if(Charge_Voltage < CHARGING_VOLTAGE) + { + Charge_Flag = 2; + } + else + { + Charge_Flag = 0; + } +} +#endif diff --git a/LCM/Code/App/task.h b/LCM/Code/App/task.h index 12818b0d..7c8f7c67 100644 --- a/LCM/Code/App/task.h +++ b/LCM/Code/App/task.h @@ -32,6 +32,7 @@ void KEY1_Task(void); void WS2812_Task(void); void Power_Task(void); void Charge_Task(void); +void Charge_Detect_Task(void); void Headlights_Task(void); void Buzzer_Task(void); void Usart_Task(void); diff --git a/LCM/Code/Drive/power.c b/LCM/Code/Drive/power.c index 8aa7d960..c2999e4c 100644 --- a/LCM/Code/Drive/power.c +++ b/LCM/Code/Drive/power.c @@ -20,6 +20,7 @@ void Power_Init(void) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); +#ifdef ADV //Charge GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -30,6 +31,7 @@ void Power_Init(void) //PWR_OFF; CHARGE_OFF; +#endif } diff --git a/LCM/Code/User/main.c b/LCM/Code/User/main.c index 45357bfe..02db2965 100644 --- a/LCM/Code/User/main.c +++ b/LCM/Code/User/main.c @@ -55,12 +55,12 @@ int main(void) Buzzer_Init(); #endif ADC1_Init(); + Time6_Init(); WS2812_Init(); Power_Init(); KEY_Init(); USART1_Init(115200); LED_PWM_Init(); - Time6_Init(); if(KEY1 == 0) { KEY1_State = 1; @@ -82,6 +82,9 @@ int main(void) #ifdef ADV Charge_Task(); +#endif +#ifdef ADV2 + Charge_Detect_Task(); #endif Headlights_Task(); #ifdef USE_BUZZER From 78c902a91d979fdb2b277bd26e14d85472c42d5b Mon Sep 17 00:00:00 2001 From: Dado Mista Date: Mon, 24 Feb 2025 11:50:47 -0800 Subject: [PATCH 03/21] fixups_to_compile --- LCM/Code/User/main.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/LCM/Code/User/main.c b/LCM/Code/User/main.c index 02db2965..89c813c9 100644 --- a/LCM/Code/User/main.c +++ b/LCM/Code/User/main.c @@ -57,14 +57,19 @@ int main(void) ADC1_Init(); Time6_Init(); WS2812_Init(); + +#ifdef ADV2 + while (Power_Time < 500) { + } +#endif + Power_Init(); KEY_Init(); USART1_Init(115200); LED_PWM_Init(); - if(KEY1 == 0) - { - KEY1_State = 1; - } + KEY1_State = 1; + Power_Time = 0; + while(1) { #ifdef ADV2 From 398e9ac5de3ca1aa99d865d27e8c6f4858ef0a17 Mon Sep 17 00:00:00 2001 From: Dado Mista Date: Wed, 26 Feb 2025 08:59:02 -0800 Subject: [PATCH 04/21] adv2_wip --- LCM/Code/App/task.c | 4 ++++ LCM/Code/Drive/power.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index c640e08c..dd990b5b 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -99,8 +99,10 @@ void KEY1_Task(void) case 3: // Long press if(Power_Flag == 2) // Boot completed { +#ifndef ADV2 Power_Flag = 4; // VESC power off Power_Time = 0; +#endif } break; @@ -1184,6 +1186,7 @@ void VESC_State_Task(void) Shutdown_Time_M = 0; } +#ifndef ADV2 if(Shutdown_Time_S>60000) { Shutdown_Time_S = 0; @@ -1202,6 +1205,7 @@ void VESC_State_Task(void) Power_Flag = 4; Power_Time = 0; } +#endif lcmConfig.boardOff = false; } diff --git a/LCM/Code/Drive/power.c b/LCM/Code/Drive/power.c index c2999e4c..a7d57fc3 100644 --- a/LCM/Code/Drive/power.c +++ b/LCM/Code/Drive/power.c @@ -20,7 +20,8 @@ void Power_Init(void) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); -#ifdef ADV + +#ifndef ADV2 //Charge GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; From d411fc6252836a44a6c0e54641e8927ae9914dba Mon Sep 17 00:00:00 2001 From: Dado Mista Date: Fri, 28 Feb 2025 11:29:00 -0800 Subject: [PATCH 05/21] Added the new watchdog nonsense Just in case it makes a difference... Signed-off-by: Dado Mista --- LCM/Code/Drive/iwdg.c | 16 +++++++++ LCM/Code/Drive/iwdg.h | 9 +++++ LCM/Code/User/main.c | 8 +++++ .../LCM_Light_Control_IO_WS2812_New.uvoptx | 34 +++++++++++++------ .../LCM_Light_Control_IO_WS2812_New.uvprojx | 25 ++++++++++++++ 5 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 LCM/Code/Drive/iwdg.c create mode 100644 LCM/Code/Drive/iwdg.h diff --git a/LCM/Code/Drive/iwdg.c b/LCM/Code/Drive/iwdg.c new file mode 100644 index 00000000..cdf91cde --- /dev/null +++ b/LCM/Code/Drive/iwdg.c @@ -0,0 +1,16 @@ +#include "iwdg.h" + +/************************************************** + * @brie :IWDG_Init() + * @note :IWDG³õʼ»¯ + * @param :ÎÞ + * @retval :ÎÞ + **************************************************/ +void IWDG_Init(void) +{ + IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); + IWDG_SetPrescaler(IWDG_Prescaler_128); + IWDG_SetReload(1000); // (128 * 1000)/114K = 1S ×óÓÒ + IWDG_ReloadCounter(); + IWDG_Enable(); +} diff --git a/LCM/Code/Drive/iwdg.h b/LCM/Code/Drive/iwdg.h new file mode 100644 index 00000000..a0b3ee06 --- /dev/null +++ b/LCM/Code/Drive/iwdg.h @@ -0,0 +1,9 @@ +#ifndef __IWDG_H +#define __IWDG_H + +#include "hk32f030m.h" + +void IWDG_Init(void); + +#endif + diff --git a/LCM/Code/User/main.c b/LCM/Code/User/main.c index 89c813c9..98e00946 100644 --- a/LCM/Code/User/main.c +++ b/LCM/Code/User/main.c @@ -34,6 +34,7 @@ #include "test.h" #include "task.h" #include "io_ws2812.h" +#include "iwdg.h" //RCC_ClocksTypeDef RCC_Clock; @@ -67,6 +68,10 @@ int main(void) KEY_Init(); USART1_Init(115200); LED_PWM_Init(); +#ifdef ADV2 + IWDG_Init(); +#endif + KEY1_State = 1; Power_Time = 0; @@ -98,6 +103,9 @@ int main(void) Usart_Task(); ADC_Task(); VESC_State_Task(); +#ifdef ADV2 + IWDG_ReloadCounter(); +#endif } return 0; } diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx index 15ab3f7d..17a22943 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx @@ -1328,6 +1328,18 @@ 0 0 + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\Code\Drive\iwdg.c + iwdg.c + 0 + 0 + @@ -1338,7 +1350,7 @@ 0 5 - 22 + 23 1 0 0 @@ -1350,7 +1362,7 @@ 5 - 23 + 24 1 0 0 @@ -1362,7 +1374,7 @@ 5 - 24 + 25 1 0 0 @@ -1374,7 +1386,7 @@ 5 - 25 + 26 1 0 0 @@ -1386,7 +1398,7 @@ 5 - 26 + 27 1 0 0 @@ -1398,7 +1410,7 @@ 5 - 27 + 28 1 0 0 @@ -1410,7 +1422,7 @@ 5 - 28 + 29 1 0 0 @@ -1422,7 +1434,7 @@ 5 - 29 + 30 1 0 0 @@ -1434,7 +1446,7 @@ 5 - 30 + 31 1 0 0 @@ -1446,7 +1458,7 @@ 5 - 31 + 32 1 0 0 @@ -1466,7 +1478,7 @@ 0 6 - 32 + 33 5 0 0 diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx index 9c109bfa..d05a682e 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx @@ -505,6 +505,11 @@ 1 ..\..\Code\Drive\eeprom.c + + iwdg.c + 1 + ..\..\Code\Drive\iwdg.c + @@ -1073,6 +1078,11 @@ 1 ..\..\Code\Drive\eeprom.c + + iwdg.c + 1 + ..\..\Code\Drive\iwdg.c + @@ -1641,6 +1651,11 @@ 1 ..\..\Code\Drive\eeprom.c + + iwdg.c + 1 + ..\..\Code\Drive\iwdg.c + @@ -2209,6 +2224,11 @@ 1 ..\..\Code\Drive\eeprom.c + + iwdg.c + 1 + ..\..\Code\Drive\iwdg.c + @@ -2777,6 +2797,11 @@ 1 ..\..\Code\Drive\eeprom.c + + iwdg.c + 1 + ..\..\Code\Drive\iwdg.c + From a9869080a643eb084a781a52672d93ba4050ad7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:46 +0200 Subject: [PATCH 06/21] add 50S battery --- LCM/Code/App/task.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index dd990b5b..a5841bc3 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -559,6 +559,10 @@ void Power_Task(void) void CheckPowerLevel(float battery_voltage) { + #ifdef S50S + uint16_t battVoltages_mv[11] = {4200, 4075, 4040, 3900, 3820, 3735, 3640, 3520, 3375, 3160, 3000}; //50S + #endif + #ifdef P42A uint16_t battVoltages_mv[11] = {4200, 4065, 3938, 3854, 3776, 3695, 3618, 3543, 3460, 3342, 3000}; //P42A #endif From 30e00fa08288cd836d886523a3be2de6a79275f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:46 +0200 Subject: [PATCH 07/21] remaining changes from adv2 source --- LCM/Code/App/ws2812.c | 15 +++++++++++++++ LCM/Code/Drive/power.c | 6 ++++-- LCM/Code/User/main.c | 21 ++++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/LCM/Code/App/ws2812.c b/LCM/Code/App/ws2812.c index c6ada65b..d52ce8e6 100644 --- a/LCM/Code/App/ws2812.c +++ b/LCM/Code/App/ws2812.c @@ -23,6 +23,14 @@ void WS2812_Init(void) ws2812_buff_add++; i++; } + +#ifdef ADV2 + for(i=0;i<10;i++) + { + WS2812_Set_Colour(i,0,0,0); + } + WS2812_Refresh(); // Refresh display +#endif } // Set a range of LEDs to the same color @@ -133,8 +141,10 @@ void WS2812_Refresh(void) __set_PRIMASK(1);//关总中断 +#ifndef ADV2 GPIOD->BRR = GPIO_Pin_4; delay(250); +#endif for(i=0; i<(WS2812_N*24); i++) { @@ -149,6 +159,11 @@ void WS2812_Refresh(void) ws2812_buff_add++; } +#ifdef ADV2 + GPIOD->BRR = GPIO_Pin_4; + delay(250); +#endif + __set_PRIMASK(0);//�����ж� //GPIOD->BSRR = GPIO_Pin_4; } diff --git a/LCM/Code/Drive/power.c b/LCM/Code/Drive/power.c index a7d57fc3..94c53fbd 100644 --- a/LCM/Code/Drive/power.c +++ b/LCM/Code/Drive/power.c @@ -20,7 +20,6 @@ void Power_Init(void) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); - #ifndef ADV2 //Charge GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; @@ -29,8 +28,11 @@ void Power_Init(void) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); +#endif - //PWR_OFF; +#ifdef ADV2 + PWR_OFF; +#else CHARGE_OFF; #endif } diff --git a/LCM/Code/User/main.c b/LCM/Code/User/main.c index 98e00946..455ced0a 100644 --- a/LCM/Code/User/main.c +++ b/LCM/Code/User/main.c @@ -56,7 +56,9 @@ int main(void) Buzzer_Init(); #endif ADC1_Init(); +#ifdef ADV2 Time6_Init(); +#endif WS2812_Init(); #ifdef ADV2 @@ -68,12 +70,25 @@ int main(void) KEY_Init(); USART1_Init(115200); LED_PWM_Init(); -#ifdef ADV2 +#ifndef ADV2 + Time6_Init(); +#endif +#ifdef IWDG_DEBUG IWDG_Init(); #endif +#ifndef ADV2 + if(KEY1 == 0) + { +#endif + KEY1_State = 1; +#ifndef ADV2 + } +#endif - KEY1_State = 1; +#ifdef ADV2 + Charge_Voltage = 3.3; Power_Time = 0; +#endif while(1) { @@ -103,7 +118,7 @@ int main(void) Usart_Task(); ADC_Task(); VESC_State_Task(); -#ifdef ADV2 +#ifdef IWDG_DEBUG IWDG_ReloadCounter(); #endif } From 3d276925cfed0bd4bc1af3400b0d66fd72623992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:46 +0200 Subject: [PATCH 08/21] adv2 needs voltage reading from the vesc while charging --- LCM/Code/App/task.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index a5841bc3..e37fc33b 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -1112,9 +1112,14 @@ void ADC_Task(void) **************************************************/ void VESC_State_Task(void) { - if ((Charge_Flag > 0) || (Power_Flag != 2) || !Vesc_Data_Ready) + if ((Power_Flag != 2) || !Vesc_Data_Ready) return; +#ifdef ADV + if (Charge_Flag > 0) + return; +#endif + Vesc_Data_Ready = false; // Not charging? Get voltage from VESC From 79dbd1e6ac820011c47afdd6262d1b728e052cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:46 +0200 Subject: [PATCH 09/21] add fully charged state to Charge_Detect_Task --- LCM/Code/App/task.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index e37fc33b..98f95bcd 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -1228,13 +1228,16 @@ void Charge_Detect_Task(void) // NOTE from surfdado: // Somehow Charge_Voltage will be below 3.0V when charging starts // I guess ADC3 is just a signal from the BMS? - if(Charge_Voltage < CHARGING_VOLTAGE) + if(Charge_Voltage >= CHARGING_VOLTAGE) { - Charge_Flag = 2; + Charge_Flag = 0; } - else + else if(data.inpVoltage >= FULL_VOLTAGE) { - Charge_Flag = 0; + Charge_Flag = 3; + } + else { + Charge_Flag = 2; } } #endif From d9558b5ba07b87340907fe0652fce29dd74d61cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:46 +0200 Subject: [PATCH 10/21] prioritize boot animation over charge animation --- LCM/Code/App/task.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index 98f95bcd..0ef5e256 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -437,7 +437,11 @@ void WS2812_Task(void) { uint8_t i; - if(Charge_Flag == 3) { // Battery fully charged + if(Power_Flag == 1) { + Idle_Time = 0; + WS2812_Boot(); + } + else if(Charge_Flag == 3) { // Battery fully charged WS2812_Set_AllColours(1,10,50,150,50); // white with a strong green tint } else if(Charge_Flag == 2) { // Charge display pattern (pulsating led) @@ -453,10 +457,6 @@ void WS2812_Task(void) WS2812_Flag = 0; Power_Display_Flag = 0; } - else if(Power_Flag == 1) { - Idle_Time = 0; - WS2812_Boot(); - } else if (Power_Flag > 2) { Idle_Time = 0; } From 83a929110f966105d6629610f0a71539b6032a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:47 +0200 Subject: [PATCH 11/21] add adv2 build target --- .github/workflows/build_lcm.yaml | 1 + ...M_Light_Control_IO_WS2812_New.cproject.yml | 1 + ..._Light_Control_IO_WS2812_New.csolution.yml | 12 + .../LCM_Light_Control_IO_WS2812_New.uvoptx | 205 +++++++ .../LCM_Light_Control_IO_WS2812_New.uvprojx | 573 ++++++++++++++++++ LCM/build.sh | 5 + 6 files changed, 797 insertions(+) diff --git a/.github/workflows/build_lcm.yaml b/.github/workflows/build_lcm.yaml index 52b37afc..5d36f181 100644 --- a/.github/workflows/build_lcm.yaml +++ b/.github/workflows/build_lcm.yaml @@ -54,6 +54,7 @@ jobs: run: | ./build.sh || true missing=0 + [ ! -f lcm_adv2.hex ] && echo "::warning::ADV2 firmware failed to build" && missing=1 [ ! -f lcm_adv_p42a.hex ] && echo "::warning::ADV-P42A firmware failed to build" && missing=1 [ ! -f lcm_adv_dg40.hex ] && echo "::warning::ADV-DG40 firmware failed to build" && missing=1 [ ! -f lcm_gtv.hex ] && echo "::warning::GTV firmware failed to build" && missing=1 diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml index 4c61167a..eeff6e02 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml @@ -87,6 +87,7 @@ project: - file: ../../Code/Drive/adc.c - file: ../../Code/Drive/io_ws2812.c - file: ../../Code/Drive/eeprom.c + - file: ../../Code/Drive/iwdg.c - group: Library files: - file: ../../Library/HK32F030Mxx_Library_V1.1.6/HK32F030M/HK32F030M_Lib/src/hk32f030m_adc.c diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml index ef9426b7..7cb95ab7 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml @@ -4,6 +4,18 @@ solution: compiler: AC6@6.23.0 target-types: + - type: ADV2 + variables: + - OutputName: adv2 + define: + - ADV2 + - S50S + - IWDG_DEBUG + - BATTERY_STRING: 20 + - FULL_VOLTAGE: 83 + - CHARGING_VOLTAGE: 3\.0 + - FIRMWARE_ID_PREFIX: '"ADV2"' + device: HK_MicroChip::HK32F030MF4P6 - type: ADV-P42A variables: - OutputName: adv_p42a diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx index 17a22943..13c546a9 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx @@ -1046,6 +1046,211 @@ + + lcm_adv2 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 0 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + 0 + CMSIS_AGDI + -X"CMSIS-DAP" -U0001A0000001 -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8009 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0HK32F030MXX_16.FLM -FS08000000 -FL04000 -FP0($$Device:HK32F030MF4P6$Flash\HK32F030MXX_16.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0HK32F030MXX_16 -FS08000000 -FL04000 -FP0($$Device:HK32F030MF4P6$Flash\HK32F030MXX_16.FLM)) + + + + + + 0 + 1 + Charge_Current + + + 1 + 1 + Power_Flag + + + 2 + 1 + Charge_Flag + + + 3 + 1 + Charge_Voltage + + + 4 + 1 + data + + + 5 + 1 + k + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + Startup 1 diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx index d05a682e..a9cc4bde 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx @@ -2871,6 +2871,579 @@ + + lcm_adv2 + 0x4 + ARM-ADS + 6230000::V6.23::ARMCLANG + 6230000::V6.23::ARMCLANG + 1 + + + HK32F030MF4P6 + HK_MicroChip + HKMicroChip.HK32F030xMxx_DFP.1.0.17 + http://www.hsxp-hk.com/companyfile/2/ + IRAM(0x20000000,0x800) IROM(0x08000000,0x4000) CPUTYPE("Cortex-M0") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0HK32F030MXX_16 -FS08000000 -FL04000 -FP0($$Device:HK32F030MF4P6$Flash\HK32F030MXX_16.FLM)) + 0 + + + + + + + + + + + $$Device:HK32F030MF4P6$SVD\HK32F030M.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + lcm_adv2 + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 1 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x800 + + + 1 + 0x8000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x4000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x800 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 3 + 5 + 1 + 1 + 0 + 0 + 0 + + + HK32F030M HK32F030MF4P6 ADV2 S50S IWDG_DEBUG BATTERY_STRING=20 FULL_VOLTAGE=83 CHARGING_VOLTAGE=3.0 FIRMWARE_ID_PREFIX=\"ADV2\" + + ..\..\Code\App;..\..\Code\Drive;..\..\Code\User;..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\inc;..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\CMSIS\CM0\Core;..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\CMSIS\HK32F030M\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Startup + + + KEIL_Startup_hk32f030m.s + 2 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\CMSIS\HK32F030M\Source\ARM\KEIL_Startup_hk32f030m.s + + + + + User + + + main.c + 1 + ..\..\Code\User\main.c + + + hk32f030m_it.c + 1 + ..\..\Code\User\hk32f030m_it.c + + + system_hk32f030m.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\CMSIS\HK32F030M\Source\system_hk32f030m.c + + + + + App + + + ws2812.c + 1 + ..\..\Code\App\ws2812.c + + + crc.c + 1 + ..\..\Code\App\crc.c + + + vesc_uasrt.c + 1 + ..\..\Code\App\vesc_uasrt.c + + + test.c + 1 + ..\..\Code\App\test.c + + + task.c + 1 + ..\..\Code\App\task.c + + + flag_bit.c + 1 + ..\..\Code\App\flag_bit.c + + + + + Drive + + + led.c + 1 + ..\..\Code\Drive\led.c + + + time.c + 1 + ..\..\Code\Drive\time.c + + + spi.c + 1 + ..\..\Code\Drive\spi.c + + + power.c + 1 + ..\..\Code\Drive\power.c + + + led_pwm.c + 1 + ..\..\Code\Drive\led_pwm.c + + + key.c + 1 + ..\..\Code\Drive\key.c + + + buzzer.c + 1 + ..\..\Code\Drive\buzzer.c + + + usart.c + 1 + ..\..\Code\Drive\usart.c + + + adc.c + 1 + ..\..\Code\Drive\adc.c + + + io_ws2812.c + 1 + ..\..\Code\Drive\io_ws2812.c + + + eeprom.c + 1 + ..\..\Code\Drive\eeprom.c + + + iwdg.c + 1 + ..\..\Code\Drive\iwdg.c + + + + + Library + + + hk32f030m_adc.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_adc.c + + + hk32f030m_gpio.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_gpio.c + + + hk32f030m_iwdg.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_iwdg.c + + + hk32f030m_misc.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_misc.c + + + hk32f030m_rcc.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_rcc.c + + + hk32f030m_spi.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_spi.c + + + hk32f030m_syscfg.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_syscfg.c + + + hk32f030m_tim.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_tim.c + + + hk32f030m_usart.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_usart.c + + + hk32f030m_flash.c + 1 + ..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\src\hk32f030m_flash.c + + + + + Readme + + + Readme.txt + 5 + ..\..\Readme\Readme.txt + + + + + diff --git a/LCM/build.sh b/LCM/build.sh index e05e74c0..ee6b82c3 100755 --- a/LCM/build.sh +++ b/LCM/build.sh @@ -1,3 +1,8 @@ +# ADV2 +cbuild setup Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml --context-set --context LCM_Light_Control_IO_WS2812_New.Release+ADV2 --packs +cbuild Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml --context-set --context LCM_Light_Control_IO_WS2812_New.Release+ADV2 +cp Project/MDK5/out/LCM_Light_Control_IO_WS2812_New/ADV2/Release/*.hex ./ + # ADV-P42A cbuild setup Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml --context-set --context LCM_Light_Control_IO_WS2812_New.Release+ADV-P42A --packs cbuild Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml --context-set --context LCM_Light_Control_IO_WS2812_New.Release+ADV-P42A From fdcf33d180bd0bbb9043a90a69931320991a0724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:47 +0200 Subject: [PATCH 12/21] prevent optimizer breaking the firmware --- LCM/Code/User/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LCM/Code/User/main.c b/LCM/Code/User/main.c index 455ced0a..fd9d235d 100644 --- a/LCM/Code/User/main.c +++ b/LCM/Code/User/main.c @@ -62,7 +62,9 @@ int main(void) WS2812_Init(); #ifdef ADV2 + Power_Time = 0; while (Power_Time < 500) { + __WFI(); } #endif From 21f06baa72cef625316065ca447b08d19308b37c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:47 +0200 Subject: [PATCH 13/21] add optimizer hints --- LCM/Code/App/ws2812.c | 2 +- LCM/Code/Drive/adc.c | 4 ++-- LCM/Code/Drive/spi.c | 2 +- LCM/Code/Drive/usart.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LCM/Code/App/ws2812.c b/LCM/Code/App/ws2812.c index d52ce8e6..412d2cda 100644 --- a/LCM/Code/App/ws2812.c +++ b/LCM/Code/App/ws2812.c @@ -129,7 +129,7 @@ void WS2812_Set_Colour(uint8_t num,uint8_t red,uint8_t green,uint8_t blue) void delay(uint16_t i) { - while(i--); + while(i--) __ASM volatile(""); } void WS2812_Refresh(void) diff --git a/LCM/Code/Drive/adc.c b/LCM/Code/Drive/adc.c index 3bea11b4..3928df74 100644 --- a/LCM/Code/Drive/adc.c +++ b/LCM/Code/Drive/adc.c @@ -77,10 +77,10 @@ uint16_t Read_ADC_Value(uint8_t ch) break; } - while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); //ADC¾ÍÐ÷±êÖ¾ + while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)) __ASM volatile(""); //ADC¾ÍÐ÷±êÖ¾ ADC_StartOfConversion(ADC1);//Ϊѡ¶¨µÄ ADC ͨµÀÆô¶¯×ª»»¡£ - while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //ת»»½áÊø±êÖ¾ + while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) __ASM volatile(""); //ת»»½áÊø±êÖ¾ adc_value =ADC_GetConversionValue(ADC1); return adc_value; diff --git a/LCM/Code/Drive/spi.c b/LCM/Code/Drive/spi.c index c3f3960b..12d34f34 100644 --- a/LCM/Code/Drive/spi.c +++ b/LCM/Code/Drive/spi.c @@ -44,5 +44,5 @@ void SPI_Config(void) void SPI1_Send_Byte(uint8_t data) { SPI1->DR = data; - while(((SPI1->SR) & SPI_I2S_FLAG_TXE) == 0); //µÈ´ý·¢ËÍÍê³É + while(((SPI1->SR) & SPI_I2S_FLAG_TXE) == 0) __ASM volatile(""); //µÈ´ý·¢ËÍÍê³É } diff --git a/LCM/Code/Drive/usart.c b/LCM/Code/Drive/usart.c index f4c630a5..1710a224 100644 --- a/LCM/Code/Drive/usart.c +++ b/LCM/Code/Drive/usart.c @@ -56,7 +56,7 @@ void USART1_Init(uint32_t Baud) **************************************************/ void USART1_Send_Byte(uint8_t byte) { - while((USART1->ISR & USART_ISR_TXE) == 0); + while((USART1->ISR & USART_ISR_TXE) == 0) __ASM volatile(""); USART1->TDR = byte; } From 65281be7423970bf46afbc104b462854d5380400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 6 Apr 2025 00:52:47 +0200 Subject: [PATCH 14/21] optimize image for size --- ...M_Light_Control_IO_WS2812_New.cproject.yml | 5 ++++ ..._Light_Control_IO_WS2812_New.csolution.yml | 4 +--- .../LCM_Light_Control_IO_WS2812_New.uvprojx | 24 +++++++++---------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml index eeff6e02..511228a7 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.cproject.yml @@ -16,6 +16,9 @@ project: define: - HK32F030M - HK32F030MF4P6 + - __MICROLIB + define-asm: + - __MICROLIB misc: - C: - -std=c99 @@ -25,6 +28,7 @@ project: - -fshort-enums - -fshort-wchar - -ffunction-sections + - -gdwarf-4 - -Wno-packed - -Wno-missing-variable-declarations - -Wno-missing-prototypes @@ -43,6 +47,7 @@ project: ASM: - -masm=auto Link: + - --library_type=microlib - --map - --load_addr_map_info - --xref diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml index 7cb95ab7..78bdec7d 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml @@ -70,9 +70,7 @@ solution: optimize: debug debug: on - type: Release - misc: - - C-CPP: - - -O1 + optimize: size debug: off projects: - project: LCM_Light_Control_IO_WS2812_New.cproject.yml diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx index a9cc4bde..5732d2bd 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx @@ -191,7 +191,7 @@ 0 0 8 - 0 + 1 0 0 0 @@ -315,7 +315,7 @@ 1 - 2 + 7 0 0 1 @@ -764,7 +764,7 @@ 0 0 8 - 0 + 1 0 0 0 @@ -888,7 +888,7 @@ 1 - 2 + 7 0 0 1 @@ -1337,7 +1337,7 @@ 0 0 8 - 0 + 1 0 0 0 @@ -1461,7 +1461,7 @@ 1 - 2 + 7 0 0 1 @@ -1910,7 +1910,7 @@ 0 0 8 - 0 + 1 0 0 0 @@ -2034,7 +2034,7 @@ 1 - 2 + 7 0 0 1 @@ -2483,7 +2483,7 @@ 0 0 8 - 0 + 1 0 0 0 @@ -2607,7 +2607,7 @@ 1 - 2 + 7 0 0 1 @@ -3056,7 +3056,7 @@ 0 0 8 - 0 + 1 0 0 0 @@ -3180,7 +3180,7 @@ 1 - 2 + 7 0 0 1 From e36eac3459fbf6180a55091e7fd0097bfadd813f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Tue, 8 Apr 2025 10:42:02 +0200 Subject: [PATCH 15/21] add a delay to prevent random flashes of the fully charged status bar --- LCM/Code/App/task.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index 0ef5e256..253acd26 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -1232,12 +1232,14 @@ void Charge_Detect_Task(void) { Charge_Flag = 0; } - else if(data.inpVoltage >= FULL_VOLTAGE) + else if(data.inpVoltage >= FULL_VOLTAGE && Charge_Time > 2000) { Charge_Flag = 3; } - else { + else + { Charge_Flag = 2; + Charge_Time = 0; } } #endif From aba26493b70032e8e965f295964941b6ae06036e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sun, 13 Apr 2025 23:09:42 +0200 Subject: [PATCH 16/21] =?UTF-8?q?fix=20the=20fully=20charged=20delay=20?= =?UTF-8?q?=F0=9F=A4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LCM/Code/App/task.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index 253acd26..644013c0 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -1232,9 +1232,12 @@ void Charge_Detect_Task(void) { Charge_Flag = 0; } - else if(data.inpVoltage >= FULL_VOLTAGE && Charge_Time > 2000) + else if(data.inpVoltage >= FULL_VOLTAGE) { - Charge_Flag = 3; + if(Charge_Time > 2000) + { + Charge_Flag = 3; + } } else { From 081dfba364d6257d37263c9937d04b1deb82c668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sat, 26 Apr 2025 09:12:26 +0200 Subject: [PATCH 17/21] make first flash occur after KR_DELAY_MS, when battery discharges to < 10% this prevents the flash during ADV2 shutdown --- LCM/Code/App/task.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index 644013c0..e43b4201 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -390,12 +390,9 @@ static void WS2818_Knight_Rider(uint8_t brightness) { static void WS2812_Idle() { if (Idle_Time > KR_DELAY_MS) { - if (Power_Display_Flag < 10) { + if (Power_Display_Flag < 10 && Idle_Time <= KR_DELAY_MS + 40) { // Voltage below 10%? Flash bright red for 40ms! WS2812_Set_AllColours(1, 10, 255, 20, 20); - if (Idle_Time > KR_DELAY_MS + 40) { - Idle_Time = 0; - } return; } @@ -404,6 +401,8 @@ static void WS2812_Idle() WS2818_Knight_Rider(WS2812_Measure); return; } + + Idle_Time = 0; } // Battery mode WS2812_Power_Display(WS2812_Measure); From dd64c1d210ed731b7f6bbb6d002c1cc10601aa10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sat, 26 Apr 2025 09:13:49 +0200 Subject: [PATCH 18/21] reset Idle_Time on power button presses --- LCM/Code/App/task.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index e43b4201..5a006f7b 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -74,6 +74,7 @@ void KEY1_Task(void) return; } + Idle_Time = 0; switch(KEY1_State) { case 1: // Click @@ -109,7 +110,6 @@ void KEY1_Task(void) case 4: // Three presses if(Power_Flag == 2) // Boot completed { - Idle_Time = 0; if(Buzzer_Flag == 2) { Buzzer_Flag = 1; From 66269fc1ff23cb4b7b54e418b92e8dc06124d3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sat, 26 Apr 2025 09:14:14 +0200 Subject: [PATCH 19/21] enable shutdown sequence on ADV2 --- LCM/Code/App/task.c | 16 +++++++++++++--- LCM/Code/App/task.h | 2 ++ ...LCM_Light_Control_IO_WS2812_New.csolution.yml | 1 + .../MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/LCM/Code/App/task.c b/LCM/Code/App/task.c index 5a006f7b..f6d0ddf6 100644 --- a/LCM/Code/App/task.c +++ b/LCM/Code/App/task.c @@ -100,10 +100,12 @@ void KEY1_Task(void) case 3: // Long press if(Power_Flag == 2) // Boot completed { -#ifndef ADV2 +#ifdef ADV2 + Power_Flag = 5; // external power off +#else Power_Flag = 4; // VESC power off - Power_Time = 0; #endif + Power_Time = 0; } break; @@ -510,6 +512,13 @@ void Power_Task(void) Power_Flag = 3; } } + else if (Power_Flag == 5) { + if(Power_Time > VESC_SHUTDOWN_TIME) + { + // BMS should shutdown the board by now, otherwise it was a false positive + Power_Flag = 2; + } + } if(power_flag_last == Power_Flag && Power_Flag != 1) { @@ -548,6 +557,7 @@ void Power_Task(void) break; case 4:// New Power state for shutdown sequence + case 5:// New Power state for ADV2 external shutdown sequence WS2812_Display_Flag = 3; break; @@ -844,7 +854,7 @@ void Buzzer_Task(void) buzzer_step = 0; return; } - else if (Power_Flag == 4) + else if (Power_Flag == 4 || Power_Flag == 5) { // Beep when powering off if (buzzer_step == 0) diff --git a/LCM/Code/App/task.h b/LCM/Code/App/task.h index 7c8f7c67..80e19640 100644 --- a/LCM/Code/App/task.h +++ b/LCM/Code/App/task.h @@ -12,7 +12,9 @@ #define SHUTDOWN_TIME 20 #define VESC_RPM 1000 #define VESC_BOOT_TIME 4000 +#ifndef VESC_SHUTDOWN_TIME #define VESC_SHUTDOWN_TIME 1000 +#endif #define DUTY_CYCLE 0.9 #define VOLTAGE_RECEIPT 0.02 #define CHARGE_COMMAND_TIME 1000 // frequency of notifying the float package of current charge state diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml index 78bdec7d..b45d5dd9 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.csolution.yml @@ -14,6 +14,7 @@ solution: - BATTERY_STRING: 20 - FULL_VOLTAGE: 83 - CHARGING_VOLTAGE: 3\.0 + - VESC_SHUTDOWN_TIME: 4000 - FIRMWARE_ID_PREFIX: '"ADV2"' device: HK_MicroChip::HK32F030MF4P6 - type: ADV-P42A diff --git a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx index 5732d2bd..3cb4a7fe 100644 --- a/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx +++ b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvprojx @@ -3204,7 +3204,7 @@ 0 - HK32F030M HK32F030MF4P6 ADV2 S50S IWDG_DEBUG BATTERY_STRING=20 FULL_VOLTAGE=83 CHARGING_VOLTAGE=3.0 FIRMWARE_ID_PREFIX=\"ADV2\" + HK32F030M HK32F030MF4P6 ADV2 S50S IWDG_DEBUG BATTERY_STRING=20 FULL_VOLTAGE=83 CHARGING_VOLTAGE=3.0 VESC_SHUTDOWN_TIME=4000 FIRMWARE_ID_PREFIX=\"ADV2\" ..\..\Code\App;..\..\Code\Drive;..\..\Code\User;..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\HK32F030M_Lib\inc;..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\CMSIS\CM0\Core;..\..\Library\HK32F030Mxx_Library_V1.1.6\HK32F030M\CMSIS\HK32F030M\Include From d3051b159dc0596bcf4431990cb7a65805ac6bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sat, 26 Apr 2025 11:44:08 +0200 Subject: [PATCH 20/21] replace app command magic numbers with datatypes --- LCM/Code/App/datatypes.h | 11 +++++++++-- LCM/Code/App/vesc_uasrt.c | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/LCM/Code/App/datatypes.h b/LCM/Code/App/datatypes.h index 086509e9..42c5533a 100644 --- a/LCM/Code/App/datatypes.h +++ b/LCM/Code/App/datatypes.h @@ -1337,6 +1337,9 @@ typedef struct __attribute__((packed)) { uint64_t runtime; // Seconds } backup_data; +typedef enum { + FLOAT_COMMAND_ID = 101, // float/refloat custom commands +} custom_app_data_command_ids; typedef enum { FLOAT_COMMAND_GET_INFO = 0, // get version / package info FLOAT_COMMAND_GET_RTDATA = 1, // get rt data @@ -1356,8 +1359,12 @@ typedef enum { FLOAT_COMMAND_FLYWHEEL = 22, FLOAT_COMMAND_HAPTIC = 23, FLOAT_COMMAND_LCM_POLL = 24, - FLOAT_COMMAND_LCM_CTRL = 25, - FLOAT_COMMAND_LCM_INFO = 26 + FLOAT_COMMAND_LCM_LIGHT_INFO = 25, + FLOAT_COMMAND_LCM_LIGHT_CTRL = 26, + FLOAT_COMMAND_LCM_DEVICE_INFO = 27, + FLOAT_COMMAND_CHARGING_STATE = 28, + FLOAT_COMMAND_LCM_GET_BATTERY = 29, + FLOAT_COMMAND_LCM_DEBUG = 99 } float_commands; typedef enum { diff --git a/LCM/Code/App/vesc_uasrt.c b/LCM/Code/App/vesc_uasrt.c index dfed8c22..738e030f 100644 --- a/LCM/Code/App/vesc_uasrt.c +++ b/LCM/Code/App/vesc_uasrt.c @@ -96,8 +96,8 @@ void Get_Vesc_Pack_Data(COMM_PACKET_ID id) command[0] = id; if (id == COMM_CUSTOM_APP_DATA) { - command[1] = 101; - command[2] = 24; // FLOAT_COMMAND_POLL + command[1] = FLOAT_COMMAND_ID; + command[2] = FLOAT_COMMAND_LCM_POLL; len = 3; if (!lcmConfig.isSet) { // write firmware id string to command @@ -109,8 +109,8 @@ void Get_Vesc_Pack_Data(COMM_PACKET_ID id) if (id == COMM_CHARGE_INFO) { command[0] = COMM_CUSTOM_APP_DATA; - command[1] = 101; - command[2] = 28; // FLOAT_COMMAND_CHARGESTATE + command[1] = FLOAT_COMMAND_ID; + command[2] = FLOAT_COMMAND_CHARGING_STATE; command[3] = 151; // -charging: 1/0 aka true/false command[4] = Charge_Flag == 2 ? 1: 0; // -charging: 1/0 aka true/false uint8_t ind = 5; @@ -121,8 +121,8 @@ void Get_Vesc_Pack_Data(COMM_PACKET_ID id) if (id == COMM_CUSTOM_DEBUG) { command[0] = COMM_CUSTOM_APP_DATA; - command[1] = 101; - command[2] = 99; // FLOAT_COMMAND_LCM_DEBUG + command[1] = FLOAT_COMMAND_ID; + command[2] = FLOAT_COMMAND_LCM_DEBUG; command[3] = Power_Flag; command[4] = Charge_Flag; command[5] = data.dutyCycleNow; @@ -333,12 +333,12 @@ uint8_t Protocol_Parse(uint8_t * message) case COMM_CUSTOM_APP_DATA: - if (len < 12) { + if (len < 12) { break; } - uint8_t magicnr = pdata[ind++]; - uint8_t floatcmd = pdata[ind++]; - if ((magicnr != 101) || (floatcmd != FLOAT_COMMAND_LCM_POLL)) { + uint8_t magicnr = pdata[ind++]; + uint8_t cmdid = pdata[ind++]; + if ((magicnr != FLOAT_COMMAND_ID) || (cmdid != FLOAT_COMMAND_LCM_POLL)) { break; } data.floatPackageSupported = true; From b3ba2bdf61aee930681d8e01d9c7e67dd085a967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Modzelewski?= Date: Sat, 26 Apr 2025 11:49:59 +0200 Subject: [PATCH 21/21] support custom lcm app command for ADV2 external shutdown notification --- LCM/Code/App/datatypes.h | 6 ++++++ LCM/Code/App/vesc_uasrt.c | 26 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/LCM/Code/App/datatypes.h b/LCM/Code/App/datatypes.h index 42c5533a..e339d645 100644 --- a/LCM/Code/App/datatypes.h +++ b/LCM/Code/App/datatypes.h @@ -1339,7 +1339,9 @@ typedef struct __attribute__((packed)) { typedef enum { FLOAT_COMMAND_ID = 101, // float/refloat custom commands + LCM_COMMAND_ID = 202, // bms custom commands } custom_app_data_command_ids; + typedef enum { FLOAT_COMMAND_GET_INFO = 0, // get version / package info FLOAT_COMMAND_GET_RTDATA = 1, // get rt data @@ -1404,6 +1406,10 @@ typedef enum { DEBUG = 255, } control_commands; +typedef enum { + LCM_COMMAND_EXTERNAL_SHUTDOWN_STATUS = 0, // shutdown status notification +} LCM_commands; + typedef enum { BOOT_DEFAULT = 0, BOOT_REDWHITEBLUE = 1, diff --git a/LCM/Code/App/vesc_uasrt.c b/LCM/Code/App/vesc_uasrt.c index 738e030f..5fd63d8b 100644 --- a/LCM/Code/App/vesc_uasrt.c +++ b/LCM/Code/App/vesc_uasrt.c @@ -333,12 +333,34 @@ uint8_t Protocol_Parse(uint8_t * message) case COMM_CUSTOM_APP_DATA: - if (len < 12) { + if (len < 3) { break; } uint8_t magicnr = pdata[ind++]; uint8_t cmdid = pdata[ind++]; - if ((magicnr != FLOAT_COMMAND_ID) || (cmdid != FLOAT_COMMAND_LCM_POLL)) { + + if (magicnr == LCM_COMMAND_ID) + { + switch(cmdid) + { + case LCM_COMMAND_EXTERNAL_SHUTDOWN_STATUS: + if(len != 4) return 1; + if(Power_Flag == 2 && + pdata[ind] == 1) // shutting down + { +#ifdef ADV2 + Power_Flag = 5; + Power_Time = 0; + Idle_Time = 0; +#endif + } + break; + } + + return 0; + } + + if ((magicnr != FLOAT_COMMAND_ID) || (cmdid != FLOAT_COMMAND_LCM_POLL) || (len < 12)) { break; } data.floatPackageSupported = true;