latest version before merge
This commit is contained in:
+29
-27
File diff suppressed because one or more lines are too long
+135
-68
@@ -1,9 +1,26 @@
|
|||||||
#MicroXplorer Configuration settings - do not modify
|
#MicroXplorer Configuration settings - do not modify
|
||||||
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_8
|
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_3
|
||||||
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,master
|
ADC1.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_4
|
||||||
|
ADC1.Channel-2\#ChannelRegularConversion=ADC_CHANNEL_8
|
||||||
|
ADC1.Channel-3\#ChannelRegularConversion=ADC_CHANNEL_9
|
||||||
|
ADC1.Channel-4\#ChannelRegularConversion=ADC_CHANNEL_TEMPSENSOR
|
||||||
|
ADC1.Channel-5\#ChannelRegularConversion=ADC_CHANNEL_VREFINT
|
||||||
|
ADC1.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T3_TRGO
|
||||||
|
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,master,Rank-1\#ChannelRegularConversion,Channel-1\#ChannelRegularConversion,SamplingTime-1\#ChannelRegularConversion,Rank-2\#ChannelRegularConversion,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,Rank-3\#ChannelRegularConversion,Channel-3\#ChannelRegularConversion,SamplingTime-3\#ChannelRegularConversion,Rank-4\#ChannelRegularConversion,Channel-4\#ChannelRegularConversion,SamplingTime-4\#ChannelRegularConversion,Rank-5\#ChannelRegularConversion,Channel-5\#ChannelRegularConversion,SamplingTime-5\#ChannelRegularConversion,NbrOfConversion,ExternalTrigConv
|
||||||
|
ADC1.NbrOfConversion=6
|
||||||
ADC1.NbrOfConversionFlag=1
|
ADC1.NbrOfConversionFlag=1
|
||||||
ADC1.Rank-0\#ChannelRegularConversion=1
|
ADC1.Rank-0\#ChannelRegularConversion=1
|
||||||
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5
|
ADC1.Rank-1\#ChannelRegularConversion=2
|
||||||
|
ADC1.Rank-2\#ChannelRegularConversion=3
|
||||||
|
ADC1.Rank-3\#ChannelRegularConversion=4
|
||||||
|
ADC1.Rank-4\#ChannelRegularConversion=5
|
||||||
|
ADC1.Rank-5\#ChannelRegularConversion=6
|
||||||
|
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_41CYCLES_5
|
||||||
|
ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_41CYCLES_5
|
||||||
|
ADC1.SamplingTime-2\#ChannelRegularConversion=ADC_SAMPLETIME_41CYCLES_5
|
||||||
|
ADC1.SamplingTime-3\#ChannelRegularConversion=ADC_SAMPLETIME_41CYCLES_5
|
||||||
|
ADC1.SamplingTime-4\#ChannelRegularConversion=ADC_SAMPLETIME_41CYCLES_5
|
||||||
|
ADC1.SamplingTime-5\#ChannelRegularConversion=ADC_SAMPLETIME_41CYCLES_5
|
||||||
ADC1.master=1
|
ADC1.master=1
|
||||||
CAD.formats=
|
CAD.formats=
|
||||||
CAD.pinconfig=
|
CAD.pinconfig=
|
||||||
@@ -30,6 +47,17 @@ CAN2.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Presca
|
|||||||
CAN2.NART=ENABLE
|
CAN2.NART=ENABLE
|
||||||
CAN2.Prescaler=16
|
CAN2.Prescaler=16
|
||||||
CAN2.TXFP=ENABLE
|
CAN2.TXFP=ENABLE
|
||||||
|
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||||
|
Dma.ADC1.0.Instance=DMA1_Channel1
|
||||||
|
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||||
|
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
|
||||||
|
Dma.ADC1.0.Mode=DMA_CIRCULAR
|
||||||
|
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||||
|
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
|
||||||
|
Dma.ADC1.0.Priority=DMA_PRIORITY_HIGH
|
||||||
|
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||||
|
Dma.Request0=ADC1
|
||||||
|
Dma.RequestsNb=1
|
||||||
File.Version=6
|
File.Version=6
|
||||||
GPIO.groupedBy=Group By Peripherals
|
GPIO.groupedBy=Group By Peripherals
|
||||||
KeepUserPlacement=false
|
KeepUserPlacement=false
|
||||||
@@ -37,86 +65,95 @@ Mcu.CPN=STM32F107VCT6
|
|||||||
Mcu.Family=STM32F1
|
Mcu.Family=STM32F1
|
||||||
Mcu.IP0=ADC1
|
Mcu.IP0=ADC1
|
||||||
Mcu.IP1=CAN1
|
Mcu.IP1=CAN1
|
||||||
Mcu.IP10=UART5
|
Mcu.IP10=TIM4
|
||||||
Mcu.IP11=USART1
|
Mcu.IP11=UART5
|
||||||
Mcu.IP12=USART2
|
Mcu.IP12=USART1
|
||||||
Mcu.IP13=USART3
|
Mcu.IP13=USART2
|
||||||
|
Mcu.IP14=USART3
|
||||||
Mcu.IP2=CAN2
|
Mcu.IP2=CAN2
|
||||||
Mcu.IP3=CRC
|
Mcu.IP3=CRC
|
||||||
Mcu.IP4=NVIC
|
Mcu.IP4=DMA
|
||||||
Mcu.IP5=RCC
|
Mcu.IP5=NVIC
|
||||||
Mcu.IP6=RTC
|
Mcu.IP6=RCC
|
||||||
Mcu.IP7=SYS
|
Mcu.IP7=RTC
|
||||||
Mcu.IP8=TIM3
|
Mcu.IP8=SYS
|
||||||
Mcu.IP9=TIM4
|
Mcu.IP9=TIM3
|
||||||
Mcu.IPNb=14
|
Mcu.IPNb=15
|
||||||
Mcu.Name=STM32F107V(B-C)Tx
|
Mcu.Name=STM32F107V(B-C)Tx
|
||||||
Mcu.Package=LQFP100
|
Mcu.Package=LQFP100
|
||||||
Mcu.Pin0=PC14-OSC32_IN
|
Mcu.Pin0=PC14-OSC32_IN
|
||||||
Mcu.Pin1=PC15-OSC32_OUT
|
Mcu.Pin1=PC15-OSC32_OUT
|
||||||
Mcu.Pin10=PC4
|
Mcu.Pin10=PA5
|
||||||
Mcu.Pin11=PC5
|
Mcu.Pin11=PA6
|
||||||
Mcu.Pin12=PB0
|
Mcu.Pin12=PA7
|
||||||
Mcu.Pin13=PB1
|
Mcu.Pin13=PC4
|
||||||
Mcu.Pin14=PE7
|
Mcu.Pin14=PC5
|
||||||
Mcu.Pin15=PE8
|
Mcu.Pin15=PB0
|
||||||
Mcu.Pin16=PE9
|
Mcu.Pin16=PB1
|
||||||
Mcu.Pin17=PE10
|
Mcu.Pin17=PE7
|
||||||
Mcu.Pin18=PE11
|
Mcu.Pin18=PE8
|
||||||
Mcu.Pin19=PE12
|
Mcu.Pin19=PE9
|
||||||
Mcu.Pin2=OSC_IN
|
Mcu.Pin2=OSC_IN
|
||||||
Mcu.Pin20=PE14
|
Mcu.Pin20=PE10
|
||||||
Mcu.Pin21=PD13
|
Mcu.Pin21=PE11
|
||||||
Mcu.Pin22=PD14
|
Mcu.Pin22=PE12
|
||||||
Mcu.Pin23=PD15
|
Mcu.Pin23=PE14
|
||||||
Mcu.Pin24=PA9
|
Mcu.Pin24=PB10
|
||||||
Mcu.Pin25=PA10
|
Mcu.Pin25=PB11
|
||||||
Mcu.Pin26=PA13
|
Mcu.Pin26=PD13
|
||||||
Mcu.Pin27=PA14
|
Mcu.Pin27=PD14
|
||||||
Mcu.Pin28=PA15
|
Mcu.Pin28=PD15
|
||||||
Mcu.Pin29=PC10
|
Mcu.Pin29=PA9
|
||||||
Mcu.Pin3=OSC_OUT
|
Mcu.Pin3=OSC_OUT
|
||||||
Mcu.Pin30=PC11
|
Mcu.Pin30=PA10
|
||||||
Mcu.Pin31=PC12
|
Mcu.Pin31=PA13
|
||||||
Mcu.Pin32=PD0
|
Mcu.Pin32=PA14
|
||||||
Mcu.Pin33=PD1
|
Mcu.Pin33=PA15
|
||||||
Mcu.Pin34=PD2
|
Mcu.Pin34=PC10
|
||||||
Mcu.Pin35=PD3
|
Mcu.Pin35=PC11
|
||||||
Mcu.Pin36=PD4
|
Mcu.Pin36=PC12
|
||||||
Mcu.Pin37=PD5
|
Mcu.Pin37=PD0
|
||||||
Mcu.Pin38=PD6
|
Mcu.Pin38=PD1
|
||||||
Mcu.Pin39=PD7
|
Mcu.Pin39=PD2
|
||||||
Mcu.Pin4=PC3
|
Mcu.Pin4=PC2
|
||||||
Mcu.Pin40=PB3
|
Mcu.Pin40=PD3
|
||||||
Mcu.Pin41=PB4
|
Mcu.Pin41=PD4
|
||||||
Mcu.Pin42=PB5
|
Mcu.Pin42=PD5
|
||||||
Mcu.Pin43=PB6
|
Mcu.Pin43=PD6
|
||||||
Mcu.Pin44=PB7
|
Mcu.Pin44=PD7
|
||||||
Mcu.Pin45=PB8
|
Mcu.Pin45=PB3
|
||||||
Mcu.Pin46=PB9
|
Mcu.Pin46=PB4
|
||||||
Mcu.Pin47=PE1
|
Mcu.Pin47=PB5
|
||||||
Mcu.Pin48=VP_ADC1_TempSens_Input
|
Mcu.Pin48=PB6
|
||||||
Mcu.Pin49=VP_ADC1_Vref_Input
|
Mcu.Pin49=PB7
|
||||||
Mcu.Pin5=PA1
|
Mcu.Pin5=PC3
|
||||||
Mcu.Pin50=VP_CRC_VS_CRC
|
Mcu.Pin50=PB8
|
||||||
Mcu.Pin51=VP_RTC_VS_RTC_Activate
|
Mcu.Pin51=PB9
|
||||||
Mcu.Pin52=VP_SYS_VS_Systick
|
Mcu.Pin52=PE1
|
||||||
Mcu.Pin53=VP_TIM3_VS_ClockSourceINT
|
Mcu.Pin53=VP_ADC1_TempSens_Input
|
||||||
Mcu.Pin54=VP_TIM4_VS_ClockSourceINT
|
Mcu.Pin54=VP_ADC1_Vref_Input
|
||||||
Mcu.Pin6=PA2
|
Mcu.Pin55=VP_CRC_VS_CRC
|
||||||
Mcu.Pin7=PA3
|
Mcu.Pin56=VP_RTC_VS_RTC_Activate
|
||||||
Mcu.Pin8=PA4
|
Mcu.Pin57=VP_SYS_VS_Systick
|
||||||
Mcu.Pin9=PA7
|
Mcu.Pin58=VP_TIM3_VS_ClockSourceINT
|
||||||
Mcu.PinsNb=55
|
Mcu.Pin59=VP_TIM3_VS_no_output1
|
||||||
|
Mcu.Pin6=PA1
|
||||||
|
Mcu.Pin60=VP_TIM4_VS_ClockSourceINT
|
||||||
|
Mcu.Pin7=PA2
|
||||||
|
Mcu.Pin8=PA3
|
||||||
|
Mcu.Pin9=PA4
|
||||||
|
Mcu.PinsNb=61
|
||||||
Mcu.ThirdPartyNb=0
|
Mcu.ThirdPartyNb=0
|
||||||
Mcu.UserConstants=
|
Mcu.UserConstants=
|
||||||
Mcu.UserName=STM32F107VCTx
|
Mcu.UserName=STM32F107VCTx
|
||||||
MxCube.Version=6.15.0
|
MxCube.Version=6.15.0
|
||||||
MxDb.Version=DB.6.0.150
|
MxDb.Version=DB.6.0.150
|
||||||
|
NVIC.ADC1_2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.CAN1_RX0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
NVIC.CAN1_RX0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||||
NVIC.CAN2_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
NVIC.CAN2_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||||
NVIC.CAN2_TX_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
NVIC.CAN2_TX_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||||
|
NVIC.DMA1_Channel1_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
|
||||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.ForceEnableDMAVector=true
|
NVIC.ForceEnableDMAVector=true
|
||||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
@@ -162,6 +199,16 @@ PA4.GPIOParameters=GPIO_Label
|
|||||||
PA4.GPIO_Label=CP_ADC
|
PA4.GPIO_Label=CP_ADC
|
||||||
PA4.Locked=true
|
PA4.Locked=true
|
||||||
PA4.Signal=ADCx_IN4
|
PA4.Signal=ADCx_IN4
|
||||||
|
PA5.GPIOParameters=GPIO_Speed,GPIO_Label
|
||||||
|
PA5.GPIO_Label=DBG2
|
||||||
|
PA5.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
|
||||||
|
PA5.Locked=true
|
||||||
|
PA5.Signal=GPIO_Output
|
||||||
|
PA6.GPIOParameters=GPIO_Speed,GPIO_Label
|
||||||
|
PA6.GPIO_Label=DBG3
|
||||||
|
PA6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
|
||||||
|
PA6.Locked=true
|
||||||
|
PA6.Signal=GPIO_Output
|
||||||
PA7.GPIOParameters=GPIO_Label
|
PA7.GPIOParameters=GPIO_Label
|
||||||
PA7.GPIO_Label=CP_PWM
|
PA7.GPIO_Label=CP_PWM
|
||||||
PA7.Locked=true
|
PA7.Locked=true
|
||||||
@@ -177,6 +224,16 @@ PB1.GPIOParameters=GPIO_Label
|
|||||||
PB1.GPIO_Label=ADC_NTC2
|
PB1.GPIO_Label=ADC_NTC2
|
||||||
PB1.Locked=true
|
PB1.Locked=true
|
||||||
PB1.Signal=ADCx_IN9
|
PB1.Signal=ADCx_IN9
|
||||||
|
PB10.GPIOParameters=GPIO_Speed,GPIO_Label
|
||||||
|
PB10.GPIO_Label=DBG5
|
||||||
|
PB10.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
|
||||||
|
PB10.Locked=true
|
||||||
|
PB10.Signal=GPIO_Output
|
||||||
|
PB11.GPIOParameters=GPIO_Speed,GPIO_Label
|
||||||
|
PB11.GPIO_Label=DBG4
|
||||||
|
PB11.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
|
||||||
|
PB11.Locked=true
|
||||||
|
PB11.Signal=GPIO_Output
|
||||||
PB3.GPIOParameters=GPIO_Label
|
PB3.GPIOParameters=GPIO_Label
|
||||||
PB3.GPIO_Label=IN_FB2
|
PB3.GPIO_Label=IN_FB2
|
||||||
PB3.Locked=true
|
PB3.Locked=true
|
||||||
@@ -211,6 +268,11 @@ PC14-OSC32_IN.Mode=LSE-External-Oscillator
|
|||||||
PC14-OSC32_IN.Signal=RCC_OSC32_IN
|
PC14-OSC32_IN.Signal=RCC_OSC32_IN
|
||||||
PC15-OSC32_OUT.Mode=LSE-External-Oscillator
|
PC15-OSC32_OUT.Mode=LSE-External-Oscillator
|
||||||
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
|
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
|
||||||
|
PC2.GPIOParameters=GPIO_Speed,GPIO_Label
|
||||||
|
PC2.GPIO_Label=DBG1
|
||||||
|
PC2.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
|
||||||
|
PC2.Locked=true
|
||||||
|
PC2.Signal=GPIO_Output
|
||||||
PC3.GPIOParameters=GPIO_Label
|
PC3.GPIOParameters=GPIO_Label
|
||||||
PC3.GPIO_Label=RELAY_CP
|
PC3.GPIO_Label=RELAY_CP
|
||||||
PC3.Locked=true
|
PC3.Locked=true
|
||||||
@@ -320,7 +382,7 @@ ProjectManager.ToolChainLocation=
|
|||||||
ProjectManager.UAScriptAfterPath=
|
ProjectManager.UAScriptAfterPath=
|
||||||
ProjectManager.UAScriptBeforePath=
|
ProjectManager.UAScriptBeforePath=
|
||||||
ProjectManager.UnderRoot=true
|
ProjectManager.UnderRoot=true
|
||||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_ADC1_Init-ADC1-false-HAL-true,4-MX_CAN1_Init-CAN1-false-HAL-true,5-MX_CAN2_Init-CAN2-false-HAL-true,6-MX_RTC_Init-RTC-false-HAL-true,7-MX_TIM4_Init-TIM4-false-HAL-true,8-MX_USART2_UART_Init-USART2-false-HAL-true,9-MX_CRC_Init-CRC-false-HAL-true,10-MX_UART5_Init-UART5-false-HAL-true,11-MX_USART1_UART_Init-USART1-false-HAL-true,12-MX_USART3_UART_Init-USART3-false-HAL-true,13-MX_TIM3_Init-TIM3-false-HAL-true
|
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_CAN1_Init-CAN1-false-HAL-true,6-MX_CAN2_Init-CAN2-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true,8-MX_TIM4_Init-TIM4-false-HAL-true,9-MX_USART2_UART_Init-USART2-false-HAL-true,10-MX_CRC_Init-CRC-false-HAL-true,11-MX_UART5_Init-UART5-false-HAL-true,12-MX_USART1_UART_Init-USART1-false-HAL-true,13-MX_USART3_UART_Init-USART3-false-HAL-true,14-MX_TIM3_Init-TIM3-false-HAL-true
|
||||||
RCC.ADCFreqValue=12000000
|
RCC.ADCFreqValue=12000000
|
||||||
RCC.ADCPresc=RCC_ADCPCLK2_DIV6
|
RCC.ADCPresc=RCC_ADCPCLK2_DIV6
|
||||||
RCC.AHBFreq_Value=72000000
|
RCC.AHBFreq_Value=72000000
|
||||||
@@ -371,8 +433,11 @@ SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3
|
|||||||
SH.S_TIM4_CH3.ConfNb=1
|
SH.S_TIM4_CH3.ConfNb=1
|
||||||
SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4
|
SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4
|
||||||
SH.S_TIM4_CH4.ConfNb=1
|
SH.S_TIM4_CH4.ConfNb=1
|
||||||
|
TIM3.Channel-Output\ Compare1\ No\ Output=TIM_CHANNEL_1
|
||||||
TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
|
TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
|
||||||
TIM3.IPParameters=Channel-PWM Generation2 CH2
|
TIM3.IPParameters=Channel-PWM Generation2 CH2,TIM_MasterOutputTrigger,Channel-Output Compare1 No Output,Pulse-Output Compare1 No Output
|
||||||
|
TIM3.Pulse-Output\ Compare1\ No\ Output=1
|
||||||
|
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_OC1
|
||||||
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
|
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
|
||||||
TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
|
TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
|
||||||
TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
|
TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
|
||||||
@@ -400,6 +465,8 @@ VP_SYS_VS_Systick.Mode=SysTick
|
|||||||
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
||||||
VP_TIM3_VS_ClockSourceINT.Mode=Internal
|
VP_TIM3_VS_ClockSourceINT.Mode=Internal
|
||||||
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
|
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
|
||||||
|
VP_TIM3_VS_no_output1.Mode=Output Compare1 No Output
|
||||||
|
VP_TIM3_VS_no_output1.Signal=TIM3_VS_no_output1
|
||||||
VP_TIM4_VS_ClockSourceINT.Mode=Internal
|
VP_TIM4_VS_ClockSourceINT.Mode=Internal
|
||||||
VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT
|
VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT
|
||||||
board=custom
|
board=custom
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
# Журнал изменений (сессия чата): `fork/CCSModuleSW30Web`
|
||||||
|
|
||||||
|
Документ фиксирует доработки проекта **CCSModuleSW30Web** в ветке/каталоге форка
|
||||||
|
`/Users/colorbass/STM32CubeIDE/workspace_1.12.0/fork/CCSModuleSW30Web`, обсуждавшиеся и вносившиеся в рамках описанной сессии (UART, ADC/DMA, CP, отладка IRQ, оптимизация `-Ofast` для кода из прерываний).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. UART и протокол
|
||||||
|
|
||||||
|
### 1.1. UART3 (Everest / `serial.c`)
|
||||||
|
|
||||||
|
- Таймаут «нет связи с хостом»:** `EVEREST_TIMEOUT_MS` = **5000** мс.
|
||||||
|
- Жёсткий реинициал при отсутствии RX:** `UART3_REINIT_TIMEOUT_MS` = **1500** мс (с защитой от слишком частых реинициалов через `uart3_last_reinit_tick`).
|
||||||
|
- Расширено логирование путей сброса/ошибок приёма и ошибок HAL для диагностики «таймаут без остановки UART3».
|
||||||
|
- Колбэки и вспомогательные функции, вызываемые из контекста прерывания, помечены **`ISR_FAST`** (см. раздел 6):
|
||||||
|
`CCS_RxEventCallback`, `HAL_UART_ErrorCallback`, `uart3_log_hal_error`, `uart3_arm_rx_or_log`, цепочка разбора пакета (`process_received_packet`, `crc16_ibm`, `expected_payload_len`, `apply_command`).
|
||||||
|
|
||||||
|
### 1.2. UART2 / `serial_control.c`
|
||||||
|
|
||||||
|
- Отдельная логика **`SC_UART2_Watchdog()`**, вызывается из **`SC_Task()`** (не из IRQ).
|
||||||
|
- Константы:
|
||||||
|
- **`SC_UART2_REINIT_TIMEOUT_MS`** = **500** мс — порог для жёсткого реинициала при отсутствии пакетов;
|
||||||
|
- **`SC_UART2_PACKET_TIMEOUT_MS`** = **5000** мс — таймаут коммуникации.
|
||||||
|
- Сценарий **новый пакет при `BUSY_TX`**: при необходимости **`Abort_IT`**, сброс направления RS-485, затем повторная инициализация UART и приём `ReceiveToIdle_IT` (защита от обрыва TX из-за агрессивного watchdog).
|
||||||
|
- Отдельная ветка **жёсткого реинициала при `BUSY_TX`** с логом `USART2 BUSY_TX: hard reinit` (отслеживание `sc_uart2_last_busy_tx_reinit_packet_tick`).
|
||||||
|
- HAL-колбэки **`HAL_UARTEx_RxEventCallback`**, **`HAL_UART_TxCpltCallback`** помечены **`ISR_FAST`**.
|
||||||
|
|
||||||
|
### 1.3. `SC_SendPacket` и стек CRC/кодирования
|
||||||
|
|
||||||
|
- Для единообразной оптимизации пути «IRQ → ответ» на функции **`calculate_crc32`**, **`encode_packet`**, **`parse_packet`**, **`process_received_packet`** и публичную **`SC_SendPacket`** добавлен **`ISR_FAST`**.
|
||||||
|
- В **`Core/Inc/serial_control.h`**: подключение **`isr_opt.h`**, прототип **`ISR_FAST void SC_SendPacket(...)`** (согласованность с определением в `.c`).
|
||||||
|
|
||||||
|
**Замечание:** `SC_SendPacket` вызывается и из основного потока; для GCC вся функция компилируется с `-Ofast`. При необходимости строгого разделения можно вынести отдельную версию «только из IRQ».
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Отладочные линии DBG в `stm32f1xx_it.c`
|
||||||
|
|
||||||
|
На время входа/выхода из выбранных обработчиков прерываний поднимается/опускается соответствующий GPIO — удобно для осциллографа (длительность IRQ).
|
||||||
|
|
||||||
|
| Линия | Обработчик |
|
||||||
|
|--------|------------|
|
||||||
|
| **DBG1** | `UART5_IRQHandler` |
|
||||||
|
| **DBG2** | `USART2_IRQHandler` |
|
||||||
|
| **DBG3** | `USART3_IRQHandler` |
|
||||||
|
| **DBG4** | `DMA1_Channel1_IRQHandler`, `ADC1_2_IRQHandler`, `TIM3_IRQHandler` |
|
||||||
|
| **DBG5** | `CAN1_RX0_IRQHandler`, `CAN2_TX_IRQHandler`, `CAN2_RX1_IRQHandler` |
|
||||||
|
| — | `USART1_IRQHandler` — без обёртки DBG (по согласованию) |
|
||||||
|
|
||||||
|
В **`DMA1_Channel1_IRQHandler`** вызывается **`HAL_DMA_IRQHandler(&hdma_adc1)`** для цепочки ADC+DMA.
|
||||||
|
|
||||||
|
Для всего файла **`stm32f1xx_it.c`** под GCC добавлено:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#pragma GCC optimize("Ofast")
|
||||||
|
```
|
||||||
|
|
||||||
|
(в блоке `USER CODE BEGIN Includes`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. ADC: DMA, глобальные данные, колбэк
|
||||||
|
|
||||||
|
- Файлы **`adc.c` / `adc.h`**: структура **`ADC_ScanData_t`**, глобально **`volatile ADC_ScanData_t adc_data`** с полями сырых каналов (`in3_raw`, `cp_raw`, `ntc1_raw`, `ntc2_raw`, `temp_sensor_raw`, `vrefint_raw` и т.д. по фактическому объявлению в заголовке).
|
||||||
|
- **`HAL_ADC_ConvCpltCallback`**: копирование из буфера DMA в **`adc_data`**, помечен **`ISR_FAST`**.
|
||||||
|
- Публичная **`ADC_ScanStart()`** — запуск сканирования (после калибровки вызывается из инициализации платы).
|
||||||
|
- **`board.c`**: после **`HAL_ADCEx_Calibration_Start`** вызывается **`ADC_ScanStart()`**; **`CONN_ReadTemp`** читает **`adc_data.ntc1_raw` / `ntc2_raw`** вместо блокирующего опроса ADC.
|
||||||
|
|
||||||
|
**Диагностика (из обсуждения):** если не вызываются **`HAL_ADC_ConvCpltCallback`** / **`HAL_DMA_IRQHandler`**, проверять: срабатывание триггера ADC (например, **TIM3 TRGO**), работу TIM3, порядок инициализации DMA/NVIC, срабатывание **`DMA1_Channel1_IRQHandler`**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. CP (`cp.c` / `cp.h`)
|
||||||
|
|
||||||
|
- Измерение опоры на **`adc_data.cp_raw`** (и при необходимости **`vrefint_raw`** по текущей реализации в коде).
|
||||||
|
- Логика классификации/порогов приведена к варианту, согласованному с основным **CCSModuleSW30Web** (не форк).
|
||||||
|
- Сэмпл по таймеру: уход от тяжёлой работы в IRQ OC — использование **`HAL_TIM_OC_Start`** без прерывания по сравнению, обновление напряжения в **`CP_GetVoltage()`** / основном цикле (**`CP_Loop`** опирается на **`CP_GetState()`** и т.п. по фактическому коду).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Отладочный UART (`debug.c`)
|
||||||
|
|
||||||
|
При **`#ifndef USE_WEB_INTERFACE`** (или эквивалентной ветке сборки в файле): колбэк **`HAL_UARTEx_RxEventCallback`** и **`debug_rx_interrupt`** помечены **`ISR_FAST`**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Оптимизация `-Ofast` для кода из прерываний
|
||||||
|
|
||||||
|
### 6.1. Макрос `ISR_FAST`
|
||||||
|
|
||||||
|
Файл **`Core/Inc/isr_opt.h`**:
|
||||||
|
|
||||||
|
- **GCC:** `#define ISR_FAST __attribute__((optimize("Ofast")))`
|
||||||
|
- **Иное:** пустой макрос.
|
||||||
|
|
||||||
|
### 6.2. Где используется (по состоянию репозитория)
|
||||||
|
|
||||||
|
| Файл | Элементы с `ISR_FAST` / pragma |
|
||||||
|
|------|--------------------------------|
|
||||||
|
| `stm32f1xx_it.c` | `#pragma GCC optimize("Ofast")` на весь файл (GCC) |
|
||||||
|
| `adc.c` | `HAL_ADC_ConvCpltCallback` |
|
||||||
|
| `serial.c` | `CCS_RxEventCallback`, `HAL_UART_ErrorCallback`, `uart3_log_hal_error`, `uart3_arm_rx_or_log`, `process_received_packet`, `crc16_ibm`, `expected_payload_len`, `apply_command` |
|
||||||
|
| `serial_control.c` | `HAL_UARTEx_RxEventCallback`, `HAL_UART_TxCpltCallback`, `calculate_crc32`, `encode_packet`, `parse_packet`, `process_received_packet`, `SC_SendPacket` |
|
||||||
|
| `serial_control.h` | прототип `SC_SendPacket` + `#include "isr_opt.h"` |
|
||||||
|
| `psu_control.c` | `HAL_CAN_RxFifo1MsgPendingCallback` |
|
||||||
|
| `debug.c` | см. раздел 5 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Ограничения и переносимость
|
||||||
|
|
||||||
|
- **`ISR_FAST`** и pragma в **`stm32f1xx_it.c`** рассчитаны на **GCC** (STM32CubeIDE по умолчанию). Для **IAR / ARM Compiler 6** потребуется отдельная стратегия (прагмы/ключи проекта).
|
||||||
|
- **`-Ofast`** допускает агрессивные преобразования с плавающей точкой и перестановки, влияющие на строго воспроизводимую арифметику; для критичных вычислений вне IRQ при необходимости ограничивайте область оптимизации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Затронутые пути (краткий список)
|
||||||
|
|
||||||
|
- `Core/Inc/isr_opt.h` — новый/центральный заголовок оптимизации IRQ.
|
||||||
|
- `Core/Inc/serial_control.h` — `isr_opt.h`, `ISR_FAST` у `SC_SendPacket`.
|
||||||
|
- `Core/Src/stm32f1xx_it.c` — DBG, DMA ADC, pragma `Ofast`.
|
||||||
|
- `Core/Src/adc.c`, `Core/Inc/adc.h` — DMA, `adc_data`, `ADC_ScanStart`, колбэк.
|
||||||
|
- `Core/Src/board.c` — калибровка, старт скана, температура из `adc_data`.
|
||||||
|
- `Core/Src/cp.c`, `Core/Inc/cp.h` — CP и ADC.
|
||||||
|
- `Core/Src/serial.c` — UART3, таймауты, логи, `ISR_FAST`.
|
||||||
|
- `Core/Src/serial_control.c` — UART2, watchdog, `ISR_FAST`.
|
||||||
|
- `Core/Src/psu_control.c` — CAN RX callback.
|
||||||
|
- `Core/Src/debug.c` — отладочный UART под условием сборки.
|
||||||
|
- `Core/Src/dma.c`, `gpio.c`, `main.h` — по необходимости для DMA1 Ch1 и DBG-пинов.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Документ сгенерирован для фиксации контекста сессии; при дальнейших правках кода имеет смысл обновлять соответствующие разделы вручную.*
|
||||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Executable → Regular
+11
@@ -29,18 +29,29 @@ extern "C" {
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
extern ADC_HandleTypeDef hadc1;
|
extern ADC_HandleTypeDef hadc1;
|
||||||
|
|
||||||
/* USER CODE BEGIN Private defines */
|
/* USER CODE BEGIN Private defines */
|
||||||
|
typedef struct {
|
||||||
|
uint16_t in3_raw; /* Rank1: ADC_CHANNEL_3 */
|
||||||
|
uint16_t cp_raw; /* Rank2: ADC_CHANNEL_4 */
|
||||||
|
uint16_t ntc1_raw; /* Rank3: ADC_CHANNEL_8 */
|
||||||
|
uint16_t ntc2_raw; /* Rank4: ADC_CHANNEL_9 */
|
||||||
|
uint16_t temp_sensor_raw; /* Rank5: ADC_CHANNEL_TEMPSENSOR */
|
||||||
|
uint16_t vrefint_raw; /* Rank6: ADC_CHANNEL_VREFINT */
|
||||||
|
} ADC_ScanData_t;
|
||||||
|
extern volatile ADC_ScanData_t adc_data;
|
||||||
|
|
||||||
/* USER CODE END Private defines */
|
/* USER CODE END Private defines */
|
||||||
|
|
||||||
void MX_ADC1_Init(void);
|
void MX_ADC1_Init(void);
|
||||||
|
|
||||||
/* USER CODE BEGIN Prototypes */
|
/* USER CODE BEGIN Prototypes */
|
||||||
|
void ADC_ScanStart(void);
|
||||||
|
|
||||||
/* USER CODE END Prototypes */
|
/* USER CODE END Prototypes */
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file dma.h
|
||||||
|
* @brief This file contains all the function prototypes for
|
||||||
|
* the dma.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2026 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __DMA_H__
|
||||||
|
#define __DMA_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
/* DMA memory to memory transfer handles -------------------------------------*/
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Includes */
|
||||||
|
|
||||||
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Private defines */
|
||||||
|
|
||||||
|
/* USER CODE END Private defines */
|
||||||
|
|
||||||
|
void MX_DMA_Init(void);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Prototypes */
|
||||||
|
|
||||||
|
/* USER CODE END Prototypes */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __DMA_H__ */
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#ifndef ISR_OPT_H
|
||||||
|
#define ISR_OPT_H
|
||||||
|
|
||||||
|
/* GCC: быстрые функции, вызываемые из IRQ / из HAL из IRQ-контекста */
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define ISR_FAST __attribute__((optimize("Ofast")))
|
||||||
|
#else
|
||||||
|
#define ISR_FAST
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ISR_OPT_H */
|
||||||
+13
-3
@@ -41,9 +41,9 @@ extern "C" {
|
|||||||
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
/* Exported constants --------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN EC */
|
/* USER CODE BEGIN EC */
|
||||||
#define FW_VERSION_MAJOR 0x01
|
#define FW_VERSION_MAJOR 1
|
||||||
#define FW_VERSION_MINOR 0x00
|
#define FW_VERSION_MINOR 0
|
||||||
#define FW_VERSION_PATCH 10
|
#define FW_VERSION_PATCH 15
|
||||||
/* USER CODE END EC */
|
/* USER CODE END EC */
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
@@ -59,6 +59,8 @@ void Error_Handler(void);
|
|||||||
/* USER CODE END EFP */
|
/* USER CODE END EFP */
|
||||||
|
|
||||||
/* Private defines -----------------------------------------------------------*/
|
/* Private defines -----------------------------------------------------------*/
|
||||||
|
#define DBG1_Pin GPIO_PIN_2
|
||||||
|
#define DBG1_GPIO_Port GPIOC
|
||||||
#define RELAY_CP_Pin GPIO_PIN_3
|
#define RELAY_CP_Pin GPIO_PIN_3
|
||||||
#define RELAY_CP_GPIO_Port GPIOC
|
#define RELAY_CP_GPIO_Port GPIOC
|
||||||
#define IN_SW0_Pin GPIO_PIN_1
|
#define IN_SW0_Pin GPIO_PIN_1
|
||||||
@@ -67,6 +69,10 @@ void Error_Handler(void);
|
|||||||
#define IN_SW1_GPIO_Port GPIOA
|
#define IN_SW1_GPIO_Port GPIOA
|
||||||
#define CP_ADC_Pin GPIO_PIN_4
|
#define CP_ADC_Pin GPIO_PIN_4
|
||||||
#define CP_ADC_GPIO_Port GPIOA
|
#define CP_ADC_GPIO_Port GPIOA
|
||||||
|
#define DBG2_Pin GPIO_PIN_5
|
||||||
|
#define DBG2_GPIO_Port GPIOA
|
||||||
|
#define DBG3_Pin GPIO_PIN_6
|
||||||
|
#define DBG3_GPIO_Port GPIOA
|
||||||
#define CP_PWM_Pin GPIO_PIN_7
|
#define CP_PWM_Pin GPIO_PIN_7
|
||||||
#define CP_PWM_GPIO_Port GPIOA
|
#define CP_PWM_GPIO_Port GPIOA
|
||||||
#define LOCK_A_Pin GPIO_PIN_4
|
#define LOCK_A_Pin GPIO_PIN_4
|
||||||
@@ -91,6 +97,10 @@ void Error_Handler(void);
|
|||||||
#define RELAY5_GPIO_Port GPIOE
|
#define RELAY5_GPIO_Port GPIOE
|
||||||
#define AC_OK_Pin GPIO_PIN_14
|
#define AC_OK_Pin GPIO_PIN_14
|
||||||
#define AC_OK_GPIO_Port GPIOE
|
#define AC_OK_GPIO_Port GPIOE
|
||||||
|
#define DBG5_Pin GPIO_PIN_10
|
||||||
|
#define DBG5_GPIO_Port GPIOB
|
||||||
|
#define DBG4_Pin GPIO_PIN_11
|
||||||
|
#define DBG4_GPIO_Port GPIOB
|
||||||
#define RELAY_CC_Pin GPIO_PIN_15
|
#define RELAY_CC_Pin GPIO_PIN_15
|
||||||
#define RELAY_CC_GPIO_Port GPIOA
|
#define RELAY_CC_GPIO_Port GPIOA
|
||||||
#define RELAY_DC_Pin GPIO_PIN_3
|
#define RELAY_DC_Pin GPIO_PIN_3
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ void CCS_Init(void);
|
|||||||
void CCS_SendEmergencyStop(void);
|
void CCS_SendEmergencyStop(void);
|
||||||
void CCS_SendStart(void);
|
void CCS_SendStart(void);
|
||||||
void CCS_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size);
|
void CCS_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size);
|
||||||
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CCS_DISABLED = 0,
|
CCS_DISABLED = 0,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "charger_control.h"
|
#include "charger_control.h"
|
||||||
|
#include "isr_opt.h"
|
||||||
|
|
||||||
#define USE_WEB_INTERFACE
|
#define USE_WEB_INTERFACE
|
||||||
|
|
||||||
@@ -168,7 +169,7 @@ struct SerialControl_t {
|
|||||||
// Публичные методы
|
// Публичные методы
|
||||||
void SC_Init();
|
void SC_Init();
|
||||||
void SC_Task();
|
void SC_Task();
|
||||||
void SC_SendPacket(const uint8_t* payload, uint16_t payload_len, uint8_t response_code);
|
ISR_FAST void SC_SendPacket(const uint8_t* payload, uint16_t payload_len, uint8_t response_code);
|
||||||
|
|
||||||
// Внешняя функция обработки команд (определена в serial_handler.c)
|
// Внешняя функция обработки команд (определена в serial_handler.c)
|
||||||
extern void SC_CommandHandler(ReceivedCommand_t* cmd);
|
extern void SC_CommandHandler(ReceivedCommand_t* cmd);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
/*#define HAL_CORTEX_MODULE_ENABLED */
|
/*#define HAL_CORTEX_MODULE_ENABLED */
|
||||||
#define HAL_CRC_MODULE_ENABLED
|
#define HAL_CRC_MODULE_ENABLED
|
||||||
/*#define HAL_DAC_MODULE_ENABLED */
|
/*#define HAL_DAC_MODULE_ENABLED */
|
||||||
/*#define HAL_DMA_MODULE_ENABLED */
|
#define HAL_DMA_MODULE_ENABLED
|
||||||
/*#define HAL_ETH_MODULE_ENABLED */
|
/*#define HAL_ETH_MODULE_ENABLED */
|
||||||
/*#define HAL_FLASH_MODULE_ENABLED */
|
/*#define HAL_FLASH_MODULE_ENABLED */
|
||||||
#define HAL_GPIO_MODULE_ENABLED
|
#define HAL_GPIO_MODULE_ENABLED
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ void SVC_Handler(void);
|
|||||||
void DebugMon_Handler(void);
|
void DebugMon_Handler(void);
|
||||||
void PendSV_Handler(void);
|
void PendSV_Handler(void);
|
||||||
void SysTick_Handler(void);
|
void SysTick_Handler(void);
|
||||||
|
void DMA1_Channel1_IRQHandler(void);
|
||||||
|
void ADC1_2_IRQHandler(void);
|
||||||
void CAN1_RX0_IRQHandler(void);
|
void CAN1_RX0_IRQHandler(void);
|
||||||
void TIM3_IRQHandler(void);
|
void TIM3_IRQHandler(void);
|
||||||
void USART1_IRQHandler(void);
|
void USART1_IRQHandler(void);
|
||||||
|
|||||||
+104
-5
@@ -21,10 +21,39 @@
|
|||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
|
|
||||||
/* USER CODE BEGIN 0 */
|
/* USER CODE BEGIN 0 */
|
||||||
|
#include "isr_opt.h"
|
||||||
|
static volatile uint16_t adc_dma_raw[6];
|
||||||
|
volatile ADC_ScanData_t adc_data = {0};
|
||||||
|
static volatile uint8_t adc_scan_data_ready = 0u;
|
||||||
|
|
||||||
|
void ADC_ScanStart(void)
|
||||||
|
{
|
||||||
|
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_dma_raw, 6u) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR_FAST void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
|
||||||
|
{
|
||||||
|
if (hadc->Instance != ADC1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
adc_data.in3_raw = adc_dma_raw[0];
|
||||||
|
adc_data.cp_raw = adc_dma_raw[1];
|
||||||
|
adc_data.ntc1_raw = adc_dma_raw[2];
|
||||||
|
adc_data.ntc2_raw = adc_dma_raw[3];
|
||||||
|
adc_data.temp_sensor_raw = adc_dma_raw[4];
|
||||||
|
adc_data.vrefint_raw = adc_dma_raw[5];
|
||||||
|
adc_scan_data_ready = 1u;
|
||||||
|
}
|
||||||
|
|
||||||
/* USER CODE END 0 */
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
ADC_HandleTypeDef hadc1;
|
ADC_HandleTypeDef hadc1;
|
||||||
|
DMA_HandleTypeDef hdma_adc1;
|
||||||
|
|
||||||
/* ADC1 init function */
|
/* ADC1 init function */
|
||||||
void MX_ADC1_Init(void)
|
void MX_ADC1_Init(void)
|
||||||
@@ -43,12 +72,12 @@ void MX_ADC1_Init(void)
|
|||||||
/** Common config
|
/** Common config
|
||||||
*/
|
*/
|
||||||
hadc1.Instance = ADC1;
|
hadc1.Instance = ADC1;
|
||||||
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
|
||||||
hadc1.Init.ContinuousConvMode = DISABLE;
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
||||||
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
||||||
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
|
||||||
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
||||||
hadc1.Init.NbrOfConversion = 1;
|
hadc1.Init.NbrOfConversion = 6;
|
||||||
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
@@ -56,9 +85,54 @@ void MX_ADC1_Init(void)
|
|||||||
|
|
||||||
/** Configure Regular Channel
|
/** Configure Regular Channel
|
||||||
*/
|
*/
|
||||||
sConfig.Channel = ADC_CHANNEL_8;
|
sConfig.Channel = ADC_CHANNEL_3;
|
||||||
sConfig.Rank = ADC_REGULAR_RANK_1;
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
||||||
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
sConfig.SamplingTime = ADC_SAMPLETIME_41CYCLES_5;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_4;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_2;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_8;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_3;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_9;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_4;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_5;
|
||||||
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
sConfig.Channel = ADC_CHANNEL_VREFINT;
|
||||||
|
sConfig.Rank = ADC_REGULAR_RANK_6;
|
||||||
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
@@ -97,6 +171,26 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
|
|||||||
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/* ADC1 DMA Init */
|
||||||
|
/* ADC1 Init */
|
||||||
|
hdma_adc1.Instance = DMA1_Channel1;
|
||||||
|
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||||
|
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
|
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
|
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||||
|
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||||
|
hdma_adc1.Init.Mode = DMA_CIRCULAR;
|
||||||
|
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
|
||||||
|
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
|
||||||
|
|
||||||
|
/* ADC1 interrupt Init */
|
||||||
|
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
||||||
/* USER CODE BEGIN ADC1_MspInit 1 */
|
/* USER CODE BEGIN ADC1_MspInit 1 */
|
||||||
|
|
||||||
/* USER CODE END ADC1_MspInit 1 */
|
/* USER CODE END ADC1_MspInit 1 */
|
||||||
@@ -124,6 +218,11 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
|
|||||||
|
|
||||||
HAL_GPIO_DeInit(GPIOB, ADC_NTC1_Pin|ADC_NTC2_Pin);
|
HAL_GPIO_DeInit(GPIOB, ADC_NTC1_Pin|ADC_NTC2_Pin);
|
||||||
|
|
||||||
|
/* ADC1 DMA DeInit */
|
||||||
|
HAL_DMA_DeInit(adcHandle->DMA_Handle);
|
||||||
|
|
||||||
|
/* ADC1 interrupt Deinit */
|
||||||
|
HAL_NVIC_DisableIRQ(ADC1_2_IRQn);
|
||||||
/* USER CODE BEGIN ADC1_MspDeInit 1 */
|
/* USER CODE BEGIN ADC1_MspDeInit 1 */
|
||||||
|
|
||||||
/* USER CODE END ADC1_MspDeInit 1 */
|
/* USER CODE END ADC1_MspDeInit 1 */
|
||||||
|
|||||||
+4
-21
@@ -1,11 +1,10 @@
|
|||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
#include "adc.h"
|
||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
#include "sma_filter.h"
|
#include "sma_filter.h"
|
||||||
|
|
||||||
extern ADC_HandleTypeDef hadc1;
|
|
||||||
|
|
||||||
//TODO:
|
//TODO:
|
||||||
//TEMP READ
|
//TEMP READ
|
||||||
// Connector temperature sensors
|
// Connector temperature sensors
|
||||||
@@ -89,6 +88,7 @@ uint8_t GetBoardTemp(){
|
|||||||
|
|
||||||
void Init_Peripheral(){
|
void Init_Peripheral(){
|
||||||
HAL_ADCEx_Calibration_Start(&hadc1);
|
HAL_ADCEx_Calibration_Start(&hadc1);
|
||||||
|
ADC_ScanStart();
|
||||||
|
|
||||||
RELAY_Write(RELAY_AUX0, 0);
|
RELAY_Write(RELAY_AUX0, 0);
|
||||||
RELAY_Write(RELAY_AUX1, 0);
|
RELAY_Write(RELAY_AUX1, 0);
|
||||||
@@ -130,27 +130,11 @@ float calculate_NTC_resistance(int adc_value, float Vref, float Vin, float R) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int16_t CONN_ReadTemp(uint8_t ch){
|
int16_t CONN_ReadTemp(uint8_t ch){
|
||||||
ADC_LockBlocking();
|
uint32_t adcValue = 0u;
|
||||||
|
adcValue = ch ? adc_data.ntc2_raw : adc_data.ntc1_raw;
|
||||||
//TODO
|
|
||||||
if(ch)ADC_Select_Channel(ADC_CHANNEL_8);
|
|
||||||
else ADC_Select_Channel(ADC_CHANNEL_9);
|
|
||||||
// Начало конверсии
|
|
||||||
HAL_ADC_Start(&hadc1);
|
|
||||||
|
|
||||||
|
|
||||||
// Ожидание окончания конверсии
|
|
||||||
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
|
|
||||||
|
|
||||||
// Получение значения
|
|
||||||
uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
|
|
||||||
|
|
||||||
// Остановка АЦП (по желанию)
|
|
||||||
HAL_ADC_Stop(&hadc1);
|
|
||||||
|
|
||||||
int32_t adc_filtered = SMAFilter_Update(&conn_temp_adc_filter[ch ? 1u : 0u], (int32_t)adcValue);
|
int32_t adc_filtered = SMAFilter_Update(&conn_temp_adc_filter[ch ? 1u : 0u], (int32_t)adcValue);
|
||||||
if((uint32_t)adc_filtered > 4000u) {
|
if((uint32_t)adc_filtered > 4000u) {
|
||||||
ADC_Unlock();
|
|
||||||
return 20; //Термодатчик не подключен
|
return 20; //Термодатчик не подключен
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +145,6 @@ int16_t CONN_ReadTemp(uint8_t ch){
|
|||||||
|
|
||||||
float temp = pt1000_to_temperature(calculate_NTC_resistance((int)adc_filtered, Vref, Vin, R));
|
float temp = pt1000_to_temperature(calculate_NTC_resistance((int)adc_filtered, Vref, Vin, R));
|
||||||
|
|
||||||
ADC_Unlock();
|
|
||||||
return (int16_t)temp;
|
return (int16_t)temp;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-140
@@ -2,131 +2,30 @@
|
|||||||
#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>
|
||||||
|
#include <stdlib.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) {
|
|
||||||
uint32_t adc = 0;
|
|
||||||
|
|
||||||
ADC_Select_Channel(ch);
|
|
||||||
HAL_ADC_Start(&hadc1);
|
|
||||||
HAL_ADC_PollForConversion(&hadc1, 10);
|
|
||||||
adc = HAL_ADC_GetValue(&hadc1);
|
|
||||||
HAL_ADC_Stop(&hadc1);
|
|
||||||
|
|
||||||
return adc;
|
|
||||||
}
|
|
||||||
#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_cp = adc_data.cp_raw;
|
||||||
int32_t v_adc_mv = 0;
|
uint32_t adc_vref = adc_data.vrefint_raw; // нужно измерять!
|
||||||
int32_t v_out_mv = 0;
|
|
||||||
|
|
||||||
adc = CP_ReadAdcChannel((uint32_t)4u);
|
// VREFINT в мВ (берётся из даташита или калибровки MCU)
|
||||||
v_adc_mv = (int32_t)((adc * 3300u) / 4095u);
|
const int32_t VREFINT_MV = 1210;
|
||||||
v_out_mv = ((v_adc_mv - 1723) * 1000) / 130;
|
|
||||||
|
// напряжение на входе АЦП
|
||||||
|
int32_t v_adc_mv = (adc_cp * VREFINT_MV) / adc_vref;
|
||||||
|
|
||||||
|
// дальше твоя формула
|
||||||
|
int32_t v_out_mv = ((v_adc_mv - 1723) * 7704) / 1000;
|
||||||
|
|
||||||
return v_out_mv;
|
return v_out_mv;
|
||||||
}
|
}
|
||||||
@@ -145,7 +44,7 @@ void CP_Init(void) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
|
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
|
||||||
HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_1);
|
HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CP_SetDuty(uint8_t percentage) {
|
void CP_SetDuty(uint8_t percentage) {
|
||||||
@@ -166,47 +65,35 @@ uint8_t CP_GetDuty(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t CP_GetVoltage(void) {
|
int32_t CP_GetVoltage(void) {
|
||||||
|
cp_voltage_mv = CP_ReadVoltageMv();
|
||||||
return cp_voltage_mv;
|
return cp_voltage_mv;
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_State_t CP_GetState(void) {
|
CP_State_t CP_GetState(void) {
|
||||||
int32_t voltage_real = cp_voltage_filt_mv;
|
int32_t voltage_real = CP_GetVoltage();
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_State_t instant_state = CP_ClassifyWithHysteresis(voltage_real, cp_stable_state);
|
if (voltage_real >= (12000-1000)) {
|
||||||
|
return EV_STATE_A_IDLE;
|
||||||
if (instant_state == cp_stable_state) {
|
} else if (voltage_real >= (9000-1000) && voltage_real <= (9000+1000)) {
|
||||||
cp_candidate_state = cp_stable_state;
|
return EV_STATE_B_CONN_PREP;
|
||||||
cp_candidate_since_ms = now;
|
} else if (voltage_real >= (6000-1000) && voltage_real <= (6000+1000)) {
|
||||||
|
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 {
|
||||||
if (cp_candidate_state != instant_state) {
|
return EV_STATE_ACQUIRING;
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
|
|
||||||
{
|
|
||||||
if (htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
|
|
||||||
if (ADC_TryLock() == 0u) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cp_voltage_mv = CP_ReadVoltageMv();
|
|
||||||
(void)CP_ApplyEma(cp_voltage_mv);
|
|
||||||
ADC_Unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -150,6 +150,8 @@ int log_printf(LogLevel_t level, const char *format, ...)
|
|||||||
|
|
||||||
#ifndef USE_WEB_INTERFACE
|
#ifndef USE_WEB_INTERFACE
|
||||||
|
|
||||||
|
#include "isr_opt.h"
|
||||||
|
|
||||||
extern UART_HandleTypeDef huart2;
|
extern UART_HandleTypeDef huart2;
|
||||||
|
|
||||||
|
|
||||||
@@ -158,7 +160,7 @@ uint8_t debug_cmd_received;
|
|||||||
uint8_t debug_rx_buffer_size = 0;
|
uint8_t debug_rx_buffer_size = 0;
|
||||||
|
|
||||||
|
|
||||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
|
ISR_FAST void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
|
||||||
|
|
||||||
// if(huart->Instance == USART1){
|
// if(huart->Instance == USART1){
|
||||||
// mm_rx_interrupt(huart, Size);
|
// mm_rx_interrupt(huart, Size);
|
||||||
@@ -168,7 +170,7 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void debug_rx_interrupt(UART_HandleTypeDef *huart, uint16_t Size){
|
ISR_FAST void debug_rx_interrupt(UART_HandleTypeDef *huart, uint16_t Size){
|
||||||
debug_rx_buffer[Size] = '\0';
|
debug_rx_buffer[Size] = '\0';
|
||||||
debug_rx_buffer_size = Size;
|
debug_rx_buffer_size = Size;
|
||||||
debug_cmd_received = 1;
|
debug_cmd_received = 1;
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file dma.c
|
||||||
|
* @brief This file provides code for the configuration
|
||||||
|
* of all the requested memory to memory DMA transfers.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2026 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "dma.h"
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 0 */
|
||||||
|
|
||||||
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Configure DMA */
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable DMA controller clock
|
||||||
|
*/
|
||||||
|
void MX_DMA_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* DMA controller clock enable */
|
||||||
|
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||||
|
|
||||||
|
/* DMA interrupt init */
|
||||||
|
/* DMA1_Channel1_IRQn interrupt configuration */
|
||||||
|
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 2 */
|
||||||
|
|
||||||
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
+25
-4
@@ -54,20 +54,27 @@ void MX_GPIO_Init(void)
|
|||||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
|
|
||||||
/*Configure GPIO pin Output Level */
|
/*Configure GPIO pin Output Level */
|
||||||
HAL_GPIO_WritePin(GPIOC, RELAY_CP_Pin|LOCK_A_Pin|LOCK_B_Pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(GPIOC, DBG1_Pin|RELAY_CP_Pin|LOCK_A_Pin|LOCK_B_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOA, DBG2_Pin|DBG3_Pin|RELAY_CC_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
/*Configure GPIO pin Output Level */
|
/*Configure GPIO pin Output Level */
|
||||||
HAL_GPIO_WritePin(GPIOE, RELAY1_Pin|RELAY2_Pin|RELAY3_Pin|RELAY4_Pin
|
HAL_GPIO_WritePin(GPIOE, RELAY1_Pin|RELAY2_Pin|RELAY3_Pin|RELAY4_Pin
|
||||||
|RELAY5_Pin, GPIO_PIN_RESET);
|
|RELAY5_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
/*Configure GPIO pin Output Level */
|
/*Configure GPIO pin Output Level */
|
||||||
HAL_GPIO_WritePin(RELAY_CC_GPIO_Port, RELAY_CC_Pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(GPIOB, DBG5_Pin|DBG4_Pin|EE_WP_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
/*Configure GPIO pin Output Level */
|
/*Configure GPIO pin Output Level */
|
||||||
HAL_GPIO_WritePin(GPIOD, RELAY_DC_Pin|USART2_DIR_Pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(GPIOD, RELAY_DC_Pin|USART2_DIR_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
/*Configure GPIO pin Output Level */
|
/*Configure GPIO pin : DBG1_Pin */
|
||||||
HAL_GPIO_WritePin(EE_WP_GPIO_Port, EE_WP_Pin, GPIO_PIN_RESET);
|
GPIO_InitStruct.Pin = DBG1_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
HAL_GPIO_Init(DBG1_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pins : RELAY_CP_Pin LOCK_A_Pin LOCK_B_Pin */
|
/*Configure GPIO pins : RELAY_CP_Pin LOCK_A_Pin LOCK_B_Pin */
|
||||||
GPIO_InitStruct.Pin = RELAY_CP_Pin|LOCK_A_Pin|LOCK_B_Pin;
|
GPIO_InitStruct.Pin = RELAY_CP_Pin|LOCK_A_Pin|LOCK_B_Pin;
|
||||||
@@ -88,6 +95,13 @@ void MX_GPIO_Init(void)
|
|||||||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||||||
HAL_GPIO_Init(IN_SW1_GPIO_Port, &GPIO_InitStruct);
|
HAL_GPIO_Init(IN_SW1_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : DBG2_Pin DBG3_Pin */
|
||||||
|
GPIO_InitStruct.Pin = DBG2_Pin|DBG3_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pins : IN0_Pin AC_OK_Pin ISO_IN_Pin */
|
/*Configure GPIO pins : IN0_Pin AC_OK_Pin ISO_IN_Pin */
|
||||||
GPIO_InitStruct.Pin = IN0_Pin|AC_OK_Pin|ISO_IN_Pin;
|
GPIO_InitStruct.Pin = IN0_Pin|AC_OK_Pin|ISO_IN_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
@@ -103,6 +117,13 @@ void MX_GPIO_Init(void)
|
|||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : DBG5_Pin DBG4_Pin */
|
||||||
|
GPIO_InitStruct.Pin = DBG5_Pin|DBG4_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pin : RELAY_CC_Pin */
|
/*Configure GPIO pin : RELAY_CC_Pin */
|
||||||
GPIO_InitStruct.Pin = RELAY_CC_Pin;
|
GPIO_InitStruct.Pin = RELAY_CC_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "can.h"
|
#include "can.h"
|
||||||
#include "crc.h"
|
#include "crc.h"
|
||||||
|
#include "dma.h"
|
||||||
#include "rtc.h"
|
#include "rtc.h"
|
||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
#include "usart.h"
|
#include "usart.h"
|
||||||
@@ -136,6 +137,7 @@ int main(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
VectorBase_Config();
|
VectorBase_Config();
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
@@ -157,6 +159,7 @@ int main(void)
|
|||||||
|
|
||||||
/* Initialize all configured peripherals */
|
/* Initialize all configured peripherals */
|
||||||
MX_GPIO_Init();
|
MX_GPIO_Init();
|
||||||
|
MX_DMA_Init();
|
||||||
MX_ADC1_Init();
|
MX_ADC1_Init();
|
||||||
MX_CAN1_Init();
|
MX_CAN1_Init();
|
||||||
MX_CAN2_Init();
|
MX_CAN2_Init();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "charger_control.h"
|
#include "charger_control.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "isr_opt.h"
|
||||||
|
|
||||||
PSU_02_t PSU_02;
|
PSU_02_t PSU_02;
|
||||||
PSU_04_t PSU_04;
|
PSU_04_t PSU_04;
|
||||||
@@ -39,7 +40,7 @@ static uint32_t PSU_StateTime(void){
|
|||||||
return HAL_GetTick() - PSU0.statetick;
|
return HAL_GetTick() - PSU0.statetick;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan){
|
ISR_FAST void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan){
|
||||||
|
|
||||||
static CAN_RxHeaderTypeDef RxHeader;
|
static CAN_RxHeaderTypeDef RxHeader;
|
||||||
static uint8_t RxData[8] = {0,};
|
static uint8_t RxData[8] = {0,};
|
||||||
|
|||||||
+137
-22
@@ -3,6 +3,7 @@
|
|||||||
#include "connector.h"
|
#include "connector.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "isr_opt.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "charger_config.h"
|
#include "charger_config.h"
|
||||||
@@ -28,7 +29,8 @@ 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
|
#define EVEREST_TIMEOUT_MS 5000u
|
||||||
|
#define UART3_REINIT_TIMEOUT_MS 1500u
|
||||||
|
|
||||||
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];
|
||||||
@@ -42,6 +44,8 @@ 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 uint8_t everest_timed_out = 0;
|
||||||
static uint32_t last_everest_timeout_log_tick = 0;
|
static uint32_t last_everest_timeout_log_tick = 0;
|
||||||
|
static uint32_t uart3_last_packet_tick = 0;
|
||||||
|
static uint32_t uart3_last_reinit_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;
|
||||||
@@ -49,27 +53,97 @@ CCS_EvInfo_t CCS_EvInfo;
|
|||||||
CONN_State_t CCS_EvseState;
|
CONN_State_t CCS_EvseState;
|
||||||
CCS_ConnectorState_t CCS_ConnectorState = CCS_UNPLUGGED;
|
CCS_ConnectorState_t CCS_ConnectorState = CCS_UNPLUGGED;
|
||||||
|
|
||||||
static uint8_t process_received_packet(const uint8_t* packet, uint16_t packet_len);
|
ISR_FAST static uint8_t process_received_packet(const uint8_t* packet, uint16_t packet_len);
|
||||||
|
static void CCS_UART3_Watchdog(void);
|
||||||
|
|
||||||
void CCS_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size) {
|
ISR_FAST static void uart3_log_hal_error(uint8_t uart_num, uint32_t err) {
|
||||||
if (huart != &huart3) {
|
if (err == HAL_UART_ERROR_NONE) {
|
||||||
|
log_printf(LOG_ERR, "UART%u HAL error decode: NONE\n", uart_num);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (size > 0 && size <= sizeof(rx_buffer)) {
|
log_printf(LOG_ERR, "UART%u HAL error decode: %s%s%s%s%s%s raw=0x%08lx\n",
|
||||||
|
uart_num,
|
||||||
|
(err & HAL_UART_ERROR_PE) ? "PE " : "",
|
||||||
|
(err & HAL_UART_ERROR_NE) ? "NE " : "",
|
||||||
|
(err & HAL_UART_ERROR_FE) ? "FE " : "",
|
||||||
|
(err & HAL_UART_ERROR_ORE) ? "ORE " : "",
|
||||||
|
(err & HAL_UART_ERROR_DMA) ? "DMA " : "",
|
||||||
|
#ifdef HAL_UART_ERROR_INVALID_CALLBACK
|
||||||
|
(err & HAL_UART_ERROR_INVALID_CALLBACK) ? "INV_CB " : "",
|
||||||
|
#else
|
||||||
|
"",
|
||||||
|
#endif
|
||||||
|
(unsigned long)err);
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR_FAST static void uart3_arm_rx_or_log(const char *where) {
|
||||||
|
HAL_StatusTypeDef st = HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer));
|
||||||
|
if (st == HAL_OK) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint32_t err_after = HAL_UART_GetError(&huart3);
|
||||||
|
log_printf(LOG_ERR,
|
||||||
|
"UART3 RX arm failed (%s): HAL_Status=%d err_after=0x%08lx\n",
|
||||||
|
where, (int)st, (unsigned long)err_after);
|
||||||
|
uart3_log_hal_error(3u, err_after);
|
||||||
|
if (err_after != HAL_UART_ERROR_NONE) {
|
||||||
|
(void)HAL_UART_Abort_IT(&huart3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR_FAST void CCS_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size) {
|
||||||
|
if (huart != &huart3) {
|
||||||
|
log_printf(LOG_WARN, "UART3 RX drop: wrong huart in RxEventCallback (size=%u)\n",
|
||||||
|
(unsigned)size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (size == 0u) {
|
||||||
|
log_printf(LOG_WARN, "UART3 RX drop: RxEvent size=0 (idle, no payload)\n");
|
||||||
|
uart3_arm_rx_or_log("RxEventCallback");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (size > sizeof(rx_buffer)) {
|
||||||
|
log_printf(LOG_ERR, "UART3 RX drop: size=%u > rx_buffer %u (overflow, not parsed)\n",
|
||||||
|
(unsigned)size, (unsigned)sizeof(rx_buffer));
|
||||||
|
uart3_arm_rx_or_log("RxEventCallback");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uart3_last_packet_tick = HAL_GetTick();
|
||||||
|
uart3_last_reinit_tick = uart3_last_packet_tick;
|
||||||
process_received_packet(rx_buffer, size);
|
process_received_packet(rx_buffer, size);
|
||||||
|
uart3_arm_rx_or_log("RxEventCallback");
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR_FAST void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
|
||||||
|
uint32_t error = HAL_UART_GetError(huart);
|
||||||
|
uint8_t uart_num =
|
||||||
|
(huart == &huart2) ? 2 :
|
||||||
|
(huart == &huart3) ? 3 :
|
||||||
|
(huart == &huart5) ? 5 : 0;
|
||||||
|
log_printf(LOG_ERR,
|
||||||
|
"UART%u HAL error (ISR): raw=0x%08lx — RX may be corrupted until re-arm\n",
|
||||||
|
uart_num, (unsigned long)error);
|
||||||
|
uart3_log_hal_error(uart_num, error);
|
||||||
|
(void)HAL_UART_Abort_IT(huart);
|
||||||
|
if (huart == &huart3) {
|
||||||
|
uart3_arm_rx_or_log("ErrorCallback");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CCS_SerialLoop(void) {
|
void CCS_SerialLoop(void) {
|
||||||
static uint32_t replug_tick = 0;
|
static uint32_t replug_tick = 0;
|
||||||
static uint32_t replug_watchdog_tick = 0;
|
static uint32_t replug_watchdog_tick = 0;
|
||||||
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 (HAL_UART_GetState(&huart3) == HAL_UART_STATE_READY) {
|
if ((&huart3)->RxState == HAL_UART_STATE_READY) {
|
||||||
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer));
|
uart3_arm_rx_or_log("SerialLoop");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCS_UART3_Watchdog();
|
||||||
|
|
||||||
/* Read CP once per loop and use buffered value below. */
|
/* Read CP once per loop and use buffered value below. */
|
||||||
cp_state_buffer = CP_GetState();
|
cp_state_buffer = CP_GetState();
|
||||||
|
|
||||||
@@ -232,11 +306,13 @@ void CCS_Init(void){
|
|||||||
CCS_MaxLoad.maxCurrent = PSU_MAX_CURRENT*10; //100A
|
CCS_MaxLoad.maxCurrent = PSU_MAX_CURRENT*10; //100A
|
||||||
CCS_MaxLoad.minCurrent = PSU_MIN_CURRENT*10; //1A
|
CCS_MaxLoad.minCurrent = PSU_MIN_CURRENT*10; //1A
|
||||||
CCS_MaxLoad.maxPower = PSU_MAX_POWER; //30000W
|
CCS_MaxLoad.maxPower = PSU_MAX_POWER; //30000W
|
||||||
|
uart3_last_packet_tick = HAL_GetTick();
|
||||||
|
uart3_last_reinit_tick = uart3_last_packet_tick;
|
||||||
CCS_SendResetReason();
|
CCS_SendResetReason();
|
||||||
log_printf(LOG_INFO, "CCS init\n");
|
log_printf(LOG_INFO, "CCS init\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t crc16_ibm(const uint8_t* data, uint16_t length) {
|
ISR_FAST static uint16_t crc16_ibm(const uint8_t* data, uint16_t length) {
|
||||||
uint16_t crc = 0xFFFFu;
|
uint16_t crc = 0xFFFFu;
|
||||||
for (uint16_t i = 0; i < length; i++) {
|
for (uint16_t i = 0; i < length; i++) {
|
||||||
crc ^= data[i];
|
crc ^= data[i];
|
||||||
@@ -270,7 +346,7 @@ static uint16_t CCS_BuildPacket(uint8_t cmd, const void* payload, uint16_t paylo
|
|||||||
static void CCS_SendPacket(uint8_t cmd, const void* payload, uint16_t payload_len) {
|
static void CCS_SendPacket(uint8_t cmd, const void* payload, uint16_t payload_len) {
|
||||||
uint16_t len = CCS_BuildPacket(cmd, payload, payload_len, tx_buffer, sizeof(tx_buffer));
|
uint16_t len = CCS_BuildPacket(cmd, payload, payload_len, tx_buffer, sizeof(tx_buffer));
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
HAL_UART_Transmit(&huart3, tx_buffer, len, 1000);
|
HAL_UART_Transmit_IT(&huart3, tx_buffer, len);
|
||||||
}
|
}
|
||||||
last_cmd_sent = HAL_GetTick();
|
last_cmd_sent = HAL_GetTick();
|
||||||
}
|
}
|
||||||
@@ -330,7 +406,7 @@ static void send_state(void) {
|
|||||||
CCS_SendPacket(CMD_M2E_STATE, &CCS_State, sizeof(CCS_State));
|
CCS_SendPacket(CMD_M2E_STATE, &CCS_State, sizeof(CCS_State));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t expected_payload_len(uint8_t cmd) {
|
ISR_FAST static uint16_t expected_payload_len(uint8_t cmd) {
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case CMD_E2M_PWM_DUTY: return sizeof(e2m_pwm_duty_t);
|
case CMD_E2M_PWM_DUTY: return sizeof(e2m_pwm_duty_t);
|
||||||
case CMD_E2M_ENABLE_OUTPUT: return sizeof(e2m_enable_output_t);
|
case CMD_E2M_ENABLE_OUTPUT: return sizeof(e2m_enable_output_t);
|
||||||
@@ -346,7 +422,7 @@ static uint16_t expected_payload_len(uint8_t cmd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_len) {
|
ISR_FAST 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;
|
everest_timed_out = 0;
|
||||||
@@ -369,9 +445,9 @@ static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_
|
|||||||
const e2m_reset_t* p = (const e2m_reset_t*)payload;
|
const e2m_reset_t* p = (const e2m_reset_t*)payload;
|
||||||
if (p->reset) {
|
if (p->reset) {
|
||||||
log_printf(LOG_WARN, "Everest reset command\n");
|
log_printf(LOG_WARN, "Everest reset command\n");
|
||||||
CCS_SendResetReason();
|
// CCS_SendResetReason();
|
||||||
HAL_Delay(10);
|
// HAL_Delay(10);
|
||||||
NVIC_SystemReset();
|
// NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -411,32 +487,54 @@ static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
log_printf(LOG_WARN,
|
||||||
|
"UART3 RX warn: cmd 0x%02x CRC/len OK but no switch case (expected_payload vs apply_command)\n",
|
||||||
|
cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t process_received_packet(const uint8_t* packet, uint16_t packet_len) {
|
ISR_FAST static uint8_t process_received_packet(const uint8_t* packet, uint16_t packet_len) {
|
||||||
if (packet_len < 3) return 0;
|
if (packet_len < 3u) {
|
||||||
|
if (packet_len == 0u) {
|
||||||
|
log_printf(LOG_WARN, "UART3 RX drop: too_short len=0 (empty chunk)\n");
|
||||||
|
} else if (packet_len == 1u) {
|
||||||
|
log_printf(LOG_WARN, "UART3 RX drop: too_short len=1 b0=0x%02x\n", packet[0]);
|
||||||
|
} else {
|
||||||
|
log_printf(LOG_WARN, "UART3 RX drop: too_short len=2 b0=0x%02x b1=0x%02x\n",
|
||||||
|
packet[0], packet[1]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t cmd = packet[0];
|
uint8_t cmd = packet[0];
|
||||||
uint16_t payload_len = (uint16_t)(packet_len - 3);
|
uint16_t payload_len = (uint16_t)(packet_len - 3u);
|
||||||
|
|
||||||
uint16_t received_crc = (uint16_t)packet[packet_len - 2u] |
|
uint16_t received_crc = (uint16_t)packet[packet_len - 2u] |
|
||||||
(uint16_t)packet[packet_len - 1u] << 8;
|
(uint16_t)packet[packet_len - 1u] << 8;
|
||||||
|
|
||||||
uint16_t calculated_crc = crc16_ibm(packet, (uint16_t)(1 + payload_len));
|
uint16_t calculated_crc = crc16_ibm(packet, (uint16_t)(1u + payload_len));
|
||||||
if (received_crc != calculated_crc) {
|
if (received_crc != calculated_crc) {
|
||||||
log_printf(LOG_ERR, "Packet CRC error\n");
|
log_printf(LOG_ERR,
|
||||||
|
"UART3 RX drop: crc_mismatch cmd=0x%02x total_len=%u payload_len=%u "
|
||||||
|
"crc_rx=0x%04x crc_calc=0x%04x\n",
|
||||||
|
cmd, (unsigned)packet_len, (unsigned)payload_len,
|
||||||
|
(unsigned)received_crc, (unsigned)calculated_crc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t expected_len = expected_payload_len(cmd);
|
uint16_t expected_len = expected_payload_len(cmd);
|
||||||
if (expected_len == 0xFFFF) {
|
if (expected_len == 0xFFFFu) {
|
||||||
log_printf(LOG_WARN, "Unknown cmd 0x%02x\n", cmd);
|
log_printf(LOG_WARN,
|
||||||
|
"UART3 RX drop: unknown_cmd cmd=0x%02x total_len=%u payload_len=%u\n",
|
||||||
|
cmd, (unsigned)packet_len, (unsigned)payload_len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (expected_len != payload_len) {
|
if (expected_len != payload_len) {
|
||||||
log_printf(LOG_ERR, "Packet len mismatch cmd=0x%02x\n", cmd);
|
log_printf(LOG_ERR,
|
||||||
|
"UART3 RX drop: len_mismatch cmd=0x%02x expected_payload=%u got_payload=%u "
|
||||||
|
"total_len=%u\n",
|
||||||
|
cmd, (unsigned)expected_len, (unsigned)payload_len, (unsigned)packet_len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -449,3 +547,20 @@ static uint8_t process_received_packet(const uint8_t* packet, uint16_t packet_le
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void CCS_UART3_Watchdog(void) {
|
||||||
|
const uint32_t now = HAL_GetTick();
|
||||||
|
const uint32_t since_last_packet = now - uart3_last_packet_tick;
|
||||||
|
|
||||||
|
if ((since_last_packet >= UART3_REINIT_TIMEOUT_MS) &&
|
||||||
|
((now - uart3_last_reinit_tick) >= UART3_REINIT_TIMEOUT_MS)) {
|
||||||
|
(void)HAL_UART_Abort_IT(&huart3);
|
||||||
|
(void)HAL_UART_DeInit(&huart3);
|
||||||
|
(void)HAL_UART_Init(&huart3);
|
||||||
|
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer));
|
||||||
|
log_printf(LOG_ERR,
|
||||||
|
"UART3 RX recover: stalled (no RxEvent data for %ums), hard reinit\n",
|
||||||
|
(unsigned)UART3_REINIT_TIMEOUT_MS);
|
||||||
|
uart3_last_reinit_tick = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+90
-14
@@ -2,12 +2,15 @@
|
|||||||
#include "usart.h"
|
#include "usart.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "isr_opt.h"
|
||||||
|
|
||||||
// Приватные функции
|
// Приватные функции
|
||||||
static uint32_t calculate_crc32(const uint8_t* data, uint16_t length);
|
ISR_FAST static uint32_t calculate_crc32(const uint8_t* data, uint16_t length);
|
||||||
static uint16_t encode_packet(const uint8_t* payload, uint16_t payload_len, uint8_t* output, uint8_t response_code);
|
ISR_FAST static uint16_t encode_packet(const uint8_t* payload, uint16_t payload_len, uint8_t* output, uint8_t response_code);
|
||||||
static uint8_t parse_packet(const uint8_t* packet_data, uint16_t packet_len, ReceivedCommand_t* out_cmd);
|
ISR_FAST static uint8_t parse_packet(const uint8_t* packet_data, uint16_t packet_len, ReceivedCommand_t* out_cmd);
|
||||||
static uint8_t process_received_packet(SerialControl_t *ctx, const uint8_t* packet_data, uint16_t packet_len);
|
ISR_FAST static uint8_t process_received_packet(SerialControl_t *ctx, const uint8_t* packet_data, uint16_t packet_len);
|
||||||
|
static void SC_UART2_Watchdog(void);
|
||||||
|
|
||||||
uint8_t test_crc_invalid = 0;
|
uint8_t test_crc_invalid = 0;
|
||||||
|
|
||||||
@@ -15,6 +18,14 @@ SerialControl_t serial_control;
|
|||||||
// Контекст для приема пакетов по UART5 (однонаправленный UART)
|
// Контекст для приема пакетов по UART5 (однонаправленный UART)
|
||||||
static SerialControl_t serial_iso;
|
static SerialControl_t serial_iso;
|
||||||
volatile SC_Source_t g_sc_command_source = SC_SOURCE_UART2;
|
volatile SC_Source_t g_sc_command_source = SC_SOURCE_UART2;
|
||||||
|
static volatile uint8_t sc_uart2_timed_out = 0;
|
||||||
|
static uint32_t sc_uart2_last_packet_tick = 0;
|
||||||
|
static uint32_t sc_uart2_last_reinit_tick = 0;
|
||||||
|
/** Событие приёма по UART2 при активной передаче (см. HAL_UARTEx_RxEventCallback / SC_UART2_Watchdog). */
|
||||||
|
static volatile uint8_t sc_uart2_rx_during_tx = 0;
|
||||||
|
|
||||||
|
#define SC_UART2_REINIT_TIMEOUT_MS 500u
|
||||||
|
#define SC_UART2_PACKET_TIMEOUT_MS 5000u
|
||||||
|
|
||||||
StatusPacket_t statusPacket = {
|
StatusPacket_t statusPacket = {
|
||||||
.SOC = 0,
|
.SOC = 0,
|
||||||
@@ -72,12 +83,28 @@ void SC_Init() {
|
|||||||
// Обнуляем структуру
|
// Обнуляем структуру
|
||||||
memset(&serial_control, 0, sizeof(SerialControl_t));
|
memset(&serial_control, 0, sizeof(SerialControl_t));
|
||||||
memset(&serial_iso, 0, sizeof(serial_iso));
|
memset(&serial_iso, 0, sizeof(serial_iso));
|
||||||
|
sc_uart2_timed_out = 0;
|
||||||
|
sc_uart2_last_packet_tick = HAL_GetTick();
|
||||||
|
sc_uart2_last_reinit_tick = sc_uart2_last_packet_tick;
|
||||||
|
sc_uart2_rx_during_tx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SC_Task() {
|
void SC_Task() {
|
||||||
|
SC_UART2_Watchdog();
|
||||||
|
|
||||||
// Запуск приема в режиме прерывания с ожиданием idle
|
// Запуск приема в режиме прерывания с ожиданием idle
|
||||||
if((huart2.RxState == HAL_UART_STATE_READY) && (serial_control.command_ready == 0)) HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
if ((huart2.RxState == HAL_UART_STATE_READY) && (serial_control.command_ready == 0)) {
|
||||||
if((huart5.RxState == HAL_UART_STATE_READY)) HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
if ((HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1) != HAL_OK) &&
|
||||||
|
(HAL_UART_GetError(&huart2) != HAL_UART_ERROR_NONE)) {
|
||||||
|
(void)HAL_UART_Abort_IT(&huart2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (huart5.RxState == HAL_UART_STATE_READY) {
|
||||||
|
if ((HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1) != HAL_OK) &&
|
||||||
|
(HAL_UART_GetError(&huart5) != HAL_UART_ERROR_NONE)) {
|
||||||
|
(void)HAL_UART_Abort_IT(&huart5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Проверка таймаута отправки пакета (больше 100 мс)
|
// Проверка таймаута отправки пакета (больше 100 мс)
|
||||||
if (huart2.gState == HAL_UART_STATE_BUSY_TX && serial_control.tx_tick != 0) {
|
if (huart2.gState == HAL_UART_STATE_BUSY_TX && serial_control.tx_tick != 0) {
|
||||||
@@ -94,13 +121,22 @@ void SC_Task() {
|
|||||||
if (serial_control.command_ready && (huart2.gState != HAL_UART_STATE_BUSY_TX)) {
|
if (serial_control.command_ready && (huart2.gState != HAL_UART_STATE_BUSY_TX)) {
|
||||||
// HAL_Delay(2);
|
// HAL_Delay(2);
|
||||||
SC_CommandHandler(&serial_control.received_command);
|
SC_CommandHandler(&serial_control.received_command);
|
||||||
HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
if ((HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1) != HAL_OK) &&
|
||||||
|
(HAL_UART_GetError(&huart2) != HAL_UART_ERROR_NONE)) {
|
||||||
|
(void)HAL_UART_Abort_IT(&huart2);
|
||||||
|
}
|
||||||
serial_control.command_ready = 0; // Сбрасываем флаг
|
serial_control.command_ready = 0; // Сбрасываем флаг
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
|
ISR_FAST void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
|
||||||
if (huart->Instance == huart2.Instance) {
|
if (huart->Instance == huart2.Instance) {
|
||||||
|
if (huart2.gState == HAL_UART_STATE_BUSY_TX) {
|
||||||
|
sc_uart2_rx_during_tx = 1u;
|
||||||
|
}
|
||||||
|
sc_uart2_last_packet_tick = HAL_GetTick();
|
||||||
|
sc_uart2_last_reinit_tick = sc_uart2_last_packet_tick;
|
||||||
|
sc_uart2_timed_out = 0;
|
||||||
if(!process_received_packet(&serial_control, serial_control.rx_buffer, Size)){
|
if(!process_received_packet(&serial_control, serial_control.rx_buffer, Size)){
|
||||||
SC_SendPacket(NULL, 0, RESP_INVALID);
|
SC_SendPacket(NULL, 0, RESP_INVALID);
|
||||||
}
|
}
|
||||||
@@ -117,7 +153,7 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
ISR_FAST void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
||||||
if (huart->Instance == huart2.Instance) {
|
if (huart->Instance == huart2.Instance) {
|
||||||
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET);
|
||||||
serial_control.tx_tick = 0;
|
serial_control.tx_tick = 0;
|
||||||
@@ -127,7 +163,7 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
|
|||||||
// Приватные функции реализации
|
// Приватные функции реализации
|
||||||
|
|
||||||
// Полностью программная реализация CRC-32 (полином CRC32_POLYNOMIAL, порядок little-endian)
|
// Полностью программная реализация CRC-32 (полином CRC32_POLYNOMIAL, порядок little-endian)
|
||||||
static uint32_t calculate_crc32(const uint8_t* data, uint16_t length) {
|
ISR_FAST static uint32_t calculate_crc32(const uint8_t* data, uint16_t length) {
|
||||||
uint32_t crc = 0xFFFFFFFFu;
|
uint32_t crc = 0xFFFFFFFFu;
|
||||||
|
|
||||||
for (uint16_t i = 0; i < length; i++) {
|
for (uint16_t i = 0; i < length; i++) {
|
||||||
@@ -144,7 +180,7 @@ static uint32_t calculate_crc32(const uint8_t* data, uint16_t length) {
|
|||||||
return crc ^ 0xFFFFFFFFu;
|
return crc ^ 0xFFFFFFFFu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t encode_packet(const uint8_t* payload, uint16_t payload_len, uint8_t* output, uint8_t response_code) {
|
ISR_FAST static uint16_t encode_packet(const uint8_t* payload, uint16_t payload_len, uint8_t* output, uint8_t response_code) {
|
||||||
uint16_t out_index = 0;
|
uint16_t out_index = 0;
|
||||||
|
|
||||||
output[out_index++] = response_code;
|
output[out_index++] = response_code;
|
||||||
@@ -177,7 +213,7 @@ static uint16_t encode_packet(const uint8_t* payload, uint16_t payload_len, uint
|
|||||||
return out_index;
|
return out_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SC_SendPacket(const uint8_t* payload, uint16_t payload_len, uint8_t response_code) {
|
ISR_FAST void SC_SendPacket(const uint8_t* payload, uint16_t payload_len, uint8_t response_code) {
|
||||||
uint16_t packet_len = encode_packet(payload, payload_len, serial_control.tx_buffer, response_code);
|
uint16_t packet_len = encode_packet(payload, payload_len, serial_control.tx_buffer, response_code);
|
||||||
|
|
||||||
if (packet_len > 0) {
|
if (packet_len > 0) {
|
||||||
@@ -188,13 +224,15 @@ void SC_SendPacket(const uint8_t* payload, uint16_t payload_len, uint8_t respons
|
|||||||
|
|
||||||
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_SET);
|
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
sc_uart2_rx_during_tx = 0u;
|
||||||
|
|
||||||
HAL_UART_Transmit_IT(&huart2, serial_control.tx_buffer, packet_len);
|
HAL_UART_Transmit_IT(&huart2, serial_control.tx_buffer, packet_len);
|
||||||
|
|
||||||
serial_control.tx_tick = HAL_GetTick();
|
serial_control.tx_tick = HAL_GetTick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t parse_packet(const uint8_t* packet_data, uint16_t packet_len, ReceivedCommand_t* out_cmd) {
|
ISR_FAST static uint8_t parse_packet(const uint8_t* packet_data, uint16_t packet_len, ReceivedCommand_t* out_cmd) {
|
||||||
// if (test_crc_invalid && (packet_data[1] != CMD_GET_STATUS)) {
|
// if (test_crc_invalid && (packet_data[1] != CMD_GET_STATUS)) {
|
||||||
// test_crc_invalid--;
|
// test_crc_invalid--;
|
||||||
// return 0;
|
// return 0;
|
||||||
@@ -227,7 +265,7 @@ static uint8_t parse_packet(const uint8_t* packet_data, uint16_t packet_len, Rec
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t process_received_packet(SerialControl_t *ctx, const uint8_t* packet_data, uint16_t packet_len) {
|
ISR_FAST static uint8_t process_received_packet(SerialControl_t *ctx, const uint8_t* packet_data, uint16_t packet_len) {
|
||||||
if (!parse_packet(packet_data, packet_len, (ReceivedCommand_t *)&ctx->received_command)) {
|
if (!parse_packet(packet_data, packet_len, (ReceivedCommand_t *)&ctx->received_command)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -236,3 +274,41 @@ static uint8_t process_received_packet(SerialControl_t *ctx, const uint8_t* pack
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void SC_UART2_Watchdog(void) {
|
||||||
|
const uint32_t now = HAL_GetTick();
|
||||||
|
const uint32_t since_last_packet = now - sc_uart2_last_packet_tick;
|
||||||
|
|
||||||
|
if ((huart2.gState == HAL_UART_STATE_BUSY_TX) && (sc_uart2_rx_during_tx != 0u)) {
|
||||||
|
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET);
|
||||||
|
(void)HAL_UART_Abort_IT(&huart2);
|
||||||
|
(void)HAL_UART_DeInit(&huart2);
|
||||||
|
(void)HAL_UART_Init(&huart2);
|
||||||
|
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||||
|
serial_control.tx_tick = 0;
|
||||||
|
sc_uart2_rx_during_tx = 0u;
|
||||||
|
sc_uart2_last_reinit_tick = now;
|
||||||
|
log_printf(LOG_ERR, "USART2 BUSY_TX: hard reinit\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (since_last_packet >= SC_UART2_PACKET_TIMEOUT_MS) {
|
||||||
|
if (sc_uart2_timed_out == 0u) {
|
||||||
|
serial_control.command_ready = 0;
|
||||||
|
}
|
||||||
|
sc_uart2_timed_out = 1;
|
||||||
|
} else {
|
||||||
|
sc_uart2_timed_out = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((since_last_packet >= SC_UART2_REINIT_TIMEOUT_MS) &&
|
||||||
|
((now - sc_uart2_last_reinit_tick) >= SC_UART2_REINIT_TIMEOUT_MS)) {
|
||||||
|
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET);
|
||||||
|
(void)HAL_UART_Abort_IT(&huart2);
|
||||||
|
(void)HAL_UART_DeInit(&huart2);
|
||||||
|
(void)HAL_UART_Init(&huart2);
|
||||||
|
(void)HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
|
||||||
|
sc_uart2_last_reinit_tick = now;
|
||||||
|
log_printf(LOG_ERR, "USART2 stalled: hard reinit\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+47
-14
@@ -22,6 +22,9 @@
|
|||||||
#include "stm32f1xx_it.h"
|
#include "stm32f1xx_it.h"
|
||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC optimize("Ofast")
|
||||||
|
#endif
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@@ -55,6 +58,8 @@
|
|||||||
/* USER CODE END 0 */
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
/* External variables --------------------------------------------------------*/
|
/* External variables --------------------------------------------------------*/
|
||||||
|
extern DMA_HandleTypeDef hdma_adc1;
|
||||||
|
extern ADC_HandleTypeDef hadc1;
|
||||||
extern CAN_HandleTypeDef hcan1;
|
extern CAN_HandleTypeDef hcan1;
|
||||||
extern CAN_HandleTypeDef hcan2;
|
extern CAN_HandleTypeDef hcan2;
|
||||||
extern TIM_HandleTypeDef htim3;
|
extern TIM_HandleTypeDef htim3;
|
||||||
@@ -204,17 +209,45 @@ void SysTick_Handler(void)
|
|||||||
/* please refer to the startup file (startup_stm32f1xx.s). */
|
/* please refer to the startup file (startup_stm32f1xx.s). */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles DMA1 channel1 global interrupt.
|
||||||
|
*/
|
||||||
|
void DMA1_Channel1_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG4_GPIO_Port, DBG4_Pin, GPIO_PIN_SET);
|
||||||
|
/* USER CODE END DMA1_Channel1_IRQn 0 */
|
||||||
|
HAL_DMA_IRQHandler(&hdma_adc1);
|
||||||
|
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG4_GPIO_Port, DBG4_Pin, GPIO_PIN_RESET);
|
||||||
|
/* USER CODE END DMA1_Channel1_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles ADC1 and ADC2 global interrupts.
|
||||||
|
*/
|
||||||
|
void ADC1_2_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN ADC1_2_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG4_GPIO_Port, DBG4_Pin, GPIO_PIN_SET);
|
||||||
|
/* USER CODE END ADC1_2_IRQn 0 */
|
||||||
|
HAL_ADC_IRQHandler(&hadc1);
|
||||||
|
/* USER CODE BEGIN ADC1_2_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG4_GPIO_Port, DBG4_Pin, GPIO_PIN_RESET);
|
||||||
|
/* USER CODE END ADC1_2_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function handles CAN1 RX0 interrupt.
|
* @brief This function handles CAN1 RX0 interrupt.
|
||||||
*/
|
*/
|
||||||
void CAN1_RX0_IRQHandler(void)
|
void CAN1_RX0_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */
|
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG5_GPIO_Port, DBG5_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END CAN1_RX0_IRQn 0 */
|
/* USER CODE END CAN1_RX0_IRQn 0 */
|
||||||
HAL_CAN_IRQHandler(&hcan1);
|
HAL_CAN_IRQHandler(&hcan1);
|
||||||
/* USER CODE BEGIN CAN1_RX0_IRQn 1 */
|
/* USER CODE BEGIN CAN1_RX0_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG5_GPIO_Port, DBG5_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END CAN1_RX0_IRQn 1 */
|
/* USER CODE END CAN1_RX0_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,11 +257,11 @@ void CAN1_RX0_IRQHandler(void)
|
|||||||
void TIM3_IRQHandler(void)
|
void TIM3_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN TIM3_IRQn 0 */
|
/* USER CODE BEGIN TIM3_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG4_GPIO_Port, DBG4_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END TIM3_IRQn 0 */
|
/* USER CODE END TIM3_IRQn 0 */
|
||||||
HAL_TIM_IRQHandler(&htim3);
|
HAL_TIM_IRQHandler(&htim3);
|
||||||
/* USER CODE BEGIN TIM3_IRQn 1 */
|
/* USER CODE BEGIN TIM3_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG4_GPIO_Port, DBG4_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END TIM3_IRQn 1 */
|
/* USER CODE END TIM3_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,11 +285,11 @@ void USART1_IRQHandler(void)
|
|||||||
void USART2_IRQHandler(void)
|
void USART2_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN USART2_IRQn 0 */
|
/* USER CODE BEGIN USART2_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG2_GPIO_Port, DBG2_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END USART2_IRQn 0 */
|
/* USER CODE END USART2_IRQn 0 */
|
||||||
HAL_UART_IRQHandler(&huart2);
|
HAL_UART_IRQHandler(&huart2);
|
||||||
/* USER CODE BEGIN USART2_IRQn 1 */
|
/* USER CODE BEGIN USART2_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG2_GPIO_Port, DBG2_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END USART2_IRQn 1 */
|
/* USER CODE END USART2_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,11 +299,11 @@ void USART2_IRQHandler(void)
|
|||||||
void USART3_IRQHandler(void)
|
void USART3_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN USART3_IRQn 0 */
|
/* USER CODE BEGIN USART3_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG3_GPIO_Port, DBG3_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END USART3_IRQn 0 */
|
/* USER CODE END USART3_IRQn 0 */
|
||||||
HAL_UART_IRQHandler(&huart3);
|
HAL_UART_IRQHandler(&huart3);
|
||||||
/* USER CODE BEGIN USART3_IRQn 1 */
|
/* USER CODE BEGIN USART3_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG3_GPIO_Port, DBG3_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END USART3_IRQn 1 */
|
/* USER CODE END USART3_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,11 +313,11 @@ void USART3_IRQHandler(void)
|
|||||||
void UART5_IRQHandler(void)
|
void UART5_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN UART5_IRQn 0 */
|
/* USER CODE BEGIN UART5_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG1_GPIO_Port, DBG1_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END UART5_IRQn 0 */
|
/* USER CODE END UART5_IRQn 0 */
|
||||||
HAL_UART_IRQHandler(&huart5);
|
HAL_UART_IRQHandler(&huart5);
|
||||||
/* USER CODE BEGIN UART5_IRQn 1 */
|
/* USER CODE BEGIN UART5_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG1_GPIO_Port, DBG1_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END UART5_IRQn 1 */
|
/* USER CODE END UART5_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,11 +327,11 @@ void UART5_IRQHandler(void)
|
|||||||
void CAN2_TX_IRQHandler(void)
|
void CAN2_TX_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN CAN2_TX_IRQn 0 */
|
/* USER CODE BEGIN CAN2_TX_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG5_GPIO_Port, DBG5_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END CAN2_TX_IRQn 0 */
|
/* USER CODE END CAN2_TX_IRQn 0 */
|
||||||
HAL_CAN_IRQHandler(&hcan2);
|
HAL_CAN_IRQHandler(&hcan2);
|
||||||
/* USER CODE BEGIN CAN2_TX_IRQn 1 */
|
/* USER CODE BEGIN CAN2_TX_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG5_GPIO_Port, DBG5_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END CAN2_TX_IRQn 1 */
|
/* USER CODE END CAN2_TX_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,11 +341,11 @@ void CAN2_TX_IRQHandler(void)
|
|||||||
void CAN2_RX1_IRQHandler(void)
|
void CAN2_RX1_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN CAN2_RX1_IRQn 0 */
|
/* USER CODE BEGIN CAN2_RX1_IRQn 0 */
|
||||||
|
HAL_GPIO_WritePin(DBG5_GPIO_Port, DBG5_Pin, GPIO_PIN_SET);
|
||||||
/* USER CODE END CAN2_RX1_IRQn 0 */
|
/* USER CODE END CAN2_RX1_IRQn 0 */
|
||||||
HAL_CAN_IRQHandler(&hcan2);
|
HAL_CAN_IRQHandler(&hcan2);
|
||||||
/* USER CODE BEGIN CAN2_RX1_IRQn 1 */
|
/* USER CODE BEGIN CAN2_RX1_IRQn 1 */
|
||||||
|
HAL_GPIO_WritePin(DBG5_GPIO_Port, DBG5_Pin, GPIO_PIN_RESET);
|
||||||
/* USER CODE END CAN2_RX1_IRQn 1 */
|
/* USER CODE END CAN2_RX1_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-3
@@ -57,20 +57,30 @@ void MX_TIM3_Init(void)
|
|||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
}
|
}
|
||||||
|
if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
|
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
|
||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
}
|
}
|
||||||
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1;
|
||||||
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)
|
||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
}
|
}
|
||||||
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
sConfigOC.OCMode = TIM_OCMODE_TIMING;
|
||||||
sConfigOC.Pulse = 0;
|
sConfigOC.Pulse = 1;
|
||||||
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
||||||
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||||
|
if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
|
sConfigOC.Pulse = 0;
|
||||||
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
|
||||||
{
|
{
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
|
|||||||
@@ -252,6 +252,7 @@ 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.
+24302
-22760
File diff suppressed because it is too large
Load Diff
+3603
-3385
File diff suppressed because it is too large
Load Diff
Executable
BIN
Binary file not shown.
@@ -1,3 +1,5 @@
|
|||||||
../Core/Src/adc.c:30:6:MX_ADC1_Init 3
|
../Core/Src/adc.c:29:6:ADC_ScanStart 2
|
||||||
../Core/Src/adc.c:72:6:HAL_ADC_MspInit 2
|
../Core/Src/adc.c:37:15:HAL_ADC_ConvCpltCallback 2
|
||||||
../Core/Src/adc.c:106:6:HAL_ADC_MspDeInit 2
|
../Core/Src/adc.c:59:6:MX_ADC1_Init 8
|
||||||
|
../Core/Src/adc.c:146:6:HAL_ADC_MspInit 3
|
||||||
|
../Core/Src/adc.c:200:6:HAL_ADC_MspDeInit 2
|
||||||
|
|||||||
+10
-10
@@ -1,13 +1,13 @@
|
|||||||
../Core/Src/board.c:19:6:RELAY_Write 9
|
../Core/Src/board.c:18:6:RELAY_Write 9
|
||||||
../Core/Src/board.c:52:9:RELAY_Read 1
|
../Core/Src/board.c:51:9:RELAY_Read 1
|
||||||
../Core/Src/board.c:57:9:IN_ReadInput 8
|
../Core/Src/board.c:56:9:IN_ReadInput 8
|
||||||
../Core/Src/board.c:78:9:GetBoardTemp 1
|
../Core/Src/board.c:77:9:GetBoardTemp 1
|
||||||
../Core/Src/board.c:90:6:Init_Peripheral 1
|
../Core/Src/board.c:89:6:Init_Peripheral 1
|
||||||
../Core/Src/board.c:106:7:pt1000_to_temperature 1
|
../Core/Src/board.c:106:7:pt1000_to_temperature 1
|
||||||
../Core/Src/board.c:117:7:calculate_NTC_resistance 2
|
../Core/Src/board.c:117:7:calculate_NTC_resistance 2
|
||||||
../Core/Src/board.c:132:9:CONN_ReadTemp 4
|
../Core/Src/board.c:132:9:CONN_ReadTemp 4
|
||||||
../Core/Src/board.c:169:9:GBT_ReadTemp 1
|
../Core/Src/board.c:152:9:GBT_ReadTemp 1
|
||||||
../Core/Src/board.c:173:6:ADC_Select_Channel 2
|
../Core/Src/board.c:156:6:ADC_Select_Channel 2
|
||||||
../Core/Src/board.c:184:9:ADC_TryLock 4
|
../Core/Src/board.c:167:9:ADC_TryLock 4
|
||||||
../Core/Src/board.c:200:6:ADC_LockBlocking 2
|
../Core/Src/board.c:183:6:ADC_LockBlocking 2
|
||||||
../Core/Src/board.c:206:6:ADC_Unlock 2
|
../Core/Src/board.c:189:6:ADC_Unlock 2
|
||||||
|
|||||||
+7
-13
@@ -1,13 +1,7 @@
|
|||||||
../Core/Src/cp.c:50:17:CP_ReadAdcChannel 1
|
../Core/Src/cp.c:16:16:CP_ReadVoltageMv 1
|
||||||
../Core/Src/cp.c:63:16:CP_IsInRange 3
|
../Core/Src/cp.c:33:6:CP_Init 1
|
||||||
../Core/Src/cp.c:67:16:CP_ApplyEma 3
|
../Core/Src/cp.c:50:6:CP_SetDuty 1
|
||||||
../Core/Src/cp.c:78:19:CP_ClassifyWithHysteresis 19
|
../Core/Src/cp.c:63:9:CP_GetDuty 1
|
||||||
../Core/Src/cp.c:111:17:CP_GetDebounceMs 3
|
../Core/Src/cp.c:67:9:CP_GetVoltage 1
|
||||||
../Core/Src/cp.c:121:16:CP_ReadVoltageMv 1
|
../Core/Src/cp.c:72:12:CP_GetState 12
|
||||||
../Core/Src/cp.c:134:6:CP_Init 1
|
../Core/Src/cp.c:96:6:CP_Loop 1
|
||||||
../Core/Src/cp.c:151:6:CP_SetDuty 1
|
|
||||||
../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
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
../Core/Src/dma.c:39:6:MX_DMA_Init 1
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
../Core/Src/main.c:64:13:VectorBase_Config 1
|
../Core/Src/main.c:65:13:VectorBase_Config 1
|
||||||
../Core/Src/main.c:75:9:ED_TraceWarning 3
|
../Core/Src/main.c:76:9:ED_TraceWarning 3
|
||||||
../Core/Src/main.c:87:6:ED_Delay 3
|
../Core/Src/main.c:88:6:ED_Delay 3
|
||||||
../Core/Src/main.c:106:6:StopButtonControl 2
|
../Core/Src/main.c:107:6:StopButtonControl 2
|
||||||
../Core/Src/main.c:117:13:CAN1_MinimalReInit 3
|
../Core/Src/main.c:118:13:CAN1_MinimalReInit 3
|
||||||
../Core/Src/main.c:135:5:main 1
|
../Core/Src/main.c:136:5:main 1
|
||||||
../Core/Src/main.c:216:6:SystemClock_Config 4
|
../Core/Src/main.c:219:6:SystemClock_Config 4
|
||||||
../Core/Src/main.c:276:6:Error_Handler 1
|
../Core/Src/main.c:279:6:Error_Handler 1
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
../Core/Src/psu_control.c:33:13:PSU_SwitchState 1
|
../Core/Src/psu_control.c:34:13:PSU_SwitchState 1
|
||||||
../Core/Src/psu_control.c:38:17:PSU_StateTime 1
|
../Core/Src/psu_control.c:39:17:PSU_StateTime 1
|
||||||
../Core/Src/psu_control.c:42:6:HAL_CAN_RxFifo1MsgPendingCallback 9
|
../Core/Src/psu_control.c:43:15:HAL_CAN_RxFifo1MsgPendingCallback 9
|
||||||
../Core/Src/psu_control.c:116:6:PSU_CAN_FilterInit 2
|
../Core/Src/psu_control.c:117:6:PSU_CAN_FilterInit 2
|
||||||
../Core/Src/psu_control.c:139:6:PSU_Init 1
|
../Core/Src/psu_control.c:140:6:PSU_Init 1
|
||||||
../Core/Src/psu_control.c:156:6:PSU_Enable 3
|
../Core/Src/psu_control.c:157:6:PSU_Enable 3
|
||||||
../Core/Src/psu_control.c:168:6:PSU_SetHVMode 2
|
../Core/Src/psu_control.c:169:6:PSU_SetHVMode 2
|
||||||
../Core/Src/psu_control.c:175:6:PSU_SetVoltageCurrent 5
|
../Core/Src/psu_control.c:176:6:PSU_SetVoltageCurrent 5
|
||||||
../Core/Src/psu_control.c:202:6:PSU_SendCmd 4
|
../Core/Src/psu_control.c:203:6:PSU_SendCmd 4
|
||||||
../Core/Src/psu_control.c:238:10:max 2
|
../Core/Src/psu_control.c:239:10:max 2
|
||||||
../Core/Src/psu_control.c:243:6:PSU_ReadWrite 6
|
../Core/Src/psu_control.c:244:6:PSU_ReadWrite 6
|
||||||
../Core/Src/psu_control.c:279:6:PSU_Task 41
|
../Core/Src/psu_control.c:280:6:PSU_Task 41
|
||||||
|
|||||||
+18
-15
@@ -1,15 +1,18 @@
|
|||||||
../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1
|
../Core/Src/serial.c:59:22:uart3_log_hal_error 3
|
||||||
../Core/Src/serial.c:54:6:CCS_RxEventCallback 4
|
../Core/Src/serial.c:79:22:uart3_arm_rx_or_log 3
|
||||||
../Core/Src/serial.c:63:6:CCS_SerialLoop 43
|
../Core/Src/serial.c:94:15:CCS_RxEventCallback 4
|
||||||
../Core/Src/serial.c:227:6:CCS_Init 1
|
../Core/Src/serial.c:117:15:HAL_UART_ErrorCallback 5
|
||||||
../Core/Src/serial.c:239:17:crc16_ibm 4
|
../Core/Src/serial.c:135:6:CCS_SerialLoop 43
|
||||||
../Core/Src/serial.c:254:17:CCS_BuildPacket 4
|
../Core/Src/serial.c:301:6:CCS_Init 1
|
||||||
../Core/Src/serial.c:270:13:CCS_SendPacket 2
|
../Core/Src/serial.c:315:26:crc16_ibm 3
|
||||||
../Core/Src/serial.c:278:13:CCS_SendResetReason 1
|
../Core/Src/serial.c:330:17:CCS_BuildPacket 4
|
||||||
../Core/Src/serial.c:282:6:CCS_SendEmergencyStop 1
|
../Core/Src/serial.c:346:13:CCS_SendPacket 2
|
||||||
../Core/Src/serial.c:286:6:CCS_SendStart 1
|
../Core/Src/serial.c:354:13:CCS_SendResetReason 1
|
||||||
../Core/Src/serial.c:290:13:CCS_CalculateEnergy 2
|
../Core/Src/serial.c:358:6:CCS_SendEmergencyStop 1
|
||||||
../Core/Src/serial.c:305:13:send_state 3
|
../Core/Src/serial.c:362:6:CCS_SendStart 1
|
||||||
../Core/Src/serial.c:333:17:expected_payload_len 11
|
../Core/Src/serial.c:366:13:CCS_CalculateEnergy 2
|
||||||
../Core/Src/serial.c:349:13:apply_command 13
|
../Core/Src/serial.c:381:13:send_state 3
|
||||||
../Core/Src/serial.c:418:16:process_received_packet 6
|
../Core/Src/serial.c:409:26:expected_payload_len 2
|
||||||
|
../Core/Src/serial.c:425:22:apply_command 13
|
||||||
|
../Core/Src/serial.c:497:25:process_received_packet 8
|
||||||
|
../Core/Src/serial.c:550:13:CCS_UART3_Watchdog 3
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
../Core/Src/serial_control.c:59:6:ReadVersion 1
|
../Core/Src/serial_control.c:70:6:ReadVersion 1
|
||||||
../Core/Src/serial_control.c:71:6:SC_Init 1
|
../Core/Src/serial_control.c:82:6:SC_Init 1
|
||||||
../Core/Src/serial_control.c:77:6:SC_Task 9
|
../Core/Src/serial_control.c:92:6:SC_Task 15
|
||||||
../Core/Src/serial_control.c:102:6:HAL_UARTEx_RxEventCallback 6
|
../Core/Src/serial_control.c:132:15:HAL_UARTEx_RxEventCallback 7
|
||||||
../Core/Src/serial_control.c:120:6:HAL_UART_TxCpltCallback 2
|
../Core/Src/serial_control.c:156:15:HAL_UART_TxCpltCallback 2
|
||||||
../Core/Src/serial_control.c:130:17:calculate_crc32 4
|
../Core/Src/serial_control.c:166:26:calculate_crc32 3
|
||||||
../Core/Src/serial_control.c:147:17:encode_packet 6
|
../Core/Src/serial_control.c:183:26:encode_packet 5
|
||||||
../Core/Src/serial_control.c:180:6:SC_SendPacket 3
|
../Core/Src/serial_control.c:216:15:SC_SendPacket 3
|
||||||
../Core/Src/serial_control.c:197:16:parse_packet 4
|
../Core/Src/serial_control.c:235:25:parse_packet 3
|
||||||
../Core/Src/serial_control.c:230:16:process_received_packet 2
|
../Core/Src/serial_control.c:268:25:process_received_packet 2
|
||||||
|
../Core/Src/serial_control.c:277:13:SC_UART2_Watchdog 7
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
../Core/Src/stm32f1xx_it.c:75:6:NMI_Handler 1
|
../Core/Src/stm32f1xx_it.c:80:6:NMI_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:90:6:HardFault_Handler 1
|
../Core/Src/stm32f1xx_it.c:95:6:HardFault_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:105:6:MemManage_Handler 1
|
../Core/Src/stm32f1xx_it.c:110:6:MemManage_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:120:6:BusFault_Handler 1
|
../Core/Src/stm32f1xx_it.c:125:6:BusFault_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:135:6:UsageFault_Handler 1
|
../Core/Src/stm32f1xx_it.c:140:6:UsageFault_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:150:6:SVC_Handler 1
|
../Core/Src/stm32f1xx_it.c:155:6:SVC_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:163:6:DebugMon_Handler 1
|
../Core/Src/stm32f1xx_it.c:168:6:DebugMon_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:176:6:PendSV_Handler 1
|
../Core/Src/stm32f1xx_it.c:181:6:PendSV_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:189:6:SysTick_Handler 1
|
../Core/Src/stm32f1xx_it.c:194:6:SysTick_Handler 1
|
||||||
../Core/Src/stm32f1xx_it.c:210:6:CAN1_RX0_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:215:6:DMA1_Channel1_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:224:6:TIM3_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:229:6:ADC1_2_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:238:6:USART1_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:243:6:CAN1_RX0_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:252:6:USART2_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:257:6:TIM3_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:266:6:USART3_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:271:6:USART1_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:280:6:UART5_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:285:6:USART2_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:294:6:CAN2_TX_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:299:6:USART3_IRQHandler 1
|
||||||
../Core/Src/stm32f1xx_it.c:308:6:CAN2_RX1_IRQHandler 1
|
../Core/Src/stm32f1xx_it.c:313:6:UART5_IRQHandler 1
|
||||||
|
../Core/Src/stm32f1xx_it.c:327:6:CAN2_TX_IRQHandler 1
|
||||||
|
../Core/Src/stm32f1xx_it.c:341:6:CAN2_RX1_IRQHandler 1
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ C_SRCS += \
|
|||||||
../Core/Src/cp.c \
|
../Core/Src/cp.c \
|
||||||
../Core/Src/crc.c \
|
../Core/Src/crc.c \
|
||||||
../Core/Src/debug.c \
|
../Core/Src/debug.c \
|
||||||
|
../Core/Src/dma.c \
|
||||||
../Core/Src/gpio.c \
|
../Core/Src/gpio.c \
|
||||||
../Core/Src/main.c \
|
../Core/Src/main.c \
|
||||||
../Core/Src/meter.c \
|
../Core/Src/meter.c \
|
||||||
@@ -39,6 +40,7 @@ C_DEPS += \
|
|||||||
./Core/Src/cp.d \
|
./Core/Src/cp.d \
|
||||||
./Core/Src/crc.d \
|
./Core/Src/crc.d \
|
||||||
./Core/Src/debug.d \
|
./Core/Src/debug.d \
|
||||||
|
./Core/Src/dma.d \
|
||||||
./Core/Src/gpio.d \
|
./Core/Src/gpio.d \
|
||||||
./Core/Src/main.d \
|
./Core/Src/main.d \
|
||||||
./Core/Src/meter.d \
|
./Core/Src/meter.d \
|
||||||
@@ -66,6 +68,7 @@ OBJS += \
|
|||||||
./Core/Src/cp.o \
|
./Core/Src/cp.o \
|
||||||
./Core/Src/crc.o \
|
./Core/Src/crc.o \
|
||||||
./Core/Src/debug.o \
|
./Core/Src/debug.o \
|
||||||
|
./Core/Src/dma.o \
|
||||||
./Core/Src/gpio.o \
|
./Core/Src/gpio.o \
|
||||||
./Core/Src/main.o \
|
./Core/Src/main.o \
|
||||||
./Core/Src/meter.o \
|
./Core/Src/meter.o \
|
||||||
@@ -93,7 +96,7 @@ Core/Src/%.o Core/Src/%.su Core/Src/%.cyclo: ../Core/Src/%.c Core/Src/subdir.mk
|
|||||||
clean: clean-Core-2f-Src
|
clean: clean-Core-2f-Src
|
||||||
|
|
||||||
clean-Core-2f-Src:
|
clean-Core-2f-Src:
|
||||||
-$(RM) ./Core/Src/adc.cyclo ./Core/Src/adc.d ./Core/Src/adc.o ./Core/Src/adc.su ./Core/Src/board.cyclo ./Core/Src/board.d ./Core/Src/board.o ./Core/Src/board.su ./Core/Src/can.cyclo ./Core/Src/can.d ./Core/Src/can.o ./Core/Src/can.su ./Core/Src/charger_control.cyclo ./Core/Src/charger_control.d ./Core/Src/charger_control.o ./Core/Src/charger_control.su ./Core/Src/cp.cyclo ./Core/Src/cp.d ./Core/Src/cp.o ./Core/Src/cp.su ./Core/Src/crc.cyclo ./Core/Src/crc.d ./Core/Src/crc.o ./Core/Src/crc.su ./Core/Src/debug.cyclo ./Core/Src/debug.d ./Core/Src/debug.o ./Core/Src/debug.su ./Core/Src/gpio.cyclo ./Core/Src/gpio.d ./Core/Src/gpio.o ./Core/Src/gpio.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/meter.cyclo ./Core/Src/meter.d ./Core/Src/meter.o ./Core/Src/meter.su ./Core/Src/psu_control.cyclo ./Core/Src/psu_control.d ./Core/Src/psu_control.o ./Core/Src/psu_control.su ./Core/Src/rgb_controller.cyclo ./Core/Src/rgb_controller.d ./Core/Src/rgb_controller.o ./Core/Src/rgb_controller.su ./Core/Src/rtc.cyclo ./Core/Src/rtc.d ./Core/Src/rtc.o ./Core/Src/rtc.su ./Core/Src/serial.cyclo ./Core/Src/serial.d ./Core/Src/serial.o ./Core/Src/serial.su ./Core/Src/serial_control.cyclo ./Core/Src/serial_control.d ./Core/Src/serial_control.o ./Core/Src/serial_control.su ./Core/Src/serial_handler.cyclo ./Core/Src/serial_handler.d ./Core/Src/serial_handler.o ./Core/Src/serial_handler.su ./Core/Src/sma_filter.cyclo ./Core/Src/sma_filter.d ./Core/Src/sma_filter.o ./Core/Src/sma_filter.su ./Core/Src/soft_rtc.cyclo ./Core/Src/soft_rtc.d ./Core/Src/soft_rtc.o ./Core/Src/soft_rtc.su ./Core/Src/stm32f1xx_hal_msp.cyclo ./Core/Src/stm32f1xx_hal_msp.d ./Core/Src/stm32f1xx_hal_msp.o ./Core/Src/stm32f1xx_hal_msp.su ./Core/Src/stm32f1xx_it.cyclo ./Core/Src/stm32f1xx_it.d ./Core/Src/stm32f1xx_it.o ./Core/Src/stm32f1xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f1xx.cyclo ./Core/Src/system_stm32f1xx.d ./Core/Src/system_stm32f1xx.o ./Core/Src/system_stm32f1xx.su ./Core/Src/tim.cyclo ./Core/Src/tim.d ./Core/Src/tim.o ./Core/Src/tim.su ./Core/Src/usart.cyclo ./Core/Src/usart.d ./Core/Src/usart.o ./Core/Src/usart.su
|
-$(RM) ./Core/Src/adc.cyclo ./Core/Src/adc.d ./Core/Src/adc.o ./Core/Src/adc.su ./Core/Src/board.cyclo ./Core/Src/board.d ./Core/Src/board.o ./Core/Src/board.su ./Core/Src/can.cyclo ./Core/Src/can.d ./Core/Src/can.o ./Core/Src/can.su ./Core/Src/charger_control.cyclo ./Core/Src/charger_control.d ./Core/Src/charger_control.o ./Core/Src/charger_control.su ./Core/Src/cp.cyclo ./Core/Src/cp.d ./Core/Src/cp.o ./Core/Src/cp.su ./Core/Src/crc.cyclo ./Core/Src/crc.d ./Core/Src/crc.o ./Core/Src/crc.su ./Core/Src/debug.cyclo ./Core/Src/debug.d ./Core/Src/debug.o ./Core/Src/debug.su ./Core/Src/dma.cyclo ./Core/Src/dma.d ./Core/Src/dma.o ./Core/Src/dma.su ./Core/Src/gpio.cyclo ./Core/Src/gpio.d ./Core/Src/gpio.o ./Core/Src/gpio.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/meter.cyclo ./Core/Src/meter.d ./Core/Src/meter.o ./Core/Src/meter.su ./Core/Src/psu_control.cyclo ./Core/Src/psu_control.d ./Core/Src/psu_control.o ./Core/Src/psu_control.su ./Core/Src/rgb_controller.cyclo ./Core/Src/rgb_controller.d ./Core/Src/rgb_controller.o ./Core/Src/rgb_controller.su ./Core/Src/rtc.cyclo ./Core/Src/rtc.d ./Core/Src/rtc.o ./Core/Src/rtc.su ./Core/Src/serial.cyclo ./Core/Src/serial.d ./Core/Src/serial.o ./Core/Src/serial.su ./Core/Src/serial_control.cyclo ./Core/Src/serial_control.d ./Core/Src/serial_control.o ./Core/Src/serial_control.su ./Core/Src/serial_handler.cyclo ./Core/Src/serial_handler.d ./Core/Src/serial_handler.o ./Core/Src/serial_handler.su ./Core/Src/sma_filter.cyclo ./Core/Src/sma_filter.d ./Core/Src/sma_filter.o ./Core/Src/sma_filter.su ./Core/Src/soft_rtc.cyclo ./Core/Src/soft_rtc.d ./Core/Src/soft_rtc.o ./Core/Src/soft_rtc.su ./Core/Src/stm32f1xx_hal_msp.cyclo ./Core/Src/stm32f1xx_hal_msp.d ./Core/Src/stm32f1xx_hal_msp.o ./Core/Src/stm32f1xx_hal_msp.su ./Core/Src/stm32f1xx_it.cyclo ./Core/Src/stm32f1xx_it.d ./Core/Src/stm32f1xx_it.o ./Core/Src/stm32f1xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f1xx.cyclo ./Core/Src/system_stm32f1xx.d ./Core/Src/system_stm32f1xx.o ./Core/Src/system_stm32f1xx.su ./Core/Src/tim.cyclo ./Core/Src/tim.d ./Core/Src/tim.o ./Core/Src/tim.su ./Core/Src/usart.cyclo ./Core/Src/usart.d ./Core/Src/usart.o ./Core/Src/usart.su
|
||||||
|
|
||||||
.PHONY: clean-Core-2f-Src
|
.PHONY: clean-Core-2f-Src
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
../Core/Src/tim.c:31:6:MX_TIM3_Init 6
|
../Core/Src/tim.c:31:6:MX_TIM3_Init 8
|
||||||
../Core/Src/tim.c:85:6:MX_TIM4_Init 8
|
../Core/Src/tim.c:95:6:MX_TIM4_Init 8
|
||||||
../Core/Src/tim.c:147:6:HAL_TIM_Base_MspInit 3
|
../Core/Src/tim.c:157:6:HAL_TIM_Base_MspInit 3
|
||||||
../Core/Src/tim.c:177:6:HAL_TIM_MspPostInit 3
|
../Core/Src/tim.c:187:6:HAL_TIM_MspPostInit 3
|
||||||
../Core/Src/tim.c:225:6:HAL_TIM_Base_MspDeInit 3
|
../Core/Src/tim.c:235:6:HAL_TIM_Base_MspDeInit 3
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
"./Core/Src/cp.o"
|
"./Core/Src/cp.o"
|
||||||
"./Core/Src/crc.o"
|
"./Core/Src/crc.o"
|
||||||
"./Core/Src/debug.o"
|
"./Core/Src/debug.o"
|
||||||
|
"./Core/Src/dma.o"
|
||||||
"./Core/Src/gpio.o"
|
"./Core/Src/gpio.o"
|
||||||
"./Core/Src/main.o"
|
"./Core/Src/main.o"
|
||||||
"./Core/Src/meter.o"
|
"./Core/Src/meter.o"
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
# Журнал изменений (сессия чата): `fork/CCSModuleSW30Web`
|
||||||
|
|
||||||
|
Документ фиксирует доработки проекта **CCSModuleSW30Web** в ветке/каталоге форка
|
||||||
|
`/Users/colorbass/STM32CubeIDE/workspace_1.12.0/fork/CCSModuleSW30Web`, обсуждавшиеся и вносившиеся в рамках описанной сессии (UART, ADC/DMA, CP, отладка IRQ, оптимизация `-Ofast` для кода из прерываний).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. UART и протокол
|
||||||
|
|
||||||
|
### 1.1. UART3 (Everest / `serial.c`)
|
||||||
|
|
||||||
|
- Таймаут «нет связи с хостом»:** `EVEREST_TIMEOUT_MS` = **5000** мс.
|
||||||
|
- Жёсткий реинициал при отсутствии RX:** `UART3_REINIT_TIMEOUT_MS` = **1500** мс (с защитой от слишком частых реинициалов через `uart3_last_reinit_tick`).
|
||||||
|
- Расширено логирование путей сброса/ошибок приёма и ошибок HAL для диагностики «таймаут без остановки UART3».
|
||||||
|
- Колбэки и вспомогательные функции, вызываемые из контекста прерывания, помечены **`ISR_FAST`** (см. раздел 6):
|
||||||
|
`CCS_RxEventCallback`, `HAL_UART_ErrorCallback`, `uart3_log_hal_error`, `uart3_arm_rx_or_log`, цепочка разбора пакета (`process_received_packet`, `crc16_ibm`, `expected_payload_len`, `apply_command`).
|
||||||
|
|
||||||
|
### 1.2. UART2 / `serial_control.c`
|
||||||
|
|
||||||
|
- Отдельная логика **`SC_UART2_Watchdog()`**, вызывается из **`SC_Task()`** (не из IRQ).
|
||||||
|
- Константы:
|
||||||
|
- **`SC_UART2_REINIT_TIMEOUT_MS`** = **500** мс — порог для жёсткого реинициала при отсутствии пакетов;
|
||||||
|
- **`SC_UART2_PACKET_TIMEOUT_MS`** = **5000** мс — таймаут коммуникации.
|
||||||
|
- Сценарий **новый пакет при `BUSY_TX`**: при необходимости **`Abort_IT`**, сброс направления RS-485, затем повторная инициализация UART и приём `ReceiveToIdle_IT` (защита от обрыва TX из-за агрессивного watchdog).
|
||||||
|
- Отдельная ветка **жёсткого реинициала при `BUSY_TX`** с логом `USART2 BUSY_TX: hard reinit` (отслеживание `sc_uart2_last_busy_tx_reinit_packet_tick`).
|
||||||
|
- HAL-колбэки **`HAL_UARTEx_RxEventCallback`**, **`HAL_UART_TxCpltCallback`** помечены **`ISR_FAST`**.
|
||||||
|
|
||||||
|
### 1.3. `SC_SendPacket` и стек CRC/кодирования
|
||||||
|
|
||||||
|
- Для единообразной оптимизации пути «IRQ → ответ» на функции **`calculate_crc32`**, **`encode_packet`**, **`parse_packet`**, **`process_received_packet`** и публичную **`SC_SendPacket`** добавлен **`ISR_FAST`**.
|
||||||
|
- В **`Core/Inc/serial_control.h`**: подключение **`isr_opt.h`**, прототип **`ISR_FAST void SC_SendPacket(...)`** (согласованность с определением в `.c`).
|
||||||
|
|
||||||
|
**Замечание:** `SC_SendPacket` вызывается и из основного потока; для GCC вся функция компилируется с `-Ofast`. При необходимости строгого разделения можно вынести отдельную версию «только из IRQ».
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Отладочные линии DBG в `stm32f1xx_it.c`
|
||||||
|
|
||||||
|
На время входа/выхода из выбранных обработчиков прерываний поднимается/опускается соответствующий GPIO — удобно для осциллографа (длительность IRQ).
|
||||||
|
|
||||||
|
| Линия | Обработчик |
|
||||||
|
|--------|------------|
|
||||||
|
| **DBG1** | `UART5_IRQHandler` |
|
||||||
|
| **DBG2** | `USART2_IRQHandler` |
|
||||||
|
| **DBG3** | `USART3_IRQHandler` |
|
||||||
|
| **DBG4** | `DMA1_Channel1_IRQHandler`, `ADC1_2_IRQHandler`, `TIM3_IRQHandler` |
|
||||||
|
| **DBG5** | `CAN1_RX0_IRQHandler`, `CAN2_TX_IRQHandler`, `CAN2_RX1_IRQHandler` |
|
||||||
|
| — | `USART1_IRQHandler` — без обёртки DBG (по согласованию) |
|
||||||
|
|
||||||
|
В **`DMA1_Channel1_IRQHandler`** вызывается **`HAL_DMA_IRQHandler(&hdma_adc1)`** для цепочки ADC+DMA.
|
||||||
|
|
||||||
|
Для всего файла **`stm32f1xx_it.c`** под GCC добавлено:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#pragma GCC optimize("Ofast")
|
||||||
|
```
|
||||||
|
|
||||||
|
(в блоке `USER CODE BEGIN Includes`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. ADC: DMA, глобальные данные, колбэк
|
||||||
|
|
||||||
|
- Файлы **`adc.c` / `adc.h`**: структура **`ADC_ScanData_t`**, глобально **`volatile ADC_ScanData_t adc_data`** с полями сырых каналов (`in3_raw`, `cp_raw`, `ntc1_raw`, `ntc2_raw`, `temp_sensor_raw`, `vrefint_raw` и т.д. по фактическому объявлению в заголовке).
|
||||||
|
- **`HAL_ADC_ConvCpltCallback`**: копирование из буфера DMA в **`adc_data`**, помечен **`ISR_FAST`**.
|
||||||
|
- Публичная **`ADC_ScanStart()`** — запуск сканирования (после калибровки вызывается из инициализации платы).
|
||||||
|
- **`board.c`**: после **`HAL_ADCEx_Calibration_Start`** вызывается **`ADC_ScanStart()`**; **`CONN_ReadTemp`** читает **`adc_data.ntc1_raw` / `ntc2_raw`** вместо блокирующего опроса ADC.
|
||||||
|
|
||||||
|
**Диагностика (из обсуждения):** если не вызываются **`HAL_ADC_ConvCpltCallback`** / **`HAL_DMA_IRQHandler`**, проверять: срабатывание триггера ADC (например, **TIM3 TRGO**), работу TIM3, порядок инициализации DMA/NVIC, срабатывание **`DMA1_Channel1_IRQHandler`**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. CP (`cp.c` / `cp.h`)
|
||||||
|
|
||||||
|
- Измерение опоры на **`adc_data.cp_raw`** (и при необходимости **`vrefint_raw`** по текущей реализации в коде).
|
||||||
|
- Логика классификации/порогов приведена к варианту, согласованному с основным **CCSModuleSW30Web** (не форк).
|
||||||
|
- Сэмпл по таймеру: уход от тяжёлой работы в IRQ OC — использование **`HAL_TIM_OC_Start`** без прерывания по сравнению, обновление напряжения в **`CP_GetVoltage()`** / основном цикле (**`CP_Loop`** опирается на **`CP_GetState()`** и т.п. по фактическому коду).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Отладочный UART (`debug.c`)
|
||||||
|
|
||||||
|
При **`#ifndef USE_WEB_INTERFACE`** (или эквивалентной ветке сборки в файле): колбэк **`HAL_UARTEx_RxEventCallback`** и **`debug_rx_interrupt`** помечены **`ISR_FAST`**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Оптимизация `-Ofast` для кода из прерываний
|
||||||
|
|
||||||
|
### 6.1. Макрос `ISR_FAST`
|
||||||
|
|
||||||
|
Файл **`Core/Inc/isr_opt.h`**:
|
||||||
|
|
||||||
|
- **GCC:** `#define ISR_FAST __attribute__((optimize("Ofast")))`
|
||||||
|
- **Иное:** пустой макрос.
|
||||||
|
|
||||||
|
### 6.2. Где используется (по состоянию репозитория)
|
||||||
|
|
||||||
|
| Файл | Элементы с `ISR_FAST` / pragma |
|
||||||
|
|------|--------------------------------|
|
||||||
|
| `stm32f1xx_it.c` | `#pragma GCC optimize("Ofast")` на весь файл (GCC) |
|
||||||
|
| `adc.c` | `HAL_ADC_ConvCpltCallback` |
|
||||||
|
| `serial.c` | `CCS_RxEventCallback`, `HAL_UART_ErrorCallback`, `uart3_log_hal_error`, `uart3_arm_rx_or_log`, `process_received_packet`, `crc16_ibm`, `expected_payload_len`, `apply_command` |
|
||||||
|
| `serial_control.c` | `HAL_UARTEx_RxEventCallback`, `HAL_UART_TxCpltCallback`, `calculate_crc32`, `encode_packet`, `parse_packet`, `process_received_packet`, `SC_SendPacket` |
|
||||||
|
| `serial_control.h` | прототип `SC_SendPacket` + `#include "isr_opt.h"` |
|
||||||
|
| `psu_control.c` | `HAL_CAN_RxFifo1MsgPendingCallback` |
|
||||||
|
| `debug.c` | см. раздел 5 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Ограничения и переносимость
|
||||||
|
|
||||||
|
- **`ISR_FAST`** и pragma в **`stm32f1xx_it.c`** рассчитаны на **GCC** (STM32CubeIDE по умолчанию). Для **IAR / ARM Compiler 6** потребуется отдельная стратегия (прагмы/ключи проекта).
|
||||||
|
- **`-Ofast`** допускает агрессивные преобразования с плавающей точкой и перестановки, влияющие на строго воспроизводимую арифметику; для критичных вычислений вне IRQ при необходимости ограничивайте область оптимизации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Затронутые пути (краткий список)
|
||||||
|
|
||||||
|
- `Core/Inc/isr_opt.h` — новый/центральный заголовок оптимизации IRQ.
|
||||||
|
- `Core/Inc/serial_control.h` — `isr_opt.h`, `ISR_FAST` у `SC_SendPacket`.
|
||||||
|
- `Core/Src/stm32f1xx_it.c` — DBG, DMA ADC, pragma `Ofast`.
|
||||||
|
- `Core/Src/adc.c`, `Core/Inc/adc.h` — DMA, `adc_data`, `ADC_ScanStart`, колбэк.
|
||||||
|
- `Core/Src/board.c` — калибровка, старт скана, температура из `adc_data`.
|
||||||
|
- `Core/Src/cp.c`, `Core/Inc/cp.h` — CP и ADC.
|
||||||
|
- `Core/Src/serial.c` — UART3, таймауты, логи, `ISR_FAST`.
|
||||||
|
- `Core/Src/serial_control.c` — UART2, watchdog, `ISR_FAST`.
|
||||||
|
- `Core/Src/psu_control.c` — CAN RX callback.
|
||||||
|
- `Core/Src/debug.c` — отладочный UART под условием сборки.
|
||||||
|
- `Core/Src/dma.c`, `gpio.c`, `main.h` — по необходимости для DMA1 Ch1 и DBG-пинов.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Документ сгенерирован для фиксации контекста сессии; при дальнейших правках кода имеет смысл обновлять соответствующие разделы вручную.*
|
||||||
Reference in New Issue
Block a user