6 Commits

Author SHA1 Message Date
achamaikin 3037ae2368 board rev2 support, added heater support 2026-06-04 10:35:01 +03:00
achamaikin 414d2cba60 clean project 2026-05-09 14:02:54 +03:00
achamaikin c8f91af7da cleanup project
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-09 13:20:17 +03:00
achamaikin e8b3ed90cd Overwrite repository contents with fork state.
Replace outdated files with the latest working tree from fork/CCSModuleSW30Web to align source and generated artifacts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-09 13:16:13 +03:00
achamaikin 28d63c7270 latest version before merge 2026-05-05 12:25:11 +03:00
achamaikin c59d150b23 Update firmware version to 1.0.10, add hv_tick parameter to PSU control, enhance serial control with response handling, and improve stop button control logic. 2026-04-13 20:01:44 +03:00
98 changed files with 46198 additions and 54734 deletions
Vendored
BIN
View File
Binary file not shown.
Executable
+187
View File
@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639" moduleId="org.eclipse.cdt.core.settings" name="Debug">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1017099221" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1244048691" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F107VCTx" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1379215735" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.960532971" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1990552137" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1586976077" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F107VCTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Core/Inc | ../Drivers/STM32F1xx_HAL_Driver/Inc | ../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy | ../Drivers/CMSIS/Device/ST/STM32F1xx/Include | ../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | STM32F107xC || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32F107VCTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.82282192" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="72" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.nanoprintffloat.808472221" name="Use float with printf from newlib-nano (-u _printf_float)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.nanoprintffloat" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.400501462" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertsrec.519949918" name="Convert to Motorola S-record file (-O srec)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertsrec" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.1730912092" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1026339783" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/GbTModuleSW}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.653659782" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1272315080" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.370357426" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols.1924718806" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols" valueType="definedSymbols">
<listOptionValue builtIn="false" value="DEBUG"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths.340226531" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="/Users/colorbass/STM32CubeIDE/workspace_1.12.0/lib_EDCAN"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.602034741" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.129443933" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.150601486" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g3" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.2041244846" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o0" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.504560065" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="DEBUG"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32F107xC"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.452593111" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../Core/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/STM32F1xx_HAL_Driver/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy"/>
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F1xx/Include"/>
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1408123272" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.2070441151" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1543951018" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g3" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.2049580629" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.2102490823" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.272103658" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32F107VCTX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.266162782" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.502005820" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1392625179" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.771001125" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1682381984" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.467663480" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.1608796910" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.1767624081" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.139156618" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.1422585447" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/>
</toolChain>
</folderInfo>
<sourceEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127" moduleId="org.eclipse.cdt.core.settings" name="Release">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.368317543" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1083778044" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F107VCTx" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1672048738" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.716214807" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1611406059" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2026840843" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F107VCTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Core/Inc | ../Drivers/STM32F1xx_HAL_Driver/Inc | ../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy | ../Drivers/CMSIS/Device/ST/STM32F1xx/Include | ../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | STM32F107xC || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32F107VCTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1744697906" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="72" valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1433680358" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/GbTModuleSW}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1316679712" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1810954687" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1184417617" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.679037772" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.2023937975" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.2061465690" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.463973701" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1124370999" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32F107xC"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.2130633236" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../Core/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/STM32F1xx_HAL_Driver/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy"/>
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F1xx/Include"/>
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.139233432" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.77997183" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.954735929" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1509118949" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.455795129" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.135018481" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32F107VCTX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.850565080" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1304115760" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.2125898682" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.862607409" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.268643843" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.2012318786" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.25627582" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.1856490045" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.573281510" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.336799426" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/>
</toolChain>
</folderInfo>
<sourceEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry"/>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="GbTModuleSW.null.359723610" name="GbTModuleSW"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.2023937975;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.139233432">
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.129443933;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1408123272">
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="Debug">
<resource resourceType="PROJECT" workspacePath="/GbTModuleSW"/>
</configuration>
<configuration configurationName="Release">
<resource resourceType="PROJECT" workspacePath="/GbTModuleSW"/>
</configuration>
</storageModule>
</cproject>
+54 -120
View File
@@ -1,129 +1,63 @@
# ---> C # macOS
# Prerequisites .DS_Store
*.d **/.DS_Store
# Object files # Temporary/editor files
*.o *.swp
*.ko *.swo
*.obj *~
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
# ---> CMake
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
# ---> Eclipse
.metadata
bin/
tmp/
*.tmp *.tmp
*.bak *.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
# External tool builders # STM32CubeIDE build intermediates
Debug/**/*.o
Debug/**/*.d
Debug/**/*.su
Debug/**/*.cyclo
Debug/**/*.mk
Debug/**/*.lst
Debug/**/*.log
Debug/**/*.tmp
Debug/**/*.a
Debug/**/*.obj
Release/**/*.o
Release/**/*.d
Release/**/*.su
Release/**/*.cyclo
Release/**/*.mk
Release/**/*.lst
Release/**/*.log
Release/**/*.tmp
Release/**/*.a
Release/**/*.obj
# Generic C/C++ intermediates
*.o
*.obj
*.d
*.su
*.gch
*.pch
*.ilk
*.exp
*.idb
*.pdb
*.dSYM/
# Preserve firmware artifacts in git
!*.hex
!*.bin
!*.srec
!*.elf
# Eclipse local workspace metadata
.metadata/
.externalToolBuilders/ .externalToolBuilders/
# Locally stored "Eclipse launch configurations" # Optional local launch configs
*.launch *.launch
# PyDev specific (Python IDE for Eclipse) # VS Code local settings
*.pydevproject .vscode/
# CDT-specific (C/C++ Development Tooling)
.cproject
# CDT- autotools
.autotools
# Java annotation processor (APT)
.factorypath
# PDT-specific (PHP Development Tools)
.buildpath
# sbteclipse plugin
.target
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Annotation Processing
.apt_generated/
.apt_generated_test/
# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet
# Uncomment this line if you wish to ignore the project description file.
# Typically, this file would be tracked if it contains build/dependency configurations:
#.project
+17 -15
View File
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}}
+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1370229639" name="Debug">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="529144383163155105" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1286135127" name="Release">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="529144383163155105" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
</project>
+6
View File
@@ -0,0 +1,6 @@
doxygen/doxygen_new_line_after_brief=true
doxygen/doxygen_use_brief_tag=false
doxygen/doxygen_use_javadoc_tags=true
doxygen/doxygen_use_pre_tag=false
doxygen/doxygen_use_structural_commands=false
eclipse.preferences.version=1
+5
View File
@@ -0,0 +1,5 @@
2F62501ED4689FB349E356AB974DBE57=0A9B2D4C5DCB32842F05F53136A1D1D7
66BE74F758C12D739921AEA421D593D3=1
8DF89ED150041C4CBC7CB9A9CAA90856=0A9B2D4C5DCB32842F05F53136A1D1D7
DC22A860405A8BF2F2C095E5B6529F12=283F84148D7B38E239E7ECD52C68B71F
eclipse.preferences.version=1
+193 -75
View File
@@ -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,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,master
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,57 @@ 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_MEDIUM
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.Request0=ADC1
Dma.Request1=USART2_RX
Dma.Request2=USART2_TX
Dma.Request3=USART3_RX
Dma.Request4=USART3_TX
Dma.RequestsNb=5
Dma.USART2_RX.1.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.1.Instance=DMA1_Channel6
Dma.USART2_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_RX.1.MemInc=DMA_MINC_ENABLE
Dma.USART2_RX.1.Mode=DMA_NORMAL
Dma.USART2_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_RX.1.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.1.Priority=DMA_PRIORITY_VERY_HIGH
Dma.USART2_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_TX.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART2_TX.2.Instance=DMA1_Channel7
Dma.USART2_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_TX.2.MemInc=DMA_MINC_ENABLE
Dma.USART2_TX.2.Mode=DMA_NORMAL
Dma.USART2_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_TX.2.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_TX.2.Priority=DMA_PRIORITY_HIGH
Dma.USART2_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART3_RX.3.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART3_RX.3.Instance=DMA1_Channel3
Dma.USART3_RX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART3_RX.3.MemInc=DMA_MINC_ENABLE
Dma.USART3_RX.3.Mode=DMA_NORMAL
Dma.USART3_RX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART3_RX.3.PeriphInc=DMA_PINC_DISABLE
Dma.USART3_RX.3.Priority=DMA_PRIORITY_VERY_HIGH
Dma.USART3_RX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART3_TX.4.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART3_TX.4.Instance=DMA1_Channel2
Dma.USART3_TX.4.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART3_TX.4.MemInc=DMA_MINC_ENABLE
Dma.USART3_TX.4.Mode=DMA_NORMAL
Dma.USART3_TX.4.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART3_TX.4.PeriphInc=DMA_PINC_DISABLE
Dma.USART3_TX.4.Priority=DMA_PRIORITY_HIGH
Dma.USART3_TX.4.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
File.Version=6 File.Version=6
GPIO.groupedBy=Group By Peripherals GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false KeepUserPlacement=false
@@ -37,86 +105,100 @@ 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=PC9
Mcu.Pin3=OSC_OUT Mcu.Pin3=OSC_OUT
Mcu.Pin30=PC11 Mcu.Pin30=PA9
Mcu.Pin31=PC12 Mcu.Pin31=PA10
Mcu.Pin32=PD0 Mcu.Pin32=PA13
Mcu.Pin33=PD1 Mcu.Pin33=PA14
Mcu.Pin34=PD2 Mcu.Pin34=PA15
Mcu.Pin35=PD3 Mcu.Pin35=PC10
Mcu.Pin36=PD4 Mcu.Pin36=PC11
Mcu.Pin37=PD5 Mcu.Pin37=PC12
Mcu.Pin38=PD6 Mcu.Pin38=PD0
Mcu.Pin39=PD7 Mcu.Pin39=PD1
Mcu.Pin4=PC3 Mcu.Pin4=PC2
Mcu.Pin40=PB3 Mcu.Pin40=PD2
Mcu.Pin41=PB4 Mcu.Pin41=PD3
Mcu.Pin42=PB5 Mcu.Pin42=PD4
Mcu.Pin43=PB6 Mcu.Pin43=PD5
Mcu.Pin44=PB7 Mcu.Pin44=PD6
Mcu.Pin45=PB8 Mcu.Pin45=PD7
Mcu.Pin46=PB9 Mcu.Pin46=PB3
Mcu.Pin47=PE1 Mcu.Pin47=PB4
Mcu.Pin48=VP_ADC1_TempSens_Input Mcu.Pin48=PB5
Mcu.Pin49=VP_ADC1_Vref_Input Mcu.Pin49=PB6
Mcu.Pin5=PA1 Mcu.Pin5=PC3
Mcu.Pin50=VP_CRC_VS_CRC Mcu.Pin50=PB7
Mcu.Pin51=VP_RTC_VS_RTC_Activate Mcu.Pin51=PB8
Mcu.Pin52=VP_SYS_VS_Systick Mcu.Pin52=PB9
Mcu.Pin53=VP_TIM3_VS_ClockSourceINT Mcu.Pin53=PE1
Mcu.Pin54=VP_TIM4_VS_ClockSourceINT Mcu.Pin54=VP_ADC1_TempSens_Input
Mcu.Pin6=PA2 Mcu.Pin55=VP_ADC1_Vref_Input
Mcu.Pin7=PA3 Mcu.Pin56=VP_CRC_VS_CRC
Mcu.Pin8=PA4 Mcu.Pin57=VP_RTC_VS_RTC_Activate
Mcu.Pin9=PA7 Mcu.Pin58=VP_SYS_VS_Systick
Mcu.PinsNb=55 Mcu.Pin59=VP_TIM3_VS_ClockSourceINT
Mcu.Pin6=PA1
Mcu.Pin60=VP_TIM3_VS_no_output1
Mcu.Pin61=VP_TIM4_VS_ClockSourceINT
Mcu.Pin7=PA2
Mcu.Pin8=PA3
Mcu.Pin9=PA4
Mcu.PinsNb=62
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\:7\:0\:true\: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\:3\:0\:true\:false\:true\:true\:true\:true
NVIC.CAN2_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.CAN2_RX1_IRQn=true\:3\:0\:true\: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\:1\:0\:true\:false\:true\:false\:true\:true
NVIC.DMA1_Channel2_IRQn=true\:4\:0\:true\:false\:true\:false\:true\:true
NVIC.DMA1_Channel3_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true
NVIC.DMA1_Channel6_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true
NVIC.DMA1_Channel7_IRQn=true\:4\:0\:true\: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
@@ -126,11 +208,11 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.TIM3_IRQn=true\:6\:0\:true\:false\:true\:true\:true\:true
NVIC.UART5_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.UART5_IRQn=true\:5\:0\:true\:false\:true\:true\:true\:true
NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.USART1_IRQn=true\:5\:0\:true\:false\:true\:true\:true\:true
NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.USART2_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true
NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.USART3_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
OSC_IN.Mode=HSE-External-Oscillator OSC_IN.Mode=HSE-External-Oscillator
OSC_IN.Signal=RCC_OSC_IN OSC_IN.Signal=RCC_OSC_IN
@@ -162,6 +244,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 +269,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
@@ -205,12 +307,19 @@ PC10.Signal=USART3_TX
PC11.Locked=true PC11.Locked=true
PC11.Mode=Asynchronous PC11.Mode=Asynchronous
PC11.Signal=USART3_RX PC11.Signal=USART3_RX
PC12.GPIOParameters=GPIO_Label
PC12.GPIO_Label=HEATER
PC12.Mode=Asynchronous PC12.Mode=Asynchronous
PC12.Signal=UART5_TX PC12.Signal=UART5_TX
PC14-OSC32_IN.Mode=LSE-External-Oscillator 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
@@ -223,6 +332,10 @@ PC5.GPIOParameters=GPIO_Label
PC5.GPIO_Label=LOCK_B PC5.GPIO_Label=LOCK_B
PC5.Locked=true PC5.Locked=true
PC5.Signal=GPIO_Output PC5.Signal=GPIO_Output
PC9.GPIOParameters=GPIO_Label
PC9.GPIO_Label=LED_DATA
PC9.Locked=true
PC9.Signal=GPIO_Output
PD0.Locked=true PD0.Locked=true
PD0.Mode=CAN_Activate PD0.Mode=CAN_Activate
PD0.Signal=CAN1_RX PD0.Signal=CAN1_RX
@@ -320,7 +433,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 +484,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 +516,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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Executable → Regular
+12 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file adc.h
* @brief This file contains all the function prototypes for
* the adc.c file
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __ADC_H__ #ifndef __ADC_H__
@@ -29,18 +13,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 */
+5 -14
View File
@@ -1,14 +1,6 @@
/* #pragma once
* board.h
*
* Created on: Apr 15, 2024
* Author: colorbass
*/
#ifndef SRC_BOARD_H_ #include <stdint.h>
#define SRC_BOARD_H_
void GBT_Lock(uint8_t state);
typedef enum{ typedef enum{
RELAY_AUX0 = 0, RELAY_AUX0 = 0,
@@ -24,6 +16,7 @@ typedef enum{
} relay_t; } relay_t;
void RELAY_Write(relay_t num, uint8_t state); void RELAY_Write(relay_t num, uint8_t state);
uint8_t RELAY_Read(relay_t num);
void Init_Peripheral(); void Init_Peripheral();
uint8_t GBT_LockGetState(); uint8_t GBT_LockGetState();
void GBT_Lock(uint8_t state); void GBT_Lock(uint8_t state);
@@ -55,10 +48,8 @@ typedef struct __attribute__((packed)) {
uint8_t stationType; // Байт 4: тип станции uint8_t stationType; // Байт 4: тип станции
uint8_t boardVersion; // Байт 5: версия платы uint8_t boardVersion; // Байт 5: версия платы
uint8_t addrEdcan; // Байт 6: адрес EDCAN uint8_t addrEdcan; // Байт 6: адрес EDCAN
uint8_t reserved[57]; // Байты 7-63: зарезервированы uint8_t maxPower; // Байт 7: максимальная мощность станции (5кВт/bit)
uint8_t reserved[56]; // Байты 8-63: зарезервированы
} InfoBlock_t; } InfoBlock_t;
extern InfoBlock_t *InfoBlock; extern InfoBlock_t *InfoBlock;
#endif /* SRC_BOARD_H_ */
Executable → Regular
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file can.h
* @brief This file contains all the function prototypes for
* the can.c file
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CAN_H__ #ifndef __CAN_H__
+5 -3
View File
@@ -5,9 +5,11 @@
#define PSU_MIN_VOLTAGE 150 //1V/bit #define PSU_MIN_VOLTAGE 150 //1V/bit
#define PSU_MAX_CURRENT 133 //1A/bit #define PSU_MAX_CURRENT 133 //1A/bit
#define PSU_MIN_CURRENT 1 //1A/bit #define PSU_MIN_CURRENT 1 //1A/bit
#define PSU_MAX_POWER 30000 //1W/bit #define PSU_MAX_POWER 40000 //1W/bit
#define PSU_NUM 1 #define PSU_NUM 1
#define GBT_CH_VER_MAJOR 1 /* Everest / стенд: запрос «500 В» на шине — реально на PSU задаются U/I ниже; статус может оставаться 500 В (serial.c). */
#define GBT_CH_VER_MINOR 0 #define FAKE_EVREQ_VOLTAGE_V 500u
#define FAKE_PSU_VOLTAGE_V 300u
#define FAKE_PSU_CURRENT_0P1A 10u
+1 -19
View File
@@ -1,12 +1,4 @@
/* #pragma once
* charger_control.h
*
* Created on: Jul 29, 2024
* Author: colorbass
*/
#ifndef INC_CHARGER_CONTROL_H_
#define INC_CHARGER_CONTROL_H_
#include "main.h" #include "main.h"
@@ -83,16 +75,6 @@ typedef struct{
extern ChargingConnector_t CONN; extern ChargingConnector_t CONN;
//информация о зарядке
//база данных с хранением инфы
//главный блок хранит в себе инфу о конфиге возможно во флеше
//либо в charger_config.h
//OCPP - универсальный блок типа
void CONN_Init(); void CONN_Init();
void CONN_Loop(); void CONN_Loop();
void CONN_PrintChargingTotal();
#endif /* INC_CHARGER_CONTROL_H_ */
+1 -12
View File
@@ -1,12 +1,4 @@
/* #pragma once
* connector.h
*
* Created on: Jul 31, 2024
* Author: colorbass
*/
#ifndef INC_CONNECTOR_H_
#define INC_CONNECTOR_H_
#include "main.h" #include "main.h"
#include "charger_control.h" #include "charger_control.h"
@@ -15,7 +7,4 @@
extern CONN_State_t connectorState; extern CONN_State_t connectorState;
void CONN_Init(); void CONN_Init();
void CONN_Task();
void CONN_SetState(CONN_State_t state); void CONN_SetState(CONN_State_t state);
#endif /* INC_CONNECTOR_H_ */
+5 -4
View File
@@ -1,5 +1,4 @@
#ifndef __CP_H #pragma once
#define __CP_H
#include "main.h" #include "main.h"
#include <stdint.h> #include <stdint.h>
@@ -16,12 +15,14 @@ typedef enum {
EV_STATE_ACQUIRING = 6, EV_STATE_ACQUIRING = 6,
} CP_State_t; } CP_State_t;
extern CP_State_t cp_state_buffer;
void CP_Init(void); void CP_Init(void);
void CP_SetDuty(uint8_t percentage); void CP_SetDuty(uint8_t percentage);
uint8_t CP_GetDuty(void); uint8_t CP_GetDuty(void);
int32_t CP_GetVoltage(void); int32_t CP_GetVoltage(void);
CP_State_t CP_GetState(void); CP_State_t CP_GetState(void);
CP_State_t CP_GetFilteredState(void);
void CP_FilterState(void);
void CP_Loop(void); void CP_Loop(void);
#endif
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file crc.h
* @brief This file contains all the function prototypes for
* the crc.c file
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRC_H__ #ifndef __CRC_H__
+1 -11
View File
@@ -1,12 +1,4 @@
/* #pragma once
* debug.h
*
* Created on: Apr 16, 2024
* Author: colorbass
*/
#ifndef SRC_DEBUG_H_
#define SRC_DEBUG_H_
#include <stdint.h> #include <stdint.h>
#include <stdarg.h> #include <stdarg.h>
@@ -30,5 +22,3 @@ void debug_buffer_send(void);
// Кастомный printf с приоритетом лога // Кастомный printf с приоритетом лога
int log_printf(LogLevel_t level, const char *format, ...); int log_printf(LogLevel_t level, const char *format, ...);
#endif /* SRC_DEBUG_H_ */
+36
View File
@@ -0,0 +1,36 @@
/* USER CODE BEGIN Header */
/* 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__ */
Executable → Regular
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file gpio.h
* @brief This file contains all the function prototypes for
* the gpio.c file
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_H__ #ifndef __GPIO_H__
+8
View File
@@ -0,0 +1,8 @@
#pragma once
/* GCC: быстрые функции, вызываемые из IRQ / из HAL из IRQ-контекста */
#if defined(__GNUC__)
#define ISR_FAST __attribute__((optimize("Ofast")))
#else
#define ISR_FAST
#endif
+20 -20
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.h
* @brief : Header for main.c file.
* This file contains the common defines of the application.
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
@@ -41,9 +25,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 0x02 #define FW_VERSION_PATCH 17
/* USER CODE END EC */ /* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/
@@ -55,10 +39,14 @@ extern "C" {
void Error_Handler(void); void Error_Handler(void);
/* USER CODE BEGIN EFP */ /* USER CODE BEGIN EFP */
uint8_t ED_TraceWarning(uint8_t flag, uint8_t id);
void ED_Delay(uint32_t Delay);
/* 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 +55,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,8 +83,16 @@ 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 LED_DATA_Pin GPIO_PIN_9
#define LED_DATA_GPIO_Port GPIOC
#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 HEATER_Pin GPIO_PIN_12
#define HEATER_GPIO_Port GPIOC
#define RELAY_DC_Pin GPIO_PIN_3 #define RELAY_DC_Pin GPIO_PIN_3
#define RELAY_DC_GPIO_Port GPIOD #define RELAY_DC_GPIO_Port GPIOD
#define USART2_DIR_Pin GPIO_PIN_4 #define USART2_DIR_Pin GPIO_PIN_4
+1 -13
View File
@@ -1,25 +1,15 @@
/* #pragma once
* psu_struct.h
*
* Created on: Jul 24, 2024
* Author: colorbass
*/
#ifndef INC_METER_H_
#define INC_METER_H_
#include "main.h" #include "main.h"
#include "charger_config.h" #include "charger_config.h"
typedef struct { typedef struct {
uint32_t meterLastTick; // Время последнего пакета Alive
uint8_t online; uint8_t online;
uint32_t lastTick; // Время последнего вызова для каждого коннектора uint32_t lastTick; // Время последнего вызова для каждого коннектора
uint64_t EnergyPSU_Ws; // Энергия для каждого коннектора (расчет по силовым модулям) uint64_t EnergyPSU_Ws; // Энергия для каждого коннектора (расчет по силовым модулям)
uint32_t AbsoluteEnergy; // Абсолютная энергия каждого счетчика (ватт*час) uint32_t AbsoluteEnergy; // Абсолютная энергия каждого счетчика (ватт*час)
uint32_t EnergyOffset; // смещение энергии по счетчикам (если 0, значит не успели захватить Offset) (ватт*час) uint32_t EnergyOffset; // смещение энергии по счетчикам (если 0, значит не успели захватить Offset) (ватт*час)
uint32_t EnergyOffset1; // смещение энергии по счетчикам относительно PSU
uint8_t enable; //если 0, то счетчик обнуляется uint8_t enable; //если 0, то счетчик обнуляется
}METER_t; }METER_t;
@@ -27,5 +17,3 @@ typedef struct {
extern METER_t METER; extern METER_t METER;
void METER_CalculateEnergy(); void METER_CalculateEnergy();
#endif /* INC_METER_H_ */
+3 -15
View File
@@ -1,20 +1,11 @@
/* #pragma once
* ccs_control.h
*
* Created on: 19 авг. 2024 г.
* Author: colorbass
*/
#ifndef INC_PSU_CONTROL_H_
#define INC_PSU_CONTROL_H_
#include "main.h" #include "main.h"
#include "charger_config.h" #include "charger_config.h"
void PSU_Init(); void PSU_Init();
void PSU_Enable(uint8_t addr, uint8_t enable); void PSU_Enable(uint8_t addr, uint8_t enable);
void PSU_Loop(); void PSU_ReadWrite(void);
void CONT_Loop();
// --- Состояние силового модуля (DC30, один PSU) --- // --- Состояние силового модуля (DC30, один PSU) ---
@@ -88,6 +79,7 @@ typedef struct {
// Дополнительные параметры для одного модуля DC30 // Дополнительные параметры для одного модуля DC30
uint32_t power_limit; // лимит мощности [кВт] uint32_t power_limit; // лимит мощности [кВт]
uint8_t hv_mode; // HV-режим (ограничение напряжения) uint8_t hv_mode; // HV-режим (ограничение напряжения)
uint32_t hv_tick; // таймер для задержки входа в HV-режим
uint32_t tempAmbient; // температура окружающего воздуха (из PSU_04) uint32_t tempAmbient; // температура окружающего воздуха (из PSU_04)
union { uint8_t raw; PSU_Status0_t bits; } status0; // modularForm0 union { uint8_t raw; PSU_Status0_t bits; } status0; // modularForm0
@@ -190,7 +182,3 @@ extern PSU_1B_t PSU_1B;
extern PSU_1C_t PSU_1C; extern PSU_1C_t PSU_1C;
#pragma pack(pop) #pragma pack(pop)
#endif /* INC_PSU_CONTROL_H_ */
+2 -12
View File
@@ -1,12 +1,4 @@
/* #pragma once
* rgb_handler.h
*
* Created on: Jul 25, 2024
* Author: colorbass
*/
#ifndef INC_RGB_CONTROLLER_H_
#define INC_RGB_CONTROLLER_H_
#include "main.h" #include "main.h"
@@ -48,6 +40,4 @@ typedef struct{
void LED_Task(); void LED_Task();
void LED_Write(); void LED_Write();
void LED_Init(); void LED_Init();
void LED_SetColor(RGB_Cycle_t *color);
#endif /* INC_RGB_CONTROLLER_H_ */
Executable → Regular
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file rtc.h
* @brief This file contains all the function prototypes for
* the rtc.c file
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __RTC_H__ #ifndef __RTC_H__
+9 -10
View File
@@ -1,5 +1,4 @@
#ifndef __SERIAL_H #pragma once
#define __SERIAL_H
#include "main.h" #include "main.h"
#include "charger_control.h" #include "charger_control.h"
@@ -11,13 +10,16 @@ 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 CCS_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
typedef enum { typedef enum {
CCS_DISABLED = 0, CCS_UNKNOWN = 0,
CCS_UNPLUGGED = 1, CCS_DISABLED = 1,
CCS_AUTH_REQUIRED = 2, CCS_UNPLUGGED = 2,
CCS_CONNECTED = 3, CCS_AUTH_REQUIRED = 3,
CCS_REPLUGGING = 4, CCS_CONNECTED = 4,
CCS_REPLUGGING = 5,
} CCS_ConnectorState_t; } CCS_ConnectorState_t;
typedef enum { typedef enum {
@@ -122,6 +124,3 @@ extern CCS_MaxLoad_t CCS_MaxLoad;
extern CCS_EvInfo_t CCS_EvInfo; extern CCS_EvInfo_t CCS_EvInfo;
extern CONN_State_t CCS_EvseState; extern CONN_State_t CCS_EvseState;
extern uint8_t REPLUG; extern uint8_t REPLUG;
#endif
+4 -7
View File
@@ -1,11 +1,9 @@
#ifndef SERIALCONTROL_H #pragma once
#define SERIALCONTROL_H
#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
// Команды от ПК к устройству // Команды от ПК к устройству
// Пакет статуса изоляции от отдельного блока по одностороннему UART // Пакет статуса изоляции от отдельного блока по одностороннему UART
@@ -168,7 +166,8 @@ 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);
void SC_RecoverUartDma(UART_HandleTypeDef *huart);
// Внешняя функция обработки команд (определена в serial_handler.c) // Внешняя функция обработки команд (определена в serial_handler.c)
extern void SC_CommandHandler(ReceivedCommand_t* cmd); extern void SC_CommandHandler(ReceivedCommand_t* cmd);
@@ -178,5 +177,3 @@ extern StatusPacket_t statusPacket;
extern InfoPacket_t infoPacket; extern InfoPacket_t infoPacket;
extern IsolationStatusPacket_t ISO; extern IsolationStatusPacket_t ISO;
extern volatile SC_Source_t g_sc_command_source; extern volatile SC_Source_t g_sc_command_source;
#endif // SERIALCONTROL_H
+1 -5
View File
@@ -1,5 +1,4 @@
#ifndef SMA_FILTER_H #pragma once
#define SMA_FILTER_H
#include <stdint.h> #include <stdint.h>
@@ -18,6 +17,3 @@ typedef struct {
void SMAFilter_Init(SMAFilter_t* f); void SMAFilter_Init(SMAFilter_t* f);
int32_t SMAFilter_Update(SMAFilter_t* f, int32_t x); int32_t SMAFilter_Update(SMAFilter_t* f, int32_t x);
#endif // SMA_FILTER_H
+1 -11
View File
@@ -1,12 +1,4 @@
/* #pragma once
* soft_rtc.h
*
* Created on: Jul 22, 2024
* Author: colorbass
*/
#ifndef INC_SOFT_RTC_H_
#define INC_SOFT_RTC_H_
#include "main.h" #include "main.h"
@@ -15,5 +7,3 @@ void set_Time(uint32_t unix_time);
void unix_to_bcd(uint32_t unix_time, uint8_t *time); void unix_to_bcd(uint32_t unix_time, uint8_t *time);
void writeTimeReg(uint8_t reg_number, uint8_t value); void writeTimeReg(uint8_t reg_number, uint8_t value);
uint8_t getTimeReg(uint8_t reg_number); uint8_t getTimeReg(uint8_t reg_number);
#endif /* INC_SOFT_RTC_H_ */
+2 -17
View File
@@ -1,20 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32f1xx_hal_conf.h
* @brief HAL configuration file.
******************************************************************************
* @attention
*
* Copyright (c) 2017 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
@@ -42,7 +27,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
+7 -16
View File
@@ -1,20 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32f1xx_it.h
* @brief This file contains the headers of the interrupt handlers.
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
@@ -55,6 +40,12 @@ 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 DMA1_Channel2_IRQHandler(void);
void DMA1_Channel3_IRQHandler(void);
void DMA1_Channel6_IRQHandler(void);
void DMA1_Channel7_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);
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file tim.h
* @brief This file contains all the function prototypes for
* the tim.c file
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TIM_H__ #ifndef __TIM_H__
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usart.h
* @brief This file contains all the function prototypes for
* the usart.c file
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/ /* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__ #ifndef __USART_H__
BIN
View File
Binary file not shown.
+105 -22
View File
@@ -1,30 +1,43 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file adc.c
* @brief This file provides code for the configuration
* of the ADC instances.
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#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 +56,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 +69,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 +155,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_MEDIUM;
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, 7, 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 +202,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 */
+30 -40
View File
@@ -1,14 +1,9 @@
#include "main.h"
#include "board.h" #include "board.h"
#include "tim.h"
#include "adc.h"
#include "main.h"
#include "sma_filter.h" #include "sma_filter.h"
#include "tim.h"
extern ADC_HandleTypeDef hadc1;
//TODO:
//TEMP READ
// Connector temperature sensors
InfoBlock_t *InfoBlock = (InfoBlock_t *)(VERSION_OFFSET); InfoBlock_t *InfoBlock = (InfoBlock_t *)(VERSION_OFFSET);
@@ -75,28 +70,41 @@ uint8_t IN_ReadInput(inputNum_t input_n){
} }
} }
uint8_t GetBoardTemp(){ /* Заглушка: температура платы не измеряется (нет реализации АЦП для канала). */
//TODO uint8_t GetBoardTemp(void){
// HAL_ADC_Start(&hadc1); // start the adc
//
// HAL_ADC_PollForConversion(&hadc1, 100); // poll for conversion
//
// adc_val = HAL_ADC_GetValue(&hadc1); // get the adc value
//
// HAL_ADC_Stop(&hadc1); // stop adc
return 0; return 0;
} }
/**
* @brief Force PC12 (HEATER) as GPIO output via CRH/ODR, overriding UART5 MspInit.
* CubeMX assigns PC12 to UART5_TX; on the board it drives the heater relay.
*/
static void Heater_PinForceOutput(void)
{
const uint32_t pin_cfg = GPIO_SPEED_FREQ_LOW; /* MODE=10, CNF=00: GP output PP, 2 MHz */
__HAL_RCC_GPIOC_CLK_ENABLE();
MODIFY_REG(HEATER_GPIO_Port->CRH,
(GPIO_CRH_MODE12 | GPIO_CRH_CNF12),
(pin_cfg << GPIO_CRH_MODE12_Pos));
HEATER_GPIO_Port->BSRR = (uint32_t)HEATER_Pin << 16U;
}
void Init_Peripheral(){ void Init_Peripheral(){
Heater_PinForceOutput();
HAL_GPIO_WritePin(HEATER_GPIO_Port, HEATER_Pin, GPIO_PIN_RESET);
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);
RELAY_Write(RELAY3, 0); RELAY_Write(RELAY3, 0);
RELAY_Write(RELAY_DC, 0); RELAY_Write(RELAY_DC, 0);
RELAY_Write(RELAY_AC, 0); RELAY_Write(RELAY_AC, 0);
RELAY_Write(RELAY_CP, 1); RELAY_Write(RELAY_CP, 0);
RELAY_Write(RELAY_CC, 1); RELAY_Write(RELAY_CC, 0);
RELAY_Write(RELAY_DC1, 0); RELAY_Write(RELAY_DC1, 0);
SMAFilter_Init(&conn_temp_adc_filter[0]); SMAFilter_Init(&conn_temp_adc_filter[0]);
@@ -130,38 +138,20 @@ 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; //Термодатчик не подключен
} }
// int adc_value = 2048; // Пример значения АЦП
float Vref = 3.3; // Напряжение опорное float Vref = 3.3; // Напряжение опорное
float Vin = 5.0; // Входное напряжение float Vin = 5.0; // Входное напряжение
float R = 1000; // Сопротивление резистора в Омах float R = 1000; // Сопротивление резистора в Омах
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;
} }
+3 -19
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file can.c
* @brief This file provides code for the configuration
* of the CAN instances.
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "can.h" #include "can.h"
@@ -127,7 +111,7 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
__HAL_AFIO_REMAP_CAN1_3(); __HAL_AFIO_REMAP_CAN1_3();
/* CAN1 interrupt Init */ /* CAN1 interrupt Init */
HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 0, 0); HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
/* USER CODE BEGIN CAN1_MspInit 1 */ /* USER CODE BEGIN CAN1_MspInit 1 */
@@ -165,7 +149,7 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
/* CAN2 interrupt Init */ /* CAN2 interrupt Init */
HAL_NVIC_SetPriority(CAN2_TX_IRQn, 0, 0); HAL_NVIC_SetPriority(CAN2_TX_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CAN2_TX_IRQn); HAL_NVIC_EnableIRQ(CAN2_TX_IRQn);
HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 0, 0); HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn); HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn);
/* USER CODE BEGIN CAN2_MspInit 1 */ /* USER CODE BEGIN CAN2_MspInit 1 */
+5 -30
View File
@@ -1,9 +1,8 @@
#include "charger_control.h" #include "charger_control.h"
#include "charger_config.h" #include "charger_config.h"
#include "psu_control.h"
#include "connector.h"
#include "debug.h" #include "debug.h"
#include "psu_control.h"
ChargingConnector_t CONN; ChargingConnector_t CONN;
CONN_State_t connectorState; CONN_State_t connectorState;
@@ -27,33 +26,16 @@ void CONN_Loop(){
CONN.chargingError = CONN_ERR_CONTACTOR; CONN.chargingError = CONN_ERR_CONTACTOR;
} else if(PSU0.psu_fault){ } else if(PSU0.psu_fault){
CONN.chargingError = CONN_ERR_PSU_FAULT; CONN.chargingError = CONN_ERR_PSU_FAULT;
// } else if(!CTRL.ac_ok) {
// CONN.chargingError = CONN_ERR_AC_FAULT;
// } else
}else if (CONN.EvConnected == 0){ }else if (CONN.EvConnected == 0){
CONN.chargingError = CONN_NO_ERROR; CONN.chargingError = CONN_NO_ERROR;
} }
if(ED_TraceWarning(CONN.chargingError, 0)) printf("CONN%d Error: %d\n", 0, CONN.chargingError); if(ED_TraceWarning(CONN.chargingError, 0)) {
log_printf(LOG_WARN, "CONN0 Error: %d\n", (int)CONN.chargingError);
}
} }
void CONN_Task(){
/* CCS state machine is handled in serial.c.
* Keep this task lightweight for scheduler compatibility.
*/
if (CONN.chargingError != CONN_NO_ERROR) {
CONN_SetState(Disabled);
return;
}
if (connectorState == Unknown) {
CONN_SetState(Unplugged);
} else if (connectorState == Disabled && CONN.chargingError == CONN_NO_ERROR) {
CONN_SetState(Unplugged);
}
}
void CONN_SetState(CONN_State_t state){ void CONN_SetState(CONN_State_t state){
if (connectorState == state) { if (connectorState == state) {
CONN.connState = state; CONN.connState = state;
@@ -79,10 +61,3 @@ void CONN_SetState(CONN_State_t state){
CONN.connState = state; CONN.connState = state;
} }
void CONN_PrintChargingTotal(){
printf("CONN%d Charging Finished:\n", 0);
// printf("Charging Time: %d\n", CONN.chargingTime);
printf("Charging Energy: %d\n", CONN.Energy);
// printf("Charging Power: %d\n", CONN.chargingPower);
}
+76 -29
View File
@@ -1,37 +1,35 @@
#include "cp.h" #include "cp.h"
#include "adc.h" #include "adc.h"
#include "board.h" #include "board.h"
#include "debug.h"
#include "tim.h" #include "tim.h"
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#define MAX_DUTY 450 #define MAX_DUTY 450
#define FILTER_ORDER 100
static int32_t cp_voltage_mv = 0; static int32_t cp_voltage_mv = 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;
CP_State_t cp_state_buffer = EV_STATE_ACQUIRING;
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 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;
} }
@@ -50,7 +48,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) {
@@ -71,11 +69,12 @@ 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_mv; int32_t voltage_real = CP_GetVoltage();
if(fake_cp_state != EV_STATE_ACQUIRING) { if(fake_cp_state != EV_STATE_ACQUIRING) {
return fake_cp_state; return fake_cp_state;
@@ -98,18 +97,66 @@ CP_State_t CP_GetState(void) {
} }
} }
void CP_Loop(void) { CP_State_t CP_GetFilteredState(void) {
(void)CP_GetState(); return cp_state_buffer;
} }
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) void CP_FilterState(void) {
{
if (htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { static CP_State_t pending_state = EV_STATE_ACQUIRING;
if (ADC_TryLock() == 0u) { static uint8_t stable_count = 0u;
return; CP_State_t current_state = CP_GetState();
}
cp_voltage_mv = CP_ReadVoltageMv(); /* Keep last accepted state while CP is still acquiring. */
ADC_Unlock(); if (current_state == EV_STATE_ACQUIRING) {
pending_state = EV_STATE_ACQUIRING;
stable_count = 0u;
return;
}
if (current_state != pending_state) {
pending_state = current_state;
stable_count = 1u;
return;
}
if (stable_count < FILTER_ORDER) {
stable_count++;
}
if (stable_count >= FILTER_ORDER) {
cp_state_buffer = pending_state;
}
}
void CP_Loop(void) {
static uint32_t tick;
if ((int32_t)(HAL_GetTick() - tick) < 1) return;
tick = HAL_GetTick();
static uint8_t initialized = 0;
static CP_State_t prev_state = EV_STATE_ACQUIRING;
static uint8_t prev_duty = 0;
CP_FilterState();
CP_State_t current_state = CP_GetFilteredState();
uint8_t current_duty = cp_duty;
if (!initialized) {
prev_state = current_state;
prev_duty = current_duty;
initialized = 1;
return;
}
if (current_state != prev_state) {
log_printf(LOG_INFO, "CP state changed: %d -> %d\n", prev_state, current_state);
prev_state = current_state;
}
if (current_duty != prev_duty) {
log_printf(LOG_INFO, "CP duty changed: %u -> %u\n", prev_duty, current_duty);
prev_duty = current_duty;
} }
} }
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file crc.c
* @brief This file provides code for the configuration
* of the CRC instances.
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "crc.h" #include "crc.h"
+7 -229
View File
@@ -1,21 +1,14 @@
/*
* debug.c
*
* Created on: Apr 16, 2024
* Author: colorbass
*/
#include "main.h" #include "main.h"
#include "board.h"
#include "connector.h"
#include "debug.h"
#include "serial_control.h"
#include "usart.h"
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdint.h>
#include <stdarg.h>
#include "debug.h"
#include "board.h"
#include "usart.h"
#include <time.h> #include <time.h>
#include <connector.h>
#include "serial_control.h"
// Кольцевой буфер для отладочных сообщений // Кольцевой буфер для отладочных сообщений
#define DEBUG_BUFFER_SIZE 1024 #define DEBUG_BUFFER_SIZE 1024
@@ -148,218 +141,3 @@ int log_printf(LogLevel_t level, const char *format, ...)
return result; return result;
} }
#ifndef USE_WEB_INTERFACE
extern UART_HandleTypeDef huart2;
uint8_t debug_rx_buffer[256];
uint8_t debug_cmd_received;
uint8_t debug_rx_buffer_size = 0;
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
// if(huart->Instance == USART1){
// mm_rx_interrupt(huart, Size);
// }
if(huart->Instance == USART2){
debug_rx_interrupt(huart, Size);
}
}
void debug_rx_interrupt(UART_HandleTypeDef *huart, uint16_t Size){
debug_rx_buffer[Size] = '\0';
debug_rx_buffer_size = Size;
debug_cmd_received = 1;
}
void debug_init(){
HAL_UARTEx_ReceiveToIdle_IT(&huart2,debug_rx_buffer,255);
}
void parse_command(uint8_t* buffer, size_t length) {
// ignore \r \n symbols
size_t i = 0;
for (i = 0; i < length; i++) {
if (buffer[i] == '\r' || buffer[i] == '\n') {
buffer[i] = '\0';
length = i;
break;
}
}
if (buffer[0] == 0) return;
if (strncmp((const char*)buffer, "reset", length) == 0) {
log_printf(LOG_INFO, "Resetting...\n");
NVIC_SystemReset();
} else if (strncmp((const char*)buffer, "relayaux", length) == 0) {
log_printf(LOG_INFO, "Relaying...\n");
RELAY_Write(RELAY_AUX, 1);
HAL_Delay(2000);
RELAY_Write(RELAY_AUX, 0);
} else if (strncmp((const char*)buffer, "relaycc", length) == 0) {
log_printf(LOG_INFO, "Relaying...\n");
RELAY_Write(RELAY_CC, 1);
HAL_Delay(200);
RELAY_Write(RELAY_CC, 0);
} else if (strncmp((const char*)buffer, "relaydc", length) == 0) {
log_printf(LOG_INFO, "Relaying...\n");
RELAY_Write(RELAY_DC, 1);
HAL_Delay(200);
RELAY_Write(RELAY_DC, 0);
} else if (strncmp((const char*)buffer, "relayac", length) == 0) {
log_printf(LOG_INFO, "Relaying...\n");
RELAY_Write(RELAY_AC, 1);
HAL_Delay(200);
RELAY_Write(RELAY_AC, 0);
} else if (strncmp((const char*)buffer, "adc", length) == 0) {
log_printf(LOG_INFO, "CC1=%.2f\n", CONN_CC_GetAdc());
} else if (strncmp((const char*)buffer, "lock_state", length) == 0) {
log_printf(LOG_INFO, "Lock state=%d\n", GBT_LockGetState());
} else if (strncmp((const char*)buffer, "lock_lock", length) == 0) {
log_printf(LOG_INFO, "Locked\n");
GBT_Lock(1);
} else if (strncmp((const char*)buffer, "lock_unlock", length) == 0) {
log_printf(LOG_INFO, "Unlocked\n");
GBT_Lock(0);
} else if (strncmp((const char*)buffer, "complete", length) == 0) {
CONN_SetState(Finished);
} else if (strncmp((const char*)buffer, "start", length) == 0) {
log_printf(LOG_INFO, "Started\n");
GBT_Start();
} else if (strncmp((const char*)buffer, "stop", length) == 0) {
log_printf(LOG_INFO, "Stopped\n");
GBT_StopEVSE(GBT_CST_SUSPENDS_ARTIFICIALLY);
} else if (strncmp((const char*)buffer, "stop1", length) == 0) {
log_printf(LOG_INFO, "Stopped\n");
GBT_ForceStop();
// } else if (strncmp((const char*)buffer, "force", length) == 0) {
// log_printf(LOG_INFO, "Stopped\n");
// GBT_Lock(1);
// GBT_SwitchState(GBT_S2_LOCKED);
// GBT_Delay(500);
} else if (strncmp((const char*)buffer, "cc_state", length) == 0) {
switch(CONN_CC_GetState()){
case GBT_CC_UNKNOWN:
log_printf(LOG_INFO, "GBT_CC_UNKNOWN\n");
break;
case GBT_CC_12V:
log_printf(LOG_INFO, "GBT_CC_12V\n");
break;
case GBT_CC_6V:
log_printf(LOG_INFO, "GBT_CC_6V\n");
break;
case GBT_CC_4V:
log_printf(LOG_INFO, "GBT_CC_4V\n");
break;
case GBT_CC_2V:
log_printf(LOG_INFO, "GBT_CC_2V\n");
break;
}
} else if (strncmp((const char*)buffer, "temp", length) == 0) {
log_printf(LOG_INFO, "temp1 %d\n",GBT_ReadTemp(0));
log_printf(LOG_INFO, "temp2 %d\n",GBT_ReadTemp(1));
} else if (strncmp((const char*)buffer, "info1", length) == 0) {
log_printf(LOG_INFO, "Battery info:\n");
log_printf(LOG_INFO, "maxCV %dV\n",GBT_BATStat.maxCellVoltage/100); // 0.01v/bit
log_printf(LOG_INFO, "maxCC %dA\n",GBT_BATStat.maxChargingCurrent/10); // 0.1A/bit
log_printf(LOG_INFO, "totE %dkWh\n",GBT_BATStat.totalEnergy/10); // 0.1kWh
log_printf(LOG_INFO, "maxCV %dV\n",GBT_BATStat.maxChargingVoltage/10); // 0.1V/ bit
log_printf(LOG_INFO, "maxT %dC\n",(int16_t)GBT_BATStat.maxTemp-50); // 1C/bit, -50C offset
log_printf(LOG_INFO, "SOC %dp\n",GBT_BATStat.SOC/10); // 0.1%/bit , 0..100%
log_printf(LOG_INFO, "Volt. %dV\n",GBT_BATStat.measVoltage/10); // 0.1V/bit
} else if (strncmp((const char*)buffer, "info2", length) == 0) {
log_printf(LOG_INFO, "EV info:\n");
log_printf(LOG_INFO, "GBT_ver V%d.%d%d\n",GBT_EVInfo.version[0],GBT_EVInfo.version[1],GBT_EVInfo.version[2]);
log_printf(LOG_INFO, "Battery type: %d\n",GBT_EVInfo.batteryType);
log_printf(LOG_INFO, "Battery capacity: %d\n", GBT_EVInfo.batteryCapacity); // 0.1Ah/bit
log_printf(LOG_INFO, "Battery voltage: %d\n", GBT_EVInfo.batteryVoltage); // 0.1V/bit
log_printf(LOG_INFO, "Battery vendor: %.4s\n", GBT_EVInfo.batteryVendor); // Battery vendor (ASCII string)
log_printf(LOG_INFO, "Battery SN: %lu\n", GBT_EVInfo.batterySN); // int
log_printf(LOG_INFO, "Battery manufacture date: %02d.%02d.%04d\n", GBT_EVInfo.batteryManuD, GBT_EVInfo.batteryManuM ,GBT_EVInfo.batteryManuY+1985); // year (offset 1985)
log_printf(LOG_INFO, "Battery cycles: %d\n", GBT_EVInfo.batteryCycleCount); //uint24_t
log_printf(LOG_INFO, "Own auto: %d\n", GBT_EVInfo.ownAuto); // 0 = lizing, 1 = own auto
log_printf(LOG_INFO, "EVIN: %.17s\n", GBT_EVInfo.EVIN); //EVIN
log_printf(LOG_INFO, "EV_SW_VER: %.8s\n", GBT_EVInfo.EV_SW_VER);
} else if (strncmp((const char*)buffer, "info3", length) == 0) {
log_printf(LOG_INFO, "GBT_MaxLoad info:\n");
log_printf(LOG_INFO, "Output max current: %d\n",GBT_MaxLoad.maxOutputCurrent);
log_printf(LOG_INFO, "Output min current: %d\n",GBT_MaxLoad.minOutputCurrent);
log_printf(LOG_INFO, "Output max voltage: %d\n",GBT_MaxLoad.maxOutputVoltage);
log_printf(LOG_INFO, "Output min voltage: %d\n",GBT_MaxLoad.minOutputVoltage);
log_printf(LOG_INFO, "\nGBT_ChargerInfo info:\n");
log_printf(LOG_INFO, "BMS Recognized: %d\n",GBT_ChargerInfo.bmsIdentified);
log_printf(LOG_INFO, "Charger location: %.3s\n",GBT_ChargerInfo.chargerLocation);
log_printf(LOG_INFO, "Charger number: %lu\n",GBT_ChargerInfo.chargerNumber);
} else if (strncmp((const char*)buffer, "help", length) == 0) {
log_printf(LOG_INFO, "Command list:\n");
log_printf(LOG_INFO, "reset\n");
log_printf(LOG_INFO, "help\n");
log_printf(LOG_INFO, "cc_state\n");
log_printf(LOG_INFO, "lock_lock\n");
log_printf(LOG_INFO, "lock_unlock\n");
log_printf(LOG_INFO, "lock_state\n");
log_printf(LOG_INFO, "adc\n");
log_printf(LOG_INFO, "relay(cc,aux,ac,dc)\n");
log_printf(LOG_INFO, "start\n");
log_printf(LOG_INFO, "stop\n");
log_printf(LOG_INFO, "stop1\n");
// log_printf(LOG_INFO, "force\n");
log_printf(LOG_INFO, "temp\n");
log_printf(LOG_INFO, "info1\n");
log_printf(LOG_INFO, "info2\n");
log_printf(LOG_INFO, "info3\n");
log_printf(LOG_INFO, "time\n");
log_printf(LOG_INFO, "cantest\n");
//TODO: info commands
} else if (strncmp((const char*)buffer, "time", length) == 0) {
time_t unix_time = (time_t)get_Current_Time();
struct tm *parts = localtime(&unix_time);
log_printf(LOG_INFO, "Year: %d\n", parts->tm_year + 1900);
log_printf(LOG_INFO, "Month: %d\n", parts->tm_mon + 1);
log_printf(LOG_INFO, "Day: %d\n", parts->tm_mday);
log_printf(LOG_INFO, "Hour: %d\n", parts->tm_hour);
log_printf(LOG_INFO, "Minute: %d\n", parts->tm_min);
log_printf(LOG_INFO, "Second: %d\n", parts->tm_sec);
} else if (strncmp((const char*)buffer, "cantest", length) == 0) {
//GBT_SendCHM();
GBT_Error(0xFDF0C0FC); //BRM Timeout
log_printf(LOG_INFO, "can test\n");
} else {
log_printf(LOG_INFO, "Unknown command\n");
}
}
void debug_task(){
if(debug_cmd_received){
parse_command(debug_rx_buffer, debug_rx_buffer_size);
HAL_UARTEx_ReceiveToIdle_IT(&huart2,debug_rx_buffer,255);
debug_cmd_received = 0;
}
}
#else
#endif // USE_WEB_INTERFACE
+51
View File
@@ -0,0 +1,51 @@
/* USER CODE BEGIN Header */
/* 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, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* DMA1_Channel2_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
/* DMA1_Channel3_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
/* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
/* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 4, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
+29 -23
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file gpio.c
* @brief This file provides code for the configuration
* of all used GPIO pins.
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
@@ -54,23 +38,31 @@ 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
|LED_DATA_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 LED_DATA_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|LED_DATA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
@@ -88,6 +80,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 +102,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;
+52 -17
View File
@@ -1,10 +1,12 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/* USER CODE END Header */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "main.h" #include "main.h"
#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"
@@ -12,15 +14,17 @@
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "can.h"
#include "board.h" #include "board.h"
#include <stdio.h>
#include "debug.h"
#include "soft_rtc.h"
#include "connector.h"
#include "serial_control.h"
#include "charger_config.h" #include "charger_config.h"
#include "connector.h"
#include "debug.h"
#include "meter.h"
#include "psu_control.h"
#include "rgb_controller.h"
#include "serial.h" #include "serial.h"
#include "serial_control.h"
#include "soft_rtc.h"
#include <stdio.h>
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
@@ -52,6 +56,7 @@ void SystemClock_Config(void);
/* Private user code ---------------------------------------------------------*/ /* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ /* USER CODE BEGIN 0 */
static void StopButtonControl(void);
/** /**
* @brief Vector base address configuration. It should no longer be at the start of * @brief Vector base address configuration. It should no longer be at the start of
@@ -96,23 +101,53 @@ void ED_Delay(uint32_t Delay)
while ((HAL_GetTick() - tickstart) < wait){ while ((HAL_GetTick() - tickstart) < wait){
CCS_SerialLoop(); CCS_SerialLoop();
// CP_Loop(); StopButtonControl();
CONN_Task(); CP_Loop();
LED_Task(); LED_Task();
SC_Task(); SC_Task();
} }
} }
void StopButtonControl(){ static void StopButtonControl(void){
static uint32_t tick;
static uint32_t hold_time;
static uint8_t stop_btn_fault = 1;
uint32_t now = HAL_GetTick();
//Charging do nothing /* Run no faster than once per 10 ms. */
if(!IN_ReadInput(IN_ESTOP)){ if((now - tick) < 10){
CONN.connControl = CMD_STOP; return;
}
tick = now;
uint8_t pressed = !IN_ReadInput(IN_ESTOP);
if(!pressed){
stop_btn_fault = 0;
} }
} if(stop_btn_fault){
return;
}
uint8_t temp0, temp1; if(pressed){
if(hold_time == 0){
CONN.connControl = CMD_STOP;
}
hold_time += 10;
if(hold_time == 5000){
CONN.connControl = CMD_FORCE_UNLOCK;
}
if(hold_time > 40000){
SC_SendPacket(NULL, 0, RESP_SUCCESS);
while(huart2.gState == HAL_UART_STATE_BUSY_TX);
HAL_Delay(10);
NVIC_SystemReset();
}
}
else{
hold_time = 0;
}
}
static void CAN1_MinimalReInit(void) static void CAN1_MinimalReInit(void)
{ {
@@ -136,7 +171,8 @@ int main(void)
{ {
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
VectorBase_Config();
VectorBase_Config();
/* USER CODE END 1 */ /* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/ /* MCU Configuration--------------------------------------------------------*/
@@ -157,6 +193,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();
@@ -202,8 +239,6 @@ int main(void)
CONN_Loop(); CONN_Loop();
LED_Write(); LED_Write();
ED_Delay(10); ED_Delay(10);
StopButtonControl();
ED_Delay(50);
} }
/* USER CODE END 3 */ /* USER CODE END 3 */
+1 -9
View File
@@ -1,13 +1,5 @@
/*
* meter.c
*
* Created on: 27 сент. 2024 г.
* Author: root
*/
#include "meter.h" #include "meter.h"
#include "charger_config.h"
#include "charger_control.h" #include "charger_control.h"
+24 -17
View File
@@ -1,13 +1,13 @@
#include "psu_control.h"
#include <psu_control.h> #include "board.h"
#include "can.h" #include "can.h"
#include "string.h"
#include "stdio.h"
#include "charger_config.h" #include "charger_config.h"
#include "charger_control.h" #include "charger_control.h"
#include "board.h"
#include "debug.h" #include "debug.h"
#include "isr_opt.h"
#include <stdio.h>
#include <string.h>
PSU_02_t PSU_02; PSU_02_t PSU_02;
PSU_04_t PSU_04; PSU_04_t PSU_04;
@@ -30,6 +30,8 @@ uint32_t can_lastpacket;
extern CAN_HandleTypeDef hcan2; extern CAN_HandleTypeDef hcan2;
static void PSU_SendCmd(uint8_t source, uint8_t destination, uint8_t cmd, void *data);
static void PSU_SwitchState(PSU_State_t state){ static void PSU_SwitchState(PSU_State_t state){
PSU0.state = state; PSU0.state = state;
PSU0.statetick = HAL_GetTick(); PSU0.statetick = HAL_GetTick();
@@ -39,7 +41,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,};
@@ -149,6 +151,7 @@ void PSU_Init(){
PSU0.power_limit = PSU_MAX_POWER; // kW PSU0.power_limit = PSU_MAX_POWER; // kW
PSU0.hv_mode = 0; PSU0.hv_mode = 0;
PSU0.hv_tick = 0;
PSU_Enable(0, 0); PSU_Enable(0, 0);
} }
@@ -225,7 +228,6 @@ void PSU_SendCmd(uint8_t source, uint8_t destination, uint8_t cmd, void *data){
/* если отправка удалась, выход */ /* если отправка удалась, выход */
if(CAN_result == HAL_OK) { if(CAN_result == HAL_OK) {
return; return;
retry_counter = 0;
} }
} }
ED_Delay(1); ED_Delay(1);
@@ -235,11 +237,6 @@ void PSU_SendCmd(uint8_t source, uint8_t destination, uint8_t cmd, void *data){
} }
uint32_t max(uint32_t a, uint32_t b){
if(a>b) return a;
else return b;
}
void PSU_ReadWrite(){ void PSU_ReadWrite(){
uint8_t zero_data[8] = {0,0,0,0,0,0,0,0}; uint8_t zero_data[8] = {0,0,0,0,0,0,0,0};
@@ -261,11 +258,22 @@ void PSU_ReadWrite(){
} }
CONN.RequestedPower = CONN.RequestedCurrent * CONN.RequestedVoltage / 10; CONN.RequestedPower = CONN.RequestedCurrent * CONN.RequestedVoltage / 10;
if(PSU0.ready){ if(PSU0.ready){
PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); // Normal mode if (CONN.RequestedVoltage == FAKE_EVREQ_VOLTAGE_V) {
PSU_SetVoltageCurrent(0, (uint16_t)FAKE_PSU_VOLTAGE_V, (uint16_t)FAKE_PSU_CURRENT_0P1A);
}else{
PSU_SetVoltageCurrent(0, CONN.RequestedVoltage, CONN.RequestedCurrent); // Normal mode
}
ED_Delay(CAN_DELAY); ED_Delay(CAN_DELAY);
if(CONN.MeasuredVoltage>490) PSU0.hv_mode = 1; if(CONN.MeasuredVoltage > 490){
if(PSU0.hv_tick == 0){
PSU0.hv_tick = HAL_GetTick();
}else if((HAL_GetTick() - PSU0.hv_tick) >= 10000){
PSU0.hv_mode = 1;
}
}else{
PSU0.hv_tick = 0;
}
} }
// PSU_SetHVMode(0, PSU0.hv_mode); // auto set, no need // PSU_SetHVMode(0, PSU0.hv_mode); // auto set, no need
@@ -275,7 +283,6 @@ void PSU_ReadWrite(){
void PSU_Task(void){ void PSU_Task(void){
static uint32_t psu_on_tick = 0; static uint32_t psu_on_tick = 0;
static uint32_t dc_on_tick = 0;
static uint32_t cont_ok_tick = 0; static uint32_t cont_ok_tick = 0;
// Обновляем ONLINE/READY по таймауту // Обновляем ONLINE/READY по таймауту
@@ -339,6 +346,7 @@ void PSU_Task(void){
case PSU_READY: case PSU_READY:
// модуль готов, но выключен // модуль готов, но выключен
PSU0.hv_mode = 0; PSU0.hv_mode = 0;
PSU0.hv_tick = 0;
RELAY_Write(RELAY_DC, 0); RELAY_Write(RELAY_DC, 0);
if(!PSU0.ready){ if(!PSU0.ready){
@@ -354,7 +362,6 @@ void PSU_Task(void){
case PSU_WAIT_ACK_ON: case PSU_WAIT_ACK_ON:
if(PSU0.PSU_enabled && PSU0.ready){ if(PSU0.PSU_enabled && PSU0.ready){
dc_on_tick = HAL_GetTick();
PSU_SwitchState(PSU_CONT_WAIT_ACK_ON); PSU_SwitchState(PSU_CONT_WAIT_ACK_ON);
}else if(PSU_StateTime() > 10000){ }else if(PSU_StateTime() > 10000){
PSU0.psu_fault = 1; PSU0.psu_fault = 1;
+31 -38
View File
@@ -1,20 +1,30 @@
#include "rgb_controller.h" #include "rgb_controller.h"
#include "main.h"
#include "string.h"
#include "charger_control.h"
#include "board.h"
#include "charger_control.h"
#include "main.h"
#include "tim.h" #include "tim.h"
#include <string.h>
RGB_State_t LED_State; RGB_State_t LED_State;
RGB_Cycle_t LED_Cycle; RGB_Cycle_t LED_Cycle;
RGB_Cycle_t color_estop = { RGB_Cycle_t color_estop = {
.Color1 = { .R = 250, .G = 0, .B = 0 }, .Color1 = { .R = 250, .G = 0, .B = 0 },
.Color2 = { .R = 250, .G = 0, .B = 0 }, .Color2 = { .R = 0, .G = 0, .B = 0 },
.Tr = 50, .Tr = 10,
.Th = 50, .Th = 5,
.Tf = 50, .Tf = 10,
.Tl = 50, .Tl = 5,
};
RGB_Cycle_t color_unlock = {
.Color1 = { .R = 255, .G = 0, .B = 0 },
.Color2 = { .R = 0, .G = 0, .B = 0 },
.Tr = 10,
.Th = 10,
.Tf = 10,
.Tl = 10,
}; };
RGB_Cycle_t color_unknown = { RGB_Cycle_t color_unknown = {
@@ -54,12 +64,12 @@ RGB_Cycle_t color_unplugged = {
}; };
RGB_Cycle_t color_preparing = { RGB_Cycle_t color_preparing = {
.Color1 = { .R = 0, .G = 0, .B = 250 }, .Color1 = { .R = 0, .G = 0, .B = 255 },
.Color2 = { .R = 0, .G = 0, .B = 250 }, .Color2 = { .R = 0, .G = 0, .B = 0 },
.Tr = 50, .Tr = 10,
.Th = 10, .Th = 10,
.Tf = 50, .Tf = 10,
.Tl = 0, .Tl = 10,
}; };
RGB_Cycle_t color_charging = { RGB_Cycle_t color_charging = {
@@ -94,6 +104,14 @@ void LED_Write(){
LED_SetColor(&color_error); LED_SetColor(&color_error);
return; return;
} }
if(CONN.connControl == CMD_FORCE_UNLOCK){
LED_SetColor(&color_unlock);
return;
}
if(CONN.connControl == CMD_STOP){
LED_SetColor(&color_estop);
return;
}
switch(CONN.connState){ switch(CONN.connState){
case Unknown: case Unknown:
LED_SetColor(&color_unknown); LED_SetColor(&color_unknown);
@@ -180,36 +198,11 @@ void LED_Init(){
RGB_SetColor(&color); RGB_SetColor(&color);
} }
// void LED_PhaseSync(uint8_t led_n){
// if(LED_State[led_n].phasesync){
// LED_State[led_n].phasesync = 0;
// //default settings
// LED_State[led_n].state = LED_HIGH;
// LED_State[led_n].tick = 0;
// //ищем среди всех светодиодов такую же последовательность
// for (uint8_t led_n1 = 0; led_n1 < 5; led_n1++){
// if ((LED_Cycle[led_n].Tf == LED_Cycle[led_n1].Tf) &&
// (LED_Cycle[led_n].Tr == LED_Cycle[led_n1].Tr) &&
// (LED_Cycle[led_n].Th == LED_Cycle[led_n1].Th) &&
// (LED_Cycle[led_n].Tl == LED_Cycle[led_n1].Tl) &&
// (led_n != led_n1)){
// //если нашли, то копируем фазу оттуда
// LED_State[led_n].state = LED_State[led_n1].state;
// LED_State[led_n].tick = LED_State[led_n1].tick;
// return;
// }
// }
// }
// }
void LED_Task(){ void LED_Task(){
static uint32_t led_tick; static uint32_t led_tick;
if((HAL_GetTick() - led_tick) > 20){ if((HAL_GetTick() - led_tick) > 20){
led_tick = HAL_GetTick(); led_tick = HAL_GetTick();
LED_State.tick++; LED_State.tick++;
// LED_PhaseSync(led_n);
switch(LED_State.state){ switch(LED_State.state){
case LED_RISING: case LED_RISING:
interpolateColors(&LED_Cycle.Color2, &LED_Cycle.Color1, LED_State.tick, LED_Cycle.Tr, &LED_State.color); interpolateColors(&LED_Cycle.Color2, &LED_Cycle.Color1, LED_State.tick, LED_Cycle.Tr, &LED_State.color);
+338 -113
View File
@@ -1,14 +1,18 @@
#include "serial.h" #include "serial.h"
#include "cp.h"
#include "connector.h"
#include "board.h" #include "board.h"
#include "charger_config.h"
#include "connector.h"
#include "cp.h"
#include "debug.h" #include "debug.h"
#include "isr_opt.h"
#include "psu_control.h"
#include "serial_control.h"
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "charger_config.h"
#include "psu_control.h"
extern UART_HandleTypeDef huart3; extern UART_HandleTypeDef huart3;
extern uint8_t config_initialized;
static void send_state(void); static void send_state(void);
static void CCS_SendResetReason(void); static void CCS_SendResetReason(void);
@@ -25,12 +29,15 @@ CONN_Control_t last_cmd = CMD_NONE;
uint8_t ev_enable_output = 0; uint8_t ev_enable_output = 0;
#define CMD_INTERVAL 10 #define CMD_INTERVAL 10
#define MAX_TX_BUFFER_SIZE 256 #define EVEREST_TIMEOUT_WARN_MS 5000u
#define MAX_RX_BUFFER_SIZE 256 #define EVEREST_TIMEOUT_STOP_MS 10000u
#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];
static uint8_t rx_armed = 0; static uint8_t tx_pending_buffer[MAX_TX_BUFFER_SIZE];
static uint16_t tx_pending_len = 0;
static uint8_t uart3_tx_busy = 0;
uint8_t ESTOP = 0; uint8_t ESTOP = 0;
uint8_t REPLUG = 0; uint8_t REPLUG = 0;
@@ -39,46 +46,159 @@ static uint8_t enabled = 0;
static uint8_t pwm_duty_percent = 100; static uint8_t pwm_duty_percent = 100;
uint8_t isolation_enable = 0; uint8_t isolation_enable = 0;
static uint32_t last_host_seen = 0; static uint32_t last_host_seen = 0;
static CP_State_t cp_state_buffer = EV_STATE_ACQUIRING; static uint8_t fake_500_voltage_mode = 0;
static uint8_t everest_timed_out = 0;
static uint8_t everest_timeout_warn_latched = 0;
static uint8_t everest_timeout_stop_latched = 0;
static uint32_t uart3_last_packet_tick = 0;
static uint32_t uart3_last_reinit_tick = 0;
CCS_State_t CCS_State; CCS_State_t CCS_State;
CCS_EvInfo_t CCS_EvInfo; 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_UNKNOWN;
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);
static void CCS_LogUart3Error(const char *tag);
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 (err == HAL_UART_ERROR_NONE) {
log_printf(LOG_ERR, "UART%u HAL error decode: NONE\n", uart_num);
return;
}
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_DMA(&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);
CCS_LogUart3Error("UART3 RX arm failed details");
if (err_after != HAL_UART_ERROR_NONE) {
(void)HAL_UART_AbortReceive(&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);
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_AbortReceive(huart);
(void)HAL_UART_AbortTransmit(huart);
if (huart == &huart3) {
uart3_tx_busy = 0;
uart3_arm_rx_or_log("ErrorCallback");
} else {
SC_RecoverUartDma(huart);
}
}
void CCS_TxCpltCallback(UART_HandleTypeDef *huart) {
if (huart != &huart3) { if (huart != &huart3) {
return; return;
} }
rx_armed = 0; uart3_tx_busy = 0;
if (size > 0 && size <= sizeof(rx_buffer)) { if (tx_pending_len > 0) {
process_received_packet(rx_buffer, size); memcpy(tx_buffer, tx_pending_buffer, tx_pending_len);
uart3_tx_busy = 1;
if (HAL_UART_Transmit_DMA(&huart3, tx_buffer, tx_pending_len) != HAL_OK) {
uart3_tx_busy = 0;
CCS_LogUart3Error("UART3 TX DMA resend failed");
}
tx_pending_len = 0;
} }
} }
void CCS_SerialLoop(void) { void CCS_SerialLoop(void) {
static uint32_t tick;
if ((int32_t)(HAL_GetTick() - tick) < 1) return;
tick = HAL_GetTick();
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;
static uint32_t force_unlock_tick = 0;
static uint32_t stop_tick = 0;
if (!rx_armed && HAL_UART_GetState(&huart3) == HAL_UART_STATE_READY) { CCS_UART3_Watchdog();
if (HAL_UARTEx_ReceiveToIdle_IT(&huart3, rx_buffer, sizeof(rx_buffer)) == HAL_OK) {
rx_armed = 1;
}
}
/* Read CP once per loop and use buffered value below. */
cp_state_buffer = CP_GetState();
if (CONN.connControl != CMD_NONE) { if (CONN.connControl != CMD_NONE) {
last_cmd = CONN.connControl; last_cmd = CONN.connControl;
} }
if((HAL_GetTick() - last_cmd_sent) > CMD_INTERVAL){ if (CONN.connControl == CMD_FORCE_UNLOCK) {
if ((HAL_GetTick() - last_state_sent) >= 200) { if (force_unlock_tick == 0) {
force_unlock_tick = HAL_GetTick();
} else if ((int32_t)(HAL_GetTick() - force_unlock_tick) >= 10000) {
CONN.connControl = CMD_NONE;
force_unlock_tick = 0;
}
} else {
force_unlock_tick = 0;
}
if (CONN.connControl == CMD_STOP) {
if (stop_tick == 0) {
stop_tick = HAL_GetTick();
} else if ((int32_t)(HAL_GetTick() - stop_tick) >= 1000) {
CONN.connControl = CMD_NONE;
stop_tick = 0;
}
} else {
stop_tick = 0;
}
if((int32_t)(HAL_GetTick() - last_cmd_sent) > (int32_t)CMD_INTERVAL){
if ((int32_t)(HAL_GetTick() - last_state_sent) >= 200) {
send_state(); send_state();
last_state_sent = HAL_GetTick(); last_state_sent = HAL_GetTick();
} }
@@ -90,15 +210,19 @@ void CCS_SerialLoop(void) {
} }
if (((CONN.connControl == CMD_STOP) || if (((CONN.connControl == CMD_STOP) ||
(CONN.connControl == CMD_FORCE_UNLOCK) ||
(CONN.chargingError != CONN_NO_ERROR)) && (CONN.chargingError != CONN_NO_ERROR)) &&
((HAL_GetTick() - last_stop_sent) > 1000)) { ((int32_t)(HAL_GetTick() - last_stop_sent) > 1000)) {
last_stop_sent = HAL_GetTick(); last_stop_sent = HAL_GetTick();
log_printf(LOG_WARN, "Stopping charging...\n"); log_printf(LOG_WARN, "Stopping charging...\n");
if (CONN.connControl == CMD_FORCE_UNLOCK) {
CP_SetDuty(100);
}
CCS_SendEmergencyStop(); CCS_SendEmergencyStop();
} }
if (((CCS_EvseState == FinishedEV) || (CCS_EvseState == FinishedEVSE)) && if (((CCS_EvseState == FinishedEV) || (CCS_EvseState == FinishedEVSE)) &&
((HAL_GetTick() - last_stop_sent) > 1000)) { ((int32_t)(HAL_GetTick() - last_stop_sent) > 1000)) {
last_stop_sent = HAL_GetTick(); last_stop_sent = HAL_GetTick();
log_printf(LOG_WARN, "FinishedEV, stopping...\n"); log_printf(LOG_WARN, "FinishedEV, stopping...\n");
CCS_SendEmergencyStop(); CCS_SendEmergencyStop();
@@ -108,81 +232,111 @@ void CCS_SerialLoop(void) {
(void)replug_watchdog_tick; (void)replug_watchdog_tick;
(void)replug_watchdog1_tick; (void)replug_watchdog1_tick;
switch(CCS_ConnectorState){ uint8_t host_timeout_warn = (last_host_seen > 0u) && ((int32_t)(HAL_GetTick() - last_host_seen) > (int32_t)EVEREST_TIMEOUT_WARN_MS);
case CCS_DISABLED: uint8_t host_timeout_stop = (last_host_seen > 0u) && ((int32_t)(HAL_GetTick() - last_host_seen) > (int32_t)EVEREST_TIMEOUT_STOP_MS);
RELAY_Write(RELAY_CP, 0); uint8_t host_timed_out = host_timeout_stop;
CONN_SetState(Disabled);
if (CONN.chargingError == CONN_NO_ERROR){
CCS_ConnectorState = CCS_UNPLUGGED;
}
break;
case CCS_UNPLUGGED:
RELAY_Write(RELAY_CP, 1);
CONN_SetState(Unplugged);
if ((cp_state_buffer == EV_STATE_B_CONN_PREP) || (cp_state_buffer == EV_STATE_C_CONN_ACTIVE)){
CCS_ConnectorState = CCS_AUTH_REQUIRED;
}
if (CONN.chargingError != CONN_NO_ERROR){
log_printf(LOG_ERR, "Charging error %d, state -> disabled\n", CONN.chargingError);
CCS_ConnectorState = CCS_DISABLED;
}
break; if (host_timeout_warn && !everest_timeout_warn_latched) {
case CCS_AUTH_REQUIRED: log_printf(LOG_ERR, "Everest timeout\n");
RELAY_Write(RELAY_CP, 1); everest_timeout_warn_latched = 1;
CONN_SetState(AuthRequired);
if(CONN.connControl == CMD_START){
log_printf(LOG_INFO, "Charging permitted, start charging\n");
CCS_ConnectorState = CCS_CONNECTED;
}
if (cp_state_buffer == EV_STATE_A_IDLE){
log_printf(LOG_INFO, "Car unplugged\n");
CCS_ConnectorState = CCS_UNPLUGGED;
}
break;
case CCS_CONNECTED:
RELAY_Write(RELAY_CP, 1);
if(CCS_EvseState < Preparing) {
CONN_SetState(Preparing);
} else {
CONN_SetState(CCS_EvseState);
}
if (cp_state_buffer == EV_STATE_A_IDLE){
log_printf(LOG_INFO, "Car unplugged\n");
CCS_ConnectorState = CCS_UNPLUGGED;
}
if(REPLUG > 0){
log_printf(LOG_INFO, "Replugging...\n");
CCS_ConnectorState = CCS_REPLUGGING;
}
break;
case CCS_REPLUGGING:
RELAY_Write(RELAY_CP, 0);
CONN_SetState(Replugging);
if((HAL_GetTick() - replug_tick) > 1000){
replug_tick = HAL_GetTick();
if(REPLUG > 0){
if (REPLUG != 0xFF) REPLUG--;
} else {
log_printf(LOG_INFO, "Replugging finished, but car unplugged\n");
CCS_ConnectorState = CCS_UNPLUGGED;
}
}
if(REPLUG == 0){
if(cp_state_buffer == EV_STATE_B_CONN_PREP){
log_printf(LOG_INFO, "Replugging finished, car plugged, state -> auth required\n");
CCS_ConnectorState = CCS_AUTH_REQUIRED;
}
}
break;
} }
if (last_host_seen > 0 && (HAL_GetTick() - last_host_seen) > 500) { if (host_timeout_stop && !everest_timeout_stop_latched) {
log_printf(LOG_ERR, "Everest timeout, stopping charging...\n");
everest_timeout_stop_latched = 1;
}
if (!host_timeout_warn) {
everest_timeout_warn_latched = 0;
everest_timeout_stop_latched = 0;
}
everest_timed_out = host_timeout_stop;
switch(CCS_ConnectorState){
case CCS_UNKNOWN:
RELAY_Write(RELAY_CP, 0);
CONN_SetState(Unknown);
if (config_initialized && !host_timed_out) {
CCS_ConnectorState = CCS_UNPLUGGED;
}
break;
case CCS_DISABLED:
RELAY_Write(RELAY_CP, 0);
CONN_SetState(Disabled);
if ((CONN.chargingError == CONN_NO_ERROR) && !host_timed_out){
CCS_ConnectorState = CCS_UNPLUGGED;
}
break;
case CCS_UNPLUGGED:
RELAY_Write(RELAY_CP, 1);
CONN_SetState(Unplugged);
if ((cp_state_buffer == EV_STATE_B_CONN_PREP) || (cp_state_buffer == EV_STATE_C_CONN_ACTIVE)){
CCS_ConnectorState = CCS_AUTH_REQUIRED;
}
if (CONN.chargingError != CONN_NO_ERROR){
log_printf(LOG_ERR, "Charging error %d, state -> disabled\n", CONN.chargingError);
CCS_ConnectorState = CCS_DISABLED;
}
break;
case CCS_AUTH_REQUIRED:
RELAY_Write(RELAY_CP, 1);
CONN_SetState(AuthRequired);
if(CONN.connControl == CMD_START){
log_printf(LOG_INFO, "Charging permitted, start charging\n");
CCS_ConnectorState = CCS_CONNECTED;
}
if (cp_state_buffer == EV_STATE_A_IDLE){
log_printf(LOG_INFO, "Car unplugged\n");
CCS_ConnectorState = CCS_UNPLUGGED;
}
break;
case CCS_CONNECTED:
RELAY_Write(RELAY_CP, 1);
if((CCS_EvseState < Preparing) || (CCS_EvseState == AuthRequired)) {
CONN_SetState(Preparing);
} else {
CONN_SetState(CCS_EvseState);
}
if (cp_state_buffer == EV_STATE_A_IDLE){
log_printf(LOG_INFO, "Car unplugged\n");
CCS_ConnectorState = CCS_UNPLUGGED;
}
if(REPLUG > 0){
log_printf(LOG_INFO, "Replugging...\n");
CCS_ConnectorState = CCS_REPLUGGING;
}
break;
case CCS_REPLUGGING:
RELAY_Write(RELAY_CP, 0);
CONN_SetState(Replugging);
if((int32_t)(HAL_GetTick() - replug_tick) > 1000){
replug_tick = HAL_GetTick();
if(REPLUG > 0){
if (REPLUG != 0xFF) REPLUG--;
} else {
log_printf(LOG_INFO, "Replugging finished, but car unplugged\n");
CCS_ConnectorState = CCS_UNPLUGGED;
}
}
if(REPLUG == 0){
if(cp_state_buffer == EV_STATE_B_CONN_PREP){
log_printf(LOG_INFO, "Replugging finished, car plugged, state -> auth required\n");
CCS_ConnectorState = CCS_AUTH_REQUIRED;
}
}
break;
}
// 10s timeout: enforce safe-state until host communication recovers.
if (host_timeout_stop) {
CONN.EnableOutput = 0; CONN.EnableOutput = 0;
CCS_EvseState = Unknown; CCS_EvseState = Unknown;
CP_SetDuty(100); CP_SetDuty(100);
log_printf(LOG_ERR, "Everest timeout\n"); if (CCS_ConnectorState != CCS_DISABLED && CCS_ConnectorState != CCS_UNKNOWN) {
CCS_ConnectorState = CCS_DISABLED;
}
} else { } else {
if (last_cmd == CMD_STOP) { if (last_cmd == CMD_STOP) {
CONN.EnableOutput = 0; CONN.EnableOutput = 0;
@@ -211,11 +365,14 @@ 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;
uart3_arm_rx_or_log("Init");
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];
@@ -249,7 +406,16 @@ 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); if (uart3_tx_busy) {
memcpy(tx_pending_buffer, tx_buffer, len);
tx_pending_len = len;
} else {
uart3_tx_busy = 1;
if (HAL_UART_Transmit_DMA(&huart3, tx_buffer, len) != HAL_OK) {
uart3_tx_busy = 0;
CCS_LogUart3Error("UART3 TX DMA start failed");
}
}
} }
last_cmd_sent = HAL_GetTick(); last_cmd_sent = HAL_GetTick();
} }
@@ -287,6 +453,9 @@ static void send_state(void) {
CCS_State.DutyCycle = CP_GetDuty(); CCS_State.DutyCycle = CP_GetDuty();
CCS_State.OutputEnabled = PSU0.CONT_enabled; CCS_State.OutputEnabled = PSU0.CONT_enabled;
CCS_State.MeasuredVoltage = (uint16_t)CONN.MeasuredVoltage; CCS_State.MeasuredVoltage = (uint16_t)CONN.MeasuredVoltage;
if (fake_500_voltage_mode) {
CCS_State.MeasuredVoltage = FAKE_EVREQ_VOLTAGE_V;
}
CCS_State.MeasuredCurrent = (uint16_t)CONN.MeasuredCurrent; CCS_State.MeasuredCurrent = (uint16_t)CONN.MeasuredCurrent;
CCS_State.Power = CCS_Power; CCS_State.Power = CCS_Power;
CCS_State.Energy = CCS_Energy; CCS_State.Energy = CCS_Energy;
@@ -308,7 +477,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);
@@ -324,16 +493,21 @@ 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_timeout_warn_latched = 0;
everest_timeout_stop_latched = 0;
switch (cmd) { switch (cmd) {
case CMD_E2M_PWM_DUTY: { case CMD_E2M_PWM_DUTY: {
const e2m_pwm_duty_t* p = (const e2m_pwm_duty_t*)payload; const e2m_pwm_duty_t* p = (const e2m_pwm_duty_t*)payload;
uint8_t duty = p->pwm_duty_percent; uint8_t duty = p->pwm_duty_percent;
if (duty > 100) duty = 100; if (duty > 100) duty = 100;
pwm_duty_percent = duty; pwm_duty_percent = duty;
CP_SetDuty(duty); if (CONN.connControl != CMD_FORCE_UNLOCK) {
CP_SetDuty(duty);
}
break; break;
} }
case CMD_E2M_ENABLE_OUTPUT: { case CMD_E2M_ENABLE_OUTPUT: {
@@ -345,9 +519,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;
} }
@@ -359,8 +533,15 @@ static void apply_command(uint8_t cmd, const uint8_t* payload, uint16_t payload_
} }
case CMD_E2M_SET_OUTPUT_VOLTAGE: { case CMD_E2M_SET_OUTPUT_VOLTAGE: {
const e2m_set_output_t* p = (const e2m_set_output_t*)payload; const e2m_set_output_t* p = (const e2m_set_output_t*)payload;
CONN.RequestedVoltage = p->voltage_V; if (p->voltage_V == FAKE_EVREQ_VOLTAGE_V) {
CONN.WantedCurrent = p->current_0p1A; fake_500_voltage_mode = 1u;
CONN.RequestedVoltage = FAKE_PSU_VOLTAGE_V;
CONN.WantedCurrent = FAKE_PSU_CURRENT_0P1A;
} else {
fake_500_voltage_mode = 0u;
CONN.RequestedVoltage = p->voltage_V;
CONN.WantedCurrent = p->current_0p1A;
}
break; break;
} }
case CMD_E2M_ISOLATION_CONTROL: { case CMD_E2M_ISOLATION_CONTROL: {
@@ -387,32 +568,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;
} }
@@ -425,3 +628,25 @@ 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 int32_t since_last_packet = (int32_t)(HAL_GetTick() - uart3_last_packet_tick);
const int32_t since_last_reinit = (int32_t)(HAL_GetTick() - uart3_last_reinit_tick);
if ((since_last_packet >= (int32_t)UART3_REINIT_TIMEOUT_MS) &&
(since_last_reinit >= (int32_t)UART3_REINIT_TIMEOUT_MS) &&
(huart3.RxState == HAL_UART_STATE_READY)) {
uart3_arm_rx_or_log("Watchdog");
CCS_LogUart3Error("UART3 watchdog rearm");
uart3_last_reinit_tick = HAL_GetTick();
}
}
static void CCS_LogUart3Error(const char *tag) {
log_printf(LOG_ERR, "%s: err=0x%08lx g=%lu rx=%lu tx_busy=%u\n",
tag,
(unsigned long)HAL_UART_GetError(&huart3),
(unsigned long)huart3.gState,
(unsigned long)huart3.RxState,
(unsigned)uart3_tx_busy);
}
+130 -31
View File
@@ -1,13 +1,20 @@
#include "serial_control.h" #include "serial_control.h"
#include "usart.h"
#include "board.h" #include "board.h"
#include "debug.h"
#include "isr_opt.h"
#include "serial.h" #include "serial.h"
#include "usart.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);
static void SC_ArmUart2RxDma(void);
static void SC_ArmUart5RxDma(void);
static void SC_LogUartError(const char *tag, UART_HandleTypeDef *huart);
uint8_t test_crc_invalid = 0; uint8_t test_crc_invalid = 0;
@@ -15,6 +22,12 @@ 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_recover_tick = 0;
#define SC_UART2_RECOVER_GUARD_MS 200u
#define SC_UART2_PACKET_TIMEOUT_MS 5000u
StatusPacket_t statusPacket = { StatusPacket_t statusPacket = {
.SOC = 0, .SOC = 0,
@@ -72,20 +85,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_recover_tick = sc_uart2_last_packet_tick;
SC_ArmUart2RxDma();
SC_ArmUart5RxDma();
} }
void SC_Task() { void SC_Task() {
// Запуск приема в режиме прерывания с ожиданием idle static uint32_t tick;
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 ((int32_t)(HAL_GetTick() - tick) < 1) return;
if((huart5.RxState == HAL_UART_STATE_READY)) HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1); tick = HAL_GetTick();
SC_UART2_Watchdog();
// Запуск приема в режиме DMA + idle
SC_ArmUart2RxDma();
SC_ArmUart5RxDma();
// Проверка таймаута отправки пакета (больше 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) {
if ((HAL_GetTick() - serial_control.tx_tick) > 100) { if ((int32_t)(HAL_GetTick() - serial_control.tx_tick) > 100) {
// Таймаут: принудительно сбрасываем передачу // Таймаут: принудительно сбрасываем передачу
HAL_UART_Abort_IT(&huart2); (void)HAL_UART_AbortTransmit(&huart2);
// Выключаем DIR при сбросе передачи
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET);
serial_control.tx_tick = 0; // Сбрасываем tick serial_control.tx_tick = 0; // Сбрасываем tick
} }
} }
@@ -93,41 +114,54 @@ 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((ReceivedCommand_t*)&serial_control.received_command);
HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1);
serial_control.command_ready = 0; // Сбрасываем флаг serial_control.command_ready = 0; // Сбрасываем флаг
SC_ArmUart2RxDma();
} }
} }
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 (Size == 0u) {
log_printf(LOG_WARN, "UART2 RX idle event with zero size\n");
}
sc_uart2_last_packet_tick = HAL_GetTick();
sc_uart2_last_recover_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)){
log_printf(LOG_WARN, "UART2 RX invalid packet len=%u\n", (unsigned)Size);
SC_SendPacket(NULL, 0, RESP_INVALID); SC_SendPacket(NULL, 0, RESP_INVALID);
} }
g_sc_command_source = SC_SOURCE_UART2; g_sc_command_source = SC_SOURCE_UART2;
HAL_UARTEx_ReceiveToIdle_IT(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1); SC_ArmUart2RxDma();
} else if (huart->Instance == huart5.Instance) { } else if (huart->Instance == huart5.Instance) {
if (Size == 0u) {
log_printf(LOG_WARN, "UART5 RX idle event with zero size\n");
}
if (process_received_packet(&serial_iso, serial_iso.rx_buffer, Size)) { if (process_received_packet(&serial_iso, serial_iso.rx_buffer, Size)) {
g_sc_command_source = SC_SOURCE_UART5; g_sc_command_source = SC_SOURCE_UART5;
SC_CommandHandler((ReceivedCommand_t*)&serial_iso.received_command); SC_CommandHandler((ReceivedCommand_t*)&serial_iso.received_command);
} else {
log_printf(LOG_WARN, "UART5 RX invalid packet len=%u\n", (unsigned)Size);
} }
HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1); SC_ArmUart5RxDma();
} else if (huart->Instance == huart3.Instance) { } else if (huart->Instance == huart3.Instance) {
CCS_RxEventCallback(huart, Size); CCS_RxEventCallback(huart, 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);
serial_control.tx_tick = 0; serial_control.tx_tick = 0;
} else if (huart->Instance == huart3.Instance) {
CCS_TxCpltCallback(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 +178,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,24 +211,24 @@ 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) {
if (huart2.gState == HAL_UART_STATE_BUSY_TX) { if (huart2.gState != HAL_UART_STATE_READY) {
HAL_UART_Abort_IT(&huart2); (void)HAL_UART_AbortTransmit(&huart2);
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_RESET); log_printf(LOG_WARN, "UART2 TX busy, abort transmit before resend\n");
}
if (HAL_UART_Transmit_DMA(&huart2, serial_control.tx_buffer, packet_len) != HAL_OK) {
SC_LogUartError("UART2 TX DMA start failed", &huart2);
return;
} }
HAL_GPIO_WritePin(USART2_DIR_GPIO_Port, USART2_DIR_Pin, GPIO_PIN_SET);
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 +261,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 +270,68 @@ 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 int32_t since_last_packet = (int32_t)(now - sc_uart2_last_packet_tick);
if (since_last_packet >= (int32_t)SC_UART2_PACKET_TIMEOUT_MS) {
if (sc_uart2_timed_out == 0u) {
serial_control.command_ready = 0;
log_printf(LOG_WARN, "UART2 RX packet timeout (%u ms)\n", (unsigned)SC_UART2_PACKET_TIMEOUT_MS);
}
sc_uart2_timed_out = 1;
} else {
sc_uart2_timed_out = 0;
}
if ((huart2.RxState == HAL_UART_STATE_READY) &&
((int32_t)(now - sc_uart2_last_recover_tick) >= (int32_t)SC_UART2_RECOVER_GUARD_MS)) {
SC_ArmUart2RxDma();
sc_uart2_last_recover_tick = now;
}
}
static void SC_ArmUart2RxDma(void) {
if ((huart2.RxState == HAL_UART_STATE_READY) && (serial_control.command_ready == 0)) {
if (HAL_UARTEx_ReceiveToIdle_DMA(&huart2, serial_control.rx_buffer, MAX_RX_BUFFER_SIZE - 1) != HAL_OK) {
SC_LogUartError("UART2 RX DMA arm failed", &huart2);
}
}
}
static void SC_ArmUart5RxDma(void) {
if (huart5.RxState == HAL_UART_STATE_READY) {
if (HAL_UARTEx_ReceiveToIdle_IT(&huart5, serial_iso.rx_buffer, MAX_RX_BUFFER_SIZE - 1) == HAL_OK) {
return;
}
SC_LogUartError("UART5 RX IT arm failed", &huart5);
}
}
void SC_RecoverUartDma(UART_HandleTypeDef *huart) {
if (huart == &huart2) {
SC_LogUartError("UART2 recover start", &huart2);
(void)HAL_UART_AbortReceive(&huart2);
(void)HAL_UART_AbortTransmit(&huart2);
serial_control.tx_tick = 0;
SC_ArmUart2RxDma();
sc_uart2_last_recover_tick = HAL_GetTick();
} else if (huart == &huart5) {
SC_LogUartError("UART5 recover start", &huart5);
(void)HAL_UART_AbortReceive(&huart5);
SC_ArmUart5RxDma();
}
}
static void SC_LogUartError(const char *tag, UART_HandleTypeDef *huart) {
if (tag == NULL || huart == NULL) {
return;
}
log_printf(LOG_ERR, "%s: instance=0x%08lx err=0x%08lx g=%lu rx=%lu\n",
tag,
(unsigned long)huart->Instance,
(unsigned long)HAL_UART_GetError(huart),
(unsigned long)huart->gState,
(unsigned long)huart->RxState);
}
+6 -7
View File
@@ -1,14 +1,14 @@
#include "serial_control.h" #include "serial_control.h"
#include "usart.h"
#include "charger_control.h"
#include "board.h" #include "board.h"
#include "psu_control.h" #include "charger_control.h"
#include "debug.h" #include "debug.h"
#include "psu_control.h"
#include "usart.h"
#include <string.h> #include <string.h>
#ifdef USE_WEB_INTERFACE
extern volatile SC_Source_t g_sc_command_source; extern volatile SC_Source_t g_sc_command_source;
static void monitoring_data_callback(void);
IsolationStatusPacket_t ISO = { IsolationStatusPacket_t ISO = {
.isolationResistance = 0xFFFF .isolationResistance = 0xFFFF
@@ -122,7 +122,7 @@ void SC_CommandHandler(ReceivedCommand_t* cmd) {
// Колбэк для заполнения данных мониторинга // Колбэк для заполнения данных мониторинга
void monitoring_data_callback() { static void monitoring_data_callback(void) {
// Информация о зарядной сессии // Информация о зарядной сессии
statusPacket.SOC = CONN.SOC; statusPacket.SOC = CONN.SOC;
@@ -202,4 +202,3 @@ void monitoring_data_callback() {
} }
#endif
+2 -22
View File
@@ -1,11 +1,4 @@
/* #include "soft_rtc.h"
* rtc.c
*
* Created on: Jul 22, 2024
* Author: colorbass
*/
#include <soft_rtc.h>
#include <stdint.h> #include <stdint.h>
#include <time.h> #include <time.h>
@@ -63,20 +56,7 @@ uint8_t getTimeReg(uint8_t reg_number){
}else{ }else{
return 0x00; return 0x00;
} }
}; }
//int main() {
// uint32_t unix_time = 1672531199; // Example Unix timestamp
// uint8_t time[8];
//
// unix_to_bcd(unix_time, time);
//
// // Print the BCD values for verification
// for (int i = 0; i < 8; i++) {
// log_printf(LOG_INFO, "time[%d]: %02X\n", i, time[i]);
// }
//
// return 0;
//}
/** /**
* @brief Read the time counter available in RTC_CNT registers. * @brief Read the time counter available in RTC_CNT registers.
+1 -17
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32f1xx_hal_msp.c
* @brief This file provides code for the MSP Initialization
* and de-Initialization codes.
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
+108 -30
View File
@@ -1,20 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32f1xx_it.c
* @brief Interrupt Service Routines.
******************************************************************************
* @attention
*
* Copyright (c) 2024 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
@@ -22,6 +7,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,9 +43,15 @@
/* 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;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern DMA_HandleTypeDef hdma_usart3_rx;
extern DMA_HandleTypeDef hdma_usart3_tx;
extern UART_HandleTypeDef huart5; extern UART_HandleTypeDef huart5;
extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart2;
@@ -204,17 +198,101 @@ 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 DMA1 channel2 global interrupt.
*/
void DMA1_Channel2_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
/* USER CODE END DMA1_Channel2_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart3_tx);
/* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
/* USER CODE END DMA1_Channel2_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel3 global interrupt.
*/
void DMA1_Channel3_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel3_IRQn 0 */
/* USER CODE END DMA1_Channel3_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart3_rx);
/* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
/* USER CODE END DMA1_Channel3_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel6 global interrupt.
*/
void DMA1_Channel6_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel6_IRQn 0 */
/* USER CODE END DMA1_Channel6_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_rx);
/* USER CODE BEGIN DMA1_Channel6_IRQn 1 */
/* USER CODE END DMA1_Channel6_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel7 global interrupt.
*/
void DMA1_Channel7_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel7_IRQn 0 */
/* USER CODE END DMA1_Channel7_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_tx);
/* USER CODE BEGIN DMA1_Channel7_IRQn 1 */
/* USER CODE END DMA1_Channel7_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 +302,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 +330,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 +344,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 +358,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 +372,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 +386,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 -29
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file tim.c
* @brief This file provides code for the configuration
* of the TIM instances.
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "tim.h" #include "tim.h"
@@ -57,31 +41,31 @@ void MX_TIM3_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OC_Init(&htim3) != HAL_OK) if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
{ {
Error_Handler(); Error_Handler();
} }
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
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_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{ {
Error_Handler(); Error_Handler();
} }
sConfigOC.OCMode = TIM_OCMODE_TIMING; sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1; sConfigOC.Pulse = 0;
if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{ {
Error_Handler(); Error_Handler();
} }
@@ -166,7 +150,7 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE();
/* TIM3 interrupt Init */ /* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_SetPriority(TIM3_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn); HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */ /* USER CODE BEGIN TIM3_MspInit 1 */
+86 -24
View File
@@ -1,21 +1,5 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usart.c
* @brief This file provides code for the configuration
* of the USART instances.
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "usart.h" #include "usart.h"
@@ -28,6 +12,10 @@ UART_HandleTypeDef huart5;
UART_HandleTypeDef huart1; UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2; UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3; UART_HandleTypeDef huart3;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
DMA_HandleTypeDef hdma_usart3_rx;
DMA_HandleTypeDef hdma_usart3_tx;
/* UART5 init function */ /* UART5 init function */
void MX_UART5_Init(void) void MX_UART5_Init(void)
@@ -163,10 +151,10 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
PC12 ------> UART5_TX PC12 ------> UART5_TX
PD2 ------> UART5_RX PD2 ------> UART5_RX
*/ */
GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Pin = HEATER_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); HAL_GPIO_Init(HEATER_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
@@ -174,7 +162,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* UART5 interrupt Init */ /* UART5 interrupt Init */
HAL_NVIC_SetPriority(UART5_IRQn, 0, 0); HAL_NVIC_SetPriority(UART5_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(UART5_IRQn); HAL_NVIC_EnableIRQ(UART5_IRQn);
/* USER CODE BEGIN UART5_MspInit 1 */ /* USER CODE BEGIN UART5_MspInit 1 */
@@ -204,7 +192,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */ /* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn); HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE BEGIN USART1_MspInit 1 */
@@ -235,8 +223,41 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
__HAL_AFIO_REMAP_USART2_ENABLE(); __HAL_AFIO_REMAP_USART2_ENABLE();
/* USART2 DMA Init */
/* USART2_RX Init */
hdma_usart2_rx.Instance = DMA1_Channel6;
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_rx.Init.Mode = DMA_NORMAL;
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
/* USART2_TX Init */
hdma_usart2_tx.Instance = DMA1_Channel7;
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
/* USART2 interrupt Init */ /* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_SetPriority(USART2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn); HAL_NVIC_EnableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspInit 1 */ /* USER CODE BEGIN USART2_MspInit 1 */
@@ -267,8 +288,41 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
__HAL_AFIO_REMAP_USART3_PARTIAL(); __HAL_AFIO_REMAP_USART3_PARTIAL();
/* USART3 DMA Init */
/* USART3_RX Init */
hdma_usart3_rx.Instance = DMA1_Channel3;
hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart3_rx.Init.Mode = DMA_NORMAL;
hdma_usart3_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
/* USART3_TX Init */
hdma_usart3_tx.Instance = DMA1_Channel2;
hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart3_tx.Init.Mode = DMA_NORMAL;
hdma_usart3_tx.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx);
/* USART3 interrupt Init */ /* USART3 interrupt Init */
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); HAL_NVIC_SetPriority(USART3_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn); HAL_NVIC_EnableIRQ(USART3_IRQn);
/* USER CODE BEGIN USART3_MspInit 1 */ /* USER CODE BEGIN USART3_MspInit 1 */
@@ -291,7 +345,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
PC12 ------> UART5_TX PC12 ------> UART5_TX
PD2 ------> UART5_RX PD2 ------> UART5_RX
*/ */
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12); HAL_GPIO_DeInit(HEATER_GPIO_Port, HEATER_Pin);
HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
@@ -335,6 +389,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
*/ */
HAL_GPIO_DeInit(GPIOD, GPIO_PIN_5|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOD, GPIO_PIN_5|GPIO_PIN_6);
/* USART2 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmarx);
HAL_DMA_DeInit(uartHandle->hdmatx);
/* USART2 interrupt Deinit */ /* USART2 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART2_IRQn); HAL_NVIC_DisableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspDeInit 1 */ /* USER CODE BEGIN USART2_MspDeInit 1 */
@@ -355,6 +413,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
*/ */
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11);
/* USART3 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmarx);
HAL_DMA_DeInit(uartHandle->hdmatx);
/* USART3 interrupt Deinit */ /* USART3 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART3_IRQn); HAL_NVIC_DisableIRQ(USART3_IRQn);
/* USER CODE BEGIN USART3_MspDeInit 1 */ /* USER CODE BEGIN USART3_MspDeInit 1 */
-1
View File
@@ -59,7 +59,6 @@ defined in linker script */
.weak Reset_Handler .weak Reset_Handler
.type Reset_Handler, %function .type Reset_Handler, %function
Reset_Handler: Reset_Handler:
ldr sp, =_estack /* set stack pointer */
/* Call the clock system initialization function.*/ /* Call the clock system initialization function.*/
bl SystemInit bl SystemInit
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
File diff suppressed because it is too large Load Diff
+26828 -23770
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3772 -3366
View File
File diff suppressed because it is too large Load Diff
+5 -3
View File
@@ -1,3 +1,5 @@
../Core/Src/adc.c:30:6:MX_ADC1_Init 3 ../Core/Src/adc.c:13:6:ADC_ScanStart 2
../Core/Src/adc.c:72:6:HAL_ADC_MspInit 2 ../Core/Src/adc.c:21:15:HAL_ADC_ConvCpltCallback 2
../Core/Src/adc.c:106:6:HAL_ADC_MspDeInit 2 ../Core/Src/adc.c:43:6:MX_ADC1_Init 8
../Core/Src/adc.c:130:6:HAL_ADC_MspInit 3
../Core/Src/adc.c:184:6:HAL_ADC_MspDeInit 2
+14 -13
View File
@@ -1,13 +1,14 @@
../Core/Src/board.c:19:6:RELAY_Write 9 ../Core/Src/board.c:14:6:RELAY_Write 9
../Core/Src/board.c:52:9:RELAY_Read 1 ../Core/Src/board.c:47:9:RELAY_Read 1
../Core/Src/board.c:57:9:IN_ReadInput 8 ../Core/Src/board.c:52:9:IN_ReadInput 8
../Core/Src/board.c:78:9:GetBoardTemp 1 ../Core/Src/board.c:74:9:GetBoardTemp 1
../Core/Src/board.c:90:6:Init_Peripheral 1 ../Core/Src/board.c:82:13:Heater_PinForceOutput 1
../Core/Src/board.c:106:7:pt1000_to_temperature 1 ../Core/Src/board.c:95:6:Init_Peripheral 1
../Core/Src/board.c:117:7:calculate_NTC_resistance 2 ../Core/Src/board.c:114:7:pt1000_to_temperature 1
../Core/Src/board.c:132:9:CONN_ReadTemp 4 ../Core/Src/board.c:125:7:calculate_NTC_resistance 2
../Core/Src/board.c:169:9:GBT_ReadTemp 1 ../Core/Src/board.c:140:9:CONN_ReadTemp 4
../Core/Src/board.c:173:6:ADC_Select_Channel 2 ../Core/Src/board.c:159:9:GBT_ReadTemp 1
../Core/Src/board.c:184:9:ADC_TryLock 4 ../Core/Src/board.c:163:6:ADC_Select_Channel 2
../Core/Src/board.c:200:6:ADC_LockBlocking 2 ../Core/Src/board.c:174:9:ADC_TryLock 4
../Core/Src/board.c:206:6:ADC_Unlock 2 ../Core/Src/board.c:190:6:ADC_LockBlocking 2
../Core/Src/board.c:196:6:ADC_Unlock 2
+4 -4
View File
@@ -1,4 +1,4 @@
../Core/Src/can.c:31:6:MX_CAN1_Init 2 ../Core/Src/can.c:15:6:MX_CAN1_Init 2
../Core/Src/can.c:63:6:MX_CAN2_Init 2 ../Core/Src/can.c:47:6:MX_CAN2_Init 2
../Core/Src/can.c:97:6:HAL_CAN_MspInit 5 ../Core/Src/can.c:81:6:HAL_CAN_MspInit 5
../Core/Src/can.c:176:6:HAL_CAN_MspDeInit 5 ../Core/Src/can.c:160:6:HAL_CAN_MspDeInit 5
+3 -5
View File
@@ -1,5 +1,3 @@
../Core/Src/charger_control.c:11:6:CONN_Init 1 ../Core/Src/charger_control.c:10:6:CONN_Init 1
../Core/Src/charger_control.c:19:6:CONN_Loop 6 ../Core/Src/charger_control.c:18:6:CONN_Loop 6
../Core/Src/charger_control.c:41:6:CONN_Task 5 ../Core/Src/charger_control.c:39:6:CONN_SetState 16
../Core/Src/charger_control.c:57:6:CONN_SetState 16
../Core/Src/charger_control.c:83:6:CONN_PrintChargingTotal 1
+9 -9
View File
@@ -1,9 +1,9 @@
../Core/Src/cp.c:13:17:CP_ReadAdcChannel 1 ../Core/Src/cp.c:20:16:CP_ReadVoltageMv 1
../Core/Src/cp.c:26:16:CP_ReadVoltageMv 1 ../Core/Src/cp.c:37:6:CP_Init 1
../Core/Src/cp.c:39:6:CP_Init 1 ../Core/Src/cp.c:54:6:CP_SetDuty 1
../Core/Src/cp.c:56:6:CP_SetDuty 1 ../Core/Src/cp.c:67:9:CP_GetDuty 1
../Core/Src/cp.c:69:9:CP_GetDuty 1 ../Core/Src/cp.c:71:9:CP_GetVoltage 1
../Core/Src/cp.c:73:9:CP_GetVoltage 1 ../Core/Src/cp.c:76:12:CP_GetState 12
../Core/Src/cp.c:77:12:CP_GetState 12 ../Core/Src/cp.c:100:12:CP_GetFilteredState 1
../Core/Src/cp.c:101:6:CP_Loop 1 ../Core/Src/cp.c:104:6:CP_FilterState 5
../Core/Src/cp.c:105:6:HAL_TIM_OC_DelayElapsedCallback 4 ../Core/Src/cp.c:132:6:CP_Loop 5
+3 -3
View File
@@ -1,3 +1,3 @@
../Core/Src/crc.c:30:6:MX_CRC_Init 2 ../Core/Src/crc.c:14:6:MX_CRC_Init 2
../Core/Src/crc.c:51:6:HAL_CRC_MspInit 2 ../Core/Src/crc.c:35:6:HAL_CRC_MspInit 2
../Core/Src/crc.c:67:6:HAL_CRC_MspDeInit 2 ../Core/Src/crc.c:51:6:HAL_CRC_MspDeInit 2
+5 -5
View File
@@ -1,5 +1,5 @@
../Core/Src/debug.c:42:5:_write 1 ../Core/Src/debug.c:35:5:_write 1
../Core/Src/debug.c:50:6:debug_buffer_add 3 ../Core/Src/debug.c:43:6:debug_buffer_add 3
../Core/Src/debug.c:70:10:debug_buffer_available 1 ../Core/Src/debug.c:63:10:debug_buffer_available 1
../Core/Src/debug.c:79:6:debug_buffer_send 5 ../Core/Src/debug.c:72:6:debug_buffer_send 5
../Core/Src/debug.c:119:5:log_printf 3 ../Core/Src/debug.c:112:5:log_printf 3
+1
View File
@@ -0,0 +1 @@
../Core/Src/dma.c:23:6:MX_DMA_Init 1
+1 -1
View File
@@ -1 +1 @@
../Core/Src/gpio.c:44:6:MX_GPIO_Init 1 ../Core/Src/gpio.c:28:6:MX_GPIO_Init 1
+9 -8
View File
@@ -1,8 +1,9 @@
../Core/Src/main.c:64:13:VectorBase_Config 1 ../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1
../Core/Src/main.c:75:9:ED_TraceWarning 3 ../Core/Src/main.c:69:13:VectorBase_Config 1
../Core/Src/main.c:87:6:ED_Delay 3 ../Core/Src/main.c:80:9:ED_TraceWarning 3
../Core/Src/main.c:106:6:StopButtonControl 2 ../Core/Src/main.c:92:6:ED_Delay 3
../Core/Src/main.c:117:13:CAN1_MinimalReInit 3 ../Core/Src/main.c:111:13:StopButtonControl 8
../Core/Src/main.c:135:5:main 1 ../Core/Src/main.c:152:13:CAN1_MinimalReInit 3
../Core/Src/main.c:216:6:SystemClock_Config 4 ../Core/Src/main.c:170:5:main 1
../Core/Src/main.c:276:6:Error_Handler 1 ../Core/Src/main.c:251:6:SystemClock_Config 4
../Core/Src/main.c:311:6:Error_Handler 1
+1 -1
View File
@@ -1 +1 @@
../Core/Src/meter.c:17:6:METER_CalculateEnergy 3 ../Core/Src/meter.c:9:6:METER_CalculateEnergy 3
+11 -12
View File
@@ -1,12 +1,11 @@
../Core/Src/psu_control.c:33:13:PSU_SwitchState 1 ../Core/Src/psu_control.c:35:13:PSU_SwitchState 1
../Core/Src/psu_control.c:38:17:PSU_StateTime 1 ../Core/Src/psu_control.c:40:17:PSU_StateTime 1
../Core/Src/psu_control.c:42:6:HAL_CAN_RxFifo1MsgPendingCallback 9 ../Core/Src/psu_control.c:44:15:HAL_CAN_RxFifo1MsgPendingCallback 9
../Core/Src/psu_control.c:116:6:PSU_CAN_FilterInit 2 ../Core/Src/psu_control.c:118:6:PSU_CAN_FilterInit 2
../Core/Src/psu_control.c:139:6:PSU_Init 1 ../Core/Src/psu_control.c:141:6:PSU_Init 1
../Core/Src/psu_control.c:156:6:PSU_Enable 3 ../Core/Src/psu_control.c:159:6:PSU_Enable 3
../Core/Src/psu_control.c:168:6:PSU_SetHVMode 2 ../Core/Src/psu_control.c:171:6:PSU_SetHVMode 2
../Core/Src/psu_control.c:175:6:PSU_SetVoltageCurrent 5 ../Core/Src/psu_control.c:178:6:PSU_SetVoltageCurrent 5
../Core/Src/psu_control.c:202:6:PSU_SendCmd 4 ../Core/Src/psu_control.c:205:6:PSU_SendCmd 4
../Core/Src/psu_control.c:238:10:max 2 ../Core/Src/psu_control.c:240:6:PSU_ReadWrite 8
../Core/Src/psu_control.c:243:6:PSU_ReadWrite 5 ../Core/Src/psu_control.c:284:6:PSU_Task 41
../Core/Src/psu_control.c:276:6:PSU_Task 41
+6 -6
View File
@@ -1,6 +1,6 @@
../Core/Src/rgb_controller.c:92:6:LED_Write 16 ../Core/Src/rgb_controller.c:102:6:LED_Write 18
../Core/Src/rgb_controller.c:146:6:interpolateColors 3 ../Core/Src/rgb_controller.c:164:6:interpolateColors 3
../Core/Src/rgb_controller.c:164:6:RGB_SetColor 1 ../Core/Src/rgb_controller.c:182:6:RGB_SetColor 1
../Core/Src/rgb_controller.c:170:6:LED_SetColor 1 ../Core/Src/rgb_controller.c:188:6:LED_SetColor 1
../Core/Src/rgb_controller.c:175:6:LED_Init 1 ../Core/Src/rgb_controller.c:193:6:LED_Init 1
../Core/Src/rgb_controller.c:207:6:LED_Task 10 ../Core/Src/rgb_controller.c:201:6:LED_Task 10
+20 -15
View File
@@ -1,15 +1,20 @@
../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1 ../Core/Src/serial.c:65:22:uart3_log_hal_error 3
../Core/Src/serial.c:51:6:CCS_RxEventCallback 4 ../Core/Src/serial.c:85:22:uart3_arm_rx_or_log 3
../Core/Src/serial.c:61:6:CCS_SerialLoop 41 ../Core/Src/serial.c:101:15:CCS_RxEventCallback 4
../Core/Src/serial.c:206:6:CCS_Init 1 ../Core/Src/serial.c:124:15:HAL_UART_ErrorCallback 5
../Core/Src/serial.c:218:17:crc16_ibm 4 ../Core/Src/serial.c:144:6:CCS_TxCpltCallback 4
../Core/Src/serial.c:233:17:CCS_BuildPacket 4 ../Core/Src/serial.c:160:6:CCS_SerialLoop 62
../Core/Src/serial.c:249:13:CCS_SendPacket 2 ../Core/Src/serial.c:360:6:CCS_Init 1
../Core/Src/serial.c:257:13:CCS_SendResetReason 1 ../Core/Src/serial.c:375:26:crc16_ibm 3
../Core/Src/serial.c:261:6:CCS_SendEmergencyStop 1 ../Core/Src/serial.c:390:17:CCS_BuildPacket 4
../Core/Src/serial.c:265:6:CCS_SendStart 1 ../Core/Src/serial.c:406:13:CCS_SendPacket 4
../Core/Src/serial.c:269:13:CCS_CalculateEnergy 2 ../Core/Src/serial.c:423:13:CCS_SendResetReason 1
../Core/Src/serial.c:284:13:send_state 2 ../Core/Src/serial.c:427:6:CCS_SendEmergencyStop 1
../Core/Src/serial.c:311:17:expected_payload_len 11 ../Core/Src/serial.c:431:6:CCS_SendStart 1
../Core/Src/serial.c:327:13:apply_command 13 ../Core/Src/serial.c:435:13:CCS_CalculateEnergy 2
../Core/Src/serial.c:394:16:process_received_packet 6 ../Core/Src/serial.c:450:13:send_state 3
../Core/Src/serial.c:480:26:expected_payload_len 2
../Core/Src/serial.c:496:22:apply_command 15
../Core/Src/serial.c:578:25:process_received_packet 8
../Core/Src/serial.c:631:13:CCS_UART3_Watchdog 4
../Core/Src/serial.c:644:13:CCS_LogUart3Error 1
+15 -10
View File
@@ -1,10 +1,15 @@
../Core/Src/serial_control.c:59:6:ReadVersion 1 ../Core/Src/serial_control.c:72:6:ReadVersion 1
../Core/Src/serial_control.c:71:6:SC_Init 1 ../Core/Src/serial_control.c:84:6:SC_Init 1
../Core/Src/serial_control.c:77:6:SC_Task 9 ../Core/Src/serial_control.c:95:6:SC_Task 7
../Core/Src/serial_control.c:102:6:HAL_UARTEx_RxEventCallback 6 ../Core/Src/serial_control.c:123:15:HAL_UARTEx_RxEventCallback 8
../Core/Src/serial_control.c:120:6:HAL_UART_TxCpltCallback 2 ../Core/Src/serial_control.c:153:15:HAL_UART_TxCpltCallback 3
../Core/Src/serial_control.c:130:17:calculate_crc32 4 ../Core/Src/serial_control.c:164:26:calculate_crc32 3
../Core/Src/serial_control.c:147:17:encode_packet 6 ../Core/Src/serial_control.c:181:26:encode_packet 5
../Core/Src/serial_control.c:180:6:SC_SendPacket 3 ../Core/Src/serial_control.c:214:15:SC_SendPacket 4
../Core/Src/serial_control.c:197:16:parse_packet 4 ../Core/Src/serial_control.c:231:25:parse_packet 3
../Core/Src/serial_control.c:230:16:process_received_packet 2 ../Core/Src/serial_control.c:264:25:process_received_packet 2
../Core/Src/serial_control.c:273:13:SC_UART2_Watchdog 5
../Core/Src/serial_control.c:294:13:SC_ArmUart2RxDma 4
../Core/Src/serial_control.c:302:13:SC_ArmUart5RxDma 3
../Core/Src/serial_control.c:311:6:SC_RecoverUartDma 3
../Core/Src/serial_control.c:326:13:SC_LogUartError 3
+1 -1
View File
@@ -1,3 +1,3 @@
../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1 ../Drivers/CMSIS/Include/core_cm3.h:1762:34:__NVIC_SystemReset 1
../Core/Src/serial_handler.c:26:6:SC_CommandHandler 19 ../Core/Src/serial_handler.c:26:6:SC_CommandHandler 19
../Core/Src/serial_handler.c:125:6:monitoring_data_callback 1 ../Core/Src/serial_handler.c:125:13:monitoring_data_callback 1
+10 -10
View File
@@ -1,10 +1,10 @@
../Core/Src/soft_rtc.c:22:10:get_Current_Time 1 ../Core/Src/soft_rtc.c:15:10:get_Current_Time 1
../Core/Src/soft_rtc.c:26:6:set_Time 1 ../Core/Src/soft_rtc.c:19:6:set_Time 1
../Core/Src/soft_rtc.c:30:9:to_bcd 1 ../Core/Src/soft_rtc.c:23:9:to_bcd 1
../Core/Src/soft_rtc.c:34:6:unix_to_bcd 1 ../Core/Src/soft_rtc.c:27:6:unix_to_bcd 1
../Core/Src/soft_rtc.c:48:6:writeTimeReg 2 ../Core/Src/soft_rtc.c:41:6:writeTimeReg 2
../Core/Src/soft_rtc.c:53:9:getTimeReg 5 ../Core/Src/soft_rtc.c:46:9:getTimeReg 5
../Core/Src/soft_rtc.c:87:17:RTC1_ReadTimeCounter 2 ../Core/Src/soft_rtc.c:67:17:RTC1_ReadTimeCounter 2
../Core/Src/soft_rtc.c:119:26:RTC1_WriteTimeCounter 3 ../Core/Src/soft_rtc.c:99:26:RTC1_WriteTimeCounter 3
../Core/Src/soft_rtc.c:151:26:RTC1_EnterInitMode 3 ../Core/Src/soft_rtc.c:131:26:RTC1_EnterInitMode 3
../Core/Src/soft_rtc.c:178:26:RTC1_ExitInitMode 3 ../Core/Src/soft_rtc.c:158:26:RTC1_ExitInitMode 3
+1 -1
View File
@@ -1 +1 @@
../Core/Src/stm32f1xx_hal_msp.c:63:6:HAL_MspInit 1 ../Core/Src/stm32f1xx_hal_msp.c:47:6:HAL_MspInit 1
+23 -17
View File
@@ -1,17 +1,23 @@
../Core/Src/stm32f1xx_it.c:75:6:NMI_Handler 1 ../Core/Src/stm32f1xx_it.c:69:6:NMI_Handler 1
../Core/Src/stm32f1xx_it.c:90:6:HardFault_Handler 1 ../Core/Src/stm32f1xx_it.c:84:6:HardFault_Handler 1
../Core/Src/stm32f1xx_it.c:105:6:MemManage_Handler 1 ../Core/Src/stm32f1xx_it.c:99:6:MemManage_Handler 1
../Core/Src/stm32f1xx_it.c:120:6:BusFault_Handler 1 ../Core/Src/stm32f1xx_it.c:114:6:BusFault_Handler 1
../Core/Src/stm32f1xx_it.c:135:6:UsageFault_Handler 1 ../Core/Src/stm32f1xx_it.c:129:6:UsageFault_Handler 1
../Core/Src/stm32f1xx_it.c:150:6:SVC_Handler 1 ../Core/Src/stm32f1xx_it.c:144:6:SVC_Handler 1
../Core/Src/stm32f1xx_it.c:163:6:DebugMon_Handler 1 ../Core/Src/stm32f1xx_it.c:157:6:DebugMon_Handler 1
../Core/Src/stm32f1xx_it.c:176:6:PendSV_Handler 1 ../Core/Src/stm32f1xx_it.c:170:6:PendSV_Handler 1
../Core/Src/stm32f1xx_it.c:189:6:SysTick_Handler 1 ../Core/Src/stm32f1xx_it.c:183:6:SysTick_Handler 1
../Core/Src/stm32f1xx_it.c:210:6:CAN1_RX0_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:204:6:DMA1_Channel1_IRQHandler 1
../Core/Src/stm32f1xx_it.c:224:6:TIM3_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:218:6:DMA1_Channel2_IRQHandler 1
../Core/Src/stm32f1xx_it.c:238:6:USART1_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:232:6:DMA1_Channel3_IRQHandler 1
../Core/Src/stm32f1xx_it.c:252:6:USART2_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:246:6:DMA1_Channel6_IRQHandler 1
../Core/Src/stm32f1xx_it.c:266:6:USART3_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:260:6:DMA1_Channel7_IRQHandler 1
../Core/Src/stm32f1xx_it.c:280:6:UART5_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:274:6:ADC1_2_IRQHandler 1
../Core/Src/stm32f1xx_it.c:294:6:CAN2_TX_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:288:6:CAN1_RX0_IRQHandler 1
../Core/Src/stm32f1xx_it.c:308:6:CAN2_RX1_IRQHandler 1 ../Core/Src/stm32f1xx_it.c:302:6:TIM3_IRQHandler 1
../Core/Src/stm32f1xx_it.c:316:6:USART1_IRQHandler 1
../Core/Src/stm32f1xx_it.c:330:6:USART2_IRQHandler 1
../Core/Src/stm32f1xx_it.c:344:6:USART3_IRQHandler 1
../Core/Src/stm32f1xx_it.c:358:6:UART5_IRQHandler 1
../Core/Src/stm32f1xx_it.c:372:6:CAN2_TX_IRQHandler 1
../Core/Src/stm32f1xx_it.c:386:6:CAN2_RX1_IRQHandler 1
+4 -1
View File
@@ -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
+5 -5
View File
@@ -1,5 +1,5 @@
../Core/Src/tim.c:31:6:MX_TIM3_Init 8 ../Core/Src/tim.c:15:6:MX_TIM3_Init 8
../Core/Src/tim.c:95:6:MX_TIM4_Init 8 ../Core/Src/tim.c:79:6:MX_TIM4_Init 8
../Core/Src/tim.c:157:6:HAL_TIM_Base_MspInit 3 ../Core/Src/tim.c:141:6:HAL_TIM_Base_MspInit 3
../Core/Src/tim.c:187:6:HAL_TIM_MspPostInit 3 ../Core/Src/tim.c:171:6:HAL_TIM_MspPostInit 3
../Core/Src/tim.c:235:6:HAL_TIM_Base_MspDeInit 3 ../Core/Src/tim.c:219:6:HAL_TIM_Base_MspDeInit 3
+6 -6
View File
@@ -1,6 +1,6 @@
../Core/Src/usart.c:33:6:MX_UART5_Init 2 ../Core/Src/usart.c:21:6:MX_UART5_Init 2
../Core/Src/usart.c:62:6:MX_USART1_UART_Init 2 ../Core/Src/usart.c:50:6:MX_USART1_UART_Init 2
../Core/Src/usart.c:91:6:MX_USART2_UART_Init 2 ../Core/Src/usart.c:79:6:MX_USART2_UART_Init 2
../Core/Src/usart.c:120:6:MX_USART3_UART_Init 2 ../Core/Src/usart.c:108:6:MX_USART3_UART_Init 2
../Core/Src/usart.c:148:6:HAL_UART_MspInit 5 ../Core/Src/usart.c:136:6:HAL_UART_MspInit 9
../Core/Src/usart.c:279:6:HAL_UART_MspDeInit 5 ../Core/Src/usart.c:333:6:HAL_UART_MspDeInit 5
+118
View File
@@ -0,0 +1,118 @@
################################################################################
# Automatically-generated file. Do not edit!
# Toolchain: GNU Tools for STM32 (13.3.rel1)
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include Drivers/STM32F1xx_HAL_Driver/Src/subdir.mk
-include Core/Startup/subdir.mk
-include Core/Src/subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(S_DEPS)),)
-include $(S_DEPS)
endif
ifneq ($(strip $(S_UPPER_DEPS)),)
-include $(S_UPPER_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
OPTIONAL_TOOL_DEPS := \
$(wildcard ../makefile.defs) \
$(wildcard ../makefile.init) \
$(wildcard ../makefile.targets) \
BUILD_ARTIFACT_NAME := CCSModuleSW30Web
BUILD_ARTIFACT_EXTENSION := elf
BUILD_ARTIFACT_PREFIX :=
BUILD_ARTIFACT := $(BUILD_ARTIFACT_PREFIX)$(BUILD_ARTIFACT_NAME)$(if $(BUILD_ARTIFACT_EXTENSION),.$(BUILD_ARTIFACT_EXTENSION),)
# Add inputs and outputs from these tool invocations to the build variables
EXECUTABLES += \
CCSModuleSW30Web.elf \
MAP_FILES += \
CCSModuleSW30Web.map \
SIZE_OUTPUT += \
default.size.stdout \
OBJDUMP_LIST += \
CCSModuleSW30Web.list \
OBJCOPY_HEX += \
CCSModuleSW30Web.hex \
OBJCOPY_BIN += \
CCSModuleSW30Web.bin \
OBJCOPY_SREC += \
CCSModuleSW30Web.srec \
# All Target
all: main-build
# Main-build Target
main-build: CCSModuleSW30Web.elf secondary-outputs
# Tool invocations
CCSModuleSW30Web.elf CCSModuleSW30Web.map: $(OBJS) $(USER_OBJS) /Users/colorbass/STM32CubeIDE/workspace_1.12.0/CCSModuleSW30Web/STM32F107VCTX_FLASH.ld makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-gcc -o "CCSModuleSW30Web.elf" @"objects.list" $(USER_OBJS) $(LIBS) -mcpu=cortex-m3 -T"/Users/colorbass/STM32CubeIDE/workspace_1.12.0/CCSModuleSW30Web/STM32F107VCTX_FLASH.ld" --specs=nosys.specs -Wl,-Map="CCSModuleSW30Web.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -u _printf_float -Wl,--start-group -lc -lm -Wl,--end-group
@echo 'Finished building target: $@'
@echo ' '
default.size.stdout: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-size $(EXECUTABLES)
@echo 'Finished building: $@'
@echo ' '
CCSModuleSW30Web.list: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-objdump -h -S $(EXECUTABLES) > "CCSModuleSW30Web.list"
@echo 'Finished building: $@'
@echo ' '
CCSModuleSW30Web.hex: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-objcopy -O ihex $(EXECUTABLES) "CCSModuleSW30Web.hex"
@echo 'Finished building: $@'
@echo ' '
CCSModuleSW30Web.bin: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-objcopy -O binary $(EXECUTABLES) "CCSModuleSW30Web.bin"
@echo 'Finished building: $@'
@echo ' '
CCSModuleSW30Web.srec: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
arm-none-eabi-objcopy -O srec $(EXECUTABLES) "CCSModuleSW30Web.srec"
@echo 'Finished building: $@'
@echo ' '
# Other Targets
clean:
-$(RM) CCSModuleSW30Web.bin CCSModuleSW30Web.elf CCSModuleSW30Web.hex CCSModuleSW30Web.list CCSModuleSW30Web.map CCSModuleSW30Web.srec default.size.stdout
-@echo ' '
secondary-outputs: $(SIZE_OUTPUT) $(OBJDUMP_LIST) $(OBJCOPY_HEX) $(OBJCOPY_BIN) $(OBJCOPY_SREC)
fail-specified-linker-script-missing:
@echo 'Error: Cannot find the specified linker script. Check the linker settings in the build configuration.'
@exit 2
warn-no-linker-script-specified:
@echo 'Warning: No linker script specified. Check the linker settings in the build configuration.'
.PHONY: all clean dependents main-build fail-specified-linker-script-missing warn-no-linker-script-specified
-include ../makefile.targets
+1
View File
@@ -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"
-9
View File
@@ -1,9 +0,0 @@
MIT License
Copyright (c) 2024 EDISON
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+139 -3
View File
@@ -1,5 +1,141 @@
# GbTModuleSW # CCSModuleSW30Web
Программное обеспечение для блока управления зарядом Gb/T Прошивка контроллера DC-зарядного модуля на STM32F107 (STM32CubeIDE).
Проект реализует управление зарядной сессией, обработку состояния EV по CP-линии, управление силовым блоком через CAN и обмен с верхним уровнем по UART.
Git-репозиторий: https://git.141922.ru/EDISON/GbTModuleSW30Web ## Архитектура прошивки
Логика разделена на несколько уровней:
- Оркестрация и планировщик задач: `Core/Src/main.c`
- Состояния зарядной сессии и протокол с Everest: `Core/Src/serial.c`
- Управление силовой частью и контакторами: `Core/Src/psu_control.c`
- Обработка CP (PWM/состояние EV): `Core/Src/cp.c`
- Единая модель состояния коннектора: `Core/Src/charger_control.c`, `Core/Inc/charger_control.h`
- Локальный протокол управления/мониторинга: `Core/Src/serial_control.c`, `Core/Src/serial_handler.c`
- Низкоуровневое управление платой: `Core/Src/board.c`, `Core/Src/gpio.c`, `Core/Src/can.c`, `Core/Src/usart.c`
## Основной цикл и выполнение задач
`main()` инициализирует периферию и подсистемы (`CCS_Init`, `SC_Init`, `PSU_Init`, `CONN_Init`), после чего переходит в бесконечный цикл.
В основном цикле выполняются:
- `PSU_ReadWrite()` — цикл опроса/команд силового блока и расчёт целевых значений.
- `PSU_Task()` — state machine силовой части, включение/выключение контакторов, контроль аварий.
- `METER_CalculateEnergy()` — расчёт энергии.
- `CONN_Loop()` — консолидация ошибок и общих флагов состояния сессии.
- `LED_Write()` — применение рассчитанного состояния индикации.
Ключевой механизм: `ED_Delay()` используется как кооперативный мини-планировщик и внутри задержки вызывает:
- `CCS_SerialLoop()` — обмен с Everest и переходы состояния коннектора;
- `StopButtonControl()` — обработка кнопки STOP/FORCE UNLOCK/RESET;
- `CP_Loop()` — чтение и фильтрация состояния CP;
- `CONN_Task()` — управление индикацией/сигнализацией;
- `LED_Task()` — анимация RGB;
- `SC_Task()` — локальный UART-протокол.
Таким образом, даже во время "задержек" критичные сервисные задачи продолжают выполняться.
## Модель управления зарядной сессией
Центр логики сессии находится в `CCS_SerialLoop()` (`serial.c`).
Она работает как state machine EVSE-стороны и переводит систему между состояниями:
- неизвестное/инициализация,
- отсутствие автомобиля,
- требование авторизации,
- подключено/заряд,
- режим переподключения,
- отключено по команде или по таймауту связи.
Переходы определяются комбинацией факторов:
- текущее состояние CP (автомобиль не подключен/подключен/готов),
- команды внешней системы (`start`, `stop`, `force unlock`),
- разрешение выдачи мощности (`EnableOutput`),
- наличие ошибок в силовой части и контакторах,
- состояние обмена с Everest.
Структура `CONN` выступает как единый контейнер рабочего состояния сессии, где сводятся:
- требуемые напряжение/ток,
- разрешение на выдачу мощности,
- команда оператора (start/stop/unlock),
- текущая стадия сессии,
- ошибки коннектора/силовой части.
## CP-линия и взаимодействие с EV
`cp.c` отвечает за:
- генерацию PWM на CP-линии (`CP_SetDuty`),
- измерение уровня CP и преобразование в дискретное состояние EV,
- цифровую фильтрацию переходов состояния (`CP_FilterState`) для подавления дребезга.
Команды верхнего уровня могут менять duty CP, что влияет на допустимый ток/режим со стороны EV.
Результат фильтрации CP непосредственно используется в state machine сессии (`serial.c`).
## Силовая часть и контакторы
`psu_control.c` реализует state machine источника питания и цепи контакторов:
- инициализация и проверка готовности PSU;
- отправка уставок напряжения/тока;
- включение/выключение силовой части;
- ожидание подтверждений и контроль таймаутов;
- контроль обратной связи контактора;
- аварийный останов при несогласованности состояния.
Управление силовыми выходами выполняется через реле платы (`RELAY_AC`, `RELAY_DC`), а факт замыкания контролируется входом обратной связи контактора.
При неисправностях флаги `contactor_fault`/`psu_fault` поднимаются и транслируются в общую модель `CONN`, что блокирует дальнейшую выдачу мощности.
## Интерфейсы обмена
### UART3: канал к Everest
`serial.c` реализует пакетный обмен с CRC:
- приём команд, их валидация и применение к текущей сессии;
- отправка телеметрии/состояния с фиксированной периодикой;
- обработка ошибок UART и восстановление DMA-приёма.
Встроен watchdog канала: при потере связи сначала выдаётся предупреждение, затем выполняется защитный переход в безопасное состояние с остановкой выдачи мощности.
### UART2/UART5: локальное управление и мониторинг
`serial_control.c` и `serial_handler.c` реализуют отдельный локальный протокол:
- разбор пакетов и CRC32-проверка;
- команды чтения состояния/информации;
- команды управления (разрешение заряда, ограничение мощности, reset и т.д.);
- публикация телеметрии.
### CAN2: управление силовым источником
`psu_control.c` использует CAN2 для обмена с PSU:
- передача управляющих команд и уставок;
- запрос/получение телеметрии;
- обработка приёмных кадров в callback и обновление внутренних переменных состояния.
## Защиты и отказобезопасность
В прошивке заложены независимые защитные механизмы:
- E-STOP (короткое/долгое/очень долгое удержание): stop, force unlock, reset.
- Потеря обмена с Everest: автоматическая остановка зарядки и перевод в безопасное состояние.
- Контроль контактора: проверка соответствия команды и физической обратной связи.
- Таймауты включения/выключения PSU: переход в fault при отсутствии ожидаемого подтверждения.
- Фильтрация CP-переходов: исключение ложных переключений от помех.
## Где смотреть ключевую логику в первую очередь
Для быстрого входа в проект:
- `Core/Src/main.c` — архитектурный "скелет" и расписание вызовов.
- `Core/Src/serial.c` — главная state machine зарядной сессии.
- `Core/Src/psu_control.c` — силовая логика, контакторы, fault-handling.
- `Core/Src/cp.c` — физика CP и распознавание состояния EV.
- `Core/Src/serial_control.c` + `Core/Src/serial_handler.c` — локальный протокол управления.
-24340
View File
File diff suppressed because it is too large Load Diff
-962
View File
@@ -1,962 +0,0 @@
374.791687 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
374.792987 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
374.841712 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
374.842985 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
374.891669 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
374.892988 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
374.941686 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
374.942983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
374.951677 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
374.991681 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
374.992985 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.001791 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
375.001797 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.011003 1 1ceb56f4x Rx d 8 01 21 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
375.021033 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
375.023025 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.041735 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.042982 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.091659 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.092984 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.141706 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.142981 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.191684 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.192998 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.201675 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
375.241679 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.242992 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.251799 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
375.251801 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.261001 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
375.271012 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
375.271014 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.291682 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.293003 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.341706 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.342996 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.391682 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.392983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.441684 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.442982 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.451686 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
375.491716 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.492985 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.501676 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
375.502994 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.510999 1 1ceb56f4x Rx d 8 01 1C 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
375.521017 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
375.521019 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.541705 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.542990 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.591674 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.592986 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.641689 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.643005 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.691672 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.692984 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.701658 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
375.741668 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.742987 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.751827 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
375.751828 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.760997 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
375.771020 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
375.771022 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
375.791674 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.792994 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.841689 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.842980 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.891676 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.892994 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.941705 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.942987 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
375.951634 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
375.991658 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
375.992986 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.001774 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
376.001775 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.010993 1 1ceb56f4x Rx d 8 01 1C 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
376.020999 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
376.021001 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.041665 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.042987 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.091670 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.093025 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.141708 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.142988 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.191709 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.192994 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.201671 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
376.241676 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.242979 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.251786 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
376.251787 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.261011 1 1ceb56f4x Rx d 8 01 1C 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
376.271003 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
376.271005 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.291650 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.293019 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.341682 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.342987 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.391667 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.393019 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.441646 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.442983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.451660 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
376.491736 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.492988 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.501814 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
376.501816 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.510998 1 1ceb56f4x Rx d 8 01 1C 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
376.521002 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
376.523014 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.541654 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.543016 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.591679 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.592987 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.641679 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.642986 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.691663 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.692982 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.701671 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
376.741659 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.742989 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.751736 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
376.751744 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.761018 1 1ceb56f4x Rx d 8 01 3A 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
376.770989 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
376.770990 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
376.791657 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.793019 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.841681 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.842984 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.891671 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.892987 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.941651 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.942982 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
376.951639 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
376.991651 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
376.993000 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.001797 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
377.001799 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.010999 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
377.021036 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
377.021038 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.041673 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.042983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.091663 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.092983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.141662 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.142981 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.191660 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.193007 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.201636 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
377.241635 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.242986 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.251745 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
377.251746 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.261012 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
377.271021 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
377.271025 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.291653 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.292991 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.341643 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.342983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.391671 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.392988 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.441636 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.442997 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.451647 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
377.491672 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.492986 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.501753 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
377.501755 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.511028 1 1ceb56f4x Rx d 8 01 17 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
377.521023 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
377.521025 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.541656 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.542991 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.591681 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.592986 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.641644 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.642990 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.691647 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.692989 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.701640 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
377.741636 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.742983 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.751743 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
377.751744 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.761006 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
377.771002 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
377.771004 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
377.791624 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.793012 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.841623 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.842990 1 1812f456x Rx d 8 12 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.891614 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.892984 1 1812f456x Rx d 8 08 11 92 0D 38 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.941650 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.942981 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
377.951613 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
377.991618 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
377.992988 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.001771 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
378.001773 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.011030 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
378.021016 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
378.023015 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.041626 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.042984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.091636 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.092990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.141637 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.142985 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.191620 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.192982 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.201633 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
378.241614 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.242984 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.251734 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
378.251736 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.261039 1 1ceb56f4x Rx d 8 01 1C 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
378.271028 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
378.271031 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.291620 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.292992 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.341632 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.342991 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.391626 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.392988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.441628 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.442981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.451649 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
378.491647 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.492988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.501666 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
378.502994 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.511004 1 1ceb56f4x Rx d 8 01 21 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
378.521001 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
378.521003 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.541632 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.543019 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.591604 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.592983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.641632 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.642988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.691613 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.692981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.701627 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
378.741623 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.743030 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.751681 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
378.751683 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.760994 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
378.771003 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
378.771006 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
378.791626 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.793019 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.841634 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.842984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.891636 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.892982 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.941629 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.942978 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
378.951611 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
378.991652 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
378.992999 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.001717 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
379.001719 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.011002 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
379.021025 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
379.021033 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.041630 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.042994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.091608 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.092981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.141604 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.142981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.191586 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.192988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.201610 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
379.241636 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.242988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.251712 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
379.251714 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.261011 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
379.270995 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
379.270997 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.291605 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.292997 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.341643 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.342983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.391620 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.393023 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.441618 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.442981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.451618 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
379.491603 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.492982 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.501687 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
379.501689 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.511021 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
379.520995 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
379.523013 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.541603 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.542986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.591577 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.592986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.641601 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.643032 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.691594 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.692989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.701579 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
379.741625 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.742978 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.751707 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
379.751709 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.761022 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
379.771000 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
379.771003 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
379.791602 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.793010 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.841603 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.842983 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.891623 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.892986 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.941630 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.942989 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
379.951590 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
379.991598 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
379.992986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.001629 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
380.002993 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.010998 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
380.020998 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
380.021001 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.041579 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.043000 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.091583 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.093004 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.141605 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.142980 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.191594 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.192988 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.201582 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
380.241581 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.242986 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.251690 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
380.251691 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.261037 1 1ceb56f4x Rx d 8 01 21 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
380.271012 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
380.271014 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.291620 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.293021 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.341604 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.342988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.391570 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.393015 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.441620 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.442984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.451566 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
380.491611 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.492986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.501690 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
380.501691 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.511046 1 1ceb56f4x Rx d 8 01 21 11 8E 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
380.521002 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
380.521004 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.541603 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.543017 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.591586 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.592990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.641562 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.642991 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.691598 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.692994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.701590 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
380.741556 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.742983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.751697 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
380.751699 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.760992 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
380.770997 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
380.770999 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
380.791579 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.792992 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.841555 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.842988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.891603 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.892989 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.941578 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.943040 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
380.951580 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
380.991578 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
380.992993 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.001666 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
381.001667 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.011004 1 1ceb56f4x Rx d 8 01 26 11 8E 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
381.021022 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
381.023015 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.041576 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.042994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.091555 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.092989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.141582 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.142988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.191599 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.192982 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.201556 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
381.241617 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.242983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.251641 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
381.251643 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.261030 1 1ceb56f4x Rx d 8 01 21 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
381.270989 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
381.270990 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.291580 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.292987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.341567 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.342984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.391567 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.392997 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.441595 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.442988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.451576 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
381.491568 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.492988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.501598 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
381.502989 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.511034 1 1ceb56f4x Rx d 8 01 21 11 8E 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
381.520993 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
381.520995 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.541555 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.542990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.591587 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.593021 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.641579 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.643031 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.691589 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.692984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.701539 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
381.741561 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.742983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.751664 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
381.751665 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.761009 1 1ceb56f4x Rx d 8 01 30 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
381.771027 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
381.771029 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
381.791579 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.792993 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.841608 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.842985 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.891553 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.892994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.941580 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.942990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
381.951560 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
381.991586 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
381.992998 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.001648 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
382.001650 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.011005 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
382.020999 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
382.021001 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.041581 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.043020 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.091567 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.092990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.141584 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.143012 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.191543 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.193028 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.201541 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
382.241546 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.242979 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.251655 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
382.251656 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.261018 1 1ceb56f4x Rx d 8 01 21 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
382.271008 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
382.271010 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.291534 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.293008 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.341580 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.342988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.391559 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.392997 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.441539 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.442982 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.451523 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
382.491565 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.492987 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.501678 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
382.501680 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.511007 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
382.520994 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
382.523024 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.541539 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.543021 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.591561 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.592984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.641556 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.642986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.691548 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.692990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.701539 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
382.741547 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.743025 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.751657 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
382.751659 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.760997 1 1ceb56f4x Rx d 8 01 12 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
382.771000 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
382.771003 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
382.791577 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.792987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.841549 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.842982 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.891544 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.893029 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.941558 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.942994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
382.951528 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
382.991519 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
382.992987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.001566 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
383.002997 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.011022 1 1ceb56f4x Rx d 8 01 26 11 8E 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
383.021021 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
383.021024 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.041574 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.042986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.091549 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.092983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.141567 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.142987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.191555 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.192984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.201570 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
383.241501 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.242994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.251630 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
383.251632 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.261023 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
383.271016 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
383.271018 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.291592 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.292994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.341552 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.342984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.391550 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.392988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.441571 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.442998 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.451524 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
383.491557 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.492986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.501655 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
383.501657 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.511006 1 1ceb56f4x Rx d 8 01 17 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
383.520997 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
383.521000 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.541546 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.543020 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.591540 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.592991 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.641527 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.642985 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.691529 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.692992 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.701495 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
383.741574 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.742987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.751641 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
383.751643 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.760997 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
383.771007 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
383.771010 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
383.791556 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.792996 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.841554 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.843038 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.891501 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.893019 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.941491 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.942989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
383.951521 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
383.991529 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
383.992990 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.001657 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
384.001659 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.011027 1 1ceb56f4x Rx d 8 01 17 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
384.020995 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
384.020997 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.041500 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.043000 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.091504 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.092991 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.141507 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.143039 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.191541 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.192981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.201495 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
384.241529 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.243011 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.251636 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
384.251637 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.261007 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
384.271033 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
384.271036 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.291518 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.293038 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.341520 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.342984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.391495 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.392987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.441529 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.442987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.451508 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
384.491542 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.492998 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.501513 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
384.502987 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.511014 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
384.521024 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
384.521027 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.541529 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.543000 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.591518 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.593020 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.641520 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.642985 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.691504 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.692987 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.701507 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
384.741507 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.742999 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.751597 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
384.751598 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.761002 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
384.771011 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
384.771013 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
384.791511 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.792996 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.841515 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.842988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.891489 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.892997 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.941495 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.942984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
384.951496 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
384.991501 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
384.992990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.001640 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
385.001642 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.010999 1 1ceb56f4x Rx d 8 01 30 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
385.020997 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
385.020999 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.041477 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.042994 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.091502 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.092991 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.141514 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.142990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.191508 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.192985 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.201496 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
385.241493 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.243000 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.251609 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
385.251611 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.261004 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
385.270999 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
385.271001 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.291480 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.292987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.341509 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.342991 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.391485 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.393020 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.441483 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.442997 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.451469 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
385.491495 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.492993 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.501587 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
385.501593 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.511019 1 1ceb56f4x Rx d 8 01 17 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
385.521007 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
385.521009 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.541500 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.543025 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.591501 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.593014 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.641530 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.642989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.691562 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.692988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.701470 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
385.741535 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.743035 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.751597 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
385.751598 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.760998 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
385.770997 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
385.770999 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
385.791494 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.792983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.841547 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.842981 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.891490 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.892979 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.941546 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.942983 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
385.951512 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
385.991485 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
385.992984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.001503 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
386.002999 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.011030 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
386.020995 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
386.020997 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.041501 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.042989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.091488 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.092984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.141504 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.142988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.191467 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.192988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.201435 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
386.241495 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.242991 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.251544 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
386.251546 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.261024 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
386.271004 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
386.271006 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.291525 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.293018 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.341472 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.342988 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.391490 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.392984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.441491 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.442984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.451474 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
386.491482 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.492987 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.501586 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
386.501588 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.510996 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
386.521011 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
386.521013 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.541458 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.543028 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.591450 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.592975 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.641507 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.642986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.691498 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.692999 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.701477 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
386.741476 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.743019 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.751604 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
386.751606 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.761039 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
386.771001 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
386.771003 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
386.791465 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.792988 1 1812f456x Rx d 8 08 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.841508 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.842986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.891468 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.892986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.941490 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.943033 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
386.951440 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
386.991466 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
386.992986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.001558 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
387.001560 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.010992 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
387.020996 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
387.020998 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.041455 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.042997 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.091473 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.092990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.141472 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.142988 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.191466 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.193000 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.201439 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
387.241462 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.242984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.251599 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
387.251601 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.260998 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
387.271002 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
387.271004 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.291455 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.293012 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.341491 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.343009 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.391468 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.392992 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.441471 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.442984 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.451436 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
387.491458 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.492985 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.501479 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
387.503005 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.511013 1 1ceb56f4x Rx d 8 01 26 11 8E 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
387.521022 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
387.521024 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.541474 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.543006 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.591468 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.593009 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.641480 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.642990 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.691492 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.692986 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.701459 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
387.741460 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.742985 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.751580 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
387.751583 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.760991 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
387.771007 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
387.771010 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
387.791480 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.793006 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.841463 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.842993 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.891430 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.892989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.941487 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.942989 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
387.951430 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
387.991431 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
387.993003 1 1812f456x Rx d 8 12 11 92 0D 39 00 FD FF Length = 0 BitCount = 0 ID = 403895382x
388.001551 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
388.001552 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.011013 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
388.021025 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
388.021027 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.041442 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.091465 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.141440 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.191455 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.201432 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
388.241486 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.251511 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
388.251512 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.261005 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
388.271028 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
388.271030 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.291429 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.341450 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.391444 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.441443 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.451440 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
388.491430 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.501538 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
388.501540 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.511001 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
388.521003 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
388.521005 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.541430 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.591427 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.641419 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.691483 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.701435 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
388.741444 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.751527 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
388.751529 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.761014 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
388.771009 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
388.771012 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
388.791435 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.841457 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.891432 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.941442 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
388.951424 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
388.991456 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.001451 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
389.002996 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.011003 1 1ceb56f4x Rx d 8 01 26 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
389.021010 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
389.021012 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.041419 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.091438 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.141443 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.191451 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.201415 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
389.241444 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.251537 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
389.251539 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.260996 1 1ceb56f4x Rx d 8 01 2B 11 98 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
389.271001 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
389.271003 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.291416 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.341423 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.391435 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.441485 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
389.441488 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.442985 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.451011 1 1ceb56f4x Rx d 8 01 D9 12 D4 0D 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
389.453010 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
389.453011 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
389.461033 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
389.461035 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.491436 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.541443 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.591434 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.641429 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.691439 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.701547 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
389.701549 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
389.703043 1 181356f4x Rx d 7 38 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
389.703044 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.710992 1 1ceb56f4x Rx d 8 01 D9 12 CE 0E 83 F1 3E Length = 0 BitCount = 0 ID = 485185268x
389.721003 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
389.721007 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.741401 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.791394 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.841435 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.891435 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.941436 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
389.951468 1 1cec56f4x Rx d 8 10 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485250804x
389.951470 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
389.952996 1 181356f4x Rx d 7 3C 4A 00 46 00 00 D0 Length = 0 BitCount = 0 ID = 403920628x
389.952998 1 1cecf456x Rx d 8 11 02 01 FF FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.961004 1 1ceb56f4x Rx d 8 01 D4 12 50 0F 82 F1 3E Length = 0 BitCount = 0 ID = 485185268x
389.971000 1 1ceb56f4x Rx d 8 02 75 00 FF FF FF FF FF Length = 0 BitCount = 0 ID = 485185268x
389.971002 1 1cecf456x Rx d 8 13 09 00 02 FF 00 11 00 Length = 0 BitCount = 0 ID = 485291094x
389.991429 1 181056f4x Rx d 5 C0 12 B8 0B 02 Length = 0 BitCount = 0 ID = 403724020x
390.201394 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
390.451445 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
390.701420 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
390.952097 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
391.202037 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
391.452179 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
391.702096 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
391.952105 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
392.202110 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
392.452104 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
392.702103 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
392.951453 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
393.201622 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
393.451409 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
393.702121 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
393.951449 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
394.202089 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
394.452088 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
394.702061 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
394.952032 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
395.201623 1 81e56f4x Rx d 4 F0 F0 F1 FC Length = 0 BitCount = 0 ID = 136206068x
End TriggerBlock
+133
View File
@@ -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-пинов.
---
*Документ сгенерирован для фиксации контекста сессии; при дальнейших правках кода имеет смысл обновлять соответствующие разделы вручную.*
-320
View File
@@ -1,320 +0,0 @@
Startup (type 'help' for command list)
CONN_Initializing
CONN_Available
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
GBT_DISABLED
CONN_Preparing
CONN_Charging
GBT_S3_STARTED
GBT_S31_WAIT_BHM
GBT_S4_ISOTEST
GBT_S5_BAT_INFO
GBT_S6_BAT_STAT
EV info:
GBT_ver V1.10
Battery type: 6
Battery capacity: 1525
Battery voltage: 7090
Battery vendor:
Battery SN: 257
Battery manufacture date: 255.255.1985
Battery cycles: 255
Own auto: 255
EVIN: L6T79ZCE6RP431111
EV_SW_VER:
GBT_S7_BMS_WAIT
Battery info:
maxCV 4V
maxCC 0A
totE 108kWh
maxCV 844V
maxT 60C
SOC 94p
Volt. 530V
GBT_S8_INIT_CHARGER
GBT_S9_WAIT_BCL
GBT_S10_CHARGING
CONN_Charging
2! (2)(k
!ѡQ)
Bš&ee — +.$HQ2 -h
(k%RLGH8Ъ -ɩh, f- +.$HQ2 2! (b ƔHP5PQ)(kRLGH8Ъ -ɩh, f- +.$HQ2 2! (B ƔHP5PQ)(k%RLGHP++J8Ъ h, f- +.$HQ2 2! (B ƔHP5PQ)
Bš&ee  +2! (2)(k
!ѡ
CONN_Available
GBT_DISABLED
CONN_Preparing
CONN_Charging
GBT_S3_STARTED
GBT_S31_WAIT_BHM
GBT_S4_ISOTEST
GBT_S5_BAT_INFO
GBT_S6_BAT_STAT
EV info:
GBT_ver V1.10
Battery type: 6
Battery capacity: 1525
Battery voltage: 7090
Battery vendor:
Battery SN: 257
Battery manufacture date: 255.255.1985
Battery cycles: 255
Own auto: 255
EVIN: L6T79ZCE6RP431111
EV_SW_VER:
GBT_S7_BMS_WAIT
Battery info:
maxCV 4V
maxCC 0A
totE 108kWh
maxCV 844V
maxT 60C
SOC 98p
Volt. 390V
GBT_S8_INIT_CHARGER
GBT_S9_WAIT_BCL
GBT_S10_CHARGING
CONN_Charging
-----
GBT_DISABLED
BEM Received, force stopping...
BEM: F0 F0 F1 FC 00 00 0F FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F1 FC 00 00 3F FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F1 FC 00 00 01 FF
GBT_COMPLETE
GBT_DISABLED
CONN_Finishing
CONN_Available
-----
CONN_Charging
GBT_S3_STARTED
GBT_S31_WAIT_BHM
GBT_S4_ISOTEST
GBT_S5_BAT_INFO
GBT_S6_BAT_STAT
EV info:
GBT_ver V1.10
Battery type: 6
Battery capacity: 1525
Battery voltage: 7090
Battery vendor:
Battery SN: 257
Battery manufacture date: 255.255.1985
Battery cycles: 255
Own auto: 255
EVIN: L6T79ZCE6RP431111
EV_SW_VER:
GBT_S7_BMS_WAIT
Battery info:
maxCV 4V
maxCC 0A
totE 108kWh
maxCV 844V
maxT 60C
SOC 98p
Volt. 825V
GBT_S8_INIT_CHARGER
GBT_S9_WAIT_BCL
GBT_S10_CHARGING
CONN_Charging
CONN_Available
GBT_DISABLED
CONN_Preparing
CONN_Charging
GBT_S3_STARTED
GBT_S31_WAIT_BHM
GBT_S4_ISOTEST
GBT_S5_BAT_INFO
GBT_S6_BAT_STAT
EV info:
GBT_ver V1.10
Battery type: 6
Battery capacity: 1525
Battery voltage: 7090
Battery vendor:
Battery SN: 257
Battery manufacture date: 255.255.1985
Battery cycles: 255
Own auto: 255
EVIN: L6T79ZCE6RP431111
EV_SW_VER:
BST Received, stopping...
BST: 01 00 00 F0 00 00 0F FF
GBT_STOP
BST Received, stopping...
BST: 01 00 00 F0 00 00 3F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 7F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 FF FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 00 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 01 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 01 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 03 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 03 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 07 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 07 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 0F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 0F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 1F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 1F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 3F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 3F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 7F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 7F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 00 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 00 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 01 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 01 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 03 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 03 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 07 FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 0F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 0F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 1F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 1F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 3F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 3F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 7F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 7F FF
BST Received, stopping...
BST: 01 00 00 F0 00 00 3F FF
GBT_STOP_CSD
GBT_COMPLETE
CONN_Suspended_EV
GBT_DISABLED
CONN_Finishing
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
BEM Received, force stopping...
BEM: F0 F0 F0 FD FF FF FF FF
GBT_COMPLETE
CONN_Available
GBT_DISABLED
-146
View File
@@ -1,146 +0,0 @@
---
name: gbt-to-ccs-port
overview: Перенос прошивки модуля GBT на CCS с сохранением логики силовой части и веб-интерфейса, интеграцией готового CCS-стека из проекта CS60DC_CCS_STM32 и разделением двух независимых UART-протоколов.
todos:
- id: analyze-gbt-project
content: Просмотреть проект `GbTModuleSW30Web` (main, PSU, CONN, LED, веб/диагностика) и зафиксировать все места, где используется GBT-логика (функции GBT_*, структуры, CAN2 и т.п.).
status: completed
- id: extract-ccs-modules
content: Выделить из `CS60DC_CCS_STM32` полный набор CCS-модулей (cp, serial, charger_ccs, структуры CCS_EDCAN_*) и их зависимости (EDCAN, board, adc_filter) для переноса.
status: completed
- id: wire-cp-and-uart3
content: Спланировать привязку CP (ADC1_IN4 и PWM на PA7) и перенастройку CCS-протокола на USART3 в проекте модуля, учитывая текущую конфигурацию таймеров и UART в `GbTModuleSW30Web`.
status: completed
- id: rewrite-main-loop
content: Спроектировать новое содержимое `main()` и `ED_Delay()` в `GbTModuleSW30Web`, убрав GBT-задачи и интегрировав CCS_SerialLoop, CP_Loop, EDCAN_Loop и существующие PSU/METER/CONN/LED/StopButton задачи.
status: completed
- id: clean-gbt-and-keep-can1
content: Определить, какие файлы/части кода GBT можно удалить или заглушить, при этом оставив инициализацию CAN1 и минимально необходимый код для корректной работы bootloader и EDCAN.
status: completed
- id: adapt-web-diagnostics
content: "Наметить изменения веб-интерфейса и диагностического протокола: заменить источники данных с GBT на CCS-структуры, сохранив максимально существующую функциональность."
status: in_progress
- id: define-test-plan
content: Уточнить и зафиксировать подробный тест-план для стендовой проверки новой CCS-прошивки (переходы состояний CP/EVSE, обмен по USART3, защитные сценарии и регрессия веб/диагностики).
status: pending
isProject: false
---
## Цель
Сделать новую прошивку для платы модуля, основанную на проекте `GbTModuleSW30Web`, которая:
- **полностью избавлена от GBT-логики и GBT-протоколов**,
- **использует CCS-алгоритмы и протокол** из проекта `[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)`,
- **сохраняет силовую часть и веб/диагностический функционал** существующей GBT-прошивки,
- использует **два независимых UART**: существующий (как в GBT) + новый `USART3` под CCS-протокол,
- сохраняет **инициализацию CAN1 как заглушку**, но не использует старый GBT‑CAN.
## Архитектура на целевом проекте
- **Базовый проект**: берем за основу прошивку модуля GBT — `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)`.
- **Источник CCS-логики**: переносим state machine и протокол CCS из `[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)` и связанных файлов:
- `[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)` — протокол MCU↔Everest (через UART, сейчас `huart1`),
- `[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)` — формирование и измерение CP (PWM+ADC),
- `[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)` + соответствующие заголовки и типы `CCS_*` и `CCS_EDCAN_*`.
- **Распределение UART**:
- существующий UART из GBT‑прошивки **оставляем без изменений** (диагностика / веб / что используется сейчас),
- **добавляем `USART3` для CCS‑протокола**, берём настройки (baud, parity и т.п.) из `CS60DC_CCS_STM32` (там CCS сейчас сидит на `USART1`, но параметры переносим на `USART3`).
- **CAN1**:
- оставляем `MX_CAN1_Init()` и базовую инициализацию как заглушку (по требованию),
- старые GBT‑обработчики CAN и `GBT_CAN_ReInit()` удаляем или заменяем пустыми/адаптированными вызовами к EDCAN при необходимости.
- **Силовая часть, реле, измерения**:
- логика `PSU_*`, `METER_*`, `CONN_*`, `LED_*` и Stop/E‑Stop остаётся из GBT‑проекта,
- управление главным DC‑контактором остаётся как в `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)` и связанных файлах, но команды/состояния будут приходить из CCS‑логики.
## План изменения `main.c` и ядра логики
- **Инициализация (start‑up)**:
- в `[GbTModuleSW30Web/Core/Src/main.c](GbTModuleSW30Web/Core/Src/main.c)` сохраняем логику OpenBLT/VectorBase (`VectorBase_Config()` и т.п.);
- после стандартной HAL‑инициализации (`HAL_Init`, `HAL_RCC_DeInit`, `SystemClock_Config`, `MX_GPIO_Init` и т.д.)
- оставляем инициализацию общих периферий: `GPIO`, `ADC1`, `CAN1`, `RTC`, `TIM4` (если используется для других задач), существующие UART (2/5/1) и `USART3`;
- **убираем GBT‑специфичные инициализации**: `GBT_Init()`, `GBT_SetConfig()`, `GBT_CAN_ReInit()`, прямые вызовы `charger_gbt.h`, `j1939.h` и т.п.;
- **добавляем CCS‑инициализации** по образцу из `CS60DC_CCS_STM32/Core/Src/main.c`:
- `ADC_Init()` (если в проект переносится фильтрация АЦП / `adc_filter.c`),
- `CP_Init()` и первоначальное `CP_SetDuty(100);`,
- `CCS_Init();`,
- инициализацию EDCAN/адреса: `EDCAN_Init(SW_GetAddr());` и возможный `CAN_ReInit();`, если EDCAN используется.
- **Главный цикл**:
- исходно в GBT‑прошивке основной цикл делает:
- `PSU_ReadWrite();`, `PSU_Task();`, `METER_CalculateEnergy();`, `CONN_Loop();`, `LED_Write();`, `StopButtonControl();` и несколько `ED_Delay(...)`, в которых вызываются GBT‑таски (`GBT_ChargerTask()`, `GBT_ManageLockMotor()`, `CONN_CC_ReadStateFiltered()` и т.п.);
- **заменяем содержимое `ED_Delay()` и цикла `while(1)` так, чтобы:**
- в основном цикле выполнялись:
- `CCS_SerialLoop();` (как в `[CS60DC_CCS_STM32/Core/Src/main.c](CS60DC_CCS_STM32/Core/Src/main.c)`),
- `EDCAN_Loop();` (если EDCAN используется для обмена с главным контроллером),
- `CP_Loop();` (обновление состояния CP и заполнение `CCS_EDCAN_Output.cpState`),
- существующие `PSU_*`, `METER_*`, `CONN_Loop()`, `LED_Write()`, `StopButtonControl()`;
- `ED_Delay()` больше **не опирается на GBT‑таски**, а, при необходимости, просто крутит `CCS_SerialLoop()` / `CP_Loop()` и необязательные сервисные задачи.
## Интеграция CCS‑протокола в проект модуля
- **Перенос файлов CCS**:
- добавляем в проект модуля исходники и заголовки из `CS60DC_CCS_STM32`:
- `[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)` + `Core/Inc/cp.h`,
- `[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)` + `Core/Inc/serial.h`,
- `[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)` + `Core/Inc/charger_ccs.h`,
- необходимые типы `CCS_*` и `CCS_EDCAN_*` (структуры состояний, входов/выходов, команд).
- подправляем include‑пути и зависимости под структуру каталогов `GbTModuleSW30Web`.
- **Привязка к `USART3`**:
- в перенесённом `serial.c` заменяем все использования `huart1` на `huart3`:
- глобальный `extern UART_HandleTypeDef huart1;``huart3;`,
- `HAL_UARTEx_ReceiveToIdle_IT(&huart1, ...)``&huart3`,
- `HAL_UART_Transmit(&huart1, ...)``&huart3`;
- обновляем `HAL_UARTEx_RxEventCallback` так, чтобы он реагировал на `huart3`;
- убеждаемся, что `MX_USART3_UART_Init()` в `GbTModuleSW30Web/Core/Src/usart.c` настроен на тот же baud/формат, что и `USART1` в `CS60DC_CCS_STM32`.
- **CP‑цепь (CP ADC + PWM на PA7)**:
- в переносимом `cp.c` уже есть логика расчёта напряжения CP по `ADC_CP_CHANNEL` и управление PWM через `TIM2`;
- на целевой плате:
- настраиваем канал ADC, соответствующий `ADC1_IN4`, как `ADC_CP_CHANNEL` в конфигурационных файлах/enum‑ах ADC;
- убеждаемся, что ножка `PA7` привязана к нужному таймеру (по CubeMX‑конфигу) и совпадает с тем, что ожидает `cp.c` (сейчас TIM2/CH1/CH2) — при необходимости в план добавим правку конфигурации таймера и каналов;
- оставляем границы состояний CP (A/B/C/D/E/F) и формулы из текущего `cp.c` без изменений, чтобы поведение соответствовало проверенной CCS‑прошивке.
- **Связка CCS ↔ силовая часть/EDCAN**:
- `CCS_SerialLoop()` управляет структурами `CCS_EDCAN_Output` и читает `CCS_EDCAN_Input`;
- в коде модуля (там, где сейчас GBT‑логика связывает CAN/силовую часть с протоколом) заменяем связь на работу с `CCS_EDCAN_*`:
- измеренные ток/напряжение из силовой части кладём в `CCS_EDCAN_Input.measuredVoltage` и `measuredCurrent`,
- команды включения/отключения питания (`PSU_ON/OFF/PREPARE`) и ошибки записываем в `CCS_EDCAN_Input.*`,
- из `CCS_EDCAN_Output` читаем:
- `enablePSU`/`requestedVoltage`/`requestedCurrent` — для управления источником питания,
- `connectorState`, `cpState`, `chargingPercentage` — для индикации, логов и веб‑интерфейса.
## Удаление GBT и чистка кода
- **Удаление GBT‑зависимостей**:
- в `GbTModuleSW30Web` находим и удаляем/отключаем:
- `#include "charger_gbt.h"`, `j1939.h`, GBT‑специфические модули блокировки/замка, если они не используются механически;
- функции `GBT_Init()`, `GBT_ChargerTask()`, `GBT_ManageLockMotor()`, `GBT_SetConfig()`, `GBT_CAN_ReInit()` и т.п.;
- оставляем общий код, не завязанный именно на GBT (питание, измерения, коннектор, индикация, веб‑сервер, логирование).
- **CAN**:
- инициализация `CAN1` (`MX_CAN1_Init()`) должна остаться, чтобы bootloader/система не сломались;
- если от GBT остался `CAN2`, его можно выключить из конфигурации, если он аппаратно не используется в CCS‑варианте;
- при необходимости добавляем простую заглушку вместо старых GBT‑обработчиков, чтобы сборка прошла без ошибок.
## Сохранение веб‑/диагностического функционала
- **Веб‑интерфейс и диагностика**:
- по вашему требованию **сохраняем весь существующий веб‑функционал `GbTModuleSW30Web`**, только:
- удаляем/переписываем поля и страницы, завязанные на GBT‑состояния/параметры,
- вместо GBT‑переменных и структур подставляем данные из `CCS_EDCAN_Output`, `CCS_State`, `CCS_EvInfo` и т.п.;
- протокол диагностики через существующий UART не меняем по формату, только отключаем GBT‑команды/состояния и, при необходимости, добавляем новые поля/команды под CCS (по согласованию).
## Тестирование и критерии приёмки
- **Юнит‑/модульные проверки на стенде**:
- запуск прошивки без подключенного EV — проверка, что станция в состоянии `Unplugged`/`EV_STATE_A_IDLE`, нет перезагрузок и ошибок;
- подключение EV/эмулятора:
- проверка переходов CP‑состояний A→B→C, корректных значений напряжения CP,
- проверка, что `CCS_ConnectorState` и `CCS_EvseState` меняются ожидаемо (Preparing, Charging, Finished и т.п.);
- проверка обмена по `USART3`:
- корректный приём/передача пакетов с CRC16,
- реакция на команды Everest (ENABLE, START/STOP, PWM_DUTY, SET_OUTPUT_VOLTAGE, EV_INFO, EVSE_STATE, KEEP_ALIVE);
- проверка защиты:
- ESTOP/StopButton — немедленное отключение выхода и отправка `CCS_SendEmergencyStop()`;
- таймаут связи с хостом (`last_host_seen`) — перевод в безопасное состояние (отключение PSU, CP duty = 100%, лог `Everest timeout`).
- **Регрессионные проверки существующей функциональности**:
- веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
- сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.