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/Code/App/datatypes.h b/LCM/Code/App/datatypes.h
index 086509e9..e339d645 100644
--- a/LCM/Code/App/datatypes.h
+++ b/LCM/Code/App/datatypes.h
@@ -1337,6 +1337,11 @@ typedef struct __attribute__((packed)) {
uint64_t runtime; // Seconds
} backup_data;
+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
@@ -1356,8 +1361,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 {
@@ -1397,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/task.c b/LCM/Code/App/task.c
index 3059eec2..f6d0ddf6 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()
**************************************************/
@@ -59,6 +74,7 @@ void KEY1_Task(void)
return;
}
+ Idle_Time = 0;
switch(KEY1_State)
{
case 1: // Click
@@ -84,7 +100,11 @@ void KEY1_Task(void)
case 3: // Long press
if(Power_Flag == 2) // Boot completed
{
+#ifdef ADV2
+ Power_Flag = 5; // external power off
+#else
Power_Flag = 4; // VESC power off
+#endif
Power_Time = 0;
}
break;
@@ -92,7 +112,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;
@@ -373,12 +392,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;
}
@@ -387,6 +403,8 @@ static void WS2812_Idle()
WS2818_Knight_Rider(WS2812_Measure);
return;
}
+
+ Idle_Time = 0;
}
// Battery mode
WS2812_Power_Display(WS2812_Measure);
@@ -420,7 +438,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)
@@ -436,10 +458,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;
}
@@ -494,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)
{
@@ -532,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;
@@ -542,6 +568,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
@@ -572,7 +602,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)
@@ -824,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)
@@ -1057,7 +1087,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)
@@ -1072,8 +1105,8 @@ void ADC_Task(void)
Charge_Voltage = (float)(adc_charge_sum_ave*0.0257080078125);
}
}
+#endif
}
-
break;
default:
@@ -1088,8 +1121,13 @@ 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;
@@ -1166,6 +1204,7 @@ void VESC_State_Task(void)
Shutdown_Time_M = 0;
}
+#ifndef ADV2
if(Shutdown_Time_S>60000)
{
Shutdown_Time_S = 0;
@@ -1184,5 +1223,35 @@ void VESC_State_Task(void)
Power_Flag = 4;
Power_Time = 0;
}
+#endif
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 = 0;
+ }
+ else if(data.inpVoltage >= FULL_VOLTAGE)
+ {
+ if(Charge_Time > 2000)
+ {
+ Charge_Flag = 3;
+ }
+ }
+ else
+ {
+ Charge_Flag = 2;
+ Charge_Time = 0;
+ }
+}
+#endif
diff --git a/LCM/Code/App/task.h b/LCM/Code/App/task.h
index 12818b0d..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
@@ -32,6 +34,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/App/vesc_uasrt.c b/LCM/Code/App/vesc_uasrt.c
index dfed8c22..5fd63d8b 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,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 floatcmd = pdata[ind++];
- if ((magicnr != 101) || (floatcmd != FLOAT_COMMAND_LCM_POLL)) {
+ uint8_t magicnr = pdata[ind++];
+ uint8_t cmdid = pdata[ind++];
+
+ 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;
diff --git a/LCM/Code/App/ws2812.c b/LCM/Code/App/ws2812.c
index c6ada65b..412d2cda 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
@@ -121,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)
@@ -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/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/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/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/Drive/power.c b/LCM/Code/Drive/power.c
index 8aa7d960..94c53fbd 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);
+#ifndef ADV2
//Charge
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
@@ -27,9 +28,13 @@ 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/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;
}
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..fd9d235d 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;
@@ -55,18 +56,47 @@ int main(void)
Buzzer_Init();
#endif
ADC1_Init();
+#ifdef ADV2
+ Time6_Init();
+#endif
WS2812_Init();
+
+#ifdef ADV2
+ Power_Time = 0;
+ while (Power_Time < 500) {
+ __WFI();
+ }
+#endif
+
Power_Init();
KEY_Init();
USART1_Init(115200);
LED_PWM_Init();
+#ifndef ADV2
Time6_Init();
+#endif
+#ifdef IWDG_DEBUG
+ IWDG_Init();
+#endif
+#ifndef ADV2
if(KEY1 == 0)
{
+#endif
KEY1_State = 1;
+#ifndef ADV2
}
+#endif
+
+#ifdef ADV2
+ Charge_Voltage = 3.3;
+ Power_Time = 0;
+#endif
+
while(1)
{
+#ifdef ADV2
+ LED_Task();
+#endif
KEY1_Task();
if(WS2812_Counter >= 20) // 20ms refresh period
@@ -79,6 +109,9 @@ int main(void)
#ifdef ADV
Charge_Task();
+#endif
+#ifdef ADV2
+ Charge_Detect_Task();
#endif
Headlights_Task();
#ifdef USE_BUZZER
@@ -87,6 +120,9 @@ int main(void)
Usart_Task();
ADC_Task();
VESC_State_Task();
+#ifdef IWDG_DEBUG
+ IWDG_ReloadCounter();
+#endif
}
return 0;
}
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..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
@@ -87,6 +92,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..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
@@ -4,6 +4,19 @@ 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
+ - VESC_SHUTDOWN_TIME: 4000
+ - FIRMWARE_ID_PREFIX: '"ADV2"'
+ device: HK_MicroChip::HK32F030MF4P6
- type: ADV-P42A
variables:
- OutputName: adv_p42a
@@ -58,9 +71,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.uvoptx b/LCM/Project/MDK5/LCM_Light_Control_IO_WS2812_New.uvoptx
index 15ab3f7d..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
@@ -1328,6 +1533,18 @@
0
0
+
+ 4
+ 22
+ 1
+ 0
+ 0
+ 0
+ ..\..\Code\Drive\iwdg.c
+ iwdg.c
+ 0
+ 0
+
@@ -1338,7 +1555,7 @@
0
5
- 22
+ 23
1
0
0
@@ -1350,7 +1567,7 @@
5
- 23
+ 24
1
0
0
@@ -1362,7 +1579,7 @@
5
- 24
+ 25
1
0
0
@@ -1374,7 +1591,7 @@
5
- 25
+ 26
1
0
0
@@ -1386,7 +1603,7 @@
5
- 26
+ 27
1
0
0
@@ -1398,7 +1615,7 @@
5
- 27
+ 28
1
0
0
@@ -1410,7 +1627,7 @@
5
- 28
+ 29
1
0
0
@@ -1422,7 +1639,7 @@
5
- 29
+ 30
1
0
0
@@ -1434,7 +1651,7 @@
5
- 30
+ 31
1
0
0
@@ -1446,7 +1663,7 @@
5
- 31
+ 32
1
0
0
@@ -1466,7 +1683,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..3cb4a7fe 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
@@ -505,6 +505,11 @@
1
..\..\Code\Drive\eeprom.c
+
+ iwdg.c
+ 1
+ ..\..\Code\Drive\iwdg.c
+
@@ -759,7 +764,7 @@
0
0
8
- 0
+ 1
0
0
0
@@ -883,7 +888,7 @@
1
- 2
+ 7
0
0
1
@@ -1073,6 +1078,11 @@
1
..\..\Code\Drive\eeprom.c
+
+ iwdg.c
+ 1
+ ..\..\Code\Drive\iwdg.c
+
@@ -1327,7 +1337,7 @@
0
0
8
- 0
+ 1
0
0
0
@@ -1451,7 +1461,7 @@
1
- 2
+ 7
0
0
1
@@ -1641,6 +1651,11 @@
1
..\..\Code\Drive\eeprom.c
+
+ iwdg.c
+ 1
+ ..\..\Code\Drive\iwdg.c
+
@@ -1895,7 +1910,7 @@
0
0
8
- 0
+ 1
0
0
0
@@ -2019,7 +2034,7 @@
1
- 2
+ 7
0
0
1
@@ -2209,6 +2224,11 @@
1
..\..\Code\Drive\eeprom.c
+
+ iwdg.c
+ 1
+ ..\..\Code\Drive\iwdg.c
+
@@ -2463,7 +2483,7 @@
0
0
8
- 0
+ 1
0
0
0
@@ -2587,7 +2607,7 @@
1
- 2
+ 7
0
0
1
@@ -2777,6 +2797,584 @@
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
+
+
+
+
+
+
+ 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
+ 1
+ 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
+ 7
+ 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 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
+
+
+
+ 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
+
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