First commit

This commit is contained in:
95384 2025-02-19 14:18:30 +08:00
commit 973b2a0151
258 changed files with 67746 additions and 0 deletions

144
ZDBMS/BMS_CC/.cproject Normal file
View File

@ -0,0 +1,144 @@
<?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="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074" moduleId="org.eclipse.cdt.core.settings" name="obj">
<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 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="${cross_rm} -rf" description="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074" name="obj" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release">
<folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074." name="/" resourcePath="">
<toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.release.231146001" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.release">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1311852988" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.1983282875" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1000761142" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.514997414" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.size" valueType="enumerated"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.1008570639" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.467272439" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.2047756949" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.207613650" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.1204865254" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level" useByScannerDiscovery="true"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.867779652" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format" useByScannerDiscovery="true"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1900297968" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.arch.rv32i" valueType="enumerated"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.387605487" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.ilp32" valueType="enumerated"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1509705449" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.compressed.1038505275" name="Compressed extension (RVC)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.compressed" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.1218760634" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" useByScannerDiscovery="false" value="GNU MCU RISC-V GCC" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.103341323" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" useByScannerDiscovery="false" value="riscv-none-embed-" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.487601824" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.1062130429" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1194282993" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.1529355265" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1053750745" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.1441326233" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" useByScannerDiscovery="false" value="size" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.550105535" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" useByScannerDiscovery="false" value="make" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.719280496" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" useByScannerDiscovery="false" value="rm" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.226017994" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id" useByScannerDiscovery="false" value="512258282" valueType="string"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.atomic.1590833110" name="Atomic extension (RVA)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.atomic" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.unused.1961191588" name="Warn on various unused elements (-Wunused)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.unused" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.uninitialized.929829166" name="Warn on uninitialized variables (-Wuninitialised)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.warnings.uninitialized" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nocommon.438890136" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nocommon" useByScannerDiscovery="true" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.xw.1540402642" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.xw" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.saverestore.813643495" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.saverestore" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1944008784" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>
<builder buildPath="${workspace_loc:/${ProjName}}/obj" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1421508906" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1244756189" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1692176068" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths.1034038285" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths" useByScannerDiscovery="true" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Startup}&quot;"/>
</option>
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.126366858" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>
</tool>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1731377187" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1567947810" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Debug}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Core}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/User}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Peripheral/inc}&quot;"/>
</option>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.2020844713" name="Language standard" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.gnu99" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs.177116515" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols"/>
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.2036806839" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>
</tool>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1610882921" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"/>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.1620074387" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.194760422" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths.2057340378" name="Library search path (-L)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths" useByScannerDiscovery="false" valueType="libPaths"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile.1390103472" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Ld/Link.ld}&quot;"/>
</option>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart.913830613" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnano.239404511" name="Use newlib-nano (--specs=nano.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnano" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnosys.351964161" name="Do not use syscalls (--specs=nosys.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnosys" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.otherobjs.16994550" name="Other objects" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.otherobjs" useByScannerDiscovery="false" valueType="userObjs"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.flags.1125808200" name="Linker flags (-Xlinker [option])" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.flags" useByScannerDiscovery="false" valueType="stringList"/>
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input.1859223768" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.1947503520" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections.1689063433" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.paths.1029177148" name="Library search path (-L)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.paths" valueType="libPaths">
<listOptionValue builtIn="false" value="&quot;../LD&quot;"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.scriptfile.1751226764" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.scriptfile" valueType="stringList">
<listOptionValue builtIn="false" value="Link.ld"/>
</option>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.nostart.642896175" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.nostart" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.usenewlibnano.1540675679" name="Use newlib-nano (--specs=nano.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.usenewlibnano" value="true" valueType="boolean"/>
</tool>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.1292785366" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver"/>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1801165667" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash"/>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.1356766765" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source.2052761852" name="Display source (--source|-S)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders.439659821" name="Display all headers (--all-headers|-x)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle.67111865" name="Demangle names (--demangle|-C)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers.1549373929" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide.1298918921" name="Wide lines (--wide|-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.disassemble.1859590835" name="Disassemble (--disassemble|-d)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.disassemble" useByScannerDiscovery="false" value="true" valueType="boolean"/>
</tool>
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.712424314" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize">
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format.1404031980" name="Size format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format" useByScannerDiscovery="false"/>
</tool>
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.rvGcc.536610708" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.rvGcc" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.rvGcc.8" valueType="enumerated"/>
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="Startup|Peripheral|Ld|Debug|Core" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Debug"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Ld"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Peripheral"/>
<entry excluding="startup_ch32v20x_D8.S|startup_ch32v20x_D8W.S" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Startup"/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
<storageModule moduleId="ilg.gnumcueclipse.managedbuild.packs"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="999.ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf.275846018" name="Executable file" projectType="ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.767917625;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.767917625.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1375371130;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1473381709">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1731377187;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.2036806839">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
</cproject>

34
ZDBMS/BMS_CC/.project Normal file
View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<projectDescription>
<name>BMS_CC</name>
<comment/>
<projects/>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments/>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments/>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
<filteredResources>
<filter>
<id>1595986042669</id>
<name/>
<type>22</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-false-*.wvproj</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<configuration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1008047074" name="obj">
<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="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1442697984142983849" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_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>

17
ZDBMS/BMS_CC/.template Normal file
View File

@ -0,0 +1,17 @@
Mcu Type=CH32L10x
Address=0x08000000
Target Path=obj/BMS_CC.hex
Erase All=true
Program=true
Verify=true
Reset=true
Vendor=WCH
Link=WCH-Link
Toolchain=RISC-V
Series=CH32L103
MCU=CH32L103C8T6
Description=Website: https://www.wch.cn/products/CH32L103.html?\nROM(byte): 64K, SRAM(byte): 20K, CHIP PINS: 48, GPIO PORTS: 37.\nCH32L103 is an industrial-grade low-power general purpose microcontroller based on Highland Barley RISC-V core design. The CH32L103 has built-in USB and PD PHY, support PDUSB, including USB Host host and USB Device device function, USB PD and type C fast charge function, built-in low power timer, It provides a set of OPA operation amplifier, 3 sets of CMP voltage comparators, 4 sets of USART serial ports, 2 I2C interfaces, 2 SPI interfaces, 1 set of CAN interfaces, multiple sets of timers, 12-bit ADC, 10 Touchkeys and other peripheral resources.
PeripheralVersion=1.4

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" ?>
<launchConfiguration type="com.mounriver.debug.gdbjtag.openocd.launchConfigurationType">
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doContinue" value="true" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doDebugInRam" value="false" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doFirstReset" value="true" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doSecondReset" value="true" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doStartGdbCLient" value="true" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.doStartGdbServer" value="true" />
<booleanAttribute key="com.mounriver.debug.gdbjtag.openocd.enableSemihosting" value="false" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.firstResetType" value="init" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off&#xD;&#xA;set architecture riscv:rv32&#xD;&#xA;set remotetimeout unlimited" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbClientOtherOptions" value="" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerConnectionAddress" value="" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerExecutable" value="${eclipse_home}toolchain/OpenOCD/bin/${openocd_executable}" />
<intAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerLog" value="" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerOther" value="-f &quot;${eclipse_home}toolchain/OpenOCD/bin/wch-riscv.cfg&quot;" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666" />
<intAttribute key="com.mounriver.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.otherInitCommands" value="" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.otherRunCommands" value="" />
<stringAttribute key="com.mounriver.debug.gdbjtag.openocd.secondResetType" value="halt" />
<stringAttribute key="com.mounriver.debug.gdbjtag.svdPath" value="${eclipse_home}template/wizard/WCH/RISC-V/CH32L103/NoneOS/CH32L103xx.svd" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value="" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value="" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="" />
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="handle_reset" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value="" />
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value="" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true" />
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true" />
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${eclipse_home}toolchain/RISC-V Embedded GCC/bin/riscv-none-embed-gdb.exe" />
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false" />
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2" />
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value="" />
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="obj\BMS_CC.elf" />
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="BMS_CC" />
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true" />
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="" />
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/BMS_CC" />
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4" />
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#xD;&#xA;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#xD;&#xA;" />
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory" />
</launchConfiguration>

View File

@ -0,0 +1 @@
©K<#6§+03Œ€\¹pŒk¿<> vr—K<E28094>™®5¤£rT¿<>…mJYi_Ê+Oo<4F>7Á¢=2<>Ѝ¤11¼;DŸ,Luª\O9<39>8¼]§¯¿€¬`:À¢³j§;«i(»GJµ$_£PŽ<50>žiªƒ­p¥<>N1€¿·0ÅÇÁˆª©><3E>V`£)hsmv:8©LQ§ŠŸv${G·[° 7ž»ÁvN*b#{­k<C2AD><EFBFBD>¾ry¶»±J,¬<>o£Op

View File

@ -0,0 +1,306 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : core_riscv.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/11/11
* Description : RISC-V V4 Core Peripheral Access Layer Source File for CH32L103
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include <stdint.h>
/* define compiler specific symbols */
#if defined ( __CC_ARM )
#define __ASM __asm /* asm keyword for ARM Compiler */
#define __INLINE __inline /* inline keyword for ARM Compiler */
#elif defined ( __ICCARM__ )
#define __ASM __asm /* asm keyword for IAR Compiler */
#define __INLINE inline /* inline keyword for IAR Compiler. Only avaiable in High optimization mode */
#elif defined ( __GNUC__ )
#define __ASM __asm /* asm keyword for GNU Compiler */
#define __INLINE inline /* inline keyword for GNU Compiler */
#elif defined ( __TASKING__ )
#define __ASM __asm /* asm keyword for TASKING Compiler */
#define __INLINE inline /* inline keyword for TASKING Compiler */
#endif
/*********************************************************************
* @fn __get_MSTATUS
*
* @brief Return the Machine Status Register
*
* @return mstatus value
*/
uint32_t __get_MSTATUS(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mstatus" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MSTATUS
*
* @brief Set the Machine Status Register
*
* @param value - set mstatus value
*
* @return none
*/
void __set_MSTATUS(uint32_t value)
{
__ASM volatile ("csrw mstatus, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MISA
*
* @brief Return the Machine ISA Register
*
* @return misa value
*/
uint32_t __get_MISA(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "misa" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MISA
*
* @brief Set the Machine ISA Register
*
* @param value - set misa value
*
* @return none
*/
void __set_MISA(uint32_t value)
{
__ASM volatile ("csrw misa, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MTVEC
*
* @brief Return the Machine Trap-Vector Base-Address Register
*
* @return mtvec value
*/
uint32_t __get_MTVEC(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mtvec" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MTVEC
*
* @brief Set the Machine Trap-Vector Base-Address Register
*
* @param value - set mtvec value
*
* @return none
*/
void __set_MTVEC(uint32_t value)
{
__ASM volatile ("csrw mtvec, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MSCRATCH
*
* @brief Return the Machine Seratch Register
*
* @return mscratch value
*/
uint32_t __get_MSCRATCH(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mscratch" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MSCRATCH
*
* @brief Set the Machine Seratch Register
*
* @param value - set mscratch value
*
* @return none
*/
void __set_MSCRATCH(uint32_t value)
{
__ASM volatile ("csrw mscratch, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MEPC
*
* @brief Return the Machine Exception Program Register
*
* @return mepc value
*/
uint32_t __get_MEPC(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mepc" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MEPC
*
* @brief Set the Machine Exception Program Register
*
* @return mepc value
*/
void __set_MEPC(uint32_t value)
{
__ASM volatile ("csrw mepc, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MCAUSE
*
* @brief Return the Machine Cause Register
*
* @return mcause value
*/
uint32_t __get_MCAUSE(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mcause" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MEPC
*
* @brief Set the Machine Cause Register
*
* @return mcause value
*/
void __set_MCAUSE(uint32_t value)
{
__ASM volatile ("csrw mcause, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MTVAL
*
* @brief Return the Machine Trap Value Register
*
* @return mtval value
*/
uint32_t __get_MTVAL(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mtval" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __set_MTVAL
*
* @brief Set the Machine Trap Value Register
*
* @return mtval value
*/
void __set_MTVAL(uint32_t value)
{
__ASM volatile ("csrw mtval, %0" : : "r" (value) );
}
/*********************************************************************
* @fn __get_MVENDORID
*
* @brief Return Vendor ID Register
*
* @return mvendorid value
*/
uint32_t __get_MVENDORID(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mvendorid" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __get_MARCHID
*
* @brief Return Machine Architecture ID Register
*
* @return marchid value
*/
uint32_t __get_MARCHID(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "marchid" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __get_MIMPID
*
* @brief Return Machine Implementation ID Register
*
* @return mimpid value
*/
uint32_t __get_MIMPID(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mimpid" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __get_MHARTID
*
* @brief Return Hart ID Register
*
* @return mhartid value
*/
uint32_t __get_MHARTID(void)
{
uint32_t result;
__ASM volatile ( "csrr %0," "mhartid" : "=r" (result) );
return (result);
}
/*********************************************************************
* @fn __get_SP
*
* @brief Return SP Register
*
* @return SP value
*/
uint32_t __get_SP(void)
{
uint32_t result;
__ASM volatile ( "mv %0," "sp" : "=r"(result) : );
return (result);
}

View File

@ -0,0 +1,585 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : core_riscv.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/12/26
* Description : RISC-V V4 Core Peripheral Access Layer Header File for CH32L103
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CORE_RISCV_H__
#define __CORE_RISCV_H__
#ifdef __cplusplus
extern "C" {
#endif
/* IO definitions */
#ifdef __cplusplus
#define __I volatile /* defines 'read only' permissions */
#else
#define __I volatile const /* defines 'read only' permissions */
#endif
#define __O volatile /* defines 'write only' permissions */
#define __IO volatile /* defines 'read / write' permissions */
typedef __I uint64_t vuc64; /* Read Only */
typedef __I uint32_t vuc32; /* Read Only */
typedef __I uint16_t vuc16; /* Read Only */
typedef __I uint8_t vuc8; /* Read Only */
typedef const uint64_t uc64; /* Read Only */
typedef const uint32_t uc32; /* Read Only */
typedef const uint16_t uc16; /* Read Only */
typedef const uint8_t uc8; /* Read Only */
typedef __I int64_t vsc64; /* Read Only */
typedef __I int32_t vsc32; /* Read Only */
typedef __I int16_t vsc16; /* Read Only */
typedef __I int8_t vsc8; /* Read Only */
typedef const int64_t sc64; /* Read Only */
typedef const int32_t sc32; /* Read Only */
typedef const int16_t sc16; /* Read Only */
typedef const int8_t sc8; /* Read Only */
typedef __IO uint64_t vu64;
typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8;
typedef uint64_t u64;
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef __IO int64_t vs64;
typedef __IO int32_t vs32;
typedef __IO int16_t vs16;
typedef __IO int8_t vs8;
typedef int64_t s64;
typedef int32_t s32;
typedef int16_t s16;
typedef int8_t s8;
typedef enum {NoREADY = 0, READY = !NoREADY} ErrorStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
#define RV_STATIC_INLINE static inline
/* memory mapped structure for Program Fast Interrupt Controller (PFIC) */
typedef struct{
__I uint32_t ISR[8];
__I uint32_t IPR[8];
__IO uint32_t ITHRESDR;
__IO uint32_t RESERVED;
__IO uint32_t CFGR;
__I uint32_t GISR;
__IO uint8_t VTFIDR[4];
uint8_t RESERVED0[12];
__IO uint32_t VTFADDR[4];
uint8_t RESERVED1[0x90];
__O uint32_t IENR[8];
uint8_t RESERVED2[0x60];
__O uint32_t IRER[8];
uint8_t RESERVED3[0x60];
__O uint32_t IPSR[8];
uint8_t RESERVED4[0x60];
__O uint32_t IPRR[8];
uint8_t RESERVED5[0x60];
__IO uint32_t IACTR[8];
uint8_t RESERVED6[0xE0];
__IO uint8_t IPRIOR[256];
uint8_t RESERVED7[0x810];
__IO uint32_t SCTLR;
}PFIC_Type;
/* memory mapped structure for SysTick */
typedef struct
{
__IO uint32_t CTLR;
__IO uint32_t SR;
__IO uint64_t CNT;
__IO uint64_t CMP;
}SysTick_Type;
#define PFIC ((PFIC_Type *) 0xE000E000)
#define NVIC PFIC
#define NVIC_KEY1 ((uint32_t)0xFA050000)
#define NVIC_KEY2 ((uint32_t)0xBCAF0000)
#define NVIC_KEY3 ((uint32_t)0xBEEF0000)
#define SysTick ((SysTick_Type *) 0xE000F000)
/*********************************************************************
* @fn __enable_irq
*
* @brief Enable Global Interrupt
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __enable_irq()
{
__asm volatile ("csrs 0x800, %0" : : "r" (0x88) );
}
/*********************************************************************
* @fn __disable_irq
*
* @brief Disable Global Interrupt
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __disable_irq()
{
__asm volatile ("csrc 0x800, %0" : : "r" (0x88) );
}
/*********************************************************************
* @fn __NOP
*
* @brief nop
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __NOP()
{
__asm volatile ("nop");
}
/*********************************************************************
* @fn NVIC_EnableIRQ
*
* @brief Disable Interrupt
*
* @param IRQn - Interrupt Numbers
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
NVIC->IENR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/*********************************************************************
* @fn NVIC_DisableIRQ
*
* @brief Disable Interrupt
*
* @param IRQn - Interrupt Numbers
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
{
NVIC->IRER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/*********************************************************************
* @fn NVIC_GetStatusIRQ
*
* @brief Get Interrupt Enable State
*
* @param IRQn - Interrupt Numbers
*
* @return 1 - Interrupt Pending Enable
* 0 - Interrupt Pending Disable
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t NVIC_GetStatusIRQ(IRQn_Type IRQn)
{
return((uint32_t) ((NVIC->ISR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
}
/*********************************************************************
* @fn NVIC_GetPendingIRQ
*
* @brief Get Interrupt Pending State
*
* @param IRQn - Interrupt Numbers
*
* @return 1 - Interrupt Pending Enable
* 0 - Interrupt Pending Disable
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
return((uint32_t) ((NVIC->IPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
}
/*********************************************************************
* @fn NVIC_SetPendingIRQ
*
* @brief Set Interrupt Pending
*
* @param IRQn - Interrupt Numbers
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
NVIC->IPSR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/*********************************************************************
* @fn NVIC_ClearPendingIRQ
*
* @brief Clear Interrupt Pending
*
* @param IRQn - Interrupt Numbers
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{
NVIC->IPRR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));
}
/*********************************************************************
* @fn NVIC_GetActive
*
* @brief Get Interrupt Active State
*
* @param IRQn - Interrupt Numbers
*
* @return 1 - Interrupt Active
* 0 - Interrupt No Active
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
{
return((uint32_t)((NVIC->IACTR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
}
/*********************************************************************
* @fn NVIC_SetPriority
*
* @brief Set Interrupt Priority
*
* @param IRQn - Interrupt Numbers
* interrupt nesting enable(CSR-0x804 bit1 = 1)
* priority - bit[7] - Preemption Priority
* bit[6:5] - Sub priority
* bit[4:0] - Reserve
* interrupt nesting disable(CSR-0x804 bit1 = 0)
* priority - bit[7:5] - Sub priority
* bit[4:0] - Reserve
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint8_t priority)
{
NVIC->IPRIOR[(uint32_t)(IRQn)] = priority;
}
/*********************************************************************
* @fn __WFI
*
* @brief Wait for Interrupt
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFI(void)
{
NVIC->SCTLR &= ~(1<<3); // wfi
asm volatile ("wfi");
}
/*********************************************************************
* @fn _SEV
*
* @brief Set Event
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void _SEV(void)
{
uint32_t t;
t = NVIC->SCTLR;
NVIC->SCTLR |= (1<<3)|(1<<5);
NVIC->SCTLR = (NVIC->SCTLR & ~(1<<5)) | ( t & (1<<5));
}
/*********************************************************************
* @fn _WFE
*
* @brief Wait for Events
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void _WFE(void)
{
NVIC->SCTLR |= (1<<3);
asm volatile ("wfi");
}
/*********************************************************************
* @fn __WFE
*
* @brief Wait for Events
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFE(void)
{
_SEV();
_WFE();
_WFE();
}
/*********************************************************************
* @fn SetVTFIRQ
*
* @brief Set VTF Interrupt
*
* @param addr - VTF interrupt service function base address.
* IRQn - Interrupt Numbers
* num - VTF Interrupt Numbers
* NewState - DISABLE or ENABLE
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void SetVTFIRQ(uint32_t addr, IRQn_Type IRQn, uint8_t num, FunctionalState NewState)
{
if(num > 3) return ;
if (NewState != DISABLE)
{
NVIC->VTFIDR[num] = IRQn;
NVIC->VTFADDR[num] = ((addr&0xFFFFFFFE)|0x1);
}
else
{
NVIC->VTFIDR[num] = IRQn;
NVIC->VTFADDR[num] = ((addr&0xFFFFFFFE)&(~0x1));
}
}
/*********************************************************************
* @fn NVIC_SystemReset
*
* @brief Initiate a system reset request
*
* @return none
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SystemReset(void)
{
NVIC->CFGR = NVIC_KEY3|(1<<7);
}
/*********************************************************************
* @fn __AMOADD_W
*
* @brief Atomic Add with 32bit value
* Atomically ADD 32bit value with value in memory using amoadd.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be ADDed
*
* @return return memory value + add value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOADD_W(volatile int32_t *addr, int32_t value)
{
int32_t result;
__asm volatile ("amoadd.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOAND_W
*
* @brief Atomic And with 32bit value
* Atomically AND 32bit value with value in memory using amoand.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be ANDed
*
* @return return memory value & and value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOAND_W(volatile int32_t *addr, int32_t value)
{
int32_t result;
__asm volatile ("amoand.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOMAX_W
*
* @brief Atomic signed MAX with 32bit value
* Atomically signed max compare 32bit value with value in memory using amomax.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be compared
*
* @return the bigger value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOMAX_W(volatile int32_t *addr, int32_t value)
{
int32_t result;
__asm volatile ("amomax.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOMAXU_W
*
* @brief Atomic unsigned MAX with 32bit value
* Atomically unsigned max compare 32bit value with value in memory using amomaxu.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be compared
*
* @return return the bigger value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOMAXU_W(volatile uint32_t *addr, uint32_t value)
{
uint32_t result;
__asm volatile ("amomaxu.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOMIN_W
*
* @brief Atomic signed MIN with 32bit value
* Atomically signed min compare 32bit value with value in memory using amomin.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be compared
*
* @return the smaller value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOMIN_W(volatile int32_t *addr, int32_t value)
{
int32_t result;
__asm volatile ("amomin.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOMINU_W
*
* @brief Atomic unsigned MIN with 32bit value
* Atomically unsigned min compare 32bit value with value in memory using amominu.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be compared
*
* @return the smaller value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOMINU_W(volatile uint32_t *addr, uint32_t value)
{
uint32_t result;
__asm volatile ("amominu.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOOR_W
*
* @brief Atomic OR with 32bit value
* Atomically OR 32bit value with value in memory using amoor.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be ORed
*
* @return return memory value | and value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOOR_W(volatile int32_t *addr, int32_t value)
{
int32_t result;
__asm volatile ("amoor.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/*********************************************************************
* @fn __AMOSWAP_W
*
* @brief Atomically swap new 32bit value into memory using amoswap.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* newval - New value to be stored into the address
*
* @return return the original value in memory
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOSWAP_W(volatile uint32_t *addr, uint32_t newval)
{
uint32_t result;
__asm volatile ("amoswap.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(newval) : "memory");
return result;
}
/*********************************************************************
* @fn __AMOXOR_W
*
* @brief Atomic XOR with 32bit value
* Atomically XOR 32bit value with value in memory using amoxor.d.
*
* @param addr - Address pointer to data, address need to be 4byte aligned
* value - value to be XORed
*
* @return return memory value ^ and value
*/
__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOXOR_W(volatile int32_t *addr, int32_t value)
{
int32_t result;
__asm volatile ("amoxor.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
/* Core_Exported_Functions */
extern uint32_t __get_MSTATUS(void);
extern void __set_MSTATUS(uint32_t value);
extern uint32_t __get_MISA(void);
extern void __set_MISA(uint32_t value);
extern uint32_t __get_MTVEC(void);
extern void __set_MTVEC(uint32_t value);
extern uint32_t __get_MSCRATCH(void);
extern void __set_MSCRATCH(uint32_t value);
extern uint32_t __get_MEPC(void);
extern void __set_MEPC(uint32_t value);
extern uint32_t __get_MCAUSE(void);
extern void __set_MCAUSE(uint32_t value);
extern uint32_t __get_MTVAL(void);
extern void __set_MTVAL(uint32_t value);
extern uint32_t __get_MVENDORID(void);
extern uint32_t __get_MARCHID(void);
extern uint32_t __get_MIMPID(void);
extern uint32_t __get_MHARTID(void);
extern uint32_t __get_SP(void);
#ifdef __cplusplus
}
#endif
#endif

192
ZDBMS/BMS_CC/Debug/debug.c Normal file
View File

@ -0,0 +1,192 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : debug.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for UART
* Printf , Delay functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "debug.h"
static uint16_t p_us = 0;
static uint16_t p_ms = 0;
/*********************************************************************
* @fn Delay_Init
*
* @brief Initializes Delay Funcation.
*
* @return none
*/
void Delay_Init(void)
{
p_us = SystemCoreClock / 8000;
p_ms = (uint16_t)p_us * 1;
}
/*********************************************************************
* @fn Delay_Us
*
* @brief Microsecond Delay Time.
*
* @param n - Microsecond number.
*
* @return None
*/
void Delay_Us(uint32_t n)
{
uint32_t i;
SysTick->SR &= ~(1 << 0);
i = (uint32_t)(n * p_us)/1000;
SysTick->CMP = i;
SysTick->CTLR |= (1 << 4);
SysTick->CTLR |= (1 << 5) | (1 << 0);
while((SysTick->SR & (1 << 0)) != (1 << 0));
SysTick->CTLR &= ~(1 << 0);
}
/*********************************************************************
* @fn Delay_Ms
*
* @brief Millisecond Delay Time.
*
* @param n - Millisecond number.
*
* @return None
*/
void Delay_Ms(uint32_t n)
{
uint32_t i;
SysTick->SR &= ~(1 << 0);
i = (uint32_t)n * p_ms;
SysTick->CMP = i;
SysTick->CTLR |= (1 << 4);
SysTick->CTLR |= (1 << 5) | (1 << 0);
while((SysTick->SR & (1 << 0)) != (1 << 0));
SysTick->CTLR &= ~(1 << 0);
}
/*********************************************************************
* @fn USART_Printf_Init
*
* @brief Initializes the USARTx peripheral.
*
* @param baudrate - USART communication baud rate.
*
* @return None
*/
void USART_Printf_Init(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
#if(DEBUG == DEBUG_UART1)
RCC_PB2PeriphClockCmd(RCC_PB2Periph_USART1 | RCC_PB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#elif(DEBUG == DEBUG_UART2)
RCC_PB1PeriphClockCmd(RCC_PB1Periph_USART2, ENABLE);
RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#elif(DEBUG == DEBUG_UART3)
RCC_PB1PeriphClockCmd(RCC_PB1Periph_USART3, ENABLE);
RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
#endif
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
#if(DEBUG == DEBUG_UART1)
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
#elif(DEBUG == DEBUG_UART2)
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
#elif(DEBUG == DEBUG_UART3)
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
#endif
}
/*********************************************************************
* @fn _write
*
* @brief Support Printf Function
*
* @param *buf - UART send Data.
* size - Data length
*
* @return size: Data length
*/
__attribute__((used))
int _write(int fd, char *buf, int size)
{
int i;
for(i = 0; i < size; i++){
#if(DEBUG == DEBUG_UART1)
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, *buf++);
#elif(DEBUG == DEBUG_UART2)
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2, *buf++);
#elif(DEBUG == DEBUG_UART3)
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3, *buf++);
#endif
}
return size;
}
/*********************************************************************
* @fn _sbrk
*
* @brief Change the spatial position of data segment.
*
* @return size: Data length
*/
__attribute__((used))
void *_sbrk(ptrdiff_t incr)
{
extern char _end[];
extern char _heap_end[];
static char *curbrk = _end;
if ((curbrk + incr < _end) || (curbrk + incr > _heap_end))
return NULL - 1;
curbrk += incr;
return curbrk - incr;
}

View File

@ -0,0 +1,54 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : debug.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/11/06
* Description : This file contains all the functions prototypes for UART
* Printf , Delay functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __DEBUG_H
#define __DEBUG_H
#include "stdio.h"
#include "ch32l103.h"
#ifdef __cplusplus
extern "C" {
#endif
/* UART Printf Definition */
#define DEBUG_UART1 1
#define DEBUG_UART2 2
#define DEBUG_UART3 3
/* DEBUG UATR Definition */
#ifndef DEBUG
#define DEBUG DEBUG_UART1
#endif
extern uint32_t OPA_Trim;
extern uint16_t ADC_Trim;
extern uint32_t TS_Val;
extern uint32_t CHIPID;
extern uint16_t USBPD_CFG;
void Delay_Init(void);
void Delay_Us(uint32_t n);
void Delay_Ms(uint32_t n);
void USART_Printf_Init(uint32_t baudrate);
#if(DEBUG)
#define PRINT(format, ...) printf(format, ##__VA_ARGS__)
#else
#define PRINT(X...)
#endif
#ifdef __cplusplus
}
#endif
#endif

1
ZDBMS/BMS_CC/Ld/Link.ld Normal file
View File

@ -0,0 +1 @@
ENTRY( _start ) __stack_size = 2048; PROVIDE( _stack_size = __stack_size ); MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K } SECTIONS { .init : { _sinit = .; . = ALIGN(4); KEEP(*(SORT_NONE(.init))) . = ALIGN(4); _einit = .; } >FLASH AT>FLASH .vector : { *(.vector); . = ALIGN(64); } >FLASH AT>FLASH .text : { . = ALIGN(4); *(.text) *(.text.*) *(.rodata) *(.rodata*) *(.gnu.linkonce.t.*) . = ALIGN(4); } >FLASH AT>FLASH .fini : { KEEP(*(SORT_NONE(.fini))) . = ALIGN(4); } >FLASH AT>FLASH PROVIDE( _etext = . ); PROVIDE( _eitcm = . ); .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); } >FLASH AT>FLASH .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) PROVIDE_HIDDEN (__init_array_end = .); } >FLASH AT>FLASH .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) PROVIDE_HIDDEN (__fini_array_end = .); } >FLASH AT>FLASH .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) /* We don't want to include the .ctor section from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >FLASH AT>FLASH .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >FLASH AT>FLASH .dalign : { . = ALIGN(4); PROVIDE(_data_vma = .); } >RAM AT>FLASH .dlalign : { . = ALIGN(4); PROVIDE(_data_lma = .); } >FLASH AT>FLASH .data : { *(.gnu.linkonce.r.*) *(.data .data.*) *(.gnu.linkonce.d.*) . = ALIGN(8); PROVIDE( __global_pointer$ = . + 0x800 ); *(.sdata .sdata.*) *(.sdata2.*) *(.gnu.linkonce.s.*) . = ALIGN(8); *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) . = ALIGN(4); PROVIDE( _edata = .); } >RAM AT>FLASH .bss : { . = ALIGN(4); PROVIDE( _sbss = .); *(.sbss*) *(.gnu.linkonce.sb.*) *(.bss*) *(.gnu.linkonce.b.*) *(COMMON*) . = ALIGN(4); PROVIDE( _ebss = .); } >RAM AT>FLASH PROVIDE( _end = _ebss); PROVIDE( end = . ); .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : { PROVIDE( _heap_end = . ); . = ALIGN(4); PROVIDE(_susrstack = . ); . = . + __stack_size; PROVIDE( _eusrstack = .); } >RAM }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,211 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_adc.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/05/06
* Description : This file contains all the functions prototypes for the
* ADC firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_ADC_H
#define __CH32L103_ADC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* ADC Init structure definition */
typedef struct
{
uint32_t ADC_Mode; /* Configures the ADC to operate in independent or
dual mode.
This parameter can be a value of @ref ADC_mode */
FunctionalState ADC_ScanConvMode; /* Specifies whether the conversion is performed in
Scan (multichannels) or Single (one channel) mode.
This parameter can be set to ENABLE or DISABLE */
FunctionalState ADC_ContinuousConvMode; /* Specifies whether the conversion is performed in
Continuous or Single mode.
This parameter can be set to ENABLE or DISABLE. */
uint32_t ADC_ExternalTrigConv; /* Defines the external trigger used to start the analog
to digital conversion of regular channels. This parameter
can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */
uint32_t ADC_DataAlign; /* Specifies whether the ADC data alignment is left or right.
This parameter can be a value of @ref ADC_data_align */
uint8_t ADC_NbrOfChannel; /* Specifies the number of ADC channels that will be converted
using the sequencer for regular channel group.
This parameter must range from 1 to 16. */
uint32_t ADC_OutputBuffer; /* Specifies whether the ADC channel output buffer is enabled or disabled.
This parameter can be a value of @ref ADC_OutputBuffer */
uint32_t ADC_Pga; /* Specifies the PGA gain multiple.
This parameter can be a value of @ref ADC_Pga */
} ADC_InitTypeDef;
/* ADC_mode */
#define ADC_Mode_Independent ((uint32_t)0x00000000)
#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000)
#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000)
#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000)
#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000)
#define ADC_Mode_InjecSimult ((uint32_t)0x00050000)
#define ADC_Mode_RegSimult ((uint32_t)0x00060000)
#define ADC_Mode_FastInterl ((uint32_t)0x00070000)
#define ADC_Mode_SlowInterl ((uint32_t)0x00080000)
#define ADC_Mode_AlterTrig ((uint32_t)0x00090000)
/* ADC_external_trigger_sources_for_regular_channels_conversion */
#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000)
#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000)
#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000)
#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000)
#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000)
#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000)
#define ADC_ExternalTrigConv_Ext_IT11 ((uint32_t)0x000C0000)
#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000)
/* ADC_data_align */
#define ADC_DataAlign_Right ((uint32_t)0x00000000)
#define ADC_DataAlign_Left ((uint32_t)0x00000800)
/* ADC_channels */
#define ADC_Channel_0 ((uint8_t)0x00)
#define ADC_Channel_1 ((uint8_t)0x01)
#define ADC_Channel_2 ((uint8_t)0x02)
#define ADC_Channel_3 ((uint8_t)0x03)
#define ADC_Channel_4 ((uint8_t)0x04)
#define ADC_Channel_5 ((uint8_t)0x05)
#define ADC_Channel_6 ((uint8_t)0x06)
#define ADC_Channel_7 ((uint8_t)0x07)
#define ADC_Channel_8 ((uint8_t)0x08)
#define ADC_Channel_9 ((uint8_t)0x09)
#define ADC_Channel_16 ((uint8_t)0x10)
#define ADC_Channel_17 ((uint8_t)0x11)
#define ADC_Channel_18 ((uint8_t)0x12)
#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16)
#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17)
#define ADC_Channel_CalInternal ((uint8_t)ADC_Channel_18)
/*ADC_output_buffer*/
#define ADC_OutputBuffer_Enable ((uint32_t)0x04000000)
#define ADC_OutputBuffer_Disable ((uint32_t)0x00000000)
/*ADC_pga*/
#define ADC_Pga_1 ((uint32_t)0x00000000)
#define ADC_Pga_4 ((uint32_t)0x08000000)
#define ADC_Pga_16 ((uint32_t)0x10000000)
#define ADC_Pga_64 ((uint32_t)0x18000000)
/* ADC_sampling_time */
#define ADC_SampleTime_CyclesMode0 ((uint8_t)0x00)
#define ADC_SampleTime_CyclesMode1 ((uint8_t)0x01)
#define ADC_SampleTime_CyclesMode2 ((uint8_t)0x02)
#define ADC_SampleTime_CyclesMode3 ((uint8_t)0x03)
#define ADC_SampleTime_CyclesMode4 ((uint8_t)0x04)
#define ADC_SampleTime_CyclesMode5 ((uint8_t)0x05)
#define ADC_SampleTime_CyclesMode6 ((uint8_t)0x06)
#define ADC_SampleTime_CyclesMode7 ((uint8_t)0x07)
/* ADC_external_trigger_sources_for_injected_channels_conversion */
#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000)
#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000)
#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000)
#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000)
#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000)
#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000)
#define ADC_ExternalTrigInjecConv_Ext_IT15 ((uint32_t)0x00006000)
#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000)
/* ADC_injected_channel_selection */
#define ADC_InjectedChannel_1 ((uint8_t)0x14)
#define ADC_InjectedChannel_2 ((uint8_t)0x18)
#define ADC_InjectedChannel_3 ((uint8_t)0x1C)
#define ADC_InjectedChannel_4 ((uint8_t)0x20)
/* ADC_analog_watchdog_selection */
#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200)
#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200)
#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200)
#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000)
#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000)
#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000)
#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000)
/* ADC_interrupts_definition */
#define ADC_IT_EOC ((uint16_t)0x0220)
#define ADC_IT_AWD ((uint16_t)0x0140)
#define ADC_IT_JEOC ((uint16_t)0x0480)
/* ADC_flags_definition */
#define ADC_FLAG_AWD ((uint8_t)0x01)
#define ADC_FLAG_EOC ((uint8_t)0x02)
#define ADC_FLAG_JEOC ((uint8_t)0x04)
#define ADC_FLAG_JSTRT ((uint8_t)0x08)
#define ADC_FLAG_STRT ((uint8_t)0x10)
/* ADC_Sample_mode_definition */
#define ADC_Sample_NoOver_1M_Mode ((uint32_t)0x00000000)
#define ADC_Sample_Over_1M_Mode ((uint32_t)0x00000020)
void ADC_DeInit(ADC_TypeDef *ADCx);
void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct);
void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct);
void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef *ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_ResetCalibration(ADC_TypeDef *ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef *ADCx);
void ADC_StartCalibration(ADC_TypeDef *ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef *ADCx);
void ADC_SoftwareStartConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef *ADCx);
void ADC_DiscModeChannelCountConfig(ADC_TypeDef *ADCx, uint8_t Number);
void ADC_DiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
void ADC_ExternalTrigConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx);
uint32_t ADC_GetDualModeConversionValue(void);
void ADC_AutoInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_InjectedDiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef *ADCx, uint32_t ADC_ExternalTrigInjecConv);
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef *ADCx);
void ADC_InjectedChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef *ADCx, uint8_t Length);
void ADC_SetInjectedOffset(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel);
void ADC_AnalogWatchdogCmd(ADC_TypeDef *ADCx, uint32_t ADC_AnalogWatchdog);
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef *ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel);
void ADC_TempSensorVrefintCmd(FunctionalState NewState);
FlagStatus ADC_GetFlagStatus(ADC_TypeDef *ADCx, uint8_t ADC_FLAG);
void ADC_ClearFlag(ADC_TypeDef *ADCx, uint8_t ADC_FLAG);
ITStatus ADC_GetITStatus(ADC_TypeDef *ADCx, uint16_t ADC_IT);
void ADC_ClearITPendingBit(ADC_TypeDef *ADCx, uint16_t ADC_IT);
s32 TempSensor_Volt_To_Temper(s32 Value);
void ADC_BufferCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_TKey_ChannelxMulShieldCmd(ADC_TypeDef *ADCx, uint8_t ADC_Channel, FunctionalState NewState);
void ADC_TKey_MulShieldCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_DutyDelayCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_FIFO_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState);
void ADC_Sample_ModeConfig(ADC_TypeDef *ADCx, uint32_t ADC_Sample_Mode);
void ADC_OffsetCalibrationConfig(ADC_TypeDef *ADCx);
void ADC_AnalogWatchdogResetCmd(ADC_TypeDef *ADCx, FunctionalState NewState);
int16_t Get_CalibrationValue(ADC_TypeDef *ADCx);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,65 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_bkp.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* BKP firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_BKP_H
#define __CH32L103_BKP_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* Tamper_Pin_active_level */
#define BKP_TamperPinLevel_High ((uint16_t)0x0000)
#define BKP_TamperPinLevel_Low ((uint16_t)0x0001)
/* RTC_output_source_to_output_on_the_Tamper_pin */
#define BKP_RTCOutputSource_None ((uint16_t)0x0000)
#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080)
#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100)
#define BKP_RTCOutputSource_Second ((uint16_t)0x0300)
/* Data_Backup_Register */
#define BKP_DR1 ((uint16_t)0x0004)
#define BKP_DR2 ((uint16_t)0x0008)
#define BKP_DR3 ((uint16_t)0x000C)
#define BKP_DR4 ((uint16_t)0x0010)
#define BKP_DR5 ((uint16_t)0x0014)
#define BKP_DR6 ((uint16_t)0x0018)
#define BKP_DR7 ((uint16_t)0x001C)
#define BKP_DR8 ((uint16_t)0x0020)
#define BKP_DR9 ((uint16_t)0x0024)
#define BKP_DR10 ((uint16_t)0x0028)
#define BKP_DR11 ((uint16_t)0x0040)
#define BKP_DR12 ((uint16_t)0x0044)
#define BKP_DR13 ((uint16_t)0x0048)
void BKP_DeInit(void);
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
void BKP_TamperPinCmd(FunctionalState NewState);
void BKP_ITConfig(FunctionalState NewState);
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
FlagStatus BKP_GetFlagStatus(void);
void BKP_ClearFlag(void);
ITStatus BKP_GetITStatus(void);
void BKP_ClearITPendingBit(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,630 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_can.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* CAN firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_CAN_H
#define __CH32L103_CAN_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* CAN init structure definition */
typedef struct
{
uint16_t CAN_Prescaler; /* Specifies the length of a time quantum.
It ranges from 1 to 1024. */
uint8_t CAN_Mode; /* Specifies the CAN operating mode.
This parameter can be a value of
@ref CAN_operating_mode */
uint8_t CAN_SJW; /* Specifies the maximum number of time quanta
the CAN hardware is allowed to lengthen or
shorten a bit to perform resynchronization.
This parameter can be a value of
@ref CAN_synchronisation_jump_width */
uint8_t CAN_BS1; /* Specifies the number of time quanta in Bit
Segment 1. This parameter can be a value of
@ref CAN_time_quantum_in_bit_segment_1 */
uint8_t CAN_BS2; /* Specifies the number of time quanta in Bit
Segment 2.
This parameter can be a value of
@ref CAN_time_quantum_in_bit_segment_2 */
FunctionalState CAN_TTCM; /* Enable or disable the time triggered
communication mode. This parameter can be set
either to ENABLE or DISABLE. */
FunctionalState CAN_ABOM; /* Enable or disable the automatic bus-off
management. This parameter can be set either
to ENABLE or DISABLE. */
FunctionalState CAN_AWUM; /* Enable or disable the automatic wake-up mode.
This parameter can be set either to ENABLE or
DISABLE. */
FunctionalState CAN_NART; /* Enable or disable the no-automatic
retransmission mode. This parameter can be
set either to ENABLE or DISABLE. */
FunctionalState CAN_RFLM; /* Enable or disable the Receive FIFO Locked mode.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CAN_TXFP; /* Enable or disable the transmit FIFO priority.
This parameter can be set either to ENABLE
or DISABLE. */
} CAN_InitTypeDef;
/* CAN filter init structure definition */
typedef struct
{
uint16_t CAN_FilterIdHigh; /* Specifies the filter identification number (MSBs for a 32-bit
configuration, first one for a 16-bit configuration).
This parameter can be a value between 0x0000 and 0xFFFF */
uint16_t CAN_FilterIdLow; /* Specifies the filter identification number (LSBs for a 32-bit
configuration, second one for a 16-bit configuration).
This parameter can be a value between 0x0000 and 0xFFFF */
uint16_t CAN_FilterMaskIdHigh; /* Specifies the filter mask number or identification number,
according to the mode (MSBs for a 32-bit configuration,
first one for a 16-bit configuration).
This parameter can be a value between 0x0000 and 0xFFFF */
uint16_t CAN_FilterMaskIdLow; /* Specifies the filter mask number or identification number,
according to the mode (LSBs for a 32-bit configuration,
second one for a 16-bit configuration).
This parameter can be a value between 0x0000 and 0xFFFF */
uint16_t CAN_FilterFIFOAssignment; /* Specifies the FIFO (0 or 1) which will be assigned to the filter.
This parameter can be a value of @ref CAN_filter_FIFO */
uint8_t CAN_FilterNumber; /* Specifies the filter which will be initialized. It ranges from 0 to 13. */
uint8_t CAN_FilterMode; /* Specifies the filter mode to be initialized.
This parameter can be a value of @ref CAN_filter_mode */
uint8_t CAN_FilterScale; /* Specifies the filter scale.
This parameter can be a value of @ref CAN_filter_scale */
FunctionalState CAN_FilterActivation; /* Enable or disable the filter.
This parameter can be set either to ENABLE or DISABLE. */
} CAN_FilterInitTypeDef;
/* CAN Tx message structure definition */
typedef struct
{
uint32_t StdId; /* Specifies the standard identifier.
This parameter can be a value between 0 to 0x7FF. */
uint32_t ExtId; /* Specifies the extended identifier.
This parameter can be a value between 0 to 0x1FFFFFFF. */
uint8_t IDE; /* Specifies the type of identifier for the message that
will be transmitted. This parameter can be a value
of @ref CAN_identifier_type */
uint8_t RTR; /* Specifies the type of frame for the message that will
be transmitted. This parameter can be a value of
@ref CAN_remote_transmission_request */
uint8_t DLC; /* Specifies the length of the frame that will be
transmitted. This parameter can be a value between
0 to 8 */
uint8_t Data[8]; /* Contains the data to be transmitted. It ranges from 0
to 0xFF. */
} CanTxMsg;
/* CAN Rx message structure definition */
typedef struct
{
uint32_t StdId; /* Specifies the standard identifier.
This parameter can be a value between 0 to 0x7FF. */
uint32_t ExtId; /* Specifies the extended identifier.
This parameter can be a value between 0 to 0x1FFFFFFF. */
uint8_t IDE; /* Specifies the type of identifier for the message that
will be received. This parameter can be a value of
@ref CAN_identifier_type */
uint8_t RTR; /* Specifies the type of frame for the received message.
This parameter can be a value of
@ref CAN_remote_transmission_request */
uint8_t DLC; /* Specifies the length of the frame that will be received.
This parameter can be a value between 0 to 8 */
uint8_t Data[8]; /* Contains the data to be received. It ranges from 0 to
0xFF. */
uint8_t FMI; /* Specifies the index of the filter the message stored in
the mailbox passes through. This parameter can be a
value between 0 to 0xFF */
} CanRxMsg;
/* CANFD init structure definition */
typedef struct
{
uint16_t CANFD_Prescaler; /* Specifies the length of a time quantum.
It ranges from 1 to 32. */
uint8_t CANFD_Mode; /* Specifies the CAN operating mode.
This parameter can be a value of
@ref CAN_operating_mode */
uint8_t CANFD_SJW; /* Specifies the maximum number of time quanta
the CAN hardware is allowed to lengthen or
shorten a bit to perform resynchronization.
This parameter can be a value of
@ref CANFD_synchronisation_jump_width */
uint8_t CANFD_BS1; /* Specifies the number of time quanta in Bit
Segment 1. This parameter can be a value of
@ref CANFD_time_quantum_in_bit_segment_1 */
uint8_t CANFD_BS2; /* Specifies the number of time quanta in Bit
Segment 2.
This parameter can be a value of
@ref CANFD_time_quantum_in_bit_segment_2 */
uint8_t CANFD_TDC_FILTER; /* Specifies the number of time quanta in Bit Segment
Minimum delay of internal delay counter.
It ranges from 0 to 63. */
uint8_t CANFD_TDC0; /* Specifies the number of time quanta in Bit Segment
transmission delay compensation offset.
It ranges from 0 to 63. */
FunctionalState CANFD_TDCE; /* Enable or disable transmission delay compensation offset.
This parameter can be set either to ENABLE or DISABLE. */
FunctionalState CANFD_TTCM; /* Enable or disable the time triggered
communication mode. This parameter can be set
either to ENABLE or DISABLE. */
FunctionalState CANFD_ABOM; /* Enable or disable the automatic bus-off
management. This parameter can be set either
to ENABLE or DISABLE. */
FunctionalState CANFD_AWUM; /* Enable or disable the automatic wake-up mode.
This parameter can be set either to ENABLE or
DISABLE. */
FunctionalState CANFD_NART; /* Enable or disable the no-automatic
retransmission mode. This parameter can be
set either to ENABLE or DISABLE. */
FunctionalState CANFD_TXFP; /* Enable or disable the transmit FIFO priority.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_RES_Error; /* Enable or disable the RES bit can generate error .
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_ESI_Auto_TXM0; /* Enable or disable the ESI bit auto mode for Tx mailbox 0.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_ESI_Auto_TXM1; /* Enable or disable the ESI bit auto mode for Tx mailbox 1.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_ESI_Auto_TXM2; /* Enable or disable the ESI bit auto mode for Tx mailbox 2.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_BRS_TXM0; /* Enable or disable the BRS bit speed switch for Tx mailbox 0.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_BRS_TXM1; /* Enable or disable the BRS bit speed switch for Tx mailbox 1.
This parameter can be set either to ENABLE
or DISABLE. */
FunctionalState CANFD_BRS_TXM2; /* Enable or disable the BRS bit speed switch for Tx mailbox 2.
This parameter can be set either to ENABLE
or DISABLE. */
} CANFD_InitTypeDef;
/* CANFD Tx message structure definition */
typedef struct
{
uint32_t StdId; /* Specifies the standard identifier.
This parameter can be a value between 0 to 0x7FF. */
uint32_t ExtId; /* Specifies the extended identifier.
This parameter can be a value between 0 to 0x1FFFFFFF. */
uint8_t Data[64]; /* Contains the data to be transmitted. It ranges from 0
to 0xFF. */
uint8_t IDE; /* Specifies the type of identifier for the message that
will be transmitted. This parameter can be a value
of @ref CAN_identifier_type */
uint8_t RTR; /* Specifies the type of frame for the message that will
be transmitted. This parameter can be a value of
@ref CAN_remote_transmission_request */
uint8_t DLC; /* Specifies the length of the frame that will be
transmitted.
This parameter can be a value of
@ref CANFD_data_length_code */
} CanFDTxMsg;
/* CANFD Rx message structure definition */
typedef struct
{
uint32_t StdId; /* Specifies the standard identifier.
This parameter can be a value between 0 to 0x7FF. */
uint32_t ExtId; /* Specifies the extended identifier.
This parameter can be a value between 0 to 0x1FFFFFFF. */
uint8_t Data[64]; /* Contains the data to be received. It ranges from 0 to
0xFF. */
uint8_t IDE; /* Specifies the type of identifier for the message that
will be received. This parameter can be a value of
@ref CAN_identifier_type */
uint8_t RTR; /* Specifies the type of frame for the received message.
This parameter can be a value of
@ref CAN_remote_transmission_request */
uint8_t DLC; /* Specifies the length of the frame that will be received.
This parameter can be a value of
0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64 */
uint8_t BRS; /* Specifies the length of the frame that will be received.
This parameter can be a value of
@ref CANFD_data_length_code */
uint8_t ESI; /* Specifies the length of the frame that will be received.
This parameter can be a value of
@ref CANFD_data_length_code */
uint8_t RES; /* Specifies the length of the frame that will be received.
This parameter can be a value of
@ref CANFD_data_length_code */
uint8_t FMI; /* Specifies the index of the filter the message stored in
the mailbox passes through. This parameter can be a
value between 0 to 0xFF */
} CanFDRxMsg;
/* CAN_sleep_constants */
#define CAN_InitStatus_Failed ((uint8_t)0x00) /* CAN initialization failed */
#define CAN_InitStatus_Success ((uint8_t)0x01) /* CAN initialization OK */
/* CAN_Mode */
#define CAN_Mode_Normal ((uint8_t)0x00) /* normal mode */
#define CAN_Mode_LoopBack ((uint8_t)0x01) /* loopback mode */
#define CAN_Mode_Silent ((uint8_t)0x02) /* silent mode */
#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /* loopback combined with silent mode */
/* CAN_Operating_Mode */
#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /* Initialization mode */
#define CAN_OperatingMode_Normal ((uint8_t)0x01) /* Normal mode */
#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /* sleep mode */
/* CAN_Mode_Status */
#define CAN_ModeStatus_Failed ((uint8_t)0x00) /* CAN entering the specific mode failed */
#define CAN_ModeStatus_Success ((uint8_t)!CAN_ModeStatus_Failed) /* CAN entering the specific mode Succeed */
/* CAN_synchronisation_jump_width */
#define CAN_SJW_1tq ((uint8_t)0x00) /* 1 time quantum */
#define CAN_SJW_2tq ((uint8_t)0x01) /* 2 time quantum */
#define CAN_SJW_3tq ((uint8_t)0x02) /* 3 time quantum */
#define CAN_SJW_4tq ((uint8_t)0x03) /* 4 time quantum */
/* CAN_time_quantum_in_bit_segment_1 */
#define CAN_BS1_1tq ((uint8_t)0x00) /* 1 time quantum */
#define CAN_BS1_2tq ((uint8_t)0x01) /* 2 time quantum */
#define CAN_BS1_3tq ((uint8_t)0x02) /* 3 time quantum */
#define CAN_BS1_4tq ((uint8_t)0x03) /* 4 time quantum */
#define CAN_BS1_5tq ((uint8_t)0x04) /* 5 time quantum */
#define CAN_BS1_6tq ((uint8_t)0x05) /* 6 time quantum */
#define CAN_BS1_7tq ((uint8_t)0x06) /* 7 time quantum */
#define CAN_BS1_8tq ((uint8_t)0x07) /* 8 time quantum */
#define CAN_BS1_9tq ((uint8_t)0x08) /* 9 time quantum */
#define CAN_BS1_10tq ((uint8_t)0x09) /* 10 time quantum */
#define CAN_BS1_11tq ((uint8_t)0x0A) /* 11 time quantum */
#define CAN_BS1_12tq ((uint8_t)0x0B) /* 12 time quantum */
#define CAN_BS1_13tq ((uint8_t)0x0C) /* 13 time quantum */
#define CAN_BS1_14tq ((uint8_t)0x0D) /* 14 time quantum */
#define CAN_BS1_15tq ((uint8_t)0x0E) /* 15 time quantum */
#define CAN_BS1_16tq ((uint8_t)0x0F) /* 16 time quantum */
/* CAN_time_quantum_in_bit_segment_2 */
#define CAN_BS2_1tq ((uint8_t)0x00) /* 1 time quantum */
#define CAN_BS2_2tq ((uint8_t)0x01) /* 2 time quantum */
#define CAN_BS2_3tq ((uint8_t)0x02) /* 3 time quantum */
#define CAN_BS2_4tq ((uint8_t)0x03) /* 4 time quantum */
#define CAN_BS2_5tq ((uint8_t)0x04) /* 5 time quantum */
#define CAN_BS2_6tq ((uint8_t)0x05) /* 6 time quantum */
#define CAN_BS2_7tq ((uint8_t)0x06) /* 7 time quantum */
#define CAN_BS2_8tq ((uint8_t)0x07) /* 8 time quantum */
/* CAN_filter_mode */
#define CAN_FilterMode_IdMask ((uint8_t)0x00) /* identifier/mask mode */
#define CAN_FilterMode_IdList ((uint8_t)0x01) /* identifier list mode */
/* CAN_filter_scale */
#define CAN_FilterScale_16bit ((uint8_t)0x00) /* Two 16-bit filters */
#define CAN_FilterScale_32bit ((uint8_t)0x01) /* One 32-bit filter */
/* CAN_filter_FIFO */
#define CAN_Filter_FIFO0 ((uint8_t)0x00) /* Filter FIFO 0 assignment for filter x */
#define CAN_Filter_FIFO1 ((uint8_t)0x01) /* Filter FIFO 1 assignment for filter x */
/* CAN_identifier_type */
#define CAN_Id_Standard ((uint32_t)0x00000000) /* Standard Id */
#define CAN_Id_Extended ((uint32_t)0x00000004) /* Extended Id */
/* CAN_remote_transmission_request */
#define CAN_RTR_Data ((uint32_t)0x00000000) /* Data frame */
#define CAN_RTR_Remote ((uint32_t)0x00000002) /* Remote frame */
/* CAN_transmit_constants */
#define CAN_TxStatus_Failed ((uint8_t)0x00) /* CAN transmission failed */
#define CAN_TxStatus_Ok ((uint8_t)0x01) /* CAN transmission succeeded */
#define CAN_TxStatus_Pending ((uint8_t)0x02) /* CAN transmission pending */
#define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /* CAN cell did not provide an empty mailbox */
/* CAN_receive_FIFO_number_constants */
#define CAN_FIFO0 ((uint8_t)0x00) /* CAN FIFO 0 used to receive */
#define CAN_FIFO1 ((uint8_t)0x01) /* CAN FIFO 1 used to receive */
/* CAN_sleep_constants */
#define CAN_Sleep_Failed ((uint8_t)0x00) /* CAN did not enter the sleep mode */
#define CAN_Sleep_Ok ((uint8_t)0x01) /* CAN entered the sleep mode */
/* CAN_wake_up_constants */
#define CAN_WakeUp_Failed ((uint8_t)0x00) /* CAN did not leave the sleep mode */
#define CAN_WakeUp_Ok ((uint8_t)0x01) /* CAN leaved the sleep mode */
/* CAN_Error_Code_constants */
#define CAN_ErrorCode_NoErr ((uint8_t)0x00) /* No Error */
#define CAN_ErrorCode_StuffErr ((uint8_t)0x10) /* Stuff Error */
#define CAN_ErrorCode_FormErr ((uint8_t)0x20) /* Form Error */
#define CAN_ErrorCode_ACKErr ((uint8_t)0x30) /* Acknowledgment Error */
#define CAN_ErrorCode_BitRecessiveErr ((uint8_t)0x40) /* Bit Recessive Error */
#define CAN_ErrorCode_BitDominantErr ((uint8_t)0x50) /* Bit Dominant Error */
#define CAN_ErrorCode_CRCErr ((uint8_t)0x60) /* CRC Error */
#define CAN_ErrorCode_SoftwareSetErr ((uint8_t)0x70) /* Software Set Error */
/* CAN_flags */
/* Transmit Flags */
/* If the flag is 0x3XXXXXXX, it means that it can be used with CAN_GetFlagStatus()
* and CAN_ClearFlag() functions.
* If the flag is 0x1XXXXXXX, it means that it can only be used with CAN_GetFlagStatus() function.
*/
#define CAN_FLAG_RQCP0 ((uint32_t)0x38000001) /* Request MailBox0 Flag */
#define CAN_FLAG_RQCP1 ((uint32_t)0x38000100) /* Request MailBox1 Flag */
#define CAN_FLAG_RQCP2 ((uint32_t)0x38010000) /* Request MailBox2 Flag */
/* Receive Flags */
#define CAN_FLAG_FMP0 ((uint32_t)0x12000003) /* FIFO 0 Message Pending Flag */
#define CAN_FLAG_FF0 ((uint32_t)0x32000008) /* FIFO 0 Full Flag */
#define CAN_FLAG_FOV0 ((uint32_t)0x32000010) /* FIFO 0 Overrun Flag */
#define CAN_FLAG_FMP1 ((uint32_t)0x14000003) /* FIFO 1 Message Pending Flag */
#define CAN_FLAG_FF1 ((uint32_t)0x34000008) /* FIFO 1 Full Flag */
#define CAN_FLAG_FOV1 ((uint32_t)0x34000010) /* FIFO 1 Overrun Flag */
/* Operating Mode Flags */
#define CAN_FLAG_WKU ((uint32_t)0x31000008) /* Wake up Flag */
#define CAN_FLAG_SLAK ((uint32_t)0x31000012) /* Sleep acknowledge Flag */
/* Note:
*When SLAK intterupt is disabled (SLKIE=0), no polling on SLAKI is possible.
*In this case the SLAK bit can be polled.
*/
/* Error Flags */
#define CAN_FLAG_EWG ((uint32_t)0x10F00001) /* Error Warning Flag */
#define CAN_FLAG_EPV ((uint32_t)0x10F00002) /* Error Passive Flag */
#define CAN_FLAG_BOF ((uint32_t)0x10F00004) /* Bus-Off Flag */
#define CAN_FLAG_LEC ((uint32_t)0x30F00070) /* Last error code Flag */
/* CAN_interrupts */
#define CAN_IT_TME ((uint32_t)0x00000001) /* Transmit mailbox empty Interrupt*/
/* Receive Interrupts */
#define CAN_IT_FMP0 ((uint32_t)0x00000002) /* FIFO 0 message pending Interrupt*/
#define CAN_IT_FF0 ((uint32_t)0x00000004) /* FIFO 0 full Interrupt*/
#define CAN_IT_FOV0 ((uint32_t)0x00000008) /* FIFO 0 overrun Interrupt*/
#define CAN_IT_FMP1 ((uint32_t)0x00000010) /* FIFO 1 message pending Interrupt*/
#define CAN_IT_FF1 ((uint32_t)0x00000020) /* FIFO 1 full Interrupt*/
#define CAN_IT_FOV1 ((uint32_t)0x00000040) /* FIFO 1 overrun Interrupt*/
/* Operating Mode Interrupts */
#define CAN_IT_WKU ((uint32_t)0x00010000) /* Wake-up Interrupt*/
#define CAN_IT_SLK ((uint32_t)0x00020000) /* Sleep acknowledge Interrupt*/
/* Error Interrupts */
#define CAN_IT_EWG ((uint32_t)0x00000100) /* Error warning Interrupt*/
#define CAN_IT_EPV ((uint32_t)0x00000200) /* Error passive Interrupt*/
#define CAN_IT_BOF ((uint32_t)0x00000400) /* Bus-off Interrupt*/
#define CAN_IT_LEC ((uint32_t)0x00000800) /* Last error code Interrupt*/
#define CAN_IT_ERR ((uint32_t)0x00008000) /* Error Interrupt*/
/* Flags named as Interrupts : kept only for FW compatibility */
#define CAN_IT_RQCP0 CAN_IT_TME
#define CAN_IT_RQCP1 CAN_IT_TME
#define CAN_IT_RQCP2 CAN_IT_TME
/* CAN_Legacy */
#define CANINITFAILED CAN_InitStatus_Failed
#define CANINITOK CAN_InitStatus_Success
#define CAN_FilterFIFO0 CAN_Filter_FIFO0
#define CAN_FilterFIFO1 CAN_Filter_FIFO1
#define CAN_ID_STD CAN_Id_Standard
#define CAN_ID_EXT CAN_Id_Extended
#define CAN_RTR_DATA CAN_RTR_Data
#define CAN_RTR_REMOTE CAN_RTR_Remote
#define CANTXFAILE CAN_TxStatus_Failed
#define CANTXOK CAN_TxStatus_Ok
#define CANTXPENDING CAN_TxStatus_Pending
#define CAN_NO_MB CAN_TxStatus_NoMailBox
#define CANSLEEPFAILED CAN_Sleep_Failed
#define CANSLEEPOK CAN_Sleep_Ok
#define CANWAKEUPFAILED CAN_WakeUp_Failed
#define CANWAKEUPOK CAN_WakeUp_Ok
/* CAN_BS1_Mode */
#define CAN_BS1_4bit ((uint32_t)0x00000000)
#define CAN_BS1_6bit ((uint32_t)0x00000100)
/* CANFD_data_length_code */
#define CANFD_DLC_BYTES_0 ((uint32_t)0x0000) /* 0 bytes data field */
#define CANFD_DLC_BYTES_1 ((uint32_t)0x0001) /* 1 bytes data field */
#define CANFD_DLC_BYTES_2 ((uint32_t)0x0002) /* 2 bytes data field */
#define CANFD_DLC_BYTES_3 ((uint32_t)0x0003) /* 3 bytes data field */
#define CANFD_DLC_BYTES_4 ((uint32_t)0x0004) /* 4 bytes data field */
#define CANFD_DLC_BYTES_5 ((uint32_t)0x0005) /* 5 bytes data field */
#define CANFD_DLC_BYTES_6 ((uint32_t)0x0006) /* 6 bytes data field */
#define CANFD_DLC_BYTES_7 ((uint32_t)0x0007) /* 7 bytes data field */
#define CANFD_DLC_BYTES_8 ((uint32_t)0x0008) /* 8 bytes data field */
#define CANFD_DLC_BYTES_12 ((uint32_t)0x0009) /* 12 bytes data field */
#define CANFD_DLC_BYTES_16 ((uint32_t)0x000A) /* 16 bytes data field */
#define CANFD_DLC_BYTES_20 ((uint32_t)0x000B) /* 20 bytes data field */
#define CANFD_DLC_BYTES_24 ((uint32_t)0x000C) /* 24 bytes data field */
#define CANFD_DLC_BYTES_32 ((uint32_t)0x000D) /* 32 bytes data field */
#define CANFD_DLC_BYTES_48 ((uint32_t)0x000E) /* 48 bytes data field */
#define CANFD_DLC_BYTES_64 ((uint32_t)0x000F) /* 64 bytes data field */
/* CANFD_synchronisation_jump_width */
#define CANFD_SJW_1tq ((uint8_t)0x00) /* 1 time quantum */
#define CANFD_SJW_2tq ((uint8_t)0x01) /* 2 time quantum */
#define CANFD_SJW_3tq ((uint8_t)0x02) /* 3 time quantum */
#define CANFD_SJW_4tq ((uint8_t)0x03) /* 4 time quantum */
#define CANFD_SJW_5tq ((uint8_t)0x04) /* 5 time quantum */
#define CANFD_SJW_6tq ((uint8_t)0x05) /* 6 time quantum */
#define CANFD_SJW_7tq ((uint8_t)0x06) /* 7 time quantum */
#define CANFD_SJW_8tq ((uint8_t)0x07) /* 8 time quantum */
#define CANFD_SJW_9tq ((uint8_t)0x08) /* 9 time quantum */
#define CANFD_SJW_10tq ((uint8_t)0x09) /* 10 time quantum */
#define CANFD_SJW_11tq ((uint8_t)0x0A) /* 11 time quantum */
#define CANFD_SJW_12tq ((uint8_t)0x0B) /* 12 time quantum */
#define CANFD_SJW_13tq ((uint8_t)0x0C) /* 13 time quantum */
#define CANFD_SJW_14tq ((uint8_t)0x0D) /* 14 time quantum */
#define CANFD_SJW_15tq ((uint8_t)0x0E) /* 15 time quantum */
#define CANFD_SJW_16tq ((uint8_t)0x0F) /* 16 time quantum */
/* CANFD_time_quantum_in_bit_segment_1 */
#define CANFD_BS1_1tq ((uint8_t)0x00) /* 1 time quantum */
#define CANFD_BS1_2tq ((uint8_t)0x01) /* 2 time quantum */
#define CANFD_BS1_3tq ((uint8_t)0x02) /* 3 time quantum */
#define CANFD_BS1_4tq ((uint8_t)0x03) /* 4 time quantum */
#define CANFD_BS1_5tq ((uint8_t)0x04) /* 5 time quantum */
#define CANFD_BS1_6tq ((uint8_t)0x05) /* 6 time quantum */
#define CANFD_BS1_7tq ((uint8_t)0x06) /* 7 time quantum */
#define CANFD_BS1_8tq ((uint8_t)0x07) /* 8 time quantum */
#define CANFD_BS1_9tq ((uint8_t)0x08) /* 9 time quantum */
#define CANFD_BS1_10tq ((uint8_t)0x09) /* 10 time quantum */
#define CANFD_BS1_11tq ((uint8_t)0x0A) /* 11 time quantum */
#define CANFD_BS1_12tq ((uint8_t)0x0B) /* 12 time quantum */
#define CANFD_BS1_13tq ((uint8_t)0x0C) /* 13 time quantum */
#define CANFD_BS1_14tq ((uint8_t)0x0D) /* 14 time quantum */
#define CANFD_BS1_15tq ((uint8_t)0x0E) /* 15 time quantum */
#define CANFD_BS1_16tq ((uint8_t)0x0F) /* 16 time quantum */
#define CANFD_BS1_17tq ((uint8_t)0x10) /* 17 time quantum */
#define CANFD_BS1_18tq ((uint8_t)0x11) /* 18 time quantum */
#define CANFD_BS1_19tq ((uint8_t)0x12) /* 19 time quantum */
#define CANFD_BS1_20tq ((uint8_t)0x13) /* 20 time quantum */
#define CANFD_BS1_21tq ((uint8_t)0x14) /* 21 time quantum */
#define CANFD_BS1_22tq ((uint8_t)0x15) /* 22 time quantum */
#define CANFD_BS1_23tq ((uint8_t)0x16) /* 23 time quantum */
#define CANFD_BS1_24tq ((uint8_t)0x17) /* 24 time quantum */
#define CANFD_BS1_25tq ((uint8_t)0x18) /* 25 time quantum */
#define CANFD_BS1_26tq ((uint8_t)0x19) /* 26 time quantum */
#define CANFD_BS1_27tq ((uint8_t)0x1A) /* 27 time quantum */
#define CANFD_BS1_28tq ((uint8_t)0x1B) /* 28 time quantum */
#define CANFD_BS1_29tq ((uint8_t)0x1C) /* 29 time quantum */
#define CANFD_BS1_30tq ((uint8_t)0x1D) /* 30 time quantum */
#define CANFD_BS1_31tq ((uint8_t)0x1E) /* 31 time quantum */
#define CANFD_BS1_32tq ((uint8_t)0x1F) /* 32 time quantum */
/* CANFD_time_quantum_in_bit_segment_2 */
#define CANFD_BS2_1tq ((uint8_t)0x00) /* 1 time quantum */
#define CANFD_BS2_2tq ((uint8_t)0x01) /* 2 time quantum */
#define CANFD_BS2_3tq ((uint8_t)0x02) /* 3 time quantum */
#define CANFD_BS2_4tq ((uint8_t)0x03) /* 4 time quantum */
#define CANFD_BS2_5tq ((uint8_t)0x04) /* 5 time quantum */
#define CANFD_BS2_6tq ((uint8_t)0x05) /* 6 time quantum */
#define CANFD_BS2_7tq ((uint8_t)0x06) /* 7 time quantum */
#define CANFD_BS2_8tq ((uint8_t)0x07) /* 8 time quantum */
#define CANFD_BS2_9tq ((uint8_t)0x08) /* 9 time quantum */
#define CANFD_BS2_10tq ((uint8_t)0x09) /* 10 time quantum */
#define CANFD_BS2_11tq ((uint8_t)0x0A) /* 11 time quantum */
#define CANFD_BS2_12tq ((uint8_t)0x0B) /* 12 time quantum */
#define CANFD_BS2_13tq ((uint8_t)0x0C) /* 13 time quantum */
#define CANFD_BS2_14tq ((uint8_t)0x0D) /* 14 time quantum */
#define CANFD_BS2_15tq ((uint8_t)0x0E) /* 15 time quantum */
#define CANFD_BS2_16tq ((uint8_t)0x0F) /* 16 time quantum */
/* CAN_Transmit_Mailbox_number_constants */
#define CAN_Transmit_Mailbox0 ((uint8_t)0x00)
#define CAN_Transmit_Mailbox1 ((uint8_t)0x01)
#define CAN_Transmit_Mailbox2 ((uint8_t)0x02)
void CAN_DeInit(CAN_TypeDef *CANx);
uint8_t CAN_Init(CAN_TypeDef *CANx, CAN_InitTypeDef *CAN_InitStruct);
void CAN_FilterInit(CAN_FilterInitTypeDef *CAN_FilterInitStruct);
void CAN_StructInit(CAN_InitTypeDef *CAN_InitStruct);
void CAN_SlaveStartBank(uint8_t CAN_BankNumber);
void CAN_DBGFreeze(CAN_TypeDef *CANx, FunctionalState NewState);
void CAN_TTComModeCmd(CAN_TypeDef *CANx, FunctionalState NewState);
uint8_t CAN_Transmit(CAN_TypeDef *CANx, CanTxMsg *TxMessage);
uint8_t CAN_TransmitStatus(CAN_TypeDef *CANx, uint8_t TransmitMailbox);
void CAN_CancelTransmit(CAN_TypeDef *CANx, uint8_t Mailbox);
void CAN_Receive(CAN_TypeDef *CANx, uint8_t FIFONumber, CanRxMsg *RxMessage);
void CAN_FIFORelease(CAN_TypeDef *CANx, uint8_t FIFONumber);
uint8_t CAN_MessagePending(CAN_TypeDef *CANx, uint8_t FIFONumber);
uint8_t CAN_OperatingModeRequest(CAN_TypeDef *CANx, uint8_t CAN_OperatingMode);
uint8_t CAN_Sleep(CAN_TypeDef *CANx);
uint8_t CAN_WakeUp(CAN_TypeDef *CANx);
uint8_t CAN_GetLastErrorCode(CAN_TypeDef *CANx);
uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef *CANx);
uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef *CANx);
void CAN_ITConfig(CAN_TypeDef *CANx, uint32_t CAN_IT, FunctionalState NewState);
FlagStatus CAN_GetFlagStatus(CAN_TypeDef *CANx, uint32_t CAN_FLAG);
void CAN_ClearFlag(CAN_TypeDef *CANx, uint32_t CAN_FLAG);
ITStatus CAN_GetITStatus(CAN_TypeDef *CANx, uint32_t CAN_IT);
void CAN_ClearITPendingBit(CAN_TypeDef *CANx, uint32_t CAN_IT);
void CAN_BS1_ModeConfig(CAN_TypeDef* CANx, uint32_t CAN_BS1_Mode, uint8_t CAN_BS1_tq);
void CAN_BusOff_ErrCntConfig(CAN_TypeDef *CANx, uint8_t BusOff_ErrCnt);
void CANFD_Restrict_ModeCmd(CAN_TypeDef *CANx, FunctionalState NewState);
uint8_t CANFD_Init(CAN_TypeDef *CANx, CANFD_InitTypeDef *CANFD_InitStruct);
void CANFD_StructInit(CANFD_InitTypeDef *CANFD_InitStruct);
uint8_t CANFD_Transmit(CAN_TypeDef *CANx, CanFDTxMsg *TxMessage);
ErrorStatus CANFD_Receive(CAN_TypeDef *CANx, uint8_t FIFONumber, CanFDRxMsg *RxMessage);
uint8_t CANFD_GetTransmitDelayOffsetVal(CAN_TypeDef *CANx);
void CANFD_TransmitMailbox_DMAAdr(CAN_TypeDef *CANx, uint8_t MailboxNumber, uint32_t Address);
void CANFD_ReceiveFIFO_DMAAdr(CAN_TypeDef *CANx, uint8_t FIFONumber, uint32_t Address);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,33 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_crc.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* CRC firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_CRC_H
#define __CH32L103_CRC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
void CRC_ResetDR(void);
uint32_t CRC_CalcCRC(uint32_t Data);
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength);
uint32_t CRC_GetCRC(void);
void CRC_SetIDRegister(uint8_t IDValue);
uint8_t CRC_GetIDRegister(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,46 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_dbgmcu.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* DBGMCU firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_DBGMCU_H
#define __CH32L103_DBGMCU_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
#define DBGMCU_SLEEP ((uint32_t)0x00000001)
#define DBGMCU_STOP ((uint32_t)0x00000002)
#define DBGMCU_STANDBY ((uint32_t)0x00000004)
#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100)
#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200)
#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00000400)
#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00000800)
#define DBGMCU_TIM1_STOP ((uint32_t)0x00001000)
#define DBGMCU_TIM2_STOP ((uint32_t)0x00002000)
#define DBGMCU_TIM3_STOP ((uint32_t)0x00004000)
#define DBGMCU_TIM4_STOP ((uint32_t)0x00008000)
#define DBGMCU_CAN1_STOP ((uint32_t)0x00100000)
uint32_t DBGMCU_GetREVID(void);
uint32_t DBGMCU_GetDEVID(void);
uint32_t __get_DEBUG_CR(void);
void __set_DEBUG_CR(uint32_t value);
void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState);
uint32_t DBGMCU_GetCHIPID( void );
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,184 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_dma.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* DMA firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_DMA_H
#define __CH32L103_DMA_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* DMA Init structure definition */
typedef struct
{
uint32_t DMA_PeripheralBaseAddr; /* Specifies the peripheral base address for DMAy Channelx. */
uint32_t DMA_MemoryBaseAddr; /* Specifies the memory base address for DMAy Channelx. */
uint32_t DMA_DIR; /* Specifies if the peripheral is the source or destination.
This parameter can be a value of @ref DMA_data_transfer_direction */
uint32_t DMA_BufferSize; /* Specifies the buffer size, in data unit, of the specified Channel.
The data unit is equal to the configuration set in DMA_PeripheralDataSize
or DMA_MemoryDataSize members depending in the transfer direction. */
uint32_t DMA_PeripheralInc; /* Specifies whether the Peripheral address register is incremented or not.
This parameter can be a value of @ref DMA_peripheral_incremented_mode */
uint32_t DMA_MemoryInc; /* Specifies whether the memory address register is incremented or not.
This parameter can be a value of @ref DMA_memory_incremented_mode */
uint32_t DMA_PeripheralDataSize; /* Specifies the Peripheral data width.
This parameter can be a value of @ref DMA_peripheral_data_size */
uint32_t DMA_MemoryDataSize; /* Specifies the Memory data width.
This parameter can be a value of @ref DMA_memory_data_size */
uint32_t DMA_Mode; /* Specifies the operation mode of the DMAy Channelx.
This parameter can be a value of @ref DMA_circular_normal_mode.
@note: The circular buffer mode cannot be used if the memory-to-memory
data transfer is configured on the selected Channel */
uint32_t DMA_Priority; /* Specifies the software priority for the DMAy Channelx.
This parameter can be a value of @ref DMA_priority_level */
uint32_t DMA_M2M; /* Specifies if the DMAy Channelx will be used in memory-to-memory transfer.
This parameter can be a value of @ref DMA_memory_to_memory */
} DMA_InitTypeDef;
/* DMA_data_transfer_direction */
#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010)
#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)
/* DMA_peripheral_incremented_mode */
#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040)
#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000)
/* DMA_memory_incremented_mode */
#define DMA_MemoryInc_Enable ((uint32_t)0x00000080)
#define DMA_MemoryInc_Disable ((uint32_t)0x00000000)
/* DMA_peripheral_data_size */
#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000)
#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100)
#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200)
/* DMA_memory_data_size */
#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000)
#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400)
#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800)
/* DMA_circular_normal_mode */
#define DMA_Mode_Circular ((uint32_t)0x00000020)
#define DMA_Mode_Normal ((uint32_t)0x00000000)
/* DMA_priority_level */
#define DMA_Priority_VeryHigh ((uint32_t)0x00003000)
#define DMA_Priority_High ((uint32_t)0x00002000)
#define DMA_Priority_Medium ((uint32_t)0x00001000)
#define DMA_Priority_Low ((uint32_t)0x00000000)
/* DMA_memory_to_memory */
#define DMA_M2M_Enable ((uint32_t)0x00004000)
#define DMA_M2M_Disable ((uint32_t)0x00000000)
/* DMA_interrupts_definition */
#define DMA_IT_TC ((uint32_t)0x00000002)
#define DMA_IT_HT ((uint32_t)0x00000004)
#define DMA_IT_TE ((uint32_t)0x00000008)
#define DMA1_IT_GL1 ((uint32_t)0x00000001)
#define DMA1_IT_TC1 ((uint32_t)0x00000002)
#define DMA1_IT_HT1 ((uint32_t)0x00000004)
#define DMA1_IT_TE1 ((uint32_t)0x00000008)
#define DMA1_IT_GL2 ((uint32_t)0x00000010)
#define DMA1_IT_TC2 ((uint32_t)0x00000020)
#define DMA1_IT_HT2 ((uint32_t)0x00000040)
#define DMA1_IT_TE2 ((uint32_t)0x00000080)
#define DMA1_IT_GL3 ((uint32_t)0x00000100)
#define DMA1_IT_TC3 ((uint32_t)0x00000200)
#define DMA1_IT_HT3 ((uint32_t)0x00000400)
#define DMA1_IT_TE3 ((uint32_t)0x00000800)
#define DMA1_IT_GL4 ((uint32_t)0x00001000)
#define DMA1_IT_TC4 ((uint32_t)0x00002000)
#define DMA1_IT_HT4 ((uint32_t)0x00004000)
#define DMA1_IT_TE4 ((uint32_t)0x00008000)
#define DMA1_IT_GL5 ((uint32_t)0x00010000)
#define DMA1_IT_TC5 ((uint32_t)0x00020000)
#define DMA1_IT_HT5 ((uint32_t)0x00040000)
#define DMA1_IT_TE5 ((uint32_t)0x00080000)
#define DMA1_IT_GL6 ((uint32_t)0x00100000)
#define DMA1_IT_TC6 ((uint32_t)0x00200000)
#define DMA1_IT_HT6 ((uint32_t)0x00400000)
#define DMA1_IT_TE6 ((uint32_t)0x00800000)
#define DMA1_IT_GL7 ((uint32_t)0x01000000)
#define DMA1_IT_TC7 ((uint32_t)0x02000000)
#define DMA1_IT_HT7 ((uint32_t)0x04000000)
#define DMA1_IT_TE7 ((uint32_t)0x08000000)
#define DMA1_IT_GL8 ((uint32_t)0x10000000)
#define DMA1_IT_TC8 ((uint32_t)0x20000000)
#define DMA1_IT_HT8 ((uint32_t)0x40000000)
#define DMA1_IT_TE8 ((uint32_t)0x80000000)
/* DMA_flags_definition */
#define DMA1_FLAG_GL1 ((uint32_t)0x00000001)
#define DMA1_FLAG_TC1 ((uint32_t)0x00000002)
#define DMA1_FLAG_HT1 ((uint32_t)0x00000004)
#define DMA1_FLAG_TE1 ((uint32_t)0x00000008)
#define DMA1_FLAG_GL2 ((uint32_t)0x00000010)
#define DMA1_FLAG_TC2 ((uint32_t)0x00000020)
#define DMA1_FLAG_HT2 ((uint32_t)0x00000040)
#define DMA1_FLAG_TE2 ((uint32_t)0x00000080)
#define DMA1_FLAG_GL3 ((uint32_t)0x00000100)
#define DMA1_FLAG_TC3 ((uint32_t)0x00000200)
#define DMA1_FLAG_HT3 ((uint32_t)0x00000400)
#define DMA1_FLAG_TE3 ((uint32_t)0x00000800)
#define DMA1_FLAG_GL4 ((uint32_t)0x00001000)
#define DMA1_FLAG_TC4 ((uint32_t)0x00002000)
#define DMA1_FLAG_HT4 ((uint32_t)0x00004000)
#define DMA1_FLAG_TE4 ((uint32_t)0x00008000)
#define DMA1_FLAG_GL5 ((uint32_t)0x00010000)
#define DMA1_FLAG_TC5 ((uint32_t)0x00020000)
#define DMA1_FLAG_HT5 ((uint32_t)0x00040000)
#define DMA1_FLAG_TE5 ((uint32_t)0x00080000)
#define DMA1_FLAG_GL6 ((uint32_t)0x00100000)
#define DMA1_FLAG_TC6 ((uint32_t)0x00200000)
#define DMA1_FLAG_HT6 ((uint32_t)0x00400000)
#define DMA1_FLAG_TE6 ((uint32_t)0x00800000)
#define DMA1_FLAG_GL7 ((uint32_t)0x01000000)
#define DMA1_FLAG_TC7 ((uint32_t)0x02000000)
#define DMA1_FLAG_HT7 ((uint32_t)0x04000000)
#define DMA1_FLAG_TE7 ((uint32_t)0x08000000)
#define DMA1_FLAG_GL8 ((uint32_t)0x10000000)
#define DMA1_FLAG_TC8 ((uint32_t)0x20000000)
#define DMA1_FLAG_HT8 ((uint32_t)0x40000000)
#define DMA1_FLAG_TE8 ((uint32_t)0x80000000)
void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx);
void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitTypeDef *DMA_InitStruct);
void DMA_StructInit(DMA_InitTypeDef *DMA_InitStruct);
void DMA_Cmd(DMA_Channel_TypeDef *DMAy_Channelx, FunctionalState NewState);
void DMA_ITConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber);
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx);
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
void DMA_ClearFlag(uint32_t DMAy_FLAG);
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
void DMA_ClearITPendingBit(uint32_t DMAy_IT);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,90 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_exti.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/05/06
* Description : This file contains all the functions prototypes for the
* EXTI firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_EXTI_H
#define __CH32L103_EXTI_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* EXTI mode enumeration */
typedef enum
{
EXTI_Mode_Interrupt = 0x00,
EXTI_Mode_Event = 0x04
} EXTIMode_TypeDef;
/* EXTI Trigger enumeration */
typedef enum
{
EXTI_Trigger_Rising = 0x08,
EXTI_Trigger_Falling = 0x0C,
EXTI_Trigger_Rising_Falling = 0x10
} EXTITrigger_TypeDef;
/* EXTI Init Structure definition */
typedef struct
{
uint32_t EXTI_Line; /* Specifies the EXTI lines to be enabled or disabled.
This parameter can be any combination of @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /* Specifies the mode for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /* Specifies the trigger signal active edge for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
FunctionalState EXTI_LineCmd; /* Specifies the new state of the selected EXTI lines.
This parameter can be set either to ENABLE or DISABLE */
} EXTI_InitTypeDef;
/* EXTI_Lines */
#define EXTI_Line0 ((uint32_t)0x00001) /* External interrupt line 0 */
#define EXTI_Line1 ((uint32_t)0x00002) /* External interrupt line 1 */
#define EXTI_Line2 ((uint32_t)0x00004) /* External interrupt line 2 */
#define EXTI_Line3 ((uint32_t)0x00008) /* External interrupt line 3 */
#define EXTI_Line4 ((uint32_t)0x00010) /* External interrupt line 4 */
#define EXTI_Line5 ((uint32_t)0x00020) /* External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00040) /* External interrupt line 6 */
#define EXTI_Line7 ((uint32_t)0x00080) /* External interrupt line 7 */
#define EXTI_Line8 ((uint32_t)0x00100) /* External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00200) /* External interrupt line 9 */
#define EXTI_Line10 ((uint32_t)0x00400) /* External interrupt line 10 */
#define EXTI_Line11 ((uint32_t)0x00800) /* External interrupt line 11 */
#define EXTI_Line12 ((uint32_t)0x01000) /* External interrupt line 12 */
#define EXTI_Line13 ((uint32_t)0x02000) /* External interrupt line 13 */
#define EXTI_Line14 ((uint32_t)0x04000) /* External interrupt line 14 */
#define EXTI_Line15 ((uint32_t)0x08000) /* External interrupt line 15 */
#define EXTI_Line16 ((uint32_t)0x10000) /* External interrupt line 16 Connected to the PVD Output */
#define EXTI_Line17 ((uint32_t)0x20000) /* External interrupt line 17 Connected to the RTC Alarm event */
#define EXTI_Line19 ((uint32_t)0x80000) /* External interrupt line 19 Connected to the USBPD Wakeup event */
#define EXTI_Line20 ((uint32_t)0x100000) /* External interrupt line 20 Connected to the USBFS Wakeup event */
#define EXTI_Line21 ((uint32_t)0x200000) /* External interrupt line 21 Connected to the LPTIM Wakeup event */
#define EXTI_Line22 ((uint32_t)0x400000) /* External interrupt line 22 Connected to the COMP Wakeup event */
void EXTI_DeInit(void);
void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct);
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,142 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_flash.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the FLASH
* firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_FLASH_H
#define __CH32L103_FLASH_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* FLASH Status */
typedef enum
{
FLASH_BUSY = 1,
FLASH_ERROR_PG,
FLASH_ERROR_WRP,
FLASH_COMPLETE,
FLASH_TIMEOUT,
FLASH_RDP,
FLASH_OP_RANGE_ERROR = 0xFD,
FLASH_ALIGN_ERROR = 0xFE,
FLASH_ADR_RANGE_ERROR = 0xFF,
} FLASH_Status;
/* Flash_Latency */
#define FLASH_Latency_0 ((uint32_t)0x00000000) /* FLASH Zero Latency cycle */
#define FLASH_Latency_1 ((uint32_t)0x00000001) /* FLASH One Latency cycle */
#define FLASH_Latency_2 ((uint32_t)0x00000002) /* FLASH Two Latency cycle */
/* Write Protect 1Sectors = 2KB */
#define FLASH_WRProt_Sectors0 ((uint32_t)0x00000001) /* Write protection of sector 0 */
#define FLASH_WRProt_Sectors1 ((uint32_t)0x00000002) /* Write protection of sector 1 */
#define FLASH_WRProt_Sectors2 ((uint32_t)0x00000004) /* Write protection of sector 2 */
#define FLASH_WRProt_Sectors3 ((uint32_t)0x00000008) /* Write protection of sector 3 */
#define FLASH_WRProt_Sectors4 ((uint32_t)0x00000010) /* Write protection of sector 4 */
#define FLASH_WRProt_Sectors5 ((uint32_t)0x00000020) /* Write protection of sector 5 */
#define FLASH_WRProt_Sectors6 ((uint32_t)0x00000040) /* Write protection of sector 6 */
#define FLASH_WRProt_Sectors7 ((uint32_t)0x00000080) /* Write protection of sector 7 */
#define FLASH_WRProt_Sectors8 ((uint32_t)0x00000100) /* Write protection of sector 8 */
#define FLASH_WRProt_Sectors9 ((uint32_t)0x00000200) /* Write protection of sector 9 */
#define FLASH_WRProt_Sectors10 ((uint32_t)0x00000400) /* Write protection of sector 10 */
#define FLASH_WRProt_Sectors11 ((uint32_t)0x00000800) /* Write protection of sector 11 */
#define FLASH_WRProt_Sectors12 ((uint32_t)0x00001000) /* Write protection of sector 12 */
#define FLASH_WRProt_Sectors13 ((uint32_t)0x00002000) /* Write protection of sector 13 */
#define FLASH_WRProt_Sectors14 ((uint32_t)0x00004000) /* Write protection of sector 14 */
#define FLASH_WRProt_Sectors15 ((uint32_t)0x00008000) /* Write protection of sector 15 */
#define FLASH_WRProt_Sectors16 ((uint32_t)0x00010000) /* Write protection of sector 16 */
#define FLASH_WRProt_Sectors17 ((uint32_t)0x00020000) /* Write protection of sector 17 */
#define FLASH_WRProt_Sectors18 ((uint32_t)0x00040000) /* Write protection of sector 18 */
#define FLASH_WRProt_Sectors19 ((uint32_t)0x00080000) /* Write protection of sector 19 */
#define FLASH_WRProt_Sectors20 ((uint32_t)0x00100000) /* Write protection of sector 20 */
#define FLASH_WRProt_Sectors21 ((uint32_t)0x00200000) /* Write protection of sector 21 */
#define FLASH_WRProt_Sectors22 ((uint32_t)0x00400000) /* Write protection of sector 22 */
#define FLASH_WRProt_Sectors23 ((uint32_t)0x00800000) /* Write protection of sector 23 */
#define FLASH_WRProt_Sectors24 ((uint32_t)0x01000000) /* Write protection of sector 24 */
#define FLASH_WRProt_Sectors25 ((uint32_t)0x02000000) /* Write protection of sector 25 */
#define FLASH_WRProt_Sectors26 ((uint32_t)0x04000000) /* Write protection of sector 26 */
#define FLASH_WRProt_Sectors27 ((uint32_t)0x08000000) /* Write protection of sector 27 */
#define FLASH_WRProt_Sectors28 ((uint32_t)0x10000000) /* Write protection of sector 28 */
#define FLASH_WRProt_Sectors29 ((uint32_t)0x20000000) /* Write protection of sector 29 */
#define FLASH_WRProt_Sectors30 ((uint32_t)0x40000000) /* Write protection of sector 30 */
#define FLASH_WRProt_Sectors31 ((uint32_t)0x80000000) /* Write protection of sector 31 */
#define FLASH_WRProt_AllSectors ((uint32_t)0xFFFFFFFF) /* Write protection of all Sectors */
/* Option_Bytes_IWatchdog */
#define OB_IWDG_SW ((uint16_t)0x0001) /* Software IWDG selected */
#define OB_IWDG_HW ((uint16_t)0x0000) /* Hardware IWDG selected */
/* Option_Bytes_nRST_STOP */
#define OB_STOP_NoRST ((uint16_t)0x0002) /* No reset generated when entering in STOP */
#define OB_STOP_RST ((uint16_t)0x0000) /* Reset generated when entering in STOP */
/* Option_Bytes_nRST_STDBY */
#define OB_STDBY_NoRST ((uint16_t)0x0004) /* No reset generated when entering in STANDBY */
#define OB_STDBY_RST ((uint16_t)0x0000) /* Reset generated when entering in STANDBY */
/* Option_Bytes_OB_CAN_BusOff_MODE */
#define OB_CAN_BusOff_MODE1 ((uint16_t)0x0020) /* Bus off recovery mode1 */
#define OB_CAN_BusOff_MODE2 ((uint16_t)0x0000) /* Bus off recovery mode2 */
/* FLASH_Interrupts */
#define FLASH_IT_ERROR ((uint32_t)0x00000400) /* FPEC error interrupt source */
#define FLASH_IT_EOP ((uint32_t)0x00001000) /* End of FLASH Operation Interrupt source */
#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /* FPEC BANK1 error interrupt source */
#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /* End of FLASH BANK1 Operation Interrupt source */
/* FLASH_Flags */
#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /* FLASH Busy flag */
#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /* FLASH Write protected error flag */
#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /* FLASH End of Operation flag */
#define FLASH_FLAG_WAKE_UP ((uint32_t)0x00000040) /* FLASH Wake up of Operation flag */
#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /* FLASH Option Byte error flag */
#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /* FLASH BANK1 Busy flag*/
#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /* FLASH BANK1 End of Operation flag */
#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /* FLASH BANK1 Write protected error flag */
/*Functions used for all devices*/
void FLASH_SetLatency(uint32_t FLASH_Latency);
void FLASH_Unlock(void);
void FLASH_Lock(void);
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
FLASH_Status FLASH_EraseAllPages(void);
FLASH_Status FLASH_EraseOptionBytes(void);
FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages);
FLASH_Status FLASH_EnableReadOutProtection(void);
FLASH_Status FLASH_UserOptionByteConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY, uint8_t OB_RST);
uint32_t FLASH_GetUserOptionByte(void);
uint32_t FLASH_GetWriteProtectionOptionByte(void);
FlagStatus FLASH_GetReadOutProtectionStatus(void);
void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState);
FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG);
void FLASH_ClearFlag(uint32_t FLASH_FLAG);
FLASH_Status FLASH_GetStatus(void);
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);
void FLASH_Unlock_Fast(void);
void FLASH_Lock_Fast(void);
void FLASH_BufReset(void);
void FLASH_BufLoad(uint32_t Address, uint32_t Data0);
void FLASH_ErasePage_Fast(uint32_t Page_Address);
void FLASH_EraseBlock_32K_Fast(uint32_t Block_Address);
void FLASH_ProgramPage_Fast(uint32_t Page_Address);
FLASH_Status FLASH_ROM_ERASE(uint32_t StartAddr, uint32_t Length);
FLASH_Status FLASH_ROM_WRITE(uint32_t StartAddr, uint32_t *pbuf, uint32_t Length);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,178 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_gpio.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/03/01
* Description : This file contains all the functions prototypes for the
* GPIO firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_GPIO_H
#define __CH32L103_GPIO_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* Output Maximum frequency selection */
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
} GPIOSpeed_TypeDef;
/* Configuration Mode enumeration */
typedef enum
{
GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
} GPIOMode_TypeDef;
/* GPIO Init structure definition */
typedef struct
{
uint16_t GPIO_Pin; /* Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /* Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /* Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
} GPIO_InitTypeDef;
/* Bit_SET and Bit_RESET enumeration */
typedef enum
{
Bit_RESET = 0,
Bit_SET
} BitAction;
/* GPIO_pins_define */
#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */
/* GPIO_Remap_define */
//bit[31:30] = 11b - PCFR1-bit[15-0] and PCFR2-bit[26:16]
/* bit[29:27] = 000b */
#define GPIO_PartialRemap1_SPI1 ((uint32_t)0xC0000001) /* SPI1 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_SPI1 ((uint32_t)0xC1000000) /* SPI1 Partial2 Alternate Function mapping */
#define GPIO_FullRemap_SPI1 ((uint32_t)0xC1000001) /* SPI1 Full Alternate Function mapping */
/* bit[29:27] = 001b */
#define GPIO_PartialRemap1_I2C1 ((uint32_t)0xC8800000) /* I2C1 Partial1 Alternate Function mapping */
#define GPIO_FullRemap_I2C1 ((uint32_t)0xC8800002) /* I2C1 Full Alternate Function mapping */
/* bit[29:27] = 010b */
#define GPIO_PartialRemap1_USART1 ((uint32_t)0xD0000004) /* USART1 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_USART1 ((uint32_t)0xD0080000) /* USART1 Partial2 Alternate Function mapping */
#define GPIO_PartialRemap3_USART1 ((uint32_t)0xD0080004) /* USART1 Partial3 Alternate Function mapping */
#define GPIO_PartialRemap4_USART1 ((uint32_t)0xD0100000) /* USART1 Partial4 Alternate Function mapping */
#define GPIO_FullRemap_USART1 ((uint32_t)0xD0100004) /* USART1 Full Alternate Function mapping */
/* bit[29:27] = 011b */
#define GPIO_PartialRemap1_USART2 ((uint32_t)0xD8000008) /* USART2 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_USART2 ((uint32_t)0xD8040000) /* USART2 Partial2 Alternate Function mapping */
#define GPIO_FullRemap_USART2 ((uint32_t)0xD8040008) /* USART2 Full Alternate Function mapping */
/* bit[29:27] = 100b */
#define GPIO_PartialRemap1_TIM1 ((uint32_t)0xE0000040) /* TIM1 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_TIM1 ((uint32_t)0xE0000080) /* TIM1 Partial2 Alternate Function mapping */
#define GPIO_PartialRemap3_TIM1 ((uint32_t)0xE00000C0) /* TIM1 Partial3 Alternate Function mapping */
#define GPIO_PartialRemap4_TIM1 ((uint32_t)0xE0400000) /* TIM1 Partial4 Alternate Function mapping */
#define GPIO_PartialRemap5_TIM1 ((uint32_t)0xE0400040) /* TIM1 Partial5 Alternate Function mapping */
#define GPIO_FullRemap_TIM1 ((uint32_t)0xE04000C0) /* TIM1 Full Alternate Function mapping */
/* bit[29:27] = 101b */
#define GPIO_PartialRemap1_TIM2 ((uint32_t)0xE8000100) /* TIM2 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_TIM2 ((uint32_t)0xE8000200) /* TIM2 Partial2 Alternate Function mapping */
#define GPIO_PartialRemap3_TIM2 ((uint32_t)0xE8000300) /* TIM2 Partial3 Alternate Function mapping */
#define GPIO_PartialRemap4_TIM2 ((uint32_t)0xE8200000) /* TIM2 Partial4 Alternate Function mapping */
#define GPIO_PartialRemap5_TIM2 ((uint32_t)0xE8200100) /* TIM2 Partial5 Alternate Function mapping */
#define GPIO_FullRemap_TIM2 ((uint32_t)0xE8200300) /* TIM2 Full Alternate Function mapping */
//bit[31:30] = 00b - PCFR1
#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140020) /* USART3 Partial Alternate Function mapping */
#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /* USART3 Full Alternate Function mapping */
#define GPIO_Remap_TIM3 ((uint32_t)0x00000400) /* TIM3 Alternate Function mapping */
#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /* TIM4 Alternate Function mapping */
#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /* CAN1 Alternate Function mapping */
#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /* CAN1 Alternate Function mapping */
#define GPIO_Remap_PD01 ((uint32_t)0x00008000) /* PD01 Alternate Function mapping */
#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /* GPIO_Remap_SWJ_Disable - Full SDI Disabled (SDI) */
//bit[31:30] = 01b - PCFR2
#define GPIO_Remap_USART4 ((uint32_t)0x40000001) /* USART4 Alternate Function mapping */
#define GPIO_Remap_LPTIM ((uint32_t)0x40000200) /* LPTIM Alternate Function mapping */
/* GPIO_Port_Sources */
#define GPIO_PortSourceGPIOA ((uint8_t)0x00)
#define GPIO_PortSourceGPIOB ((uint8_t)0x01)
#define GPIO_PortSourceGPIOC ((uint8_t)0x02)
#define GPIO_PortSourceGPIOD ((uint8_t)0x03)
/* GPIO_Pin_sources */
#define GPIO_PinSource0 ((uint8_t)0x00)
#define GPIO_PinSource1 ((uint8_t)0x01)
#define GPIO_PinSource2 ((uint8_t)0x02)
#define GPIO_PinSource3 ((uint8_t)0x03)
#define GPIO_PinSource4 ((uint8_t)0x04)
#define GPIO_PinSource5 ((uint8_t)0x05)
#define GPIO_PinSource6 ((uint8_t)0x06)
#define GPIO_PinSource7 ((uint8_t)0x07)
#define GPIO_PinSource8 ((uint8_t)0x08)
#define GPIO_PinSource9 ((uint8_t)0x09)
#define GPIO_PinSource10 ((uint8_t)0x0A)
#define GPIO_PinSource11 ((uint8_t)0x0B)
#define GPIO_PinSource12 ((uint8_t)0x0C)
#define GPIO_PinSource13 ((uint8_t)0x0D)
#define GPIO_PinSource14 ((uint8_t)0x0E)
#define GPIO_PinSource15 ((uint8_t)0x0F)
void GPIO_DeInit(GPIO_TypeDef *GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx);
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal);
void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_IPD_Unused(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,424 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_i2c.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* I2C firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_I2C_H
#define __CH32L103_I2C_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* I2C Init structure definition */
typedef struct
{
uint32_t I2C_ClockSpeed; /* Specifies the clock frequency.
This parameter must be set to a value lower than 400kHz */
uint16_t I2C_Mode; /* Specifies the I2C mode.
This parameter can be a value of @ref I2C_mode */
uint16_t I2C_DutyCycle; /* Specifies the I2C fast mode duty cycle.
This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
uint16_t I2C_OwnAddress1; /* Specifies the first device own address.
This parameter can be a 7-bit or 10-bit address. */
uint16_t I2C_Ack; /* Enables or disables the acknowledgement.
This parameter can be a value of @ref I2C_acknowledgement */
uint16_t I2C_AcknowledgedAddress; /* Specifies if 7-bit or 10-bit address is acknowledged.
This parameter can be a value of @ref I2C_acknowledged_address */
} I2C_InitTypeDef;
/* I2C_mode */
#define I2C_Mode_I2C ((uint16_t)0x0000)
#define I2C_Mode_SMBusDevice ((uint16_t)0x0002)
#define I2C_Mode_SMBusHost ((uint16_t)0x000A)
/* I2C_duty_cycle_in_fast_mode */
#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /* I2C fast mode Tlow/Thigh = 16/9 */
#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /* I2C fast mode Tlow/Thigh = 2 */
/* I2C_acknowledgement */
#define I2C_Ack_Enable ((uint16_t)0x0400)
#define I2C_Ack_Disable ((uint16_t)0x0000)
/* I2C_transfer_direction */
#define I2C_Direction_Transmitter ((uint8_t)0x00)
#define I2C_Direction_Receiver ((uint8_t)0x01)
/* I2C_acknowledged_address */
#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000)
#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000)
/* I2C_registers */
#define I2C_Register_CTLR1 ((uint8_t)0x00)
#define I2C_Register_CTLR2 ((uint8_t)0x04)
#define I2C_Register_OADDR1 ((uint8_t)0x08)
#define I2C_Register_OADDR2 ((uint8_t)0x0C)
#define I2C_Register_DATAR ((uint8_t)0x10)
#define I2C_Register_STAR1 ((uint8_t)0x14)
#define I2C_Register_STAR2 ((uint8_t)0x18)
#define I2C_Register_CKCFGR ((uint8_t)0x1C)
#define I2C_Register_RTR ((uint8_t)0x20)
/* I2C_SMBus_alert_pin_level */
#define I2C_SMBusAlert_Low ((uint16_t)0x2000)
#define I2C_SMBusAlert_High ((uint16_t)0xDFFF)
/* I2C_PEC_position */
#define I2C_PECPosition_Next ((uint16_t)0x0800)
#define I2C_PECPosition_Current ((uint16_t)0xF7FF)
/* I2C_NACK_position */
#define I2C_NACKPosition_Next ((uint16_t)0x0800)
#define I2C_NACKPosition_Current ((uint16_t)0xF7FF)
/* I2C_interrupts_definition */
#define I2C_IT_BUF ((uint16_t)0x0400)
#define I2C_IT_EVT ((uint16_t)0x0200)
#define I2C_IT_ERR ((uint16_t)0x0100)
/* I2C_interrupts_definition */
#define I2C_IT_SMBALERT ((uint32_t)0x01008000)
#define I2C_IT_TIMEOUT ((uint32_t)0x01004000)
#define I2C_IT_PECERR ((uint32_t)0x01001000)
#define I2C_IT_OVR ((uint32_t)0x01000800)
#define I2C_IT_AF ((uint32_t)0x01000400)
#define I2C_IT_ARLO ((uint32_t)0x01000200)
#define I2C_IT_BERR ((uint32_t)0x01000100)
#define I2C_IT_TXE ((uint32_t)0x06000080)
#define I2C_IT_RXNE ((uint32_t)0x06000040)
#define I2C_IT_STOPF ((uint32_t)0x02000010)
#define I2C_IT_ADD10 ((uint32_t)0x02000008)
#define I2C_IT_BTF ((uint32_t)0x02000004)
#define I2C_IT_ADDR ((uint32_t)0x02000002)
#define I2C_IT_SB ((uint32_t)0x02000001)
/* STAR2 register flags */
#define I2C_FLAG_DUALF ((uint32_t)0x00800000)
#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000)
#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000)
#define I2C_FLAG_GENCALL ((uint32_t)0x00100000)
#define I2C_FLAG_TRA ((uint32_t)0x00040000)
#define I2C_FLAG_BUSY ((uint32_t)0x00020000)
#define I2C_FLAG_MSL ((uint32_t)0x00010000)
/* STAR1 register flags */
#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000)
#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000)
#define I2C_FLAG_PECERR ((uint32_t)0x10001000)
#define I2C_FLAG_OVR ((uint32_t)0x10000800)
#define I2C_FLAG_AF ((uint32_t)0x10000400)
#define I2C_FLAG_ARLO ((uint32_t)0x10000200)
#define I2C_FLAG_BERR ((uint32_t)0x10000100)
#define I2C_FLAG_TXE ((uint32_t)0x10000080)
#define I2C_FLAG_RXNE ((uint32_t)0x10000040)
#define I2C_FLAG_STOPF ((uint32_t)0x10000010)
#define I2C_FLAG_ADD10 ((uint32_t)0x10000008)
#define I2C_FLAG_BTF ((uint32_t)0x10000004)
#define I2C_FLAG_ADDR ((uint32_t)0x10000002)
#define I2C_FLAG_SB ((uint32_t)0x10000001)
/****************I2C Master Events (Events grouped in order of communication)********************/
/********************************************************************************************************************
* @brief Start communicate
*
* After master use I2C_GenerateSTART() function sending the START condition,the master
* has to wait for event 5(the Start condition has been correctly
* released on the I2C bus ).
*
*/
/* EVT5 */
#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */
/********************************************************************************************************************
* @brief Address Acknowledge
*
* When start condition correctly released on the bus(check EVT5), the
* master use I2C_Send7bitAddress() function sends the address of the slave(s) with which it will communicate
* it also determines master as transmitter or Receiver. Then the master has to wait that a slave acknowledges
* his address. If an acknowledge is sent on the bus, one of the following events will be set:
*
* 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED
* event is set.
*
* 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
* is set
*
* 3) In case of 10-Bit addressing mode, the master (after generating the START
* and checking on EVT5) use I2C_SendData() function send the header of 10-bit addressing mode.
* Then master wait EVT9. EVT9 means that the 10-bit addressing header has been correctly sent
* on the bus. Then master should use the function I2C_Send7bitAddress() to send the second part
* of the 10-bit address (LSB) . Then master should wait for event 6.
*
*
*/
/* EVT6 */
#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */
#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */
/* EVT9 */
#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */
/********************************************************************************************************************
* @brief Communication events
*
* If START condition has generated and slave address
* been acknowledged. then the master has to check one of the following events for
* communication procedures:
*
* 1) Master Receiver mode: The master has to wait on the event EVT7 then use
* I2C_ReceiveData() function to read the data received from the slave.
*
* 2) Master Transmitter mode: The master use I2C_SendData() function to send data
* then to wait on event EVT8 or EVT8_2.
* These two events are similar:
* - EVT8 means that the data has been written in the data register and is
* being shifted out.
* - EVT8_2 means that the data has been physically shifted out and output
* on the bus.
* In most cases, using EVT8 is sufficient for the application.
* Using EVT8_2 will leads to a slower communication speed but will more reliable .
* EVT8_2 is also more suitable than EVT8 for testing on the last data transmission
*
* Note:
* In case the user software does not guarantee that this event EVT7 is managed before
* the current byte end of transfer, then user may check on I2C_EVENT_MASTER_BYTE_RECEIVED
* and I2C_FLAG_BTF flag at the same time .But in this case the communication may be slower.
*
*
*/
/* Master Receive mode */
/* EVT7 */
#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */
/* Master Transmitter mode*/
/* EVT8 */
#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */
/* EVT8_2 */
#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */
/******************I2C Slave Events (Events grouped in order of communication)******************/
/********************************************************************************************************************
* @brief Start Communicate events
*
* Wait on one of these events at the start of the communication. It means that
* the I2C peripheral detected a start condition of master device generate on the bus.
* If the acknowledge feature is enabled through function I2C_AcknowledgeConfig()),The peripheral generates an ACK condition on the bus.
*
* a) In normal case (only one address managed by the slave), when the address
* sent by the master matches the own address of the peripheral (configured by
* I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set
* (where XXX could be TRANSMITTER or RECEIVER).
*
* b) In case the address sent by the master matches the second address of the
* peripheral (configured by the function I2C_OwnAddress2Config() and enabled
* by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED
* (where XXX could be TRANSMITTER or RECEIVER) are set.
*
* c) In case the address sent by the master is General Call (address 0x00) and
* if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd())
* the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED.
*
*/
/* EVT1 */
/* a) Case of One Single Address managed by the slave */
#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */
#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */
/* b) Case of Dual address managed by the slave */
#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */
#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */
/* c) Case of General Call enabled for the slave */
#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */
/********************************************************************************************************************
* @brief Communication events
*
* Wait on one of these events when EVT1 has already been checked :
*
* - Slave Receiver mode:
* - EVT2--The device is expecting to receive a data byte .
* - EVT4--The device is expecting the end of the communication: master
* sends a stop condition and data transmission is stopped.
*
* - Slave Transmitter mode:
* - EVT3--When a byte has been transmitted by the slave and the Master is expecting
* the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and
* I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. If the user software doesn't guarantee
* the EVT3 is managed before the current byte end of transfer The second one can optionally
* be used.
* - EVT3_2--When the master sends a NACK to tell slave device that data transmission
* shall end . The slave device has to stop sending
* data bytes and wait a Stop condition from bus.
*
* Note:
* If the user software does not guarantee that the event 2 is
* managed before the current byte end of transfer, User may check on I2C_EVENT_SLAVE_BYTE_RECEIVED
* and I2C_FLAG_BTF flag at the same time .
* In this case the communication will be slower.
*
*/
/* Slave Receiver mode*/
/* EVT2 */
#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */
/* EVT4 */
#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */
/* Slave Transmitter mode*/
/* EVT3 */
#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */
#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */
/* EVT3_2 */
#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */
void I2C_DeInit(I2C_TypeDef *I2Cx);
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitTypeDef *I2C_InitStruct);
void I2C_StructInit(I2C_InitTypeDef *I2C_InitStruct);
void I2C_Cmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_DMACmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_DMALastTransferCmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_GenerateSTART(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_GenerateSTOP(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_AcknowledgeConfig(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_OwnAddress2Config(I2C_TypeDef *I2Cx, uint8_t Address);
void I2C_DualAddressCmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_GeneralCallCmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_ITConfig(I2C_TypeDef *I2Cx, uint16_t I2C_IT, FunctionalState NewState);
void I2C_SendData(I2C_TypeDef *I2Cx, uint8_t Data);
uint8_t I2C_ReceiveData(I2C_TypeDef *I2Cx);
void I2C_Send7bitAddress(I2C_TypeDef *I2Cx, uint8_t Address, uint8_t I2C_Direction);
uint16_t I2C_ReadRegister(I2C_TypeDef *I2Cx, uint8_t I2C_Register);
void I2C_SoftwareResetCmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_NACKPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_NACKPosition);
void I2C_SMBusAlertConfig(I2C_TypeDef *I2Cx, uint16_t I2C_SMBusAlert);
void I2C_TransmitPEC(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_PECPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_PECPosition);
void I2C_CalculatePEC(I2C_TypeDef *I2Cx, FunctionalState NewState);
uint8_t I2C_GetPEC(I2C_TypeDef *I2Cx);
void I2C_ARPCmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_StretchClockCmd(I2C_TypeDef *I2Cx, FunctionalState NewState);
void I2C_FastModeDutyCycleConfig(I2C_TypeDef *I2Cx, uint16_t I2C_DutyCycle);
/*****************************************************************************************
*
* I2C State Monitoring Functions
*
****************************************************************************************
* This I2C driver provides three different ways for I2C state monitoring
* profit the application requirements and constraints:
*
*
* a) First way:
* Using I2C_CheckEvent() function:
* It compares the status registers (STARR1 and STAR2) content to a given event
* (can be the combination of more flags).
* If the current status registers includes the given flags will return SUCCESS.
* and if the current status registers miss flags will returns ERROR.
* - When to use:
* - This function is suitable for most applications as well as for startup
* activity since the events are fully described in the product reference manual
* (CH32FV2x-V3xRM).
* - It is also suitable for users who need to define their own events.
* - Limitations:
* - If an error occurs besides to the monitored error,
* the I2C_CheckEvent() function may return SUCCESS despite the communication
* in corrupted state. it is suggeted to use error interrupts to monitor the error
* events and handle them in IRQ handler.
*
*
* Note:
* The following functions are recommended for error management: :
* - I2C_ITConfig() main function of configure and enable the error interrupts.
* - I2Cx_ER_IRQHandler() will be called when the error interrupt happen.
* Where x is the peripheral instance (I2C1, I2C2 ...)
* - I2Cx_ER_IRQHandler() will call I2C_GetFlagStatus() or I2C_GetITStatus() functions
* to determine which error occurred.
* - I2C_ClearFlag() \ I2C_ClearITPendingBit() \ I2C_SoftwareResetCmd()
* \ I2C_GenerateStop() will be use to clear the error flag and source,
* and return to correct communication status.
*
*
* b) Second way:
* Using the function to get a single word(uint32_t) composed of status register 1 and register 2.
* (Status Register 2 value is shifted left by 16 bits and concatenated to Status Register 1).
* - When to use:
*
* - This function is suitable for the same applications above but it
* don't have the limitations of I2C_GetFlagStatus() function .
* The returned value could be compared to events already defined in the
* library (CH32L103_i2c.h) or to custom values defined by user.
* - This function can be used to monitor the status of multiple flags simultaneously.
* - Contrary to the I2C_CheckEvent () function, this function can choose the time to
* accept the event according to the user's needs (when all event flags are set and
* no other flags are set, or only when the required flags are set)
*
* - Limitations:
* - User may need to define his own events.
* - Same remark concerning the error management is applicable for this
* function if user decides to check only regular communication flags (and
* ignores error flags).
*
*
* c) Third way:
* Using the function I2C_GetFlagStatus() get the status of
* one single flag .
* - When to use:
* - This function could be used for specific applications or in debug phase.
* - It is suitable when only one flag checking is needed .
*
* - Limitations:
* - Call this function to access the status register. Some flag bits may be cleared.
* - Function may need to be called twice or more in order to monitor one single event.
*/
/*********************************************************
*
* a) Basic state monitoring(First way)
********************************************************
*/
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
/*********************************************************
*
* b) Advanced state monitoring(Second way)
********************************************************
*/
uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx);
/*********************************************************
*
* c) Flag-based state monitoring(Third way)
*********************************************************
*/
FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
void I2C_ClearFlag(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG);
ITStatus I2C_GetITStatus(I2C_TypeDef *I2Cx, uint32_t I2C_IT);
void I2C_ClearITPendingBit(I2C_TypeDef *I2Cx, uint32_t I2C_IT);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,50 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_iwdg.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* IWDG firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_IWDG_H
#define __CH32L103_IWDG_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* IWDG_WriteAccess */
#define IWDG_WriteAccess_Enable ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable ((uint16_t)0x0000)
/* IWDG_prescaler */
#define IWDG_Prescaler_4 ((uint8_t)0x00)
#define IWDG_Prescaler_8 ((uint8_t)0x01)
#define IWDG_Prescaler_16 ((uint8_t)0x02)
#define IWDG_Prescaler_32 ((uint8_t)0x03)
#define IWDG_Prescaler_64 ((uint8_t)0x04)
#define IWDG_Prescaler_128 ((uint8_t)0x05)
#define IWDG_Prescaler_256 ((uint8_t)0x06)
/* IWDG_Flag */
#define IWDG_FLAG_PVU ((uint16_t)0x0001)
#define IWDG_FLAG_RVU ((uint16_t)0x0002)
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
void IWDG_SetReload(uint16_t Reload);
void IWDG_ReloadCounter(void);
void IWDG_Enable(void);
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,200 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_lptim.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/07/15
* Description : This file contains all the functions prototypes for the
* TIM firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_LPTIM_H
#define __CH32L103_LPTIM_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
typedef struct
{
uint32_t LPTIM_ClockSource; /* Selects the clock source.
This parameter can be a value of @ref LPTIM_Clock_Source */
union{
uint32_t LPTIM_ClockPolarity; /* Configures Clock Polarity(No Encoder mode).
This parameter can be a value of @ref LPTIM_ClockPolarity */
uint32_t LPTIM_EncoderMode; /* Configures Encoder mode.
This parameter can be a value of @ref LPTIM_EncoderMode */
};
uint32_t LPTIM_ClockSampleTime; /* Configures Clock Sample Time.
This parameter can be a value of @ref LPTIM_ClockSampleTime */
uint32_t LPTIM_TriggerSampleTime; /* Configures Trigger Sample Time.
This parameter can be a value of @ref LPTIM_TriggerSampleTime */
uint32_t LPTIM_ClockPrescaler; /* Configures the clock Prescaler.
This parameter can be a value of @ref LPTIM_ClockPrescaler */
uint32_t LPTIM_TriggerSource; /* Configures trigger source.
This parameter can be a value of @ref LPTIM_TriggerSource */
uint32_t LPTIM_ExTriggerPolarity; /* Configures external trigger polarity.
This parameter can be a value of @ref LPTIM_ExTriggerPolarity */
FunctionalState LPTIM_TimeOut; /* Specifies whether the time out function.
This parameter can be set to ENABLE or DISABLE */
FunctionalState LPTIM_OnePulseMode; /* Specifies whether the PWM out one pulse.
This parameter can be set to ENABLE or DISABLE */
uint32_t LPTIM_OutputPolarity; /* Configures output polarity.
This parameter can be a value of @ref LPTIM_OutputPolarity */
uint32_t LPTIM_UpdateMode; /* Configures update mode.
This parameter can be a value of @ref LPTIM_UpdateMode */
uint32_t LPTIM_CountSource; /* Configures Counter Source.
This parameter can be a value of @ref LPTIM_CountSource */
FunctionalState LPTIM_Encoder; /* Specifies whether open Encoder function.
This parameter can be set to ENABLE or DISABLE */
uint32_t LPTIM_InClockSource; /* Specifies Internal clock source.
This parameter can be a value of @ref LPTIM_InClockSource */
FunctionalState LPTIM_ForceOutHigh; /* Specifies whether the PWM out high level.
This parameter can be set to ENABLE or DISABLE */
FunctionalState LPTIM_SingleMode; /* Specifies whether single mode.
This parameter can be set to ENABLE or DISABLE */
FunctionalState LPTIM_ContinuousMode; /* Specifies whether continuous mode.
This parameter can be set to ENABLE or DISABLE */
FunctionalState LPTIM_PWMOut; /* Specifies whether PWM out function.
This parameter can be set to ENABLE or DISABLE */
FunctionalState LPTIM_CounterDirIndicat; /* Specifies whether counter direction indicate function.
This parameter can be set to ENABLE or DISABLE */
uint16_t LPTIM_Pulse; /* Specifies the pulse value to be loaded into the Capture Compare Register.
This parameter can be a number between 0x0000 and 0xFFFF */
uint16_t LPTIM_Period; /* Specifies the period value to be loaded into the active
This parameter must be a number between 0x0000 and 0xFFFF. */
} LPTIM_TimeBaseInitTypeDef;
/* LPTIM_Clock_Source */
#define LPTIM_ClockSource_In ((uint32_t)0x00000000)
#define LPTIM_ClockSource_Ex ((uint32_t)0x00000001)
/* LPTIM_ClockPolarity */
#define LPTIM_ClockPolarity_Rising ((uint32_t)0x00000000)
#define LPTIM_ClockPolarity_Falling ((uint32_t)0x00000002)
#define LPTIM_ClockPolarity_Rising_Falling ((uint32_t)0x00000004)
/* LPTIM_ClockPrescalerTime */
#define LPTIM_ClockSampleTime_0T ((uint32_t)0x00000000)
#define LPTIM_ClockSampleTime_2T ((uint32_t)0x00000008)
#define LPTIM_ClockSampleTime_4T ((uint32_t)0x00000010)
#define LPTIM_ClockSampleTime_8T ((uint32_t)0x00000018)
/* LPTIM_TriggerSampleTime */
#define LPTIM_TriggerSampleTime_0T ((uint32_t)0x00000000)
#define LPTIM_TriggerSampleTime_2T ((uint32_t)0x00000040)
#define LPTIM_TriggerSampleTime_4T ((uint32_t)0x00000080)
#define LPTIM_TriggerSampleTime_8T ((uint32_t)0x000000C0)
/* LPTIM_ClockPrescaler */
#define LPTIM_TClockPrescaler_DIV1 ((uint32_t)0x00000000)
#define LPTIM_TClockPrescaler_DIV2 ((uint32_t)0x00000200)
#define LPTIM_TClockPrescaler_DIV4 ((uint32_t)0x00000400)
#define LPTIM_TClockPrescaler_DIV8 ((uint32_t)0x00000600)
#define LPTIM_TClockPrescaler_DIV16 ((uint32_t)0x00000800)
#define LPTIM_TClockPrescaler_DIV32 ((uint32_t)0x00000A00)
#define LPTIM_TClockPrescaler_DIV64 ((uint32_t)0x00000C00)
#define LPTIM_TClockPrescaler_DIV128 ((uint32_t)0x00000E00)
/* LPTIM_TriggerSource */
#define LPTIM_TriggerSource_ETR ((uint32_t)0x00000000)
#define LPTIM_TriggerSource_RTC_ALARM ((uint32_t)0x00002000)
#define LPTIM_TriggerSource_TAMP ((uint32_t)0x00004000)
/* LPTIM_ExTriggerPolarity */
#define LPTIM_ExTriggerPolarity_Disable ((uint32_t)0x00000000)
#define LPTIM_ExTriggerPolarity_Rising ((uint32_t)0x00020000)
#define LPTIM_ExTriggerPolarity_Falling ((uint32_t)0x00040000)
#define LPTIM_ExTriggerPolarity_Rising_Falling ((uint32_t)0x00060000)
/* LPTIM_OutputPolarity */
#define LPTIM_OutputPolarity_High ((uint32_t)0x00000000)
#define LPTIM_OutputPolarity_Low ((uint32_t)0x00200000)
/* LPTIM_UpdateMode */
#define LPTIM_UpdateMode0 ((uint32_t)0x00000000)
#define LPTIM_UpdateMode1 ((uint32_t)0x00400000)
/* LPTIM_CountSource */
#define LPTIM_CountSource_Internal ((uint32_t)0x00000000)
#define LPTIM_CountSource_External ((uint32_t)0x00800000)
/* LPTIM_InClockSource */
#define LPTIM_InClockSource_PCLK1 ((uint32_t)0x00000000)
#define LPTIM_InClockSource_HSI ((uint32_t)0x02000000)
#define LPTIM_InClockSource_LSE ((uint32_t)0x04000000)
#define LPTIM_InClockSource_LSI ((uint32_t)0x06000000)
/* LPTIM_Flag_Definition */
#define LPTIM_FLAG_DIR_SYNC ((uint32_t)0x00000080)
#define LPTIM_FLAG_DOWN ((uint32_t)0x00000040)
#define LPTIM_FLAG_UP ((uint32_t)0x00000020)
#define LPTIM_FLAG_ARROK ((uint32_t)0x00000010)
#define LPTIM_FLAG_CMPOK ((uint32_t)0x00000008)
#define LPTIM_FLAG_EXTTRIG ((uint32_t)0x00000004)
#define LPTIM_FLAG_ARRM ((uint32_t)0x00000002)
#define LPTIM_FLAG_CMPM ((uint32_t)0x00000001)
/* LPTIM_Interrupts_Definition */
#define LPTIM_IT_DOWN ((uint32_t)0x00000040)
#define LPTIM_IT_UP ((uint32_t)0x00000020)
#define LPTIM_IT_ARROK ((uint32_t)0x00000010)
#define LPTIM_IT_CMPOK ((uint32_t)0x00000008)
#define LPTIM_IT_EXTTRIG ((uint32_t)0x00000004)
#define LPTIM_IT_ARRM ((uint32_t)0x00000002)
#define LPTIM_IT_CMPM ((uint32_t)0x00000001)
#define LPYIM_OutputPolarity_High LPTIM_OutputPolarity_High
#define LPYIM_OutputPolarity_Low LPTIM_OutputPolarity_Low
#define LPYIM_UpdateMode0 LPTIM_UpdateMode0
#define LPYIM_UpdateMode1 LPTIM_UpdateMode1
void LPTIM_DeInit(void);
void LPTIM_TimeBaseInit(LPTIM_TimeBaseInitTypeDef* LPTIM_TimeBaseInitStruct);
void LPTIM_TimeBaseStructInit(LPTIM_TimeBaseInitTypeDef* LPTIM_TimeBaseInitStruct);
void LPTIM_CounterDirIndicat_Cmd(FunctionalState NewState);
void LPTIM_OutCmd(FunctionalState NewState);
void LPTIM_Cmd(FunctionalState NewState);
uint16_t LPTIM_GetCounter(void);
void LPTIM_SetAutoreload(uint16_t Autoreload);
void LPTIM_SetCompare(uint16_t Compare);
void LPTIM_ITConfig(uint32_t LPTIM_IT, FunctionalState NewState);
FlagStatus LPTIM_GetFlagStatus(uint32_t LPTIM_FLAG);
void LPTIM_ClearFlag(uint32_t LPTIM_FLAG);
ITStatus LPTIM_GetITStatus(uint32_t LPTIM_IT);
void LPTIM_ClearITPendingBit(uint32_t LPTIM_IT);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,72 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_misc.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/12/26
* Description : This file contains all the functions prototypes for the
* miscellaneous firmware library functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_MISC_H
#define __CH32L103_MISC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* CSR_INTSYSCR_INEST_definition */
#define INTSYSCR_INEST_NoEN 0x00 /* interrupt nesting disable(CSR-0x804 bit1 = 0) */
#define INTSYSCR_INEST_EN 0x01 /* interrupt nesting enable(CSR-0x804 bit1 = 1) */
/* Check the configuration of CSR(0x804) in the startup file(.S)
* interrupt nesting enable(CSR-0x804 bit1 = 1)
* priority - bit[7] - Preemption Priority
* bit[6:5] - Sub priority
* bit[4:0] - Reserve
* interrupt nesting disable(CSR-0x804 bit1 = 0)
* priority - bit[7:5] - Sub priority
* bit[4:0] - Reserve
*/
#ifndef INTSYSCR_INEST
#define INTSYSCR_INEST INTSYSCR_INEST_EN
#endif
/* NVIC Init Structure definition
* interrupt nesting enable(CSR-0x804 bit1 = 1)
* NVIC_IRQChannelPreemptionPriority - range from 0 to 1.
* NVIC_IRQChannelSubPriority - range from 0 to 3.
*
* interrupt nesting disable(CSR-0x804 bit1 = 0)
* NVIC_IRQChannelPreemptionPriority - range is 0.
* NVIC_IRQChannelSubPriority - range from 0 to 7.
*
*/
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
/* Preemption_Priority_Group */
#if (INTSYSCR_INEST == INTSYSCR_INEST_NoEN)
#define NVIC_PriorityGroup_0 ((uint32_t)0x00) /* interrupt nesting disable(CSR-0x804 bit1 = 0) */
#else
#define NVIC_PriorityGroup_1 ((uint32_t)0x01) /* interrupt nesting enable(CSR-0x804 bit1 = 1) */
#endif
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,243 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_opa.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/11/05
* Description : This file contains all the functions prototypes for the
* OPA firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_OPA_H
#define __CH32L103_OPA_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* OPA_member_enumeration */
typedef enum
{
OPA1 = 0,
} OPA_Num_TypeDef;
/* OPA_out_channel_enumeration */
typedef enum
{
OUT_IO_OUT0 = 0, /* PA3 */
OUT_IO_OUT1, /* PB1 */
OUT_IO_OUT2, /* PA2 */
OUT_IO_OUT3, /* PA4 */
OUT_IO_OUT4, /* PB0 */
OUT_IO_OFF
} OPA_Mode_TypeDef;
/* OPA_PSEL_enumeration */
typedef enum
{
CHP0 = 0, /* PB15 */
CHP1, /* PB0 */
CHP2, /* PB14 */
CHP3, /* PA7 */
CHP4, /* PA0 */
CHP5, /* PA6 */
CHP_OFF
} OPA_PSEL_TypeDef;
/* OPA_FB_enumeration */
typedef enum
{
FB_OFF = 0,
FB_ON
} OPA_FB_TypeDef;
/* OPA_NSEL_enumeration */
typedef enum
{
CHN0 = 0, /* PB11 */
CHN1, /* PA6 */
CHN2, /* PB10 */
CHN3, /* PA5 */
CHN4, /* PA1 */
CHN5, /* PA7 */
CHN2_PGA_32xIN, /* PB10 */
CHN_PGA_8xIN,
CHN_PGA_16xIN,
CHN_PGA_32xIN,
CHN_PGA_64xIN,
CHN_OFF = 0xF
} OPA_NSEL_TypeDef;
/* OPA_PSEL_POLL_enumeration */
typedef enum
{
CHP_OPA1_OFF = 0,
CHP_OPA1_ON,
} OPA_PSEL_POLL_TypeDef;
/* OPA_BKIN_EN_enumeration */
typedef enum
{
BKIN_OPA1_OFF = 0, /* TIM1 braking signal source form IO input */
BKIN_OPA1_ON, /* TIM1 braking signal source form OPA output */
} OPA_BKIN_EN_TypeDef;
/* OPA_RST_EN_enumeration */
typedef enum
{
RST_OPA1_OFF = 0,
RST_OPA1_ON,
} OPA_RST_EN_TypeDef;
/* OPA_OUT_IE_enumeration */
typedef enum
{
OUT_IE_OPA1_OFF = 0,
OUT_IE_OPA1_ON,
} OPA_OUT_IE_TypeDef;
/* OPA_CNT_IE_enumeration */
typedef enum
{
CNT_IE_OFF = 0,
CNT_IE_ON,
} OPA_CNT_IE_TypeDef;
/* OPA_NMI_IE_enumeration */
typedef enum
{
NMI_IE_OFF = 0,
NMI_IE_ON,
} OPA_NMI_IE_TypeDef;
/* OPA_PSEL_POLL_NUM_enumeration */
typedef enum
{
CHP_POLL_NUM_1 = 0,
CHP_POLL_NUM_2,
CHP_POLL_NUM_3,
CHP_POLL_NUM_4,
CHP_POLL_NUM_5,
CHP_POLL_NUM_6
} OPA_PSEL_POLL_NUM_TypeDef;
/* Offset_voltage_adjustment_value_polarity */
typedef enum
{
OPA_Vos_Ads_N = 0,
OPA_Vos_Ads_P
} OPA_Vos_ADS_POLARITY_TypeDef;
/* OPA Init Structure definition */
typedef struct
{
uint16_t OPA_POLL_Interval; /* OPA polling interval = (OPA_POLL_Interval+1)*1us
This parameter must range from 0 to 0x1FF.*/
OPA_Num_TypeDef OPA_NUM; /* Specifies the members of OPA */
OPA_Mode_TypeDef Mode; /* Specifies the mode of OPA */
OPA_PSEL_TypeDef PSEL; /* Specifies the positive channel of OPA */
OPA_FB_TypeDef FB; /* Specifies the internal feedback resistor of OPA */
OPA_NSEL_TypeDef NSEL; /* Specifies the negative channel of OPA */
OPA_PSEL_POLL_TypeDef PSEL_POLL; /* Specifies the positive channel poll of OPA */
OPA_BKIN_EN_TypeDef BKIN_EN; /* Specifies the brake input source of OPA */
OPA_RST_EN_TypeDef RST_EN; /* Specifies the reset source of OPA */
OPA_OUT_IE_TypeDef OUT_IE; /* Specifies the out interrupt of OPA */
OPA_CNT_IE_TypeDef CNT_IE; /* Specifies the out interrupt rising edge of sampling data */
OPA_NMI_IE_TypeDef NMI_IE; /* Specifies the out NIM interrupt of OPA */
OPA_PSEL_POLL_NUM_TypeDef POLL_NUM; /* Specifies the number of forward inputs*/
} OPA_InitTypeDef;
/* CMP_member_enumeration */
typedef enum
{
CMP1 = 0,
CMP2,
CMP3
} CMP_Num_TypeDef;
/* CMP_out_channel_enumeration */
typedef enum
{
OUT_IO0 = 0,
OUT_IO1,
OUT_IO_TIM2
} CMP_Mode_TypeDef;
/* CMP_NSEL_enumeration */
typedef enum
{
CMP_CHN0 = 0,
CMP_CHN1,
} CMP_NSEL_TypeDef;
/* CMP_PSEL_enumeration */
typedef enum
{
CMP_CHP_0 = 0,
CMP_CHP_1,
} CMP_PSEL_TypeDef;
#define CMP_CHP1 CMP_CHP_0
#define CMP_CHP2 CMP_CHP_1
/* CMP_HYEN_enumeration */
typedef enum
{
CMP_HYEN0 = 0,
CMP_HYEN1,
} CMP_HYEN_TypeDef;
/* CMP Init Structure definition */
typedef struct
{
CMP_Num_TypeDef CMP_NUM; /* Specifies the members of CMP */
CMP_Mode_TypeDef Mode; /* Specifies the mode of CMP */
CMP_NSEL_TypeDef NSEL; /* Specifies the negative channel of CMP */
CMP_PSEL_TypeDef PSEL; /* Specifies the positive channel of CMP */
CMP_HYEN_TypeDef HYEN; /* Specifies the hysteresis comparator of CMP */
} CMP_InitTypeDef;
/* Current channel for OPA polling enumeration */
typedef enum
{
O1P0 = 0,
O1P1,
O1P2,
O1P3,
O1P4,
O1P5,
} OPA_POLL_NUM_TypeDef;
/* OPA_flags_definition */
#define OPA_FLAG_OUT_OPA1 ((uint16_t)0x1000)
#define OPA_FLAG_OUT_CNT ((uint16_t)0x4000)
/* CMP_WakeUp_IO_mode_definition */
#define CMP_WakeUp_Rising_Falling ((uint32_t)0x01000000)
#define CMP_WakeUp_Rising ((uint32_t)0x02000000)
#define CMP_WakeUp_Falling ((uint32_t)0x03000000)
void OPCM_Unlock(void);
void OPCM_Lock(void);
void OPA_Init(OPA_InitTypeDef *OPA_InitStruct);
void OPA_StructInit(OPA_InitTypeDef *OPA_InitStruct);
void OPA_Cmd(OPA_Num_TypeDef OPA_NUM, FunctionalState NewState);
void OPA_LP_Cmd(FunctionalState NewState);
void OPA_CMP_Init(CMP_InitTypeDef *CMP_InitStruct);
void OPA_CMP_StructInit(CMP_InitTypeDef *CMP_InitStruct);
void OPA_CMP_Cmd(CMP_Num_TypeDef CMP_NUM, FunctionalState NewState);
void OPA_CMP_LP_Cmd(CMP_Num_TypeDef CMP_NUM, FunctionalState NewState);
void OPA_CMP_WakeUp_ModeConfig(uint32_t CMP_WakeUP_Mode);
FlagStatus OPA_GetFlagStatus( uint16_t OPA_FLAG);
void OPA_ClearFlag(uint16_t OPA_FLAG);
OPA_POLL_NUM_TypeDef OPA_POLL_CNT(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,68 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_pwr.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the PWR
* firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_PWR_H
#define __CH32L103_PWR_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* PVD_detection_level */
#define PWR_PVDLevel_0 ((uint32_t)0x00000000)
#define PWR_PVDLevel_1 ((uint32_t)0x00000020)
#define PWR_PVDLevel_2 ((uint32_t)0x00000040)
#define PWR_PVDLevel_3 ((uint32_t)0x00000060)
#define PWR_PVDLevel_4 ((uint32_t)0x00000080)
#define PWR_PVDLevel_5 ((uint32_t)0x000000A0)
#define PWR_PVDLevel_6 ((uint32_t)0x000000C0)
#define PWR_PVDLevel_7 ((uint32_t)0x000000E0)
/* Regulator_state_is_STOP_mode */
#define PWR_Regulator_ON ((uint32_t)0x00000000)
#define PWR_Regulator_LowPower ((uint32_t)0x00000001)
/* STOP_mode_entry */
#define PWR_STOPEntry_WFI ((uint8_t)0x01)
#define PWR_STOPEntry_WFE ((uint8_t)0x02)
/* PWR_Flag */
#define PWR_FLAG_WU ((uint32_t)0x00000001)
#define PWR_FLAG_SB ((uint32_t)0x00000002)
#define PWR_FLAG_PVDO ((uint32_t)0x00000004)
void PWR_DeInit(void);
void PWR_BackupAccessCmd(FunctionalState NewState);
void PWR_PVDCmd(FunctionalState NewState);
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel);
void PWR_WakeUpPinCmd(FunctionalState NewState);
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
void PWR_EnterSTANDBYMode(void);
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);
void PWR_ClearFlag(uint32_t PWR_FLAG);
void PWR_EnterSTANDBYMode_RAM(void);
void PWR_EnterSTANDBYMode_RAM_LV(void);
void PWR_EnterSTANDBYMode_RAM_VBAT_EN(void);
void PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN(void);
void PWR_EnterSTOPMode_RAM_LV(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
void PWR_LDO_LP_Cmd(FunctionalState NewState);
void PWR_STOPMode_Auto_LDO_LP_Cmd(FunctionalState NewState);
void PWR_FLASH_LP_Cmd(FunctionalState NewState);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,220 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_rcc.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the RCC firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_RCC_H
#define __CH32L103_RCC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* RCC_Exported_Types */
typedef struct
{
uint32_t SYSCLK_Frequency; /* returns SYSCLK clock frequency expressed in Hz */
uint32_t HCLK_Frequency; /* returns HCLK clock frequency expressed in Hz */
uint32_t PCLK1_Frequency; /* returns PCLK1 clock frequency expressed in Hz */
uint32_t PCLK2_Frequency; /* returns PCLK2 clock frequency expressed in Hz */
uint32_t ADCCLK_Frequency; /* returns ADCCLK clock frequency expressed in Hz */
} RCC_ClocksTypeDef;
/* HSE_configuration */
#define RCC_HSE_OFF ((uint32_t)0x00000000)
#define RCC_HSE_ON ((uint32_t)0x00010000)
#define RCC_HSE_Bypass ((uint32_t)0x00040000)
/* PLL_entry_clock_source */
#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000)
#define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000)
#define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000)
/* PLL_multiplication_factor for other CH32L103 */
#define RCC_PLLMul_2 ((uint32_t)0x00000000)
#define RCC_PLLMul_3 ((uint32_t)0x00040000)
#define RCC_PLLMul_4 ((uint32_t)0x00080000)
#define RCC_PLLMul_5 ((uint32_t)0x000C0000)
#define RCC_PLLMul_6 ((uint32_t)0x00100000)
#define RCC_PLLMul_7 ((uint32_t)0x00140000)
#define RCC_PLLMul_8 ((uint32_t)0x00180000)
#define RCC_PLLMul_9 ((uint32_t)0x001C0000)
#define RCC_PLLMul_10 ((uint32_t)0x00200000)
#define RCC_PLLMul_11 ((uint32_t)0x00240000)
#define RCC_PLLMul_12 ((uint32_t)0x00280000)
#define RCC_PLLMul_13 ((uint32_t)0x002C0000)
#define RCC_PLLMul_14 ((uint32_t)0x00300000)
#define RCC_PLLMul_15 ((uint32_t)0x00340000)
#define RCC_PLLMul_16 ((uint32_t)0x00380000)
#define RCC_PLLMul_18 ((uint32_t)0x003C0000)
/* System_clock_source */
#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000)
#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001)
#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002)
/* HB_clock_source */
#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000)
#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080)
#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090)
#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0)
#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0)
#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0)
#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0)
#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0)
#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0)
/* PB1_PB2_clock_source */
#define RCC_HCLK_Div1 ((uint32_t)0x00000000)
#define RCC_HCLK_Div2 ((uint32_t)0x00000400)
#define RCC_HCLK_Div4 ((uint32_t)0x00000500)
#define RCC_HCLK_Div8 ((uint32_t)0x00000600)
#define RCC_HCLK_Div16 ((uint32_t)0x00000700)
/* RCC_Interrupt_source */
#define RCC_IT_LSIRDY ((uint8_t)0x01)
#define RCC_IT_LSERDY ((uint8_t)0x02)
#define RCC_IT_HSIRDY ((uint8_t)0x04)
#define RCC_IT_HSERDY ((uint8_t)0x08)
#define RCC_IT_PLLRDY ((uint8_t)0x10)
#define RCC_IT_CSS ((uint8_t)0x80)
/* USB_Device_clock_source */
#define RCC_USBCLKSource_PLLCLK_Div1 ((uint32_t)0x00000000)
#define RCC_USBCLKSource_PLLCLK_Div2 ((uint32_t)0x00400000)
#define RCC_USBCLKSource_PLLCLK_Div1_5 ((uint32_t)0x00800000)
/* ADC_clock_source */
#define RCC_PCLK2_Div2 ((uint32_t)0x00000000)
#define RCC_PCLK2_Div4 ((uint32_t)0x00004000)
#define RCC_PCLK2_Div6 ((uint32_t)0x00008000)
#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000)
#define RCC_HCLK_ADC ((uint32_t)0x80000000)
/* LSE_configuration */
#define RCC_LSE_OFF ((uint8_t)0x00)
#define RCC_LSE_ON ((uint8_t)0x01)
#define RCC_LSE_Bypass ((uint8_t)0x04)
/* RTC_clock_source */
#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100)
#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200)
#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300)
/* HB_peripheral */
#define RCC_HBPeriph_DMA1 ((uint32_t)0x00000001)
#define RCC_HBPeriph_SRAM ((uint32_t)0x00000004)
#define RCC_HBPeriph_CRC ((uint32_t)0x00000040)
#define RCC_HBPeriph_USBFS ((uint32_t)0x00001000)
#define RCC_HBPeriph_USBPD ((uint32_t)0x00020000)
/* PB2_peripheral */
#define RCC_PB2Periph_AFIO ((uint32_t)0x00000001)
#define RCC_PB2Periph_GPIOA ((uint32_t)0x00000004)
#define RCC_PB2Periph_GPIOB ((uint32_t)0x00000008)
#define RCC_PB2Periph_GPIOC ((uint32_t)0x00000010)
#define RCC_PB2Periph_GPIOD ((uint32_t)0x00000020)
#define RCC_PB2Periph_ADC1 ((uint32_t)0x00000200)
#define RCC_PB2Periph_TIM1 ((uint32_t)0x00000800)
#define RCC_PB2Periph_SPI1 ((uint32_t)0x00001000)
#define RCC_PB2Periph_USART1 ((uint32_t)0x00004000)
/* PB1_peripheral */
#define RCC_PB1Periph_TIM2 ((uint32_t)0x00000001)
#define RCC_PB1Periph_TIM3 ((uint32_t)0x00000002)
#define RCC_PB1Periph_TIM4 ((uint32_t)0x00000004)
#define RCC_PB1Periph_WWDG ((uint32_t)0x00000800)
#define RCC_PB1Periph_SPI2 ((uint32_t)0x00004000)
#define RCC_PB1Periph_USART2 ((uint32_t)0x00020000)
#define RCC_PB1Periph_USART3 ((uint32_t)0x00040000)
#define RCC_PB1Periph_USART4 ((uint32_t)0x00080000)
#define RCC_PB1Periph_I2C1 ((uint32_t)0x00200000)
#define RCC_PB1Periph_I2C2 ((uint32_t)0x00400000)
#define RCC_PB1Periph_CAN1 ((uint32_t)0x02000000)
#define RCC_PB1Periph_BKP ((uint32_t)0x08000000)
#define RCC_PB1Periph_PWR ((uint32_t)0x10000000)
#define RCC_PB1Periph_LPTIM ((uint32_t)0x80000000)
/* Clock_source_to_output_on_MCO_pin */
#define RCC_MCO_NoClock ((uint8_t)0x00)
#define RCC_MCO_SYSCLK ((uint8_t)0x04)
#define RCC_MCO_HSI ((uint8_t)0x05)
#define RCC_MCO_HSE ((uint8_t)0x06)
#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07)
/* RCC_Flag */
#define RCC_FLAG_HSIRDY ((uint8_t)0x21)
#define RCC_FLAG_HSERDY ((uint8_t)0x31)
#define RCC_FLAG_PLLRDY ((uint8_t)0x39)
#define RCC_FLAG_LSERDY ((uint8_t)0x41)
#define RCC_FLAG_LSIRDY ((uint8_t)0x61)
#define RCC_FLAG_PINRST ((uint8_t)0x7A)
#define RCC_FLAG_PORRST ((uint8_t)0x7B)
#define RCC_FLAG_SFTRST ((uint8_t)0x7C)
#define RCC_FLAG_IWDGRST ((uint8_t)0x7D)
#define RCC_FLAG_WWDGRST ((uint8_t)0x7E)
#define RCC_FLAG_LPWRRST ((uint8_t)0x7F)
/* SysTick_clock_source */
#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)
/* ADC_clock_H_Level_Duty_Cycle */
#define RCC_ADC_H_Level_Mode0 ((uint32_t)0x00000000)
#define RCC_ADC_H_Level_Mode1 ((uint32_t)0x10000000)
#define RCC_ADC_H_Level_Mode2 ((uint32_t)0x20000000)
#define RCC_ADC_H_Level_Mode3 ((uint32_t)0x30000000)
#define RCC_ADC_H_Level_Mode4 ((uint32_t)0x40000000)
#define RCC_ADC_H_Level_Mode5 ((uint32_t)0x50000000)
#define RCC_ADC_H_Level_Mode6 ((uint32_t)0x60000000)
#define RCC_ADC_H_Level_Mode7 ((uint32_t)0x70000000)
void RCC_DeInit(void);
void RCC_HSEConfig(uint32_t RCC_HSE);
ErrorStatus RCC_WaitForHSEStartUp(void);
void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);
void RCC_HSICmd(FunctionalState NewState);
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
uint8_t RCC_GetSYSCLKSource(void);
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void RCC_PCLK1Config(uint32_t RCC_HCLK);
void RCC_PCLK2Config(uint32_t RCC_HCLK);
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
void RCC_LSEConfig(uint8_t RCC_LSE);
void RCC_LSICmd(FunctionalState NewState);
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
void RCC_RTCCLKCmd(FunctionalState NewState);
void RCC_GetClocksFreq(RCC_ClocksTypeDef *RCC_Clocks);
void RCC_HBPeriphClockCmd(uint32_t RCC_HBPeriph, FunctionalState NewState);
void RCC_PB2PeriphClockCmd(uint32_t RCC_PB2Periph, FunctionalState NewState);
void RCC_PB1PeriphClockCmd(uint32_t RCC_PB1Periph, FunctionalState NewState);
void RCC_PB2PeriphResetCmd(uint32_t RCC_PB2Periph, FunctionalState NewState);
void RCC_PB1PeriphResetCmd(uint32_t RCC_PB1Periph, FunctionalState NewState);
void RCC_BackupResetCmd(FunctionalState NewState);
void RCC_ClockSecuritySystemCmd(FunctionalState NewState);
void RCC_MCOConfig(uint8_t RCC_MCO);
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
void RCC_ClearFlag(void);
ITStatus RCC_GetITStatus(uint8_t RCC_IT);
void RCC_ClearITPendingBit(uint8_t RCC_IT);
void RCC_ADCCLKDutyCycleConfig(uint32_t RCC_DutyCycle);
void RCC_HSE_LP_Cmd(FunctionalState NewState);
void RCC_HSI_LP_Cmd(FunctionalState NewState);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,55 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_rtc.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the RTC
* firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_RTC_H
#define __CH32L103_RTC_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* RTC_interrupts_define */
#define RTC_IT_OW ((uint16_t)0x0004) /* Overflow interrupt */
#define RTC_IT_ALR ((uint16_t)0x0002) /* Alarm interrupt */
#define RTC_IT_SEC ((uint16_t)0x0001) /* Second interrupt */
/* RTC_interrupts_flags */
#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /* RTC Operation OFF flag */
#define RTC_FLAG_RSF ((uint16_t)0x0008) /* Registers Synchronized flag */
#define RTC_FLAG_OW ((uint16_t)0x0004) /* Overflow flag */
#define RTC_FLAG_ALR ((uint16_t)0x0002) /* Alarm flag */
#define RTC_FLAG_SEC ((uint16_t)0x0001) /* Second flag */
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
void RTC_EnterConfigMode(void);
void RTC_ExitConfigMode(void);
uint32_t RTC_GetCounter(void);
void RTC_SetCounter(uint32_t CounterValue);
void RTC_SetPrescaler(uint32_t PrescalerValue);
void RTC_SetAlarm(uint32_t AlarmValue);
uint32_t RTC_GetDivider(void);
void RTC_WaitForLastTask(void);
void RTC_WaitForSynchro(void);
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,158 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_spi.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/06/05
* Description : This file contains all the functions prototypes for the
* SPI firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_SPI_H
#define __CH32L103_SPI_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* SPI Init structure definition */
typedef struct
{
uint16_t SPI_Direction; /* Specifies the SPI unidirectional or bidirectional data mode.
This parameter can be a value of @ref SPI_data_direction */
uint16_t SPI_Mode; /* Specifies the SPI operating mode.
This parameter can be a value of @ref SPI_mode */
uint16_t SPI_DataSize; /* Specifies the SPI data size.
This parameter can be a value of @ref SPI_data_size */
uint16_t SPI_CPOL; /* Specifies the serial clock steady state.
This parameter can be a value of @ref SPI_Clock_Polarity
When using SPI slave mode to send data, the CPOL bit should be set to 1 */
uint16_t SPI_CPHA; /* Specifies the clock active edge for the bit capture.
This parameter can be a value of @ref SPI_Clock_Phase */
uint16_t SPI_NSS; /* Specifies whether the NSS signal is managed by
hardware (NSS pin) or by software using the SSI bit.
This parameter can be a value of @ref SPI_Slave_Select_management */
uint16_t SPI_BaudRatePrescaler; /* Specifies the Baud Rate prescaler value which will be
used to configure the transmit and receive SCK clock.
This parameter can be a value of @ref SPI_BaudRate_Prescaler.
@note The communication clock is derived from the master
clock. The slave clock does not need to be set. */
uint16_t SPI_FirstBit; /* Specifies whether data transfers start from MSB or LSB bit.
This parameter can be a value of @ref SPI_MSB_LSB_transmission */
uint16_t SPI_CRCPolynomial; /* Specifies the polynomial used for the CRC calculation. */
} SPI_InitTypeDef;
/* SPI_data_direction */
#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000)
#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400)
#define SPI_Direction_1Line_Rx ((uint16_t)0x8000)
#define SPI_Direction_1Line_Tx ((uint16_t)0xC000)
/* SPI_mode */
#define SPI_Mode_Master ((uint16_t)0x0104)
#define SPI_Mode_Slave ((uint16_t)0x0000)
/* SPI_data_size */
#define SPI_DataSize_16b ((uint16_t)0x0800)
#define SPI_DataSize_8b ((uint16_t)0x0000)
/* SPI_Clock_Polarity */
#define SPI_CPOL_Low ((uint16_t)0x0000)
#define SPI_CPOL_High ((uint16_t)0x0002)//When using SPI slave mode to send data, the CPOL bit should be set to 1.
/* SPI_Clock_Phase */
#define SPI_CPHA_1Edge ((uint16_t)0x0000)
#define SPI_CPHA_2Edge ((uint16_t)0x0001)
/* SPI_Slave_Select_management */
#define SPI_NSS_Soft ((uint16_t)0x0200)
#define SPI_NSS_Hard ((uint16_t)0x0000)
/* SPI_BaudRate_Prescaler */
#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000)
#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008)
#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010)
#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018)
#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020)
#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028)
#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030)
#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038)
/* SPI_MSB_LSB_transmission */
#define SPI_FirstBit_MSB ((uint16_t)0x0000)
#define SPI_FirstBit_LSB ((uint16_t)0x0080)
/* SPI_DMA_transfer_requests */
#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002)
#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001)
/* SPI_NSS_internal_software_management */
#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100)
#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF)
/* SPI_CRC_Transmit_Receive */
#define SPI_CRC_Tx ((uint8_t)0x00)
#define SPI_CRC_Rx ((uint8_t)0x01)
/* SPI_direction_transmit_receive */
#define SPI_Direction_Rx ((uint16_t)0xBFFF)
#define SPI_Direction_Tx ((uint16_t)0x4000)
/* SPI_interrupts_definition */
#define SPI_I2S_IT_TXE ((uint8_t)0x71)
#define SPI_I2S_IT_RXNE ((uint8_t)0x60)
#define SPI_I2S_IT_ERR ((uint8_t)0x50)
#define SPI_I2S_IT_OVR ((uint8_t)0x56)
#define SPI_IT_MODF ((uint8_t)0x55)
#define SPI_IT_CRCERR ((uint8_t)0x54)
/* SPI_flags_definition */
#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001)
#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002)
#define SPI_FLAG_CRCERR ((uint16_t)0x0010)
#define SPI_FLAG_MODF ((uint16_t)0x0020)
#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040)
#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080)
void SPI_I2S_DeInit(SPI_TypeDef *SPIx);
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct);
void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct);
void SPI_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState);
void I2S_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState);
void SPI_I2S_ITConfig(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState);
void SPI_I2S_DMACmd(SPI_TypeDef *SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);
void SPI_I2S_SendData(SPI_TypeDef *SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx);
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef *SPIx, uint16_t SPI_NSSInternalSoft);
void SPI_SSOutputCmd(SPI_TypeDef *SPIx, FunctionalState NewState);
void SPI_DataSizeConfig(SPI_TypeDef *SPIx, uint16_t SPI_DataSize);
void SPI_TransmitCRC(SPI_TypeDef *SPIx);
void SPI_CalculateCRC(SPI_TypeDef *SPIx, FunctionalState NewState);
uint16_t SPI_GetCRC(SPI_TypeDef *SPIx, uint8_t SPI_CRC);
uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx);
void SPI_BiDirectionalLineConfig(SPI_TypeDef *SPIx, uint16_t SPI_Direction);
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG);
void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG);
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT);
void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT);
void SPI_HighSpeedRead_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,517 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_tim.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* TIM firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_TIM_H
#define __CH32L103_TIM_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* TIM Time Base Init structure definition */
typedef struct
{
uint32_t TIM_Period; /* Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF for TIM1-TIM2-TIM3.
This parameter must be a number between 0x00000000 and 0xFFFFFFFF for TIM4. */
uint16_t TIM_Prescaler; /* Specifies the prescaler value used to divide the TIM clock.
This parameter can be a number between 0x0000 and 0xFFFF */
uint16_t TIM_CounterMode; /* Specifies the counter mode.
This parameter can be a value of @ref TIM_Counter_Mode */
uint16_t TIM_ClockDivision; /* Specifies the clock division.
This parameter can be a value of @ref TIM_Clock_Division_CKD */
uint8_t TIM_RepetitionCounter; /* Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;
/* TIM Output Compare Init structure definition */
typedef struct
{
uint32_t TIM_Pulse; /* Specifies the pulse value to be loaded into the Capture Compare Register.
This parameter can be a number between 0x0000 and 0xFFFF for TIM1-TIM2-TIM3.
This parameter must be a number between 0x00000000 and 0xFFFFFFFF for TIM4. */
uint16_t TIM_OCMode; /* Specifies the TIM mode.
This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */
uint16_t TIM_OutputState; /* Specifies the TIM Output Compare state.
This parameter can be a value of @ref TIM_Output_Compare_state */
uint16_t TIM_OutputNState; /* Specifies the TIM complementary Output Compare state.
This parameter can be a value of @ref TIM_Output_Compare_N_state
@note This parameter is valid only for TIM1 and TIM8. */
uint16_t TIM_OCPolarity; /* Specifies the output polarity.
This parameter can be a value of @ref TIM_Output_Compare_Polarity */
uint16_t TIM_OCNPolarity; /* Specifies the complementary output polarity.
This parameter can be a value of @ref TIM_Output_Compare_N_Polarity
@note This parameter is valid only for TIM1 and TIM8. */
uint16_t TIM_OCIdleState; /* Specifies the TIM Output Compare pin state during Idle state.
This parameter can be a value of @ref TIM_Output_Compare_Idle_State
@note This parameter is valid only for TIM1 and TIM8. */
uint16_t TIM_OCNIdleState; /* Specifies the TIM Output Compare pin state during Idle state.
This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_OCInitTypeDef;
/* TIM Input Capture Init structure definition */
typedef struct
{
uint16_t TIM_Channel; /* Specifies the TIM channel.
This parameter can be a value of @ref TIM_Channel */
uint16_t TIM_ICPolarity; /* Specifies the active edge of the input signal.
This parameter can be a value of @ref TIM_Input_Capture_Polarity */
uint16_t TIM_ICSelection; /* Specifies the input.
This parameter can be a value of @ref TIM_Input_Capture_Selection */
uint16_t TIM_ICPrescaler; /* Specifies the Input Capture Prescaler.
This parameter can be a value of @ref TIM_Input_Capture_Prescaler */
uint16_t TIM_ICFilter; /* Specifies the input capture filter.
This parameter can be a number between 0x0 and 0xF */
} TIM_ICInitTypeDef;
/* BDTR structure definition */
typedef struct
{
uint16_t TIM_OSSRState; /* Specifies the Off-State selection used in Run mode.
This parameter can be a value of @ref OSSR_Off_State_Selection_for_Run_mode_state */
uint16_t TIM_OSSIState; /* Specifies the Off-State used in Idle state.
This parameter can be a value of @ref OSSI_Off_State_Selection_for_Idle_mode_state */
uint16_t TIM_LOCKLevel; /* Specifies the LOCK level parameters.
This parameter can be a value of @ref Lock_level */
uint16_t TIM_DeadTime; /* Specifies the delay time between the switching-off and the
switching-on of the outputs.
This parameter can be a number between 0x00 and 0xFF */
uint16_t TIM_Break; /* Specifies whether the TIM Break input is enabled or not.
This parameter can be a value of @ref Break_Input_enable_disable */
uint16_t TIM_BreakPolarity; /* Specifies the TIM Break Input pin polarity.
This parameter can be a value of @ref Break_Polarity */
uint16_t TIM_AutomaticOutput; /* Specifies whether the TIM Automatic Output feature is enabled or not.
This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */
} TIM_BDTRInitTypeDef;
/* TIM_Output_Compare_and_PWM_modes */
#define TIM_OCMode_Timing ((uint16_t)0x0000)
#define TIM_OCMode_Active ((uint16_t)0x0010)
#define TIM_OCMode_Inactive ((uint16_t)0x0020)
#define TIM_OCMode_Toggle ((uint16_t)0x0030)
#define TIM_OCMode_PWM1 ((uint16_t)0x0060)
#define TIM_OCMode_PWM2 ((uint16_t)0x0070)
/* TIM_One_Pulse_Mode */
#define TIM_OPMode_Single ((uint16_t)0x0008)
#define TIM_OPMode_Repetitive ((uint16_t)0x0000)
/* TIM_Channel */
#define TIM_Channel_1 ((uint16_t)0x0000)
#define TIM_Channel_2 ((uint16_t)0x0004)
#define TIM_Channel_3 ((uint16_t)0x0008)
#define TIM_Channel_4 ((uint16_t)0x000C)
/* TIM_Clock_Division_CKD */
#define TIM_CKD_DIV1 ((uint16_t)0x0000)
#define TIM_CKD_DIV2 ((uint16_t)0x0100)
#define TIM_CKD_DIV4 ((uint16_t)0x0200)
/* TIM_Counter_Mode */
#define TIM_CounterMode_Up ((uint16_t)0x0000)
#define TIM_CounterMode_Down ((uint16_t)0x0010)
#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020)
#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060)
/* TIM_Output_Compare_Polarity */
#define TIM_OCPolarity_High ((uint16_t)0x0000)
#define TIM_OCPolarity_Low ((uint16_t)0x0002)
/* TIM_Output_Compare_N_Polarity */
#define TIM_OCNPolarity_High ((uint16_t)0x0000)
#define TIM_OCNPolarity_Low ((uint16_t)0x0008)
/* TIM_Output_Compare_state */
#define TIM_OutputState_Disable ((uint16_t)0x0000)
#define TIM_OutputState_Enable ((uint16_t)0x0001)
/* TIM_Output_Compare_N_state */
#define TIM_OutputNState_Disable ((uint16_t)0x0000)
#define TIM_OutputNState_Enable ((uint16_t)0x0004)
/* TIM_Capture_Compare_state */
#define TIM_CCx_Enable ((uint16_t)0x0001)
#define TIM_CCx_Disable ((uint16_t)0x0000)
/* TIM_Capture_Compare_N_state */
#define TIM_CCxN_Enable ((uint16_t)0x0004)
#define TIM_CCxN_Disable ((uint16_t)0x0000)
/* Break_Input_enable_disable */
#define TIM_Break_Enable ((uint16_t)0x1000)
#define TIM_Break_Disable ((uint16_t)0x0000)
/* Break_Polarity */
#define TIM_BreakPolarity_Low ((uint16_t)0x0000)
#define TIM_BreakPolarity_High ((uint16_t)0x2000)
/* TIM_AOE_Bit_Set_Reset */
#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000)
#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000)
/* Lock_level */
#define TIM_LOCKLevel_OFF ((uint16_t)0x0000)
#define TIM_LOCKLevel_1 ((uint16_t)0x0100)
#define TIM_LOCKLevel_2 ((uint16_t)0x0200)
#define TIM_LOCKLevel_3 ((uint16_t)0x0300)
/* OSSI_Off_State_Selection_for_Idle_mode_state */
#define TIM_OSSIState_Enable ((uint16_t)0x0400)
#define TIM_OSSIState_Disable ((uint16_t)0x0000)
/* OSSR_Off_State_Selection_for_Run_mode_state */
#define TIM_OSSRState_Enable ((uint16_t)0x0800)
#define TIM_OSSRState_Disable ((uint16_t)0x0000)
/* TIM_Output_Compare_Idle_State */
#define TIM_OCIdleState_Set ((uint16_t)0x0100)
#define TIM_OCIdleState_Reset ((uint16_t)0x0000)
/* TIM_Output_Compare_N_Idle_State */
#define TIM_OCNIdleState_Set ((uint16_t)0x0200)
#define TIM_OCNIdleState_Reset ((uint16_t)0x0000)
/* TIM_Input_Capture_Polarity */
#define TIM_ICPolarity_Rising ((uint16_t)0x0000)
#define TIM_ICPolarity_Falling ((uint16_t)0x0002)
#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A)
/* TIM_Input_Capture_Selection */
#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /* TIM Input 1, 2, 3 or 4 is selected to be \
connected to IC1, IC2, IC3 or IC4, respectively */
#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /* TIM Input 1, 2, 3 or 4 is selected to be \
connected to IC2, IC1, IC4 or IC3, respectively. */
#define TIM_ICSelection_TRC ((uint16_t)0x0003) /* TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */
/* TIM_Input_Capture_Prescaler */
#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /* Capture performed each time an edge is detected on the capture input. */
#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /* Capture performed once every 2 events. */
#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /* Capture performed once every 4 events. */
#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /* Capture performed once every 8 events. */
/* TIM_interrupt_sources */
#define TIM_IT_Update ((uint16_t)0x0001)
#define TIM_IT_CC1 ((uint16_t)0x0002)
#define TIM_IT_CC2 ((uint16_t)0x0004)
#define TIM_IT_CC3 ((uint16_t)0x0008)
#define TIM_IT_CC4 ((uint16_t)0x0010)
#define TIM_IT_COM ((uint16_t)0x0020)
#define TIM_IT_Trigger ((uint16_t)0x0040)
#define TIM_IT_Break ((uint16_t)0x0080)
/* TIM_DMA_Base_address */
#define TIM_DMABase_CR1 ((uint16_t)0x0000)
#define TIM_DMABase_CR2 ((uint16_t)0x0001)
#define TIM_DMABase_SMCR ((uint16_t)0x0002)
#define TIM_DMABase_DIER ((uint16_t)0x0003)
#define TIM_DMABase_SR ((uint16_t)0x0004)
#define TIM_DMABase_EGR ((uint16_t)0x0005)
#define TIM_DMABase_CCMR1 ((uint16_t)0x0006)
#define TIM_DMABase_CCMR2 ((uint16_t)0x0007)
#define TIM_DMABase_CCER ((uint16_t)0x0008)
#define TIM_DMABase_CNT ((uint16_t)0x0009)
#define TIM_DMABase_PSC ((uint16_t)0x000A)
#define TIM_DMABase_ARR ((uint16_t)0x000B)
#define TIM_DMABase_RCR ((uint16_t)0x000C)
#define TIM_DMABase_CCR1 ((uint16_t)0x000D)
#define TIM_DMABase_CCR2 ((uint16_t)0x000E)
#define TIM_DMABase_CCR3 ((uint16_t)0x000F)
#define TIM_DMABase_CCR4 ((uint16_t)0x0010)
#define TIM_DMABase_BDTR ((uint16_t)0x0011)
#define TIM_DMABase_DCR ((uint16_t)0x0012)
/* TIM_DMA_Burst_Length */
#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000)
#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100)
#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200)
#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300)
#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400)
#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500)
#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600)
#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700)
#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800)
#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900)
#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00)
#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00)
#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00)
#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00)
#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00)
#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00)
#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000)
#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100)
/* TIM_DMA_sources */
#define TIM_DMA_Update ((uint16_t)0x0100)
#define TIM_DMA_CC1 ((uint16_t)0x0200)
#define TIM_DMA_CC2 ((uint16_t)0x0400)
#define TIM_DMA_CC3 ((uint16_t)0x0800)
#define TIM_DMA_CC4 ((uint16_t)0x1000)
#define TIM_DMA_COM ((uint16_t)0x2000)
#define TIM_DMA_Trigger ((uint16_t)0x4000)
/* TIM_External_Trigger_Prescaler */
#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000)
#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000)
#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000)
#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000)
/* TIM_Internal_Trigger_Selection */
#define TIM_TS_ITR0 ((uint16_t)0x0000)
#define TIM_TS_ITR1 ((uint16_t)0x0010)
#define TIM_TS_ITR2 ((uint16_t)0x0020)
#define TIM_TS_ITR3 ((uint16_t)0x0030)
#define TIM_TS_TI1F_ED ((uint16_t)0x0040)
#define TIM_TS_TI1FP1 ((uint16_t)0x0050)
#define TIM_TS_TI2FP2 ((uint16_t)0x0060)
#define TIM_TS_ETRF ((uint16_t)0x0070)
/* TIM_TIx_External_Clock_Source */
#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050)
#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060)
#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040)
/* TIM_External_Trigger_Polarity */
#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000)
#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000)
/* TIM_Prescaler_Reload_Mode */
#define TIM_PSCReloadMode_Update ((uint16_t)0x0000)
#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001)
/* TIM_Forced_Action */
#define TIM_ForcedAction_Active ((uint16_t)0x0050)
#define TIM_ForcedAction_InActive ((uint16_t)0x0040)
/* TIM_Encoder_Mode */
#define TIM_EncoderMode_TI1 ((uint16_t)0x0001)
#define TIM_EncoderMode_TI2 ((uint16_t)0x0002)
#define TIM_EncoderMode_TI12 ((uint16_t)0x0003)
/* TIM_Event_Source */
#define TIM_EventSource_Update ((uint16_t)0x0001)
#define TIM_EventSource_CC1 ((uint16_t)0x0002)
#define TIM_EventSource_CC2 ((uint16_t)0x0004)
#define TIM_EventSource_CC3 ((uint16_t)0x0008)
#define TIM_EventSource_CC4 ((uint16_t)0x0010)
#define TIM_EventSource_COM ((uint16_t)0x0020)
#define TIM_EventSource_Trigger ((uint16_t)0x0040)
#define TIM_EventSource_Break ((uint16_t)0x0080)
/* TIM_Update_Source */
#define TIM_UpdateSource_Global ((uint16_t)0x0000) /* Source of update is the counter overflow/underflow \
or the setting of UG bit, or an update generation \
through the slave mode controller. */
#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /* Source of update is counter overflow/underflow. */
/* TIM_Output_Compare_Preload_State */
#define TIM_OCPreload_Enable ((uint16_t)0x0008)
#define TIM_OCPreload_Disable ((uint16_t)0x0000)
/* TIM_Output_Compare_Fast_State */
#define TIM_OCFast_Enable ((uint16_t)0x0004)
#define TIM_OCFast_Disable ((uint16_t)0x0000)
/* TIM_Output_Compare_Clear_State */
#define TIM_OCClear_Enable ((uint16_t)0x0080)
#define TIM_OCClear_Disable ((uint16_t)0x0000)
/* TIM_Trigger_Output_Source */
#define TIM_TRGOSource_Reset ((uint16_t)0x0000)
#define TIM_TRGOSource_Enable ((uint16_t)0x0010)
#define TIM_TRGOSource_Update ((uint16_t)0x0020)
#define TIM_TRGOSource_OC1 ((uint16_t)0x0030)
#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040)
#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050)
#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060)
#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070)
/* TIM_Slave_Mode */
#define TIM_SlaveMode_Reset ((uint16_t)0x0004)
#define TIM_SlaveMode_Gated ((uint16_t)0x0005)
#define TIM_SlaveMode_Trigger ((uint16_t)0x0006)
#define TIM_SlaveMode_External1 ((uint16_t)0x0007)
/* TIM_Master_Slave_Mode */
#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080)
#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000)
/* TIM_Flags */
#define TIM_FLAG_Update ((uint16_t)0x0001)
#define TIM_FLAG_CC1 ((uint16_t)0x0002)
#define TIM_FLAG_CC2 ((uint16_t)0x0004)
#define TIM_FLAG_CC3 ((uint16_t)0x0008)
#define TIM_FLAG_CC4 ((uint16_t)0x0010)
#define TIM_FLAG_COM ((uint16_t)0x0020)
#define TIM_FLAG_Trigger ((uint16_t)0x0040)
#define TIM_FLAG_Break ((uint16_t)0x0080)
#define TIM_FLAG_CC1OF ((uint16_t)0x0200)
#define TIM_FLAG_CC2OF ((uint16_t)0x0400)
#define TIM_FLAG_CC3OF ((uint16_t)0x0800)
#define TIM_FLAG_CC4OF ((uint16_t)0x1000)
/* TIM_Legacy */
#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer
#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers
#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers
#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers
#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers
#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers
#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers
#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers
#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers
#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers
#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers
#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers
#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers
#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers
#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers
#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers
#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers
#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers
/* TIM_Capture_Mode */
#define TIM_Capture_Mode0 ((uint16_t)0x0000)
#define TIM_Capture_Mode1 ((uint16_t)0x4000)
void TIM_DeInit(TIM_TypeDef *TIMx);
void TIM_TimeBaseInit(TIM_TypeDef *TIMx, TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct);
void TIM_OC1Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct);
void TIM_ICInit(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct);
void TIM_PWMIConfig(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct);
void TIM_BDTRConfig(TIM_TypeDef *TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct);
void TIM_OCStructInit(TIM_OCInitTypeDef *TIM_OCInitStruct);
void TIM_ICStructInit(TIM_ICInitTypeDef *TIM_ICInitStruct);
void TIM_BDTRStructInit(TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);
void TIM_Cmd(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_CtrlPWMOutputs(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_ITConfig(TIM_TypeDef *TIMx, uint16_t TIM_IT, FunctionalState NewState);
void TIM_GenerateEvent(TIM_TypeDef *TIMx, uint16_t TIM_EventSource);
void TIM_DMAConfig(TIM_TypeDef *TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength);
void TIM_DMACmd(TIM_TypeDef *TIMx, uint16_t TIM_DMASource, FunctionalState NewState);
void TIM_InternalClockConfig(TIM_TypeDef *TIMx);
void TIM_ITRxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource);
void TIM_TIxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
void TIM_ETRClockMode1Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
void TIM_ETRConfig(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
void TIM_PrescalerConfig(TIM_TypeDef *TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
void TIM_CounterModeConfig(TIM_TypeDef *TIMx, uint16_t TIM_CounterMode);
void TIM_SelectInputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource);
void TIM_EncoderInterfaceConfig(TIM_TypeDef *TIMx, uint16_t TIM_EncoderMode,
uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
void TIM_ForcedOC1Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction);
void TIM_ARRPreloadConfig(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_SelectCOM(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_SelectCCDMA(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_CCPreloadControl(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_OC1PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload);
void TIM_OC1FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast);
void TIM_ClearOC1Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear);
void TIM_OC1PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity);
void TIM_CCxCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
void TIM_SelectOCxM(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
void TIM_UpdateDisableConfig(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_UpdateRequestConfig(TIM_TypeDef *TIMx, uint16_t TIM_UpdateSource);
void TIM_SelectHallSensor(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_SelectOnePulseMode(TIM_TypeDef *TIMx, uint16_t TIM_OPMode);
void TIM_SelectOutputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_TRGOSource);
void TIM_SelectSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_SlaveMode);
void TIM_SelectMasterSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_MasterSlaveMode);
void TIM_SetCounter(TIM_TypeDef *TIMx, uint32_t Counter);
void TIM_SetAutoreload(TIM_TypeDef *TIMx, uint32_t Autoreload);
void TIM_SetCompare1(TIM_TypeDef *TIMx, uint32_t Compare1);
void TIM_SetCompare2(TIM_TypeDef *TIMx, uint32_t Compare2);
void TIM_SetCompare3(TIM_TypeDef *TIMx, uint32_t Compare3);
void TIM_SetCompare4(TIM_TypeDef *TIMx, uint32_t Compare4);
void TIM_SetIC1Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC);
void TIM_SetClockDivision(TIM_TypeDef *TIMx, uint16_t TIM_CKD);
uint32_t TIM_GetCapture1(TIM_TypeDef *TIMx);
uint32_t TIM_GetCapture2(TIM_TypeDef *TIMx);
uint32_t TIM_GetCapture3(TIM_TypeDef *TIMx);
uint32_t TIM_GetCapture4(TIM_TypeDef *TIMx);
uint32_t TIM_GetCounter(TIM_TypeDef *TIMx);
uint16_t TIM_GetPrescaler(TIM_TypeDef *TIMx);
FlagStatus TIM_GetFlagStatus(TIM_TypeDef *TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef *TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef *TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef *TIMx, uint16_t TIM_IT);
void TIM_CaptureLevelIndicate_Cmd(TIM_TypeDef *TIMx, FunctionalState NewState);
void TIM_CaptureModeConfig(TIM_TypeDef *TIMx, uint16_t TIM_CaptureMode);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,188 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_usart.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* USART firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_USART_H
#define __CH32L103_USART_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* USART Init Structure definition */
typedef struct
{
uint32_t USART_BaudRate; /* This member configures the USART communication baud rate.
The baud rate is computed using the following formula:
- IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate)))
- FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */
uint16_t USART_WordLength; /* Specifies the number of data bits transmitted or received in a frame.
This parameter can be a value of @ref USART_Word_Length */
uint16_t USART_StopBits; /* Specifies the number of stop bits transmitted.
This parameter can be a value of @ref USART_Stop_Bits */
uint16_t USART_Parity; /* Specifies the parity mode.
This parameter can be a value of @ref USART_Parity
@note When parity is enabled, the computed parity is inserted
at the MSB position of the transmitted data (9th bit when
the word length is set to 9 data bits; 8th bit when the
word length is set to 8 data bits). */
uint16_t USART_Mode; /* Specifies wether the Receive or Transmit mode is enabled or disabled.
This parameter can be a value of @ref USART_Mode */
uint16_t USART_HardwareFlowControl; /* Specifies wether the hardware flow control mode is enabled
or disabled.
This parameter can be a value of @ref USART_Hardware_Flow_Control */
} USART_InitTypeDef;
/* USART Clock Init Structure definition */
typedef struct
{
uint16_t USART_Clock; /* Specifies whether the USART clock is enabled or disabled.
This parameter can be a value of @ref USART_Clock */
uint16_t USART_CPOL; /* Specifies the steady state value of the serial clock.
This parameter can be a value of @ref USART_Clock_Polarity */
uint16_t USART_CPHA; /* Specifies the clock transition on which the bit capture is made.
This parameter can be a value of @ref USART_Clock_Phase */
uint16_t USART_LastBit; /* Specifies whether the clock pulse corresponding to the last transmitted
data bit (MSB) has to be output on the SCLK pin in synchronous mode.
This parameter can be a value of @ref USART_Last_Bit */
} USART_ClockInitTypeDef;
/* USART_Word_Length */
#define USART_WordLength_8b ((uint16_t)0x0000)
#define USART_WordLength_9b ((uint16_t)0x1000)
/* USART_Stop_Bits */
#define USART_StopBits_1 ((uint16_t)0x0000)
#define USART_StopBits_0_5 ((uint16_t)0x1000)
#define USART_StopBits_2 ((uint16_t)0x2000)
#define USART_StopBits_1_5 ((uint16_t)0x3000)
/* USART_Parity */
#define USART_Parity_No ((uint16_t)0x0000)
#define USART_Parity_Even ((uint16_t)0x0400)
#define USART_Parity_Odd ((uint16_t)0x0600)
/* USART_Mode */
#define USART_Mode_Rx ((uint16_t)0x0004)
#define USART_Mode_Tx ((uint16_t)0x0008)
/* USART_Hardware_Flow_Control */
#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
/* USART_Clock */
#define USART_Clock_Disable ((uint16_t)0x0000)
#define USART_Clock_Enable ((uint16_t)0x0800)
/* USART_Clock_Polarity */
#define USART_CPOL_Low ((uint16_t)0x0000)
#define USART_CPOL_High ((uint16_t)0x0400)
/* USART_Clock_Phase */
#define USART_CPHA_1Edge ((uint16_t)0x0000)
#define USART_CPHA_2Edge ((uint16_t)0x0200)
/* USART_Last_Bit */
#define USART_LastBit_Disable ((uint16_t)0x0000)
#define USART_LastBit_Enable ((uint16_t)0x0100)
/* USART_Interrupt_definition */
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_ORE_RX ((uint16_t)0x0325)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ERR ((uint16_t)0x0060)
#define USART_IT_ORE_ER ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)
#define USART_IT_ORE USART_IT_ORE_ER
/* USART_DMA_Requests */
#define USART_DMAReq_Tx ((uint16_t)0x0080)
#define USART_DMAReq_Rx ((uint16_t)0x0040)
/* USART_WakeUp_methods */
#define USART_WakeUp_IdleLine ((uint16_t)0x0000)
#define USART_WakeUp_AddressMark ((uint16_t)0x0800)
/* USART_LIN_Break_Detection_Length */
#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000)
#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020)
/* USART_IrDA_Low_Power */
#define USART_IrDAMode_LowPower ((uint16_t)0x0004)
#define USART_IrDAMode_Normal ((uint16_t)0x0000)
/* USART_Flags */
#define USART_FLAG_RX_BUSY ((uint16_t)0x0400)
#define USART_FLAG_CTS ((uint16_t)0x0200)
#define USART_FLAG_LBD ((uint16_t)0x0100)
#define USART_FLAG_TXE ((uint16_t)0x0080)
#define USART_FLAG_TC ((uint16_t)0x0040)
#define USART_FLAG_RXNE ((uint16_t)0x0020)
#define USART_FLAG_IDLE ((uint16_t)0x0010)
#define USART_FLAG_ORE ((uint16_t)0x0008)
#define USART_FLAG_NE ((uint16_t)0x0004)
#define USART_FLAG_FE ((uint16_t)0x0002)
#define USART_FLAG_PE ((uint16_t)0x0001)
void USART_DeInit(USART_TypeDef *USARTx);
void USART_Init(USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct);
void USART_StructInit(USART_InitTypeDef *USART_InitStruct);
void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitTypeDef *USART_ClockInitStruct);
void USART_ClockStructInit(USART_ClockInitTypeDef *USART_ClockInitStruct);
void USART_Cmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_ITConfig(USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState);
void USART_DMACmd(USART_TypeDef *USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
void USART_SetAddress(USART_TypeDef *USARTx, uint8_t USART_Address);
void USART_WakeUpConfig(USART_TypeDef *USARTx, uint16_t USART_WakeUp);
void USART_ReceiverWakeUpCmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_LINBreakDetectLengthConfig(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength);
void USART_LINCmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_SendData(USART_TypeDef *USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef *USARTx);
void USART_SendBreak(USART_TypeDef *USARTx);
void USART_SetGuardTime(USART_TypeDef *USARTx, uint8_t USART_GuardTime);
void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler);
void USART_SmartCardCmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_SmartCardNACKCmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_HalfDuplexCmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_OverSampling8Cmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_OneBitMethodCmd(USART_TypeDef *USARTx, FunctionalState NewState);
void USART_IrDAConfig(USART_TypeDef *USARTx, uint16_t USART_IrDAMode);
void USART_IrDACmd(USART_TypeDef *USARTx, FunctionalState NewState);
FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx, uint16_t USART_FLAG);
void USART_ClearFlag(USART_TypeDef *USARTx, uint16_t USART_FLAG);
ITStatus USART_GetITStatus(USART_TypeDef *USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef *USARTx, uint16_t USART_IT);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,513 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_usb.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/01/19
* Description : This file contains all the functions prototypes for the USB
* firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_USB_H
#define __CH32L103_USB_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************/
/* Header File */
#include "stdint.h"
/*******************************************************************************/
/* USB Communication Related Macro Definition */
/* USB Endpoint0 Size */
#ifndef DEFAULT_ENDP0_SIZE
#define DEFAULT_ENDP0_SIZE 8
#endif
/* USB Buffer Size */
#ifndef USBFS_MAX_PACKET_SIZE
#define USBFS_MAX_PACKET_SIZE 64
#endif
/* USB PID */
#ifndef USB_PID_SETUP
#define USB_PID_NULL 0x00
#define USB_PID_SOF 0x05
#define USB_PID_SETUP 0x0D
#define USB_PID_IN 0x09
#define USB_PID_OUT 0x01
#define USB_PID_NYET 0x06
#define USB_PID_ACK 0x02
#define USB_PID_NAK 0x0A
#define USB_PID_STALL 0x0E
#define USB_PID_DATA0 0x03
#define USB_PID_DATA1 0x0B
#define USB_PID_PRE 0x0C
#endif
/* USB standard device request code */
#ifndef USB_GET_DESCRIPTOR
#define USB_GET_STATUS 0x00
#define USB_CLEAR_FEATURE 0x01
#define USB_SET_FEATURE 0x03
#define USB_SET_ADDRESS 0x05
#define USB_GET_DESCRIPTOR 0x06
#define USB_SET_DESCRIPTOR 0x07
#define USB_GET_CONFIGURATION 0x08
#define USB_SET_CONFIGURATION 0x09
#define USB_GET_INTERFACE 0x0A
#define USB_SET_INTERFACE 0x0B
#define USB_SYNCH_FRAME 0x0C
#endif
#define DEF_STRING_DESC_LANG 0x00
#define DEF_STRING_DESC_MANU 0x01
#define DEF_STRING_DESC_PROD 0x02
#define DEF_STRING_DESC_SERN 0x03
/* USB hub class request code */
#ifndef HUB_GET_DESCRIPTOR
#define HUB_GET_STATUS 0x00
#define HUB_CLEAR_FEATURE 0x01
#define HUB_GET_STATE 0x02
#define HUB_SET_FEATURE 0x03
#define HUB_GET_DESCRIPTOR 0x06
#define HUB_SET_DESCRIPTOR 0x07
#endif
/* USB HID class request code */
#ifndef HID_GET_REPORT
#define HID_GET_REPORT 0x01
#define HID_GET_IDLE 0x02
#define HID_GET_PROTOCOL 0x03
#define HID_SET_REPORT 0x09
#define HID_SET_IDLE 0x0A
#define HID_SET_PROTOCOL 0x0B
#endif
/* Bit Define for USB Request Type */
#ifndef USB_REQ_TYP_MASK
#define USB_REQ_TYP_IN 0x80
#define USB_REQ_TYP_OUT 0x00
#define USB_REQ_TYP_READ 0x80
#define USB_REQ_TYP_WRITE 0x00
#define USB_REQ_TYP_MASK 0x60
#define USB_REQ_TYP_STANDARD 0x00
#define USB_REQ_TYP_CLASS 0x20
#define USB_REQ_TYP_VENDOR 0x40
#define USB_REQ_TYP_RESERVED 0x60
#define USB_REQ_RECIP_MASK 0x1F
#define USB_REQ_RECIP_DEVICE 0x00
#define USB_REQ_RECIP_INTERF 0x01
#define USB_REQ_RECIP_ENDP 0x02
#define USB_REQ_RECIP_OTHER 0x03
#define USB_REQ_FEAT_REMOTE_WAKEUP 0x01
#define USB_REQ_FEAT_ENDP_HALT 0x00
#endif
/* USB Descriptor Type */
#ifndef USB_DESCR_TYP_DEVICE
#define USB_DESCR_TYP_DEVICE 0x01
#define USB_DESCR_TYP_CONFIG 0x02
#define USB_DESCR_TYP_STRING 0x03
#define USB_DESCR_TYP_INTERF 0x04
#define USB_DESCR_TYP_ENDP 0x05
#define USB_DESCR_TYP_QUALIF 0x06
#define USB_DESCR_TYP_SPEED 0x07
#define USB_DESCR_TYP_OTG 0x09
#define USB_DESCR_TYP_BOS 0X0F
#define USB_DESCR_TYP_HID 0x21
#define USB_DESCR_TYP_REPORT 0x22
#define USB_DESCR_TYP_PHYSIC 0x23
#define USB_DESCR_TYP_CS_INTF 0x24
#define USB_DESCR_TYP_CS_ENDP 0x25
#define USB_DESCR_TYP_HUB 0x29
#endif
/* USB Device Class */
#ifndef USB_DEV_CLASS_HUB
#define USB_DEV_CLASS_RESERVED 0x00
#define USB_DEV_CLASS_AUDIO 0x01
#define USB_DEV_CLASS_COMMUNIC 0x02
#define USB_DEV_CLASS_HID 0x03
#define USB_DEV_CLASS_MONITOR 0x04
#define USB_DEV_CLASS_PHYSIC_IF 0x05
#define USB_DEV_CLASS_POWER 0x06
#define USB_DEV_CLASS_IMAGE 0x06
#define USB_DEV_CLASS_PRINTER 0x07
#define USB_DEV_CLASS_STORAGE 0x08
#define USB_DEV_CLASS_HUB 0x09
#define USB_DEV_CLASS_VEN_SPEC 0xFF
#endif
/* USB Hub Class Request */
#ifndef HUB_GET_HUB_DESCRIPTOR
#define HUB_CLEAR_HUB_FEATURE 0x20
#define HUB_CLEAR_PORT_FEATURE 0x23
#define HUB_GET_BUS_STATE 0xA3
#define HUB_GET_HUB_DESCRIPTOR 0xA0
#define HUB_GET_HUB_STATUS 0xA0
#define HUB_GET_PORT_STATUS 0xA3
#define HUB_SET_HUB_DESCRIPTOR 0x20
#define HUB_SET_HUB_FEATURE 0x20
#define HUB_SET_PORT_FEATURE 0x23
#endif
/* Hub Class Feature Selectors */
#ifndef HUB_PORT_RESET
#define HUB_C_HUB_LOCAL_POWER 0
#define HUB_C_HUB_OVER_CURRENT 1
#define HUB_PORT_CONNECTION 0
#define HUB_PORT_ENABLE 1
#define HUB_PORT_SUSPEND 2
#define HUB_PORT_OVER_CURRENT 3
#define HUB_PORT_RESET 4
#define HUB_PORT_POWER 8
#define HUB_PORT_LOW_SPEED 9
#define HUB_C_PORT_CONNECTION 16
#define HUB_C_PORT_ENABLE 17
#define HUB_C_PORT_SUSPEND 18
#define HUB_C_PORT_OVER_CURRENT 19
#define HUB_C_PORT_RESET 20
#endif
/* USB HID Class Request Code */
#ifndef HID_GET_REPORT
#define HID_GET_REPORT 0x01
#define HID_GET_IDLE 0x02
#define HID_GET_PROTOCOL 0x03
#define HID_SET_REPORT 0x09
#define HID_SET_IDLE 0x0A
#define HID_SET_PROTOCOL 0x0B
#endif
/* USB CDC Class request code */
#ifndef CDC_GET_LINE_CODING
#define CDC_GET_LINE_CODING 0x21 /* This request allows the host to find out the currently configured line coding */
#define CDC_SET_LINE_CODING 0x20 /* Configures DTE rate, stop-bits, parity, and number-of-character */
#define CDC_SET_LINE_CTLSTE 0x22 /* This request generates RS-232/V.24 style control signals */
#define CDC_SEND_BREAK 0x23 /* Sends special carrier modulation used to specify RS-232 style break */
#endif
/* USB UDisk */
#ifndef USB_BO_CBW_SIZE
#define USB_BO_CBW_SIZE 0x1F
#define USB_BO_CSW_SIZE 0x0D
#endif
#ifndef USB_BO_CBW_SIG0
#define USB_BO_CBW_SIG0 0x55
#define USB_BO_CBW_SIG1 0x53
#define USB_BO_CBW_SIG2 0x42
#define USB_BO_CBW_SIG3 0x43
#define USB_BO_CSW_SIG0 0x55
#define USB_BO_CSW_SIG1 0x53
#define USB_BO_CSW_SIG2 0x42
#define USB_BO_CSW_SIG3 0x53
#endif
/*******************************************************************************/
/* USBFS Related Register Macro Definition */
/* R8_USB_CTRL */
#define USBFS_UC_HOST_MODE 0x80
#define USBFS_UC_LOW_SPEED 0x40
#define USBFS_UC_SYS_CTRL_MASK 0x30
#define USBFS_UC_SYS_CTRL0 0x00
#define USBFS_UC_SYS_CTRL1 0x10
#define USBFS_UC_SYS_CTRL2 0x20
#define USBFS_UC_SYS_CTRL3 0x30
#define USBFS_UC_DEV_PU_EN 0x20
#define USBFS_UC_INT_BUSY 0x08
#define USBFS_UC_RESET_SIE 0x04
#define USBFS_UC_CLR_ALL 0x02
#define USBFS_UC_DMA_EN 0x01
/* R8_USB_INT_EN */
#define USBFS_UIE_DEV_NAK 0x40
#define USBFS_UID_1_WIRE 0x20
#define USBFS_UIE_FIFO_OV 0x10
#define USBFS_UIE_HST_SOF 0x08
#define USBFS_UIE_SUSPEND 0x04
#define USBFS_UIE_TRANSFER 0x02
#define USBFS_UIE_DETECT 0x01
#define USBFS_UIE_BUS_RST 0x01
/* R8_USB_DEV_AD */
#define USBFS_UDA_GP_BIT 0x80
#define USBFS_USB_ADDR_MASK 0x7F
/* R8_USB_MIS_ST */
#define USBFS_UMS_SOF_PRES 0x80
#define USBFS_UMS_SOF_ACT 0x40
#define USBFS_UMS_SIE_FREE 0x20
#define USBFS_UMS_R_FIFO_RDY 0x10
#define USBFS_UMS_BUS_RESET 0x08
#define USBFS_UMS_SUSPEND 0x04
#define USBFS_UMS_DM_LEVEL 0x02
#define USBFS_UMS_DEV_ATTACH 0x01
/* R8_USB_INT_FG */
#define USBFS_U_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received
#define USBFS_U_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK
#define USBFS_U_SIE_FREE 0x20 // RO, indicate USB SIE free status
#define USBFS_UIF_FIFO_OV 0x10 // FIFO overflow interrupt flag for USB, direct bit address clear or write 1 to clear
#define USBFS_UIF_HST_SOF 0x08 // host SOF timer interrupt flag for USB host, direct bit address clear or write 1 to clear
#define USBFS_UIF_SUSPEND 0x04 // USB suspend or resume event interrupt flag, direct bit address clear or write 1 to clear
#define USBFS_UIF_TRANSFER 0x02 // USB transfer completion interrupt flag, direct bit address clear or write 1 to clear
#define USBFS_UIF_DETECT 0x01 // device detected event interrupt flag for USB host mode, direct bit address clear or write 1 to clear
#define USBFS_UIF_BUS_RST 0x01 // bus reset event interrupt flag for USB device mode, direct bit address clear or write 1 to clear
/* R8_USB_INT_ST */
#define USBFS_SETUP_ACT 0x80 // RO, indicate current SETUP transaction completed
#define USBFS_UIS_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK
#define USBFS_UIS_TOKEN_MASK 0x30 // RO, bit mask of current token PID code received for USB device mode
#define USBFS_UIS_TOKEN_OUT 0x00
#define USBFS_UIS_TOKEN_IN 0x20
#define USBFS_UIS_TOKEN_SETUP 0x30
// bUIS_TOKEN1 & bUIS_TOKEN0: current token PID code received for USB device mode
// 00: OUT token PID received
// 10: IN token PID received
// 11: SETUP token PID received
#define USBFS_UIS_ENDP_MASK 0x0F // RO, bit mask of current transfer endpoint number for USB device mode
#define USBFS_UIS_H_RES_MASK 0x0F // RO, bit mask of current transfer handshake response for USB host mode: 0000=no response, time out from device, others=handshake response PID received
/* R8_UDEV_CTRL */
#define USBFS_UD_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable
#define USBFS_UD_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level
#define USBFS_UD_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level
#define USBFS_UD_LOW_SPEED 0x04 // enable USB physical port low speed: 0=full speed, 1=low speed
#define USBFS_UD_GP_BIT 0x02 // general purpose bit
#define USBFS_UD_PORT_EN 0x01 // enable USB physical port I/O: 0=disable, 1=enable
/* R8_UEP4_1_MOD */
#define USBFS_UEP1_RX_EN 0x80 // enable USB endpoint 1 receiving (OUT)
#define USBFS_UEP1_TX_EN 0x40 // enable USB endpoint 1 transmittal (IN)
#define USBFS_UEP1_BUF_MOD 0x10 // buffer mode of USB endpoint 1
#define USBFS_UEP4_RX_EN 0x08 // enable USB endpoint 4 receiving (OUT)
#define USBFS_UEP4_TX_EN 0x04 // enable USB endpoint 4 transmittal (IN)
#define USBFS_UEP4_BUF_MOD 0x01
/* R8_UEP2_3_MOD */
#define USBFS_UEP3_RX_EN 0x80 // enable USB endpoint 3 receiving (OUT)
#define USBFS_UEP3_TX_EN 0x40 // enable USB endpoint 3 transmittal (IN)
#define USBFS_UEP3_BUF_MOD 0x10 // buffer mode of USB endpoint 3
#define USBFS_UEP2_RX_EN 0x08 // enable USB endpoint 2 receiving (OUT)
#define USBFS_UEP2_TX_EN 0x04 // enable USB endpoint 2 transmittal (IN)
#define USBFS_UEP2_BUF_MOD 0x01 // buffer mode of USB endpoint 2
/* R8_UEP5_6_MOD */
#define USBFS_UEP6_RX_EN 0x80 // enable USB endpoint 6 receiving (OUT)
#define USBFS_UEP6_TX_EN 0x40 // enable USB endpoint 6 transmittal (IN)
#define USBFS_UEP6_BUF_MOD 0x10 // buffer mode of USB endpoint 6
#define USBFS_UEP5_RX_EN 0x08 // enable USB endpoint 5 receiving (OUT)
#define USBFS_UEP5_TX_EN 0x04 // enable USB endpoint 5 transmittal (IN)
#define USBFS_UEP5_BUF_MOD 0x01 // buffer mode of USB endpoint 5
/* R8_UEP7_MOD */
#define USBFS_UEP7_RX_EN 0x08 // enable USB endpoint 7 receiving (OUT)
#define USBFS_UEP7_TX_EN 0x04 // enable USB endpoint 7 transmittal (IN)
#define USBFS_UEP7_BUF_MOD 0x01 // buffer mode of USB endpoint 7
/* R8_UEPn_TX_CTRL */
#define USBFS_UEP_T_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle
#define USBFS_UEP_T_TOG 0x04 // prepared data toggle flag of USB endpoint X transmittal (IN): 0=DATA0, 1=DATA1
#define USBFS_UEP_T_RES_MASK 0x03 // bit mask of handshake response type for USB endpoint X transmittal (IN)
#define USBFS_UEP_T_RES_ACK 0x00
#define USBFS_UEP_T_RES_NONE 0x01
#define USBFS_UEP_T_RES_NAK 0x02
#define USBFS_UEP_T_RES_STALL 0x03
// bUEP_T_RES1 & bUEP_T_RES0: handshake response type for USB endpoint X transmittal (IN)
// 00: DATA0 or DATA1 then expecting ACK (ready)
// 01: DATA0 or DATA1 then expecting no response, time out from host, for non-zero endpoint isochronous transactions
// 10: NAK (busy)
// 11: STALL (error)
// host aux setup
/* R8_UEPn_RX_CTRL, n=0-7 */
#define USBFS_UEP_R_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle
#define USBFS_UEP_R_TOG 0x04 // expected data toggle flag of USB endpoint X receiving (OUT): 0=DATA0, 1=DATA1
#define USBFS_UEP_R_RES_MASK 0x03 // bit mask of handshake response type for USB endpoint X receiving (OUT)
#define USBFS_UEP_R_RES_ACK 0x00
#define USBFS_UEP_R_RES_NONE 0x01
#define USBFS_UEP_R_RES_NAK 0x02
#define USBFS_UEP_R_RES_STALL 0x03
// RB_UEP_R_RES1 & RB_UEP_R_RES0: handshake response type for USB endpoint X receiving (OUT)
// 00: ACK (ready)
// 01: no response, time out to host, for non-zero endpoint isochronous transactions
// 10: NAK (busy)
// 11: STALL (error)
/* R8_UHOST_CTRL */
#define USBFS_UH_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable
#define USBFS_UH_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level
#define USBFS_UH_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level
#define USBFS_UH_LOW_SPEED 0x04 // enable USB port low speed: 0=full speed, 1=low speed
#define USBFS_UH_BUS_RESET 0x02 // control USB bus reset: 0=normal, 1=force bus reset
#define USBFS_UH_PORT_EN 0x01 // enable USB port: 0=disable, 1=enable port, automatic disabled if USB device detached
/* R32_UH_EP_MOD */
#define USBFS_UH_EP_TX_EN 0x40 // enable USB host OUT endpoint transmittal
#define USBFS_UH_EP_TBUF_MOD 0x10 // buffer mode of USB host OUT endpoint
#define USBFS_UH_EP_RX_EN 0x08 // enable USB host IN endpoint receiving
#define USBFS_UH_EP_RBUF_MOD 0x01 // buffer mode of USB host IN endpoint
/* R16_UH_SETUP */
#define USBFS_UH_PRE_PID_EN 0x0400 // USB host PRE PID enable for low speed device via hub
#define USBFS_UH_SOF_EN 0x0004 // USB host automatic SOF enable
/* R8_UH_EP_PID */
#define USBFS_UH_TOKEN_MASK 0xF0 // bit mask of token PID for USB host transfer
#define USBFS_UH_ENDP_MASK 0x0F // bit mask of endpoint number for USB host transfer
/* R8_UH_RX_CTRL */
#define USBFS_UH_R_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle
#define USBFS_UH_R_TOG 0x04 // expected data toggle flag of host receiving (IN): 0=DATA0, 1=DATA1
#define USBFS_UH_R_RES 0x01 // prepared handshake response type for host receiving (IN): 0=ACK (ready), 1=no response, time out to device, for isochronous transactions
/* R8_UH_TX_CTRL */
#define USBFS_UH_T_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle
#define USBFS_UH_T_TOG 0x04 // prepared data toggle flag of host transmittal (SETUP/OUT): 0=DATA0, 1=DATA1
#define USBFS_UH_T_RES 0x01 // expected handshake response type for host transmittal (SETUP/OUT): 0=ACK (ready), 1=no response, time out from device, for isochronous transactions
/*******************************************************************************/
/* Struct Definition */
/* USB Setup Request */
typedef struct __attribute__((packed)) _USB_SETUP_REQ
{
uint8_t bRequestType;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
} USB_SETUP_REQ, *PUSB_SETUP_REQ;
/* USB Device Descriptor */
typedef struct __attribute__((packed)) _USB_DEVICE_DESCR
{
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t bcdUSB;
uint8_t bDeviceClass;
uint8_t bDeviceSubClass;
uint8_t bDeviceProtocol;
uint8_t bMaxPacketSize0;
uint16_t idVendor;
uint16_t idProduct;
uint16_t bcdDevice;
uint8_t iManufacturer;
uint8_t iProduct;
uint8_t iSerialNumber;
uint8_t bNumConfigurations;
} USB_DEV_DESCR, *PUSB_DEV_DESCR;
/* USB Configuration Descriptor */
typedef struct __attribute__((packed)) _USB_CONFIG_DESCR
{
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t wTotalLength;
uint8_t bNumInterfaces;
uint8_t bConfigurationValue;
uint8_t iConfiguration;
uint8_t bmAttributes;
uint8_t MaxPower;
} USB_CFG_DESCR, *PUSB_CFG_DESCR;
/* USB Interface Descriptor */
typedef struct __attribute__((packed)) _USB_INTERF_DESCR
{
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bInterfaceNumber;
uint8_t bAlternateSetting;
uint8_t bNumEndpoints;
uint8_t bInterfaceClass;
uint8_t bInterfaceSubClass;
uint8_t bInterfaceProtocol;
uint8_t iInterface;
} USB_ITF_DESCR, *PUSB_ITF_DESCR;
/* USB Endpoint Descriptor */
typedef struct __attribute__((packed)) _USB_ENDPOINT_DESCR
{
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bEndpointAddress;
uint8_t bmAttributes;
uint8_t wMaxPacketSizeL;
uint8_t wMaxPacketSizeH;
uint8_t bInterval;
} USB_ENDP_DESCR, *PUSB_ENDP_DESCR;
/* USB Configuration Descriptor Set */
typedef struct __attribute__((packed)) _USB_CONFIG_DESCR_LONG
{
USB_CFG_DESCR cfg_descr;
USB_ITF_DESCR itf_descr;
USB_ENDP_DESCR endp_descr[ 1 ];
} USB_CFG_DESCR_LONG, *PUSB_CFG_DESCR_LONG;
/* USB HUB Descriptor */
typedef struct __attribute__((packed)) _USB_HUB_DESCR
{
uint8_t bDescLength;
uint8_t bDescriptorType;
uint8_t bNbrPorts;
uint8_t wHubCharacteristicsL;
uint8_t wHubCharacteristicsH;
uint8_t bPwrOn2PwrGood;
uint8_t bHubContrCurrent;
uint8_t DeviceRemovable;
uint8_t PortPwrCtrlMask;
} USB_HUB_DESCR, *PUSB_HUB_DESCR;
/* USB HID Descriptor */
typedef struct __attribute__((packed)) _USB_HID_DESCR
{
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t bcdHID;
uint8_t bCountryCode;
uint8_t bNumDescriptors;
uint8_t bDescriptorTypeX;
uint8_t wDescriptorLengthL;
uint8_t wDescriptorLengthH;
} USB_HID_DESCR, *PUSB_HID_DESCR;
/* USB UDisk */
typedef struct __attribute__((packed)) _UDISK_BOC_CBW
{
uint32_t mCBW_Sig;
uint32_t mCBW_Tag;
uint32_t mCBW_DataLen;
uint8_t mCBW_Flag;
uint8_t mCBW_LUN;
uint8_t mCBW_CB_Len;
uint8_t mCBW_CB_Buf[ 16 ];
} UDISK_BOC_CBW, *PXUDISK_BOC_CBW;
/* USB UDisk */
typedef struct __attribute__((packed)) _UDISK_BOC_CSW
{
uint32_t mCBW_Sig;
uint32_t mCBW_Tag;
uint32_t mCSW_Residue;
uint8_t mCSW_Status;
} UDISK_BOC_CSW, *PXUDISK_BOC_CSW;
#ifdef __cplusplus
}
#endif
#endif /*_CH32L103_USB_H */

View File

@ -0,0 +1,408 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_can.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the
* CAN firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_USBPD_H
#define __CH32L103_USBPD_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
#ifndef VOID
#define VOID void
#endif
#ifndef CONST
#define CONST const
#endif
#ifndef BOOL
typedef unsigned char BOOL;
#endif
#ifndef BOOLEAN
typedef unsigned char BOOLEAN;
#endif
#ifndef CHAR
typedef char CHAR;
#endif
#ifndef INT8
typedef char INT8;
#endif
#ifndef INT16
typedef short INT16;
#endif
#ifndef INT32
typedef long INT32;
#endif
#ifndef UINT8
typedef unsigned char UINT8;
#endif
#ifndef UINT16
typedef unsigned short UINT16;
#endif
#ifndef UINT32
typedef unsigned long UINT32;
#endif
#ifndef UINT8V
typedef unsigned char volatile UINT8V;
#endif
#ifndef UINT16V
typedef unsigned short volatile UINT16V;
#endif
#ifndef UINT32V
typedef unsigned long volatile UINT32V;
#endif
#ifndef PVOID
typedef void *PVOID;
#endif
#ifndef PCHAR
typedef char *PCHAR;
#endif
#ifndef PCHAR
typedef const char *PCCHAR;
#endif
#ifndef PINT8
typedef char *PINT8;
#endif
#ifndef PINT16
typedef short *PINT16;
#endif
#ifndef PINT32
typedef long *PINT32;
#endif
#ifndef PUINT8
typedef unsigned char *PUINT8;
#endif
#ifndef PUINT16
typedef unsigned short *PUINT16;
#endif
#ifndef PUINT32
typedef unsigned long *PUINT32;
#endif
#ifndef PUINT8V
typedef volatile unsigned char *PUINT8V;
#endif
#ifndef PUINT16V
typedef volatile unsigned short *PUINT16V;
#endif
#ifndef PUINT32V
typedef volatile unsigned long *PUINT32V;
#endif
/******************************************************************************/
/* Related macro definitions */
/* Define the return value of the function */
#ifndef SUCCESS
#define SUCCESS 0
#endif
#ifndef FAIL
#define FAIL 0xFF
#endif
/* Register Bit Definition */
/* USBPD->CONFIG */
#define PD_FILT_ED (1<<0) /* PD pin input filter enable */
#define PD_ALL_CLR (1<<1) /* Clear all interrupt flags */
#define CC_SEL (1<<2) /* Select PD communication port */
#define PD_DMA_EN (1<<3) /* Enable DMA for USBPD */
#define PD_RST_EN (1<<4) /* PD mode reset command enable */
#define WAKE_POLAR (1<<5) /* PD port wake-up level */
#define IE_PD_IO (1<<10) /* PD IO interrupt enable */
#define IE_RX_BIT (1<<11) /* Receive bit interrupt enable */
#define IE_RX_BYTE (1<<12) /* Receive byte interrupt enable */
#define IE_RX_ACT (1<<13) /* Receive completion interrupt enable */
#define IE_RX_RESET (1<<14) /* Reset interrupt enable */
#define IE_TX_END (1<<15) /* Transfer completion interrupt enable */
/* USBPD->CONTROL */
#define PD_TX_EN (1<<0) /* USBPD transceiver mode and transmit enable */
#define BMC_START (1<<1) /* BMC send start signal */
#define RX_STATE_0 (1<<2) /* PD received state bit 0 */
#define RX_STATE_1 (1<<3) /* PD received state bit 1 */
#define RX_STATE_2 (1<<4) /* PD received state bit 2 */
#define DATA_FLAG (1<<5) /* Cache data valid flag bit */
#define TX_BIT_BACK (1<<6) /* Indicates the current bit status of the BMC when sending the code */
#define BMC_BYTE_HI (1<<7) /* Indicates the current half-byte status of the PD data being sent and received */
/* USBPD->TX_SEL */
#define TX_SEL1 (0<<0)
#define TX_SEL1_SYNC1 (0<<0) /* 0-SYNC1 */
#define TX_SEL1_RST1 (1<<0) /* 1-RST1 */
#define TX_SEL2_Mask (3<<2)
#define TX_SEL2_SYNC1 (0<<2) /* 00-SYNC1 */
#define TX_SEL2_SYNC3 (1<<2) /* 01-SYNC3 */
#define TX_SEL2_RST1 (2<<2) /* 1x-RST1 */
#define TX_SEL3_Mask (3<<4)
#define TX_SEL3_SYNC1 (0<<4) /* 00-SYNC1 */
#define TX_SEL3_SYNC3 (1<<4) /* 01-SYNC3 */
#define TX_SEL3_RST1 (2<<4) /* 1x-RST1 */
#define TX_SEL4_Mask (3<<6)
#define TX_SEL4_SYNC2 (0<<6) /* 00-SYNC2 */
#define TX_SEL4_SYNC3 (1<<6) /* 01-SYNC3 */
#define TX_SEL4_RST2 (2<<6) /* 1x-RST2 */
/* USBPD->STATUS */
#define BMC_AUX (3<<0) /* BMC auxiliary information */
#define BMC_AUX_INVALID (0<<0) /* 00-Invalid */
#define BMC_AUX_SOP0 (1<<0) /* 01-SOP0 */
#define BMC_AUX_SOP1_HRST (2<<0) /* 10-SOP1 hard reset */
#define BMC_AUX_SOP2_CRST (3<<0) /* 11-SOP2 cable reset */
#define BUF_ERR (1<<2) /* BUFFER or DMA error interrupt flag */
#define IF_RX_BIT (1<<3) /* Receive bit or 5bit interrupt flag */
#define IF_RX_BYTE (1<<4) /* Receive byte or SOP interrupt flag */
#define IF_RX_ACT (1<<5) /* Receive completion interrupt flag */
#define IF_RX_RESET (1<<6) /* Receive reset interrupt flag */
#define IF_TX_END (1<<7) /* Transfer completion interrupt flag */
/* USBPD->PORT_CC1 */
/* USBPD->PORT_CC2 */
#define PA_CC_AI (1<<0) /* CC port comparator analogue input */
#define CC_PD (1<<1) /* CC port pull-down resistor enable */
#define CC_PU_Mask (3<<2) /* Clear CC port pull-up current */
#define CC_NO_PU (0<<2) /* 00-Prohibit pull-up current */
#define CC_PU_330 (1<<2) /* 01-330uA */
#define CC_PU_180 (2<<2) /* 10-180uA */
#define CC_PU_80 (3<<2) /* 11-80uA */
#define CC_LVE (1<<4) /* CC port output low voltage enable */
#define CC_CE (7<<5) /* Enable the voltage comparator on port CC */
#define CC_NO_CMP (0<<5) /* 000-closed */
#define CC_CMP_22 (2<<5) /* 010-0.22V */
#define CC_CMP_45 (3<<5) /* 011-0.45V */
#define CC_CMP_55 (4<<5) /* 100-0.55V */
#define CC_CMP_66 (5<<5) /* 101-0.66V */
#define CC_CMP_95 (6<<5) /* 110-0.95V */
#define CC_CMP_123 (7<<5) /* 111-1.23V */
#define USBPD_IN_HVT (1<<9)
/*********************************************************
* PD pin PB6/PB7 high threshold input mode:
* 1: High threshold input (2.2V typical), to reduce the I/O power consumption during PD communication
* 0: Normal GPIO threshold input
* *******************************************************/
/* Control Message Types */
#define DEF_TYPE_RESERVED 0x00
#define DEF_TYPE_GOODCRC 0x01 /* Send By: Source,Sink,Cable Plug */
#define DEF_TYPE_GOTOMIN 0x02 /* Send By: Source */
#define DEF_TYPE_ACCEPT 0x03 /* Send By: Source,Sink,Cable Plug */
#define DEF_TYPE_REJECT 0x04 /* Send By: Source,Sink,Cable Plug */
#define DEF_TYPE_PING 0x05 /* Send By: Source */
#define DEF_TYPE_PS_RDY 0x06 /* Send By: Source,Sink */
#define DEF_TYPE_GET_SRC_CAP 0x07 /* Send By: Sink,DRP */
#define DEF_TYPE_GET_SNK_CAP 0x08 /* Send By: Source,DRP */
#define DEF_TYPE_DR_SWAP 0x09 /* Send By: Source,Sink */
#define DEF_TYPE_PR_SWAP 0x0A /* Send By: Source,Sink */
#define DEF_TYPE_VCONN_SWAP 0x0B /* Send By: Source,Sink */
#define DEF_TYPE_WAIT 0x0C /* Send By: Source,Sink */
#define DEF_TYPE_SOFT_RESET 0x0D /* Send By: Source,Sink */
#define DEF_TYPE_DATA_RESET 0x0E /* Send By: Source,Sink */
#define DEF_TYPE_DATA_RESET_CMP 0x0F /* Send By: Source,Sink */
#define DEF_TYPE_NOT_SUPPORT 0x10 /* Send By: Source,Sink,Cable Plug */
#define DEF_TYPE_GET_SRC_CAP_EX 0x11 /* Send By: Sink,DRP */
#define DEF_TYPE_GET_STATUS 0x12 /* Send By: Source,Sink */
#define DEF_TYPE_GET_STATUS_R 0X02 /* ext=1 */
#define DEF_TYPE_FR_SWAP 0x13 /* Send By: Sink */
#define DEF_TYPE_GET_PPS_STATUS 0x14 /* Send By: Sink */
#define DEF_TYPE_GET_CTY_CODES 0x15 /* Send By: Source,Sink */
#define DEF_TYPE_GET_SNK_CAP_EX 0x16 /* Send By: Source,DRP */
#define DEF_TYPE_GET_SRC_INFO 0x17 /* Send By: Sink,DRP */
#define DEF_TYPE_GET_REVISION 0x18 /* Send By: Source,Sink */
/* Data Message Types */
#define DEF_TYPE_SRC_CAP 0x01 /* Send By: Source,Dual-Role Power */
#define DEF_TYPE_REQUEST 0x02 /* Send By: Sink */
#define DEF_TYPE_BIST 0x03 /* Send By: Tester,Source,Sink */
#define DEF_TYPE_SNK_CAP 0x04 /* Send By: Sink,Dual-Role Power */
#define DEF_TYPE_BAT_STATUS 0x05 /* Send By: Source,Sink */
#define DEF_TYPE_ALERT 0x06 /* Send By: Source,Sink */
#define DEF_TYPE_GET_CTY_INFO 0x07 /* Send By: Source,Sink */
#define DEF_TYPE_ENTER_USB 0x08 /* Send By: DFP */
#define DEF_TYPE_EPR_REQUEST 0x09 /* Send By: Sink */
#define DEF_TYPE_EPR_MODE 0x0A /* Send By: Source,Sink */
#define DEF_TYPE_SRC_INFO 0x0B /* Send By: Source */
#define DEF_TYPE_REVISION 0x0C /* Send By: Source,Sink,Cable Plug */
#define DEF_TYPE_VENDOR_DEFINED 0x0F /* Send By: Source,Sink,Cable Plug */
/* Vendor Define Message Command */
#define DEF_VDM_DISC_IDENT 0x01
#define DEF_VDM_DISC_SVID 0x02
#define DEF_VDM_DISC_MODE 0x03
#define DEF_VDM_ENTER_MODE 0x04
#define DEF_VDM_EXIT_MODE 0x05
#define DEF_VDM_ATTENTION 0x06
#define DEF_VDM_DP_S_UPDATE 0x10
#define DEF_VDM_DP_CONFIG 0x11
/* PD Revision */
#define DEF_PD_REVISION_10 0x00
#define DEF_PD_REVISION_20 0x01
#define DEF_PD_REVISION_30 0x02
/* PD PHY Channel */
#define DEF_PD_CC1 0x00
#define DEF_PD_CC2 0x01
#define PIN_CC1 GPIO_Pin_6
#define PIN_CC2 GPIO_Pin_7
/* PD Tx Status */
#define DEF_PD_TX_OK 0x00
#define DEF_PD_TX_FAIL 0x01
/* PDO INDEX */
#define PDO_INDEX_1 1
#define PDO_INDEX_2 2
#define PDO_INDEX_3 3
#define PDO_INDEX_4 4
#define PDO_INDEX_5 5
/******************************************************************************/
#define UPD_TMR_TX_96M (160-1) /* timer value for USB PD BMC transmittal @Fsys=96MHz */
#define UPD_TMR_RX_96M (240-1) /* timer value for USB PD BMC receiving @Fsys=96MHz */
#define UPD_TMR_TX_48M (80-1) /* timer value for USB PD BMC transmittal @Fsys=48MHz */
#define UPD_TMR_RX_48M (120-1) /* timer value for USB PD BMC receiving @Fsys=48MHz */
#define UPD_TMR_TX_24M (40-1) /* timer value for USB PD BMC transmittal @Fsys=24MHz */
#define UPD_TMR_RX_24M (60-1) /* timer value for USB PD BMC receiving @Fsys=24MHz */
#define UPD_TMR_TX_12M (20-1) /* timer value for USB PD BMC transmittal @Fsys=12MHz */
#define UPD_TMR_RX_12M (30-1) /* timer value for USB PD BMC receiving @Fsys=12MHz */
#define MASK_PD_STAT 0x03 /* Bit mask for current PD status */
#define PD_RX_SOP0 0x01 /* SOP0 received */
#define PD_RX_SOP1_HRST 0x02 /* SOP1 or Hard Reset received */
#define PD_RX_SOP2_CRST 0x03 /* SOP2 or Cable Reset received */
#define UPD_SOP0 ( TX_SEL1_SYNC1 | TX_SEL2_SYNC1 | TX_SEL3_SYNC1 | TX_SEL4_SYNC2 ) /* SOP1 */
#define UPD_SOP1 ( TX_SEL1_SYNC1 | TX_SEL2_SYNC1 | TX_SEL3_SYNC3 | TX_SEL4_SYNC3 ) /* SOP2 */
#define UPD_SOP2 ( TX_SEL1_SYNC1 | TX_SEL2_SYNC3 | TX_SEL3_SYNC1 | TX_SEL4_SYNC3 ) /* SOP3 */
#define UPD_HARD_RESET ( TX_SEL1_RST1 | TX_SEL2_RST1 | TX_SEL3_RST1 | TX_SEL4_RST2 ) /* Hard Reset*/
#define UPD_CABLE_RESET ( TX_SEL1_RST1 | TX_SEL2_SYNC1 | TX_SEL3_RST1 | TX_SEL4_SYNC3 ) /* Cable Reset*/
#define bCC_CMP_22 0X01
#define bCC_CMP_45 0X02
#define bCC_CMP_55 0X04
#define bCC_CMP_66 0X08
#define bCC_CMP_95 0X10
#define bCC_CMP_123 0X20
#define bCC_CMP_220 0X40
/******************************************************************************/
/* PD State Machine */
typedef enum
{
STA_IDLE = 0, /* 0: No task status */
STA_DISCONNECT, /* 1: Disconnection */
STA_SRC_CONNECT, /* 2: SRC connect */
STA_RX_SRC_CAP_WAIT, /* 3: Waiting to receive SRC_CAP */
STA_RX_SRC_CAP, /* 4: SRC_CAP received */
STA_TX_REQ, /* 5: Send REQUEST */
STA_RX_ACCEPT_WAIT, /* 6: Waiting to receive ACCEPT */
STA_RX_ACCEPT, /* 7: ACCEPT received */
STA_RX_REJECT, /* 8: REJECT received */
STA_RX_PS_RDY_WAIT, /* 9: Waiting to receive PS_RDY */
STA_RX_PS_RDY, /* 10: PS_RDY received */
STA_SINK_CONNECT, /* 11: SNK access */
STA_TX_SRC_CAP, /* 12: Send SRC_CAP */
STA_RX_REQ_WAIT, /* 13: Waiting to receive REQUEST */
STA_RX_REQ, /* 14: REQUEST received */
STA_TX_ACCEPT, /* 15: Send ACCEPT */
STA_TX_REJECT, /* 16: Send REJECT */
STA_ADJ_VOL, /* 17: Adjustment of output voltage and current */
STA_TX_PS_RDY, /* 18: Send PS_RDY */
STA_TX_DR_SWAP, /* 19: Send DR_SWAP */
STA_RX_DR_SWAP_ACCEPT, /* 20: Waiting to receive the answer ACCEPT from DR_SWAP */
STA_TX_PR_SWAP, /* 21: Send PR_SWAP */
STA_RX_PR_SWAP_ACCEPT, /* 22: Waiting to receive the answer ACCEPT from PR_SWAP */
STA_RX_PR_SWAP_PS_RDY, /* 23: Waiting to receive the answer PS_RDY from PR_SWAP */
STA_TX_PR_SWAP_PS_RDY, /* 24: Send answer PS_RDY for PR_SWAP */
STA_PR_SWAP_RECON_WAIT, /* 25: Wait for PR_SWAP before reconnecting */
STA_SRC_RECON_WAIT, /* 26: Waiting for SRC to reconnect */
STA_SINK_RECON_WAIT, /* 27: Waiting for SNK to reconnect */
STA_RX_APD_PS_RDY_WAIT, /* 28: Waiting for PS_RDY from the receiving adapter */
STA_RX_APD_PS_RDY, /* 29: PS_RDY received from the adapter */
STA_MODE_SWITCH, /* 30: Mode switching */
STA_TX_SOFTRST, /* 31: Sending a software reset */
STA_TX_HRST, /* 32: Send hardware reset */
STA_PHY_RST, /* 33: PHY reset */
STA_APD_IDLE_WAIT, /* 34: Waiting for the adapter to become idle */
} CC_STATUS;
/******************************************************************************/
/* PD Message Header Struct */
typedef union
{
struct _Message_Header
{
UINT8 MsgType: 5; /* Message Type */
UINT8 PDRole: 1; /* 0-UFP; 1-DFP */
UINT8 SpecRev: 2; /* 00-Rev1.0; 01-Rev2.0; 10-Rev3.0; */
UINT8 PRRole: 1; /* 0-Sink; 1-Source */
UINT8 MsgID: 3;
UINT8 NumDO: 3;
UINT8 Ext: 1;
}Message_Header;
UINT16 Data;
}_Message_Header;
/******************************************************************************/
/* Bit definition */
typedef union
{
struct _BITS_
{
UINT8 Msg_Recvd: 1; /* Notify the main program of the receipt of a PD packet */
UINT8 Connected: 1; /* PD Physical Layer Connected Flag */
UINT8 Stop_Det_Chk: 1; /* 0-Enable detection; 1-Disable disconnection detection */
UINT8 PD_Role: 1; /* 0-UFP; 1-DFP */
UINT8 PR_Role: 1; /* 0-Sink; 1-Source */
UINT8 Auto_Ack_PRRole: 1; /* Role used by auto-responder 0:SINK; 1:SOURCE */
UINT8 PD_Version: 1; /* PD version 0-PD2.0; 1-PD3.0 */
UINT8 VDM_Version: 1; /* VDM Version 0-1.0 1-2.0 */
UINT8 HPD_Connected: 1; /* HPD Physical Layer Connected Flag */
UINT8 HPD_Det_Chk: 1; /* 0-turn off HPD connection detection; 1-turn on HPD connection detection */
UINT8 CC_Sel_En: 1; /* 0-CC channel selection toggle enable; 1-CC channel selection toggle disable */
UINT8 CC_Sel_State: 1; /* 0-CC channel selection switches to 0; 1-CC channel selection switches to 1 */
UINT8 PD_Comm_Succ: 1; /* 0-PD communication unsuccessful; 1-PD communication successful; */
UINT8 Recv: 3;
}Bit;
UINT16 Bit_Flag;
}_BIT_FLAG;
/* PD control-related structures */
typedef struct _PD_CONTROL
{
CC_STATUS PD_State; /* PD communication status machine */
CC_STATUS PD_State_Last; /* PD communication status machine (last value) */
UINT8 Msg_ID; /* ID of the message sent */
UINT8 Det_Timer; /* PD connection status detection timing */
UINT8 Det_Cnt; /* Number of PD connection status detections */
UINT8 Det_Sel_Cnt; /* Number of SEL toggles for PD connection status detection */
UINT8 HPD_Det_Timer; /* HPD connection detection timing */
UINT8 HPD_Det_Cnt; /* HPD pin connection status detection count */
UINT16 PD_Comm_Timer; /* PD shared timing variables */
UINT8 ReqPDO_Idx; /* Index of the requested PDO, valid values 1-7 */
UINT16 PD_BusIdle_Timer; /* Bus Idle Time Timer */
UINT8 Mode_Try_Cnt; /* Number of retries for current mode, highest bit marks mode */
UINT8 Err_Op_Cnt; /* Exception operation count */
UINT8 Adapter_Idle_Cnt; /* Adapter communication idle timing */
_BIT_FLAG Flag; /* Flag byte bit definition */
}PD_CONTROL, *pPD_CONTROL;
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,41 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_wwdg.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains all the functions prototypes for the WWDG
* firmware library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_WWDG_H
#define __CH32L103_WWDG_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32l103.h"
/* WWDG_Prescaler */
#define WWDG_Prescaler_1 ((uint32_t)0x00000000)
#define WWDG_Prescaler_2 ((uint32_t)0x00000080)
#define WWDG_Prescaler_4 ((uint32_t)0x00000100)
#define WWDG_Prescaler_8 ((uint32_t)0x00000180)
void WWDG_DeInit(void);
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
void WWDG_SetWindowValue(uint8_t WindowValue);
void WWDG_EnableIT(void);
void WWDG_SetCounter(uint8_t Counter);
void WWDG_Enable(uint8_t Counter);
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,244 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_bkp.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the BKP firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_bkp.h"
#include "ch32l103_rcc.h"
/* BKP registers bit mask */
/* OCTLR register bit mask */
#define OCTLR_CAL_MASK ((uint16_t)0xFF80)
#define OCTLR_MASK ((uint16_t)0xFC7F)
/*********************************************************************
* @fn BKP_DeInit
*
* @brief Deinitializes the BKP peripheral registers to their default reset values.
*
* @return none
*/
void BKP_DeInit(void)
{
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);
}
/*********************************************************************
* @fn BKP_TamperPinLevelConfig
*
* @brief Configures the Tamper Pin active level.
*
* @param BKP_TamperPinLevel - specifies the Tamper Pin active level.
* BKP_TamperPinLevel_High - Tamper pin active on high level.
* BKP_TamperPinLevel_Low - Tamper pin active on low level.
*
* @return none
*/
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel)
{
if(BKP_TamperPinLevel)
{
BKP->TPCTLR |= (1 << 1);
}
else
{
BKP->TPCTLR &= ~(1 << 1);
}
}
/*********************************************************************
* @fn BKP_TamperPinCmd
*
* @brief Enables or disables the Tamper Pin activation.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void BKP_TamperPinCmd(FunctionalState NewState)
{
if(NewState)
{
BKP->TPCTLR |= (1 << 0);
}
else
{
BKP->TPCTLR &= ~(1 << 0);
}
}
/*********************************************************************
* @fn BKP_ITConfig
*
* @brief Enables or disables the Tamper Pin Interrupt.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void BKP_ITConfig(FunctionalState NewState)
{
if(NewState)
{
BKP->TPCSR |= (1 << 2);
}
else
{
BKP->TPCSR &= ~(1 << 2);
}
}
/*********************************************************************
* @fn BKP_RTCOutputConfig
*
* @brief Select the RTC output source to output on the Tamper pin.
*
* @param BKP_RTCOutputSource - specifies the RTC output source.
* BKP_RTCOutputSource_None - no RTC output on the Tamper pin.
* BKP_RTCOutputSource_CalibClock - output the RTC clock with
* frequency divided by 64 on the Tamper pin.
* BKP_RTCOutputSource_Alarm - output the RTC Alarm pulse signal
* on the Tamper pin.
* BKP_RTCOutputSource_Second - output the RTC Second pulse
* signal on the Tamper pin.
*
* @return none
*/
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource)
{
uint16_t tmpreg = 0;
tmpreg = BKP->OCTLR;
tmpreg &= OCTLR_MASK;
tmpreg |= BKP_RTCOutputSource;
BKP->OCTLR = tmpreg;
}
/*********************************************************************
* @fn BKP_SetRTCCalibrationValue
*
* @brief Sets RTC Clock Calibration value.
*
* @param CalibrationValue - specifies the RTC Clock Calibration value.
* This parameter must be a number between 0 and 0x1F.
*
* @return none
*/
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue)
{
uint16_t tmpreg = 0;
tmpreg = BKP->OCTLR;
tmpreg &= OCTLR_CAL_MASK;
tmpreg |= CalibrationValue;
BKP->OCTLR = tmpreg;
}
/*********************************************************************
* @fn BKP_WriteBackupRegister
*
* @brief Writes user data to the specified Data Backup Register.
*
* @param BKP_DR - specifies the Data Backup Register.
* Data - data to write.
*
* @return none
*/
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)
{
__IO uint32_t tmp = 0;
tmp = (uint32_t)BKP_BASE;
tmp += BKP_DR;
*(__IO uint32_t *)tmp = Data;
}
/*********************************************************************
* @fn BKP_ReadBackupRegister
*
* @brief Reads data from the specified Data Backup Register.
*
* @param BKP_DR - specifies the Data Backup Register.
* This parameter can be BKP_DRx where x=[1, 42].
*
* @return none
*/
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR)
{
__IO uint32_t tmp = 0;
tmp = (uint32_t)BKP_BASE;
tmp += BKP_DR;
return (*(__IO uint16_t *)tmp);
}
/*********************************************************************
* @fn BKP_GetFlagStatus
*
* @brief Checks whether the Tamper Pin Event flag is set or not.
*
* @return FlagStatus - SET or RESET.
*/
FlagStatus BKP_GetFlagStatus(void)
{
if(BKP->TPCSR & (1 << 8))
{
return SET;
}
else
{
return RESET;
}
}
/*********************************************************************
* @fn BKP_ClearFlag
*
* @brief Clears Tamper Pin Event pending flag.
*
* @return none
*/
void BKP_ClearFlag(void)
{
BKP->TPCSR |= BKP_CTE;
}
/*********************************************************************
* @fn BKP_GetITStatus
*
* @brief Checks whether the Tamper Pin Interrupt has occurred or not.
*
* @return ITStatus - SET or RESET.
*/
ITStatus BKP_GetITStatus(void)
{
if(BKP->TPCSR & (1 << 9))
{
return SET;
}
else
{
return RESET;
}
}
/*********************************************************************
* @fn BKP_ClearITPendingBit
*
* @brief Clears Tamper Pin Interrupt pending bit.
*
* @return none
*/
void BKP_ClearITPendingBit(void)
{
BKP->TPCSR |= BKP_CTI;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,99 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_crc.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the CRC firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_crc.h"
/*********************************************************************
* @fn CRC_ResetDR
*
* @brief Resets the CRC Data register (DR).
*
* @return none
*/
void CRC_ResetDR(void)
{
CRC->CTLR = CRC_CTLR_RESET;
}
/*********************************************************************
* @fn CRC_CalcCRC
*
* @brief Computes the 32-bit CRC of a given data word(32-bit).
*
* @param Data - data word(32-bit) to compute its CRC.
*
* @return 32-bit CRC.
*/
uint32_t CRC_CalcCRC(uint32_t Data)
{
CRC->DATAR = Data;
return (CRC->DATAR);
}
/*********************************************************************
* @fn CRC_CalcBlockCRC
*
* @brief Computes the 32-bit CRC of a given buffer of data word(32-bit).
*
* @param pBuffer - pointer to the buffer containing the data to be computed.
* BufferLength - length of the buffer to be computed.
*
* @return 32-bit CRC.
*/
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
{
uint32_t index = 0;
for(index = 0; index < BufferLength; index++){
CRC->DATAR = pBuffer[index];
}
return (CRC->DATAR);
}
/*********************************************************************
* @fn CRC_GetCRC
*
* @brief Returns the current CRC value.
*
* @return 32-bit CRC.
*/
uint32_t CRC_GetCRC(void)
{
return (CRC->DATAR);
}
/*********************************************************************
* @fn CRC_SetIDRegister
*
* @brief Stores a 8-bit data in the Independent Data(ID) register.
*
* @param IDValue - 8-bit value to be stored in the ID register.
*
* @return none
*/
void CRC_SetIDRegister(uint8_t IDValue)
{
CRC->IDATAR = IDValue;
}
/*********************************************************************
* @fn CRC_GetIDRegister
*
* @brief Returns the 8-bit data stored in the Independent Data(ID) register.
*
* @return 8-bit value of the ID register.
*/
uint8_t CRC_GetIDRegister(void)
{
return (CRC->IDATAR);
}

View File

@ -0,0 +1,126 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_dbgmcu.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/05/06
* Description : This file provides all the DBGMCU firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_dbgmcu.h"
#define IDCODE_DEVID_MASK ((uint32_t)0x0000FFFF)
/*********************************************************************
* @fn DBGMCU_GetREVID
*
* @brief Returns the device revision identifier.
*
* @return Revision identifier.
*/
uint32_t DBGMCU_GetREVID(void)
{
return (CHIPID >> 16);
}
/*********************************************************************
* @fn DBGMCU_GetDEVID
*
* @brief Returns the device identifier.
*
* @return Device identifier.
*/
uint32_t DBGMCU_GetDEVID(void)
{
return (CHIPID & IDCODE_DEVID_MASK);
}
/*********************************************************************
* @fn __get_DEBUG_CR
*
* @brief Return the DEBUGE Control Register
*
* @return DEBUGE Control value
*/
uint32_t __get_DEBUG_CR(void)
{
uint32_t result;
__asm volatile("csrr %0,""0x7C0" : "=r"(result));
return (result);
}
/*********************************************************************
* @fn __set_DEBUG_CR
*
* @brief Set the DEBUGE Control Register
*
* @param value - set DEBUGE Control value
*
* @return none
*/
void __set_DEBUG_CR(uint32_t value)
{
__asm volatile("csrw 0x7C0, %0" : : "r"(value));
}
/*********************************************************************
* @fn DBGMCU_Config
*
* @brief Configures the specified peripheral and low power mode behavior
* when the MCU under Debug mode.
*
* @param DBGMCU_Periph - specifies the peripheral and low power mode.
* DBGMCU_SLEEP - Debug sleep stopped when Core is halted
* DBGMCU_STOP - Debug stop stopped when Core is halted
* DBGMCU_STANDBY - Debug standby stopped when Core is halted
* DBGMCU_IWDG_STOP - Debug IWDG stopped when Core is halted
* DBGMCU_WWDG_STOP - Debug WWDG stopped when Core is halted
* DBGMCU_I2C1_SMBUS_TIMEOUT - Debug I2C1 SMBUS time out when Core is halted
* DBGMCU_I2C2_SMBUS_TIMEOUT - Debug I2C2 SMBUS time out when Core is halted
* DBGMCU_TIM1_STOP - TIM1 counter stopped when Core is halted
* DBGMCU_TIM2_STOP - TIM2 counter stopped when Core is halted
* DBGMCU_TIM3_STOP - TIM3 counter stopped when Core is halted
* DBGMCU_TIM4_STOP - TIM4 counter stopped when Core is halted
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState)
{
uint32_t val;
if(NewState != DISABLE)
{
__set_DEBUG_CR(DBGMCU_Periph);
}
else
{
val = __get_DEBUG_CR();
val &= ~(uint32_t)DBGMCU_Periph;
__set_DEBUG_CR(val);
}
}
/*********************************************************************
* @fn DBGMCU_GetCHIPID
*
* @brief Returns the CHIP identifier.
*
* @return Device identifier.
* ChipID List-
* CH32L103C8T6-0x103107x0
* CH32L103F8P6-0x103A07x0
* CH32L103G8R6-0x103B07x0
* CH32L103K8U6-0x103207x0
* CH32L103F8U6-0x103D07x0
*
*/
uint32_t DBGMCU_GetCHIPID( void )
{
return( CHIPID );
}

View File

@ -0,0 +1,432 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_dma.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the DMA firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_dma.h"
#include "ch32l103_rcc.h"
/* DMA1 Channelx interrupt pending bit masks */
#define DMA1_Channel1_IT_Mask ((uint32_t)(DMA_GIF1 | DMA_TCIF1 | DMA_HTIF1 | DMA_TEIF1))
#define DMA1_Channel2_IT_Mask ((uint32_t)(DMA_GIF2 | DMA_TCIF2 | DMA_HTIF2 | DMA_TEIF2))
#define DMA1_Channel3_IT_Mask ((uint32_t)(DMA_GIF3 | DMA_TCIF3 | DMA_HTIF3 | DMA_TEIF3))
#define DMA1_Channel4_IT_Mask ((uint32_t)(DMA_GIF4 | DMA_TCIF4 | DMA_HTIF4 | DMA_TEIF4))
#define DMA1_Channel5_IT_Mask ((uint32_t)(DMA_GIF5 | DMA_TCIF5 | DMA_HTIF5 | DMA_TEIF5))
#define DMA1_Channel6_IT_Mask ((uint32_t)(DMA_GIF6 | DMA_TCIF6 | DMA_HTIF6 | DMA_TEIF6))
#define DMA1_Channel7_IT_Mask ((uint32_t)(DMA_GIF7 | DMA_TCIF7 | DMA_HTIF7 | DMA_TEIF7))
#define DMA1_Channel8_IT_Mask ((uint32_t)(DMA_GIF8 | DMA_TCIF8 | DMA_HTIF8 | DMA_TEIF8))
/* DMA registers Masks */
#define CFGR_CLEAR_Mask ((uint32_t)0xFFFF800F)
/*********************************************************************
* @fn DMA_DeInit
*
* @brief Deinitializes the DMAy Channelx registers to their default
* reset values.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
*
* @return none
*/
void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx)
{
DMAy_Channelx->CFGR &= (uint16_t)(~DMA_CFGR1_EN);
DMAy_Channelx->CFGR = 0;
DMAy_Channelx->CNTR = 0;
DMAy_Channelx->PADDR = 0;
DMAy_Channelx->MADDR = 0;
if(DMAy_Channelx == DMA1_Channel1)
{
DMA1->INTFCR |= DMA1_Channel1_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel2)
{
DMA1->INTFCR |= DMA1_Channel2_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel3)
{
DMA1->INTFCR |= DMA1_Channel3_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel4)
{
DMA1->INTFCR |= DMA1_Channel4_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel5)
{
DMA1->INTFCR |= DMA1_Channel5_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel6)
{
DMA1->INTFCR |= DMA1_Channel6_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel7)
{
DMA1->INTFCR |= DMA1_Channel7_IT_Mask;
}
else if(DMAy_Channelx == DMA1_Channel8)
{
DMA1->INTFCR |= DMA1_Channel8_IT_Mask;
}
}
/*********************************************************************
* @fn DMA_Init
*
* @brief Initializes the DMAy Channelx according to the specified
* parameters in the DMA_InitStruct.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
* DMA_InitStruct - pointer to a DMA_InitTypeDef structure that contains
* contains the configuration information for the specified DMA Channel.
*
* @return none
*/
void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitTypeDef *DMA_InitStruct)
{
uint32_t tmpreg = 0;
tmpreg = DMAy_Channelx->CFGR;
tmpreg &= CFGR_CLEAR_Mask;
tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode |
DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc |
DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize |
DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M;
DMAy_Channelx->CFGR = tmpreg;
DMAy_Channelx->CNTR = DMA_InitStruct->DMA_BufferSize;
DMAy_Channelx->PADDR = DMA_InitStruct->DMA_PeripheralBaseAddr;
DMAy_Channelx->MADDR = DMA_InitStruct->DMA_MemoryBaseAddr;
}
/*********************************************************************
* @fn DMA_StructInit
*
* @brief Fills each DMA_InitStruct member with its default value.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
* DMA_InitStruct - pointer to a DMA_InitTypeDef structure that contains
* contains the configuration information for the specified DMA Channel.
*
* @return none
*/
void DMA_StructInit(DMA_InitTypeDef *DMA_InitStruct)
{
DMA_InitStruct->DMA_PeripheralBaseAddr = 0;
DMA_InitStruct->DMA_MemoryBaseAddr = 0;
DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStruct->DMA_BufferSize = 0;
DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStruct->DMA_Mode = DMA_Mode_Normal;
DMA_InitStruct->DMA_Priority = DMA_Priority_Low;
DMA_InitStruct->DMA_M2M = DMA_M2M_Disable;
}
/*********************************************************************
* @fn DMA_Cmd
*
* @brief Enables or disables the specified DMAy Channelx.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
* NewState - new state of the DMAy Channelx(ENABLE or DISABLE).
*
* @return none
*/
void DMA_Cmd(DMA_Channel_TypeDef *DMAy_Channelx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
DMAy_Channelx->CFGR |= DMA_CFGR1_EN;
}
else
{
DMAy_Channelx->CFGR &= (uint16_t)(~DMA_CFGR1_EN);
}
}
/*********************************************************************
* @fn DMA_ITConfig
*
* @brief Enables or disables the specified DMAy Channelx interrupts.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
* DMA_IT - specifies the DMA interrupts sources to be enabled
* or disabled.
* DMA_IT_TC - Transfer complete interrupt mask
* DMA_IT_HT - Half transfer interrupt mask
* DMA_IT_TE - Transfer error interrupt mask
* NewState - new state of the DMAy Channelx(ENABLE or DISABLE).
*
* @return none
*/
void DMA_ITConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState)
{
if(NewState != DISABLE)
{
DMAy_Channelx->CFGR |= DMA_IT;
}
else
{
DMAy_Channelx->CFGR &= ~DMA_IT;
}
}
/*********************************************************************
* @fn DMA_SetCurrDataCounter
*
* @brief Sets the number of data units in the current DMAy Channelx transfer.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
* DataNumber - The number of data units in the current DMAy Channelx
* transfer.
*
* @return none
*/
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber)
{
DMAy_Channelx->CNTR = DataNumber;
}
/*********************************************************************
* @fn DMA_GetCurrDataCounter
*
* @brief Returns the number of remaining data units in the current
* DMAy Channelx transfer.
*
* @param DMAy_Channelx - here y can be 1 to select the DMA and x can be
* 1 to 8 for DMA1 to select the DMA Channel.
*
* @return DataNumber - The number of remaining data units in the current
* DMAy Channelx transfer.
*/
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx)
{
return ((uint16_t)(DMAy_Channelx->CNTR));
}
/*********************************************************************
* @fn DMA_GetFlagStatus
*
* @brief Checks whether the specified DMAy Channelx flag is set or not.
*
* @param DMAy_FLAG - specifies the flag to check.
* DMA1_FLAG_GL1 - DMA1 Channel1 global flag.
* DMA1_FLAG_TC1 - DMA1 Channel1 transfer complete flag.
* DMA1_FLAG_HT1 - DMA1 Channel1 half transfer flag.
* DMA1_FLAG_TE1 - DMA1 Channel1 transfer error flag.
* DMA1_FLAG_GL2 - DMA1 Channel2 global flag.
* DMA1_FLAG_TC2 - DMA1 Channel2 transfer complete flag.
* DMA1_FLAG_HT2 - DMA1 Channel2 half transfer flag.
* DMA1_FLAG_TE2 - DMA1 Channel2 transfer error flag.
* DMA1_FLAG_GL3 - DMA1 Channel3 global flag.
* DMA1_FLAG_TC3 - DMA1 Channel3 transfer complete flag.
* DMA1_FLAG_HT3 - DMA1 Channel3 half transfer flag.
* DMA1_FLAG_TE3 - DMA1 Channel3 transfer error flag.
* DMA1_FLAG_GL4 - DMA1 Channel4 global flag.
* DMA1_FLAG_TC4 - DMA1 Channel4 transfer complete flag.
* DMA1_FLAG_HT4 - DMA1 Channel4 half transfer flag.
* DMA1_FLAG_TE4 - DMA1 Channel4 transfer error flag.
* DMA1_FLAG_GL5 - DMA1 Channel5 global flag.
* DMA1_FLAG_TC5 - DMA1 Channel5 transfer complete flag.
* DMA1_FLAG_HT5 - DMA1 Channel5 half transfer flag.
* DMA1_FLAG_TE5 - DMA1 Channel5 transfer error flag.
* DMA1_FLAG_GL6 - DMA1 Channel6 global flag.
* DMA1_FLAG_TC6 - DMA1 Channel6 transfer complete flag.
* DMA1_FLAG_HT6 - DMA1 Channel6 half transfer flag.
* DMA1_FLAG_TE6 - DMA1 Channel6 transfer error flag.
* DMA1_FLAG_GL7 - DMA1 Channel7 global flag.
* DMA1_FLAG_TC7 - DMA1 Channel7 transfer complete flag.
* DMA1_FLAG_HT7 - DMA1 Channel7 half transfer flag.
* DMA1_FLAG_TE7 - DMA1 Channel7 transfer error flag.
* DMA1_FLAG_GL8 - DMA1 Channel8 global flag.
* DMA1_FLAG_TC8 - DMA1 Channel8 transfer complete flag.
* DMA1_FLAG_HT8 - DMA1 Channel8 half transfer flag.
* DMA1_FLAG_TE8 - DMA1 Channel8 transfer error flag.
*
* @return The new state of DMAy_FLAG (SET or RESET).
*/
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG)
{
FlagStatus bitstatus = RESET;
uint32_t tmpreg = 0;
tmpreg = DMA1->INTFR;
if((tmpreg & DMAy_FLAG) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn DMA_ClearFlag
*
* @brief Clears the DMAy Channelx's pending flags.
*
* @param DMAy_FLAG - specifies the flag to check.
* DMA1_FLAG_GL1 - DMA1 Channel1 global flag.
* DMA1_FLAG_TC1 - DMA1 Channel1 transfer complete flag.
* DMA1_FLAG_HT1 - DMA1 Channel1 half transfer flag.
* DMA1_FLAG_TE1 - DMA1 Channel1 transfer error flag.
* DMA1_FLAG_GL2 - DMA1 Channel2 global flag.
* DMA1_FLAG_TC2 - DMA1 Channel2 transfer complete flag.
* DMA1_FLAG_HT2 - DMA1 Channel2 half transfer flag.
* DMA1_FLAG_TE2 - DMA1 Channel2 transfer error flag.
* DMA1_FLAG_GL3 - DMA1 Channel3 global flag.
* DMA1_FLAG_TC3 - DMA1 Channel3 transfer complete flag.
* DMA1_FLAG_HT3 - DMA1 Channel3 half transfer flag.
* DMA1_FLAG_TE3 - DMA1 Channel3 transfer error flag.
* DMA1_FLAG_GL4 - DMA1 Channel4 global flag.
* DMA1_FLAG_TC4 - DMA1 Channel4 transfer complete flag.
* DMA1_FLAG_HT4 - DMA1 Channel4 half transfer flag.
* DMA1_FLAG_TE4 - DMA1 Channel4 transfer error flag.
* DMA1_FLAG_GL5 - DMA1 Channel5 global flag.
* DMA1_FLAG_TC5 - DMA1 Channel5 transfer complete flag.
* DMA1_FLAG_HT5 - DMA1 Channel5 half transfer flag.
* DMA1_FLAG_TE5 - DMA1 Channel5 transfer error flag.
* DMA1_FLAG_GL6 - DMA1 Channel6 global flag.
* DMA1_FLAG_TC6 - DMA1 Channel6 transfer complete flag.
* DMA1_FLAG_HT6 - DMA1 Channel6 half transfer flag.
* DMA1_FLAG_TE6 - DMA1 Channel6 transfer error flag.
* DMA1_FLAG_GL7 - DMA1 Channel7 global flag.
* DMA1_FLAG_TC7 - DMA1 Channel7 transfer complete flag.
* DMA1_FLAG_HT7 - DMA1 Channel7 half transfer flag.
* DMA1_FLAG_TE7 - DMA1 Channel7 transfer error flag.
* DMA1_FLAG_GL8 - DMA1 Channel8 global flag.
* DMA1_FLAG_TC8 - DMA1 Channel8 transfer complete flag.
* DMA1_FLAG_HT8 - DMA1 Channel8 half transfer flag.
* DMA1_FLAG_TE8 - DMA1 Channel8 transfer error flag.
*
* @return none
*/
void DMA_ClearFlag(uint32_t DMAy_FLAG)
{
DMA1->INTFCR = DMAy_FLAG;
}
/*********************************************************************
* @fn DMA_GetITStatus
*
* @brief Checks whether the specified DMAy Channelx interrupt has
* occurred or not.
*
* @param DMAy_IT - specifies the DMAy interrupt source to check.
* DMA1_IT_GL1 - DMA1 Channel1 global flag.
* DMA1_IT_TC1 - DMA1 Channel1 transfer complete flag.
* DMA1_IT_HT1 - DMA1 Channel1 half transfer flag.
* DMA1_IT_TE1 - DMA1 Channel1 transfer error flag.
* DMA1_IT_GL2 - DMA1 Channel2 global flag.
* DMA1_IT_TC2 - DMA1 Channel2 transfer complete flag.
* DMA1_IT_HT2 - DMA1 Channel2 half transfer flag.
* DMA1_IT_TE2 - DMA1 Channel2 transfer error flag.
* DMA1_IT_GL3 - DMA1 Channel3 global flag.
* DMA1_IT_TC3 - DMA1 Channel3 transfer complete flag.
* DMA1_IT_HT3 - DMA1 Channel3 half transfer flag.
* DMA1_IT_TE3 - DMA1 Channel3 transfer error flag.
* DMA1_IT_GL4 - DMA1 Channel4 global flag.
* DMA1_IT_TC4 - DMA1 Channel4 transfer complete flag.
* DMA1_IT_HT4 - DMA1 Channel4 half transfer flag.
* DMA1_IT_TE4 - DMA1 Channel4 transfer error flag.
* DMA1_IT_GL5 - DMA1 Channel5 global flag.
* DMA1_IT_TC5 - DMA1 Channel5 transfer complete flag.
* DMA1_IT_HT5 - DMA1 Channel5 half transfer flag.
* DMA1_IT_TE5 - DMA1 Channel5 transfer error flag.
* DMA1_IT_GL6 - DMA1 Channel6 global flag.
* DMA1_IT_TC6 - DMA1 Channel6 transfer complete flag.
* DMA1_IT_HT6 - DMA1 Channel6 half transfer flag.
* DMA1_IT_TE6 - DMA1 Channel6 transfer error flag.
* DMA1_IT_GL7 - DMA1 Channel7 global flag.
* DMA1_IT_TC7 - DMA1 Channel7 transfer complete flag.
* DMA1_IT_HT7 - DMA1 Channel7 half transfer flag.
* DMA1_IT_TE7 - DMA1 Channel7 transfer error flag.
* DMA1_IT_GL8 - DMA1 Channel8 global flag.
* DMA1_IT_TC8 - DMA1 Channel8 transfer complete flag.
* DMA1_IT_HT8 - DMA1 Channel8 half transfer flag.
* DMA1_IT_TE8 - DMA1 Channel8 transfer error flag.
*
* @return The new state of DMAy_IT (SET or RESET).
*/
ITStatus DMA_GetITStatus(uint32_t DMAy_IT)
{
ITStatus bitstatus = RESET;
uint32_t tmpreg = 0;
tmpreg = DMA1->INTFR;
if((tmpreg & DMAy_IT) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn DMA_ClearITPendingBit
*
* @brief Clears the DMAy Channelx's interrupt pending bits.
*
* @param DMAy_IT - specifies the DMAy interrupt source to check.
* DMA1_IT_GL1 - DMA1 Channel1 global flag.
* DMA1_IT_TC1 - DMA1 Channel1 transfer complete flag.
* DMA1_IT_HT1 - DMA1 Channel1 half transfer flag.
* DMA1_IT_TE1 - DMA1 Channel1 transfer error flag.
* DMA1_IT_GL2 - DMA1 Channel2 global flag.
* DMA1_IT_TC2 - DMA1 Channel2 transfer complete flag.
* DMA1_IT_HT2 - DMA1 Channel2 half transfer flag.
* DMA1_IT_TE2 - DMA1 Channel2 transfer error flag.
* DMA1_IT_GL3 - DMA1 Channel3 global flag.
* DMA1_IT_TC3 - DMA1 Channel3 transfer complete flag.
* DMA1_IT_HT3 - DMA1 Channel3 half transfer flag.
* DMA1_IT_TE3 - DMA1 Channel3 transfer error flag.
* DMA1_IT_GL4 - DMA1 Channel4 global flag.
* DMA1_IT_TC4 - DMA1 Channel4 transfer complete flag.
* DMA1_IT_HT4 - DMA1 Channel4 half transfer flag.
* DMA1_IT_TE4 - DMA1 Channel4 transfer error flag.
* DMA1_IT_GL5 - DMA1 Channel5 global flag.
* DMA1_IT_TC5 - DMA1 Channel5 transfer complete flag.
* DMA1_IT_HT5 - DMA1 Channel5 half transfer flag.
* DMA1_IT_TE5 - DMA1 Channel5 transfer error flag.
* DMA1_IT_GL6 - DMA1 Channel6 global flag.
* DMA1_IT_TC6 - DMA1 Channel6 transfer complete flag.
* DMA1_IT_HT6 - DMA1 Channel6 half transfer flag.
* DMA1_IT_TE6 - DMA1 Channel6 transfer error flag.
* DMA1_IT_GL7 - DMA1 Channel7 global flag.
* DMA1_IT_TC7 - DMA1 Channel7 transfer complete flag.
* DMA1_IT_HT7 - DMA1 Channel7 half transfer flag.
* DMA1_IT_TE7 - DMA1 Channel7 transfer error flag.
* DMA1_IT_GL8 - DMA1 Channel8 global flag.
* DMA1_IT_TC8 - DMA1 Channel8 transfer complete flag.
* DMA1_IT_HT8 - DMA1 Channel8 half transfer flag.
* DMA1_IT_TE8 - DMA1 Channel8 transfer error flag.
*
* @return none
*/
void DMA_ClearITPendingBit(uint32_t DMAy_IT)
{
DMA1->INTFCR = DMAy_IT;
}

View File

@ -0,0 +1,182 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_exti.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the EXTI firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_exti.h"
/* No interrupt selected */
#define EXTI_LINENONE ((uint32_t)0x000000)
/*********************************************************************
* @fn EXTI_DeInit
*
* @brief Deinitializes the EXTI peripheral registers to their default
* reset values.
*
* @return none.
*/
void EXTI_DeInit(void)
{
EXTI->INTENR = 0x00000000;
EXTI->EVENR = 0x00000000;
EXTI->RTENR = 0x00000000;
EXTI->FTENR = 0x00000000;
EXTI->INTFR = 0x007FFFFF;
}
/*********************************************************************
* @fn EXTI_Init
*
* @brief Initializes the EXTI peripheral according to the specified
* parameters in the EXTI_InitStruct.
*
* @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure
*
* @return none.
*/
void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct)
{
uint32_t tmp = 0;
tmp = (uint32_t)EXTI_BASE;
if(EXTI_InitStruct->EXTI_LineCmd != DISABLE)
{
EXTI->INTENR &= ~EXTI_InitStruct->EXTI_Line;
EXTI->EVENR &= ~EXTI_InitStruct->EXTI_Line;
tmp += EXTI_InitStruct->EXTI_Mode;
*(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line;
EXTI->RTENR &= ~EXTI_InitStruct->EXTI_Line;
EXTI->FTENR &= ~EXTI_InitStruct->EXTI_Line;
if(EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)
{
EXTI->RTENR |= EXTI_InitStruct->EXTI_Line;
EXTI->FTENR |= EXTI_InitStruct->EXTI_Line;
}
else
{
tmp = (uint32_t)EXTI_BASE;
tmp += EXTI_InitStruct->EXTI_Trigger;
*(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line;
}
}
else
{
tmp += EXTI_InitStruct->EXTI_Mode;
*(__IO uint32_t *)tmp &= ~EXTI_InitStruct->EXTI_Line;
}
}
/*********************************************************************
* @fn EXTI_StructInit
*
* @brief Fills each EXTI_InitStruct member with its reset value.
*
* @param EXTI_InitStruct - pointer to a EXTI_InitTypeDef structure
*
* @return none.
*/
void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct)
{
EXTI_InitStruct->EXTI_Line = EXTI_LINENONE;
EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStruct->EXTI_LineCmd = DISABLE;
}
/*********************************************************************
* @fn EXTI_GenerateSWInterrupt
*
* @brief Generates a Software interrupt.
*
* @param EXTI_Line - specifies the EXTI lines to be enabled or disabled.
*
* @return none.
*/
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)
{
EXTI->SWIEVR |= EXTI_Line;
}
/*********************************************************************
* @fn EXTI_GetFlagStatus
*
* @brief Checks whether the specified EXTI line flag is set or not.
*
* @param EXTI_Line - specifies the EXTI lines to be enabled or disabled.
*
* @return The new state of EXTI_Line (SET or RESET).
*/
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)
{
FlagStatus bitstatus = RESET;
if((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn EXTI_ClearFlag
*
* @brief Clears the EXTI's line pending flags.
*
* @param EXTI_Line - specifies the EXTI lines to be enabled or disabled.
*
* @return None
*/
void EXTI_ClearFlag(uint32_t EXTI_Line)
{
EXTI->INTFR = EXTI_Line;
}
/*********************************************************************
* @fn EXTI_GetITStatus
*
* @brief Checks whether the specified EXTI line is asserted or not.
*
* @param EXTI_Line - specifies the EXTI lines to be enabled or disabled.
*
* @return The new state of EXTI_Line (SET or RESET).
*/
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
{
ITStatus bitstatus = RESET;
uint32_t enablestatus = 0;
enablestatus = EXTI->INTENR & EXTI_Line;
if(((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn EXTI_ClearITPendingBit
*
* @brief Clears the EXTI's line pending bits.
*
* @param EXTI_Line - specifies the EXTI lines to be enabled or disabled.
*
* @return none
*/
void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
{
EXTI->INTFR = EXTI_Line;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,696 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_gpio.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/11/06
* Description : This file provides all the GPIO firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_gpio.h"
#include "ch32l103_rcc.h"
/* MASK */
#define ECR_PORTPINCONFIG_MASK ((uint16_t)0xFF80)
#define LSB_MASK ((uint16_t)0xFFFF)
#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000)
#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF8FFFFFF)
#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000)
#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000)
#define REMAP_MASK ((uint32_t)0xC0000000)
#define REMAP_NUM_MASK ((uint32_t)0x38000000)
uint32_t OPA_Trim = 0;
uint16_t ADC_Trim = 0;
uint32_t TS_Val = 0;
uint32_t CHIPID = 0;
uint16_t USBPD_CFG = 0;
/*********************************************************************
* @fn GPIO_DeInit
*
* @brief Deinitializes the GPIOx peripheral registers to their default
* reset values.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
*
* @return none
*/
void GPIO_DeInit(GPIO_TypeDef *GPIOx)
{
if(GPIOx == GPIOA)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOA, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOA, DISABLE);
}
else if(GPIOx == GPIOB)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOB, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOB, DISABLE);
}
else if(GPIOx == GPIOC)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOC, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOC, DISABLE);
}
else if(GPIOx == GPIOD)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOD, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_GPIOD, DISABLE);
}
}
/*********************************************************************
* @fn GPIO_AFIODeInit
*
* @brief Deinitializes the Alternate Functions (remap, event control
* and EXTI configuration) registers to their default reset values.
*
* @return none
*/
void GPIO_AFIODeInit(void)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_AFIO, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_AFIO, DISABLE);
}
/*********************************************************************
* @fn GPIO_Init
*
* @brief GPIOx - where x can be (A..D) to select the GPIO peripheral.
*
* @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO peripheral.
*
* @return none
*/
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}
if(((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
{
tmpreg = GPIOx->CFGLR;
for(pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
if(currentpin == pos)
{
pos = pinpos << 2;
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
tmpreg |= (currentmode << pos);
if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BCR = (((uint32_t)0x01) << pinpos);
}
else
{
if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSHR = (((uint32_t)0x01) << pinpos);
}
}
}
}
GPIOx->CFGLR = tmpreg;
}
if(GPIO_InitStruct->GPIO_Pin > 0x00FF)
{
tmpreg = GPIOx->CFGHR;
for(pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = (((uint32_t)0x01) << (pinpos + 0x08));
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
if(currentpin == pos)
{
pos = pinpos << 2;
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
tmpreg |= (currentmode << pos);
if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BCR = (((uint32_t)0x01) << (pinpos + 0x08));
}
if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSHR = (((uint32_t)0x01) << (pinpos + 0x08));
}
}
}
GPIOx->CFGHR = tmpreg;
}
}
/*********************************************************************
* @fn GPIO_StructInit
*
* @brief Fills each GPIO_InitStruct member with its default
*
* @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure
* which will be initialized.
*
* @return none
*/
void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct)
{
GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING;
}
/*********************************************************************
* @fn GPIO_ReadInputDataBit
*
* @brief GPIOx - where x can be (A..D) to select the GPIO peripheral.
*
* @param GPIO_Pin - specifies the port bit to read.
* This parameter can be GPIO_Pin_x where x can be (0..15).
*
* @return The input port pin value.
*/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
uint8_t bitstatus = 0x00;
if((GPIOx->INDR & GPIO_Pin) != (uint32_t)Bit_RESET)
{
bitstatus = (uint8_t)Bit_SET;
}
else
{
bitstatus = (uint8_t)Bit_RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn GPIO_ReadInputData
*
* @brief Reads the specified GPIO input data port.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
*
* @return The output port pin value.
*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx)
{
uint16_t val;
val = ( uint16_t )GPIOx->INDR;
return ( val );
}
/*********************************************************************
* @fn GPIO_ReadOutputDataBit
*
* @brief Reads the specified output data port bit.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
* GPIO_Pin - specifies the port bit to read.
* This parameter can be GPIO_Pin_x where x can be (0..15).
*
* @return none
*/
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
uint8_t bitstatus = 0x00;
if((GPIOx->OUTDR & GPIO_Pin) != (uint32_t)Bit_RESET)
{
bitstatus = (uint8_t)Bit_SET;
}
else
{
bitstatus = (uint8_t)Bit_RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn GPIO_ReadOutputData
*
* @brief Reads the specified GPIO output data port.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
*
* @return GPIO output port pin value.
*/
uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx)
{
uint16_t val;
val = ( uint16_t )GPIOx->OUTDR;
return ( val );
}
/*********************************************************************
* @fn GPIO_SetBits
*
* @brief Sets the selected data port bits.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
* GPIO_Pin - specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
*
* @return none
*/
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIOx->BSHR = GPIO_Pin;
}
/*********************************************************************
* @fn GPIO_ResetBits
*
* @brief Clears the selected data port bits.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
* GPIO_Pin - specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
*
* @return none
*/
void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIOx->BCR = GPIO_Pin;
}
/*********************************************************************
* @fn GPIO_WriteBit
*
* @brief Sets or clears the selected data port bit.
*
* @param GPIO_Pin - specifies the port bit to be written.
* This parameter can be one of GPIO_Pin_x where x can be (0..15).
* BitVal - specifies the value to be written to the selected bit.
* Bit_RESET - to clear the port pin.
* Bit_SET - to set the port pin.
*
* @return none
*/
void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
{
if(BitVal != Bit_RESET)
{
GPIOx->BSHR = GPIO_Pin;
}
else
{
GPIOx->BCR = GPIO_Pin;
}
}
/*********************************************************************
* @fn GPIO_Write
*
* @brief Writes data to the specified GPIO data port.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
* PortVal - specifies the value to be written to the port output data register.
*
* @return none
*/
void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal)
{
GPIOx->OUTDR = PortVal;
}
/*********************************************************************
* @fn GPIO_PinLockConfig
*
* @brief Locks GPIO Pins configuration registers.
*
* @param GPIOx - where x can be (A..D) to select the GPIO peripheral.
* GPIO_Pin - specifies the port bit to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
*
* @return none
*/
void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
uint32_t tmp = 0x00010000;
tmp |= GPIO_Pin;
GPIOx->LCKR = tmp;
GPIOx->LCKR = GPIO_Pin;
GPIOx->LCKR = tmp;
tmp = GPIOx->LCKR;
tmp = GPIOx->LCKR;
}
/*********************************************************************
* @fn GPIO_EventOutputConfig
*
* @brief Selects the GPIO pin used as Event output.
*
* @param GPIO_PortSource - selects the GPIO port to be used as source
* for Event output.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..D).
* GPIO_PinSource - specifies the pin for the Event output.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
*
* @return none
*/
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
uint32_t tmpreg = 0x00;
tmpreg = AFIO->ECR;
tmpreg &= ECR_PORTPINCONFIG_MASK;
tmpreg |= (uint32_t)GPIO_PortSource << 0x04;
tmpreg |= GPIO_PinSource;
AFIO->ECR = tmpreg;
}
/*********************************************************************
* @fn GPIO_EventOutputCmd
*
* @brief Enables or disables the Event Output.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void GPIO_EventOutputCmd(FunctionalState NewState)
{
if(NewState)
{
AFIO->ECR |= (1 << 7);
}
else
{
AFIO->ECR &= ~(1 << 7);
}
}
/*********************************************************************
* @fn GPIO_PinRemapConfig
*
* @brief Changes the mapping of the specified pin.
*
* @param GPIO_Remap - selects the pin to remap.
* GPIO_PartialRemap1_SPI1 - SPI1 Partial1 Alternate Function mapping
* GPIO_PartialRemap2_SPI1 - SPI1 Partial2 Alternate Function mapping
* GPIO_FullRemap_SPI1 - SPI1 Full Alternate Function mapping
* GPIO_PartialRemap1_I2C1 - I2C1 Partial1 Alternate Function mapping
* GPIO_FullRemap_I2C1 - I2C1 Full Alternate Function mapping
* GPIO_PartialRemap1_USART1 - USART1 Partial1 Alternate Function mapping
* GPIO_PartialRemap2_USART1 - USART1 Partial2 Alternate Function mapping
* GPIO_PartialRemap3_USART1 - USART1 Partial3 Alternate Function mapping
* GPIO_PartialRemap4_USART1 - USART1 Partial4 Alternate Function mapping
* GPIO_FullRemap_USART1 - USART1 Full Alternate Function mapping
* GPIO_PartialRemap1_USART2 - USART2 Partial1 Alternate Function mapping
* GPIO_PartialRemap2_USART2 - USART2 Partial2 Alternate Function mapping
* GPIO_FullRemap_USART2 - USART2 Full Alternate Function mapping
* GPIO_PartialRemap1_TIM1 - TIM1 Partial1 Alternate Function mapping
* GPIO_PartialRemap2_TIM1 - TIM1 Partial2 Alternate Function mapping
* GPIO_PartialRemap3_TIM1 - TIM1 Partial3 Alternate Function mapping
* GPIO_PartialRemap4_TIM1 - TIM1 Partial4 Alternate Function mapping
* GPIO_PartialRemap5_TIM1 - TIM1 Partial5 Alternate Function mapping
* GPIO_FullRemap_TIM1 - TIM1 Full Alternate Function mapping
* GPIO_PartialRemap1_TIM2 - TIM2 Partial1 Alternate Function mapping
* GPIO_PartialRemap2_TIM2 - TIM2 Partial2 Alternate Function mapping
* GPIO_PartialRemap3_TIM2 - TIM2 Partial3 Alternate Function mapping
* GPIO_PartialRemap4_TIM2 - TIM2 Partial4 Alternate Function mapping
* GPIO_PartialRemap5_TIM2 - TIM2 Partial5 Alternate Function mapping
* GPIO_FullRemap_TIM2 - TIM2 Full Alternate Function mapping
* GPIO_PartialRemap_USART3 - USART3 Partial Alternate Function mapping
* GPIO_FullRemap_USART3 - USART3 Full Alternate Function mapping
* GPIO_Remap_TIM3 - TIM3 Alternate Function mapping
* GPIO_Remap_TIM4 - TIM4 Alternate Function mapping
* GPIO_Remap1_CAN1 - CAN1 Alternate Function mapping
* GPIO_Remap2_CAN1 - CAN1 Alternate Function mapping
* GPIO_Remap_PD01 - PD01 Alternate Function mapping
* GPIO_Remap_SWJ_Disable - Full SDI Disabled (SDI)
* GPIO_Remap_USART4 - USART4 Alternate Function mapping
* GPIO_Remap_LPTIM - LPTIM Alternate Function mapping
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
{
uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg1 = 0x00, tmpreg2 = 0x00, tmpmask = 0x00;
if((GPIO_Remap & 0xC0000000) == 0xC0000000) /* PCFR1 + PCFR2 */
{
tmpreg1 = AFIO->PCFR1;
tmpreg2 = AFIO->PCFR2;
/* Clear bit */
tmp1 = ((GPIO_Remap & REMAP_NUM_MASK) >> 27);
if(tmp1 == 0)
{
tmpreg1 &= ~(1<<0);
tmpreg2 &= ~(1<<24);
}
else if(tmp1 == 1)
{
tmpreg1 &= ~(1<<1);
tmpreg2 &= ~(1<<23);
}
else if(tmp1 == 2)
{
tmpreg1 &= ~(1<<2);
tmpreg2 &= ~(3<<19);
}
else if(tmp1 == 3)
{
tmpreg1 &= ~(1<<3);
tmpreg2 &= ~(1<<18);
}
else if(tmp1 == 4)
{
tmpreg1 &= ~(3<<6);
tmpreg2 &= ~(1<<22);
}
else if(tmp1 == 5)
{
tmpreg1 &= ~(3<<8);
tmpreg2 &= ~(1<<21);
}
/* Set bit */
if(NewState != DISABLE)
{
tmpreg1 |= (GPIO_Remap & 0x0000FFFF);
tmpreg2 |= (GPIO_Remap & 0x01FF0000);
}
tmpreg1 |= ~DBGAFR_SWJCFG_MASK;
AFIO->PCFR1 = tmpreg1;
AFIO->PCFR2 = tmpreg2;
}
else if((GPIO_Remap & 0xC0000000) == 0x40000000) /* PCFR2 */
{
tmpreg2 = AFIO->PCFR2;
/* Clear bit */
tmp1 = ((GPIO_Remap & (~REMAP_MASK)) << 0x10);
tmpreg2 &= ~tmp1;
/* Set bit */
if(NewState != DISABLE)
{
tmpreg2 |= tmp1;
}
AFIO->PCFR2 = tmpreg2;
}
else if((GPIO_Remap & 0xC0000000) == 0x00000000) /* PCFR1 */
{
tmpreg1 = AFIO->PCFR1;
/* Clear bit */
tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10;
tmp = GPIO_Remap & LSB_MASK;
if((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) /* [26:24] 3bit SW_CFG */
{
tmpreg1 &= DBGAFR_SWJCFG_MASK;
AFIO->PCFR1 &= DBGAFR_SWJCFG_MASK;
}
else if((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) /* [15:0] 2bit */
{
tmp1 = ((uint32_t)0x03) << tmpmask;
tmpreg1 &= ~tmp1;
tmpreg1 |= ~DBGAFR_SWJCFG_MASK;
}
else /* [31:0] 1bit */
{
tmpreg1 &= ~(tmp << ((GPIO_Remap >> 0x15) * 0x10));
tmpreg1 |= ~DBGAFR_SWJCFG_MASK;
}
/* Set bit */
if(NewState != DISABLE)
{
tmpreg1 |= (tmp << (((GPIO_Remap & 0x7FFFFFFF )>> 0x15) * 0x10));
}
AFIO->PCFR1 = tmpreg1;
}
}
/*********************************************************************
* @fn GPIO_EXTILineConfig
*
* @brief Selects the GPIO pin used as EXTI Line.
*
* @param GPIO_PortSource - selects the GPIO port to be used as source for EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..D).
* GPIO_PinSource - specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
*
* @return none
*/
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
uint32_t tmp = 0x00;
tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
/*********************************************************************
* @fn GPIO_IPD_Unused
*
* @brief Configure unused GPIO as input pull-down.
*
* @param none
*
* @return none
*/
void GPIO_IPD_Unused(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
uint32_t chip = 0;
OPA_Trim = (((*(uint32_t *)OPA_TRIM_BASE & 0x0000001F) << 25) | (((*(uint32_t *)OPA_TRIM_BASE & 0x00008000)^0x00008000) << 9)) \
| (((*(uint32_t *)OPA_TRIM_BASE & 0x001F0000) << 1) | (((*(uint32_t *)OPA_TRIM_BASE & 0x80000000)^0x80000000) >> 15));
ADC_Trim = (*(uint16_t *)ADC_TRIM_BASE);
TS_Val = (*(uint32_t *)TS_BASE);
CHIPID = (*(uint32_t *)CHIPID_BASE);
USBPD_CFG = (*(uint16_t *)USBPD_CFG_BASE);
RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA | RCC_PB2Periph_GPIOB | RCC_PB2Periph_GPIOC |RCC_PB2Periph_GPIOD |RCC_PB2Periph_AFIO,ENABLE);
chip = *( uint32_t * )CHIPID_BASE & (~0x000000F0);
switch(chip)
{
case 0x10320700: //CH32L103K8U6
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10\
|GPIO_Pin_11|GPIO_Pin_12\
|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
break;
}
case 0x103D0700: //CH32L103F8U6
{
GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3\
|GPIO_Pin_4|GPIO_Pin_5\
|GPIO_Pin_8|GPIO_Pin_9\
|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14\
|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
break;
}
case 0x103B0700: //CH32L103G8R6
{
GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14\
|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
break;
}
case 0x103A0700: //CH32L103F8P6
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9\
|GPIO_Pin_10|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3\
|GPIO_Pin_4|GPIO_Pin_5\
|GPIO_Pin_9|GPIO_Pin_10\
|GPIO_Pin_11|GPIO_Pin_12\
|GPIO_Pin_13|GPIO_Pin_14\
|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14\
|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
break;
}
case 0x10310700: //CH32L103C8T6
{
break;
}
default:
{
break;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,123 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_iwdg.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/03/26
* Description : This file provides all the IWDG firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_iwdg.h"
/* CTLR register bit mask */
#define CTLR_KEY_Reload ((uint16_t)0xAAAA)
#define CTLR_KEY_Enable ((uint16_t)0xCCCC)
/*********************************************************************
* @fn IWDG_WriteAccessCmd
*
* @brief Enables or disables write access to IWDG_PSCR and IWDG_RLDR registers.
*
* @param WDG_WriteAccess - new state of write access to IWDG_PSCR and
* IWDG_RLDR registers.
* IWDG_WriteAccess_Enable - Enable write access to IWDG_PSCR and
* IWDG_RLDR registers.
* IWDG_WriteAccess_Disable - Disable write access to IWDG_PSCR
* and IWDG_RLDR registers.
*
* @return none
*/
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)
{
IWDG->CTLR = IWDG_WriteAccess;
}
/*********************************************************************
* @fn IWDG_SetPrescaler
*
* @brief Sets IWDG Prescaler value.
*
* @param IWDG_Prescaler - specifies the IWDG Prescaler value.
* IWDG_Prescaler_4 - IWDG prescaler set to 4.
* IWDG_Prescaler_8 - IWDG prescaler set to 8.
* IWDG_Prescaler_16 - IWDG prescaler set to 16.
* IWDG_Prescaler_32 - IWDG prescaler set to 32.
* IWDG_Prescaler_64 - IWDG prescaler set to 64.
* IWDG_Prescaler_128 - IWDG prescaler set to 128.
* IWDG_Prescaler_256 - IWDG prescaler set to 256.
*
* @return none
*/
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)
{
IWDG->PSCR = IWDG_Prescaler;
}
/*********************************************************************
* @fn IWDG_SetReload
*
* @brief Sets IWDG Reload value.
*
* @param Reload - specifies the IWDG Reload value.
* This parameter must be a number between 0 and 0x0FFF.
*
* @return none
*/
void IWDG_SetReload(uint16_t Reload)
{
IWDG->RLDR = Reload;
}
/*********************************************************************
* @fn IWDG_ReloadCounter
*
* @brief Reloads IWDG counter with value defined in the reload register.
*
* @return none
*/
void IWDG_ReloadCounter(void)
{
IWDG->CTLR = CTLR_KEY_Reload;
}
/*********************************************************************
* @fn IWDG_Enable
*
* @brief Enables IWDG (write access to IWDG_PSCR and IWDG_RLDR registers disabled).
*
* @return none
*/
void IWDG_Enable(void)
{
IWDG->CTLR = CTLR_KEY_Enable;
while((RCC->RSTSCKR & 0x2) == RESET);
}
/*********************************************************************
* @fn IWDG_GetFlagStatus
*
* @brief Checks whether the specified IWDG flag is set or not.
*
* @param IWDG_FLAG - specifies the flag to check.
* IWDG_FLAG_PVU - Prescaler Value Update on going.
* IWDG_FLAG_RVU - Reload Value Update on going.
*
* @return none
*/
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)
{
FlagStatus bitstatus = RESET;
if((IWDG->STATR & IWDG_FLAG) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}

View File

@ -0,0 +1,363 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_lptim.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/08/29
* Description : This file provides all the TIM firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_lptim.h"
#include "ch32l103_rcc.h"
/*********************************************************************
* @fn LPTIM_DeInit
*
* @brief Deinitializes the LPTIM peripheral registers to their default
* reset values.
*
* @param none
*
* @return none
*/
void LPTIM_DeInit(void)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_LPTIM, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_LPTIM, DISABLE);
}
/*********************************************************************
* @fn LPTIM_TimeBaseInit
*
* @brief Initializes the LPTIM Time Base Unit peripheral according to
* the specified parameters in the LPTIM_TimeBaseInitStruct.
*
* @param LPTIM_TimeBaseInitStruct - pointer to a LPTIM_TimeBaseInitTypeDef
* structure.
*
* @return none
*/
void LPTIM_TimeBaseInit(LPTIM_TimeBaseInitTypeDef *LPTIM_TimeBaseInitStruct)
{
uint32_t temp1 = 0, temp2 = 0;
temp2 = (LPTIM->CR & 0x00000001);
if(LPTIM_TimeBaseInitStruct->LPTIM_Encoder == ENABLE)
{
temp1 |= LPTIM_TimeBaseInitStruct->LPTIM_EncoderMode;
}
else
{
temp1 |= LPTIM_TimeBaseInitStruct->LPTIM_ClockPolarity;
}
temp1 |= LPTIM_TimeBaseInitStruct->LPTIM_ClockSource | LPTIM_TimeBaseInitStruct->LPTIM_ClockSampleTime \
| LPTIM_TimeBaseInitStruct->LPTIM_TriggerSampleTime | LPTIM_TimeBaseInitStruct->LPTIM_ClockPrescaler \
| LPTIM_TimeBaseInitStruct->LPTIM_TriggerSource | LPTIM_TimeBaseInitStruct->LPTIM_ExTriggerPolarity \
| LPTIM_TimeBaseInitStruct->LPTIM_OutputPolarity | LPTIM_TimeBaseInitStruct->LPTIM_UpdateMode \
| LPTIM_TimeBaseInitStruct->LPTIM_CountSource | LPTIM_TimeBaseInitStruct->LPTIM_InClockSource \
| (LPTIM_TimeBaseInitStruct->LPTIM_TimeOut << 19) | (LPTIM_TimeBaseInitStruct->LPTIM_OnePulseMode << 20) \
| (LPTIM_TimeBaseInitStruct->LPTIM_Encoder << 24) | (LPTIM_TimeBaseInitStruct->LPTIM_ForceOutHigh << 27);
temp2 |= (LPTIM_TimeBaseInitStruct->LPTIM_SingleMode << 1) | (LPTIM_TimeBaseInitStruct->LPTIM_ContinuousMode << 2) \
| (LPTIM_TimeBaseInitStruct->LPTIM_PWMOut << 3) | (LPTIM_TimeBaseInitStruct->LPTIM_CounterDirIndicat << 4);
LPTIM->CFGR = temp1;
LPTIM->CR = temp2;
LPTIM->CMP = LPTIM_TimeBaseInitStruct->LPTIM_Pulse;
LPTIM->ARR = LPTIM_TimeBaseInitStruct->LPTIM_Period;
}
/*********************************************************************
* @fn LPTIM_TimeBaseStructInit
*
* @brief Fills each LPTIM_TimeBaseInitStruct member with its default value.
*
* @param TIM_TimeBaseInitStruct - pointer to a LPTIM_TimeBaseInitTypeDef structure.
*
* @return none
*/
void LPTIM_TimeBaseStructInit(LPTIM_TimeBaseInitTypeDef *LPTIM_TimeBaseInitStruct)
{
LPTIM_TimeBaseInitStruct->LPTIM_ClockSource = LPTIM_ClockSource_In;
LPTIM_TimeBaseInitStruct->LPTIM_ClockPolarity = LPTIM_ClockPolarity_Rising;
LPTIM_TimeBaseInitStruct->LPTIM_ClockSampleTime = LPTIM_ClockSampleTime_0T;
LPTIM_TimeBaseInitStruct->LPTIM_TriggerSampleTime = LPTIM_TriggerSampleTime_0T;
LPTIM_TimeBaseInitStruct->LPTIM_ClockPrescaler = LPTIM_TClockPrescaler_DIV1;
LPTIM_TimeBaseInitStruct->LPTIM_TriggerSource = LPTIM_TriggerSource_ETR;
LPTIM_TimeBaseInitStruct->LPTIM_ExTriggerPolarity = LPTIM_ExTriggerPolarity_Disable;
LPTIM_TimeBaseInitStruct->LPTIM_TimeOut = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_OnePulseMode = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_OutputPolarity = LPTIM_OutputPolarity_High;
LPTIM_TimeBaseInitStruct->LPTIM_UpdateMode = LPTIM_UpdateMode0;
LPTIM_TimeBaseInitStruct->LPTIM_CountSource = LPTIM_CountSource_Internal;
LPTIM_TimeBaseInitStruct->LPTIM_Encoder = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_InClockSource = LPTIM_InClockSource_PCLK1;
LPTIM_TimeBaseInitStruct->LPTIM_ForceOutHigh = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_SingleMode = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_ContinuousMode = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_PWMOut = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_CounterDirIndicat = DISABLE;
LPTIM_TimeBaseInitStruct->LPTIM_Pulse = 0;
LPTIM_TimeBaseInitStruct->LPTIM_Period = 0x0001;
}
/*********************************************************************
* @fn LPTIM_CounterDirIndicat_Cmd
*
* @brief Enable or Disable counter direction indicate function.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void LPTIM_CounterDirIndicat_Cmd(FunctionalState NewState)
{
if(NewState)
{
LPTIM->CR |= (1<<3);
}
else{
LPTIM->CR &= ~(1<<3);
}
}
/*********************************************************************
* @fn LPTIM_OutCmd
*
* @brief Enable or Disable PWM out function.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void LPTIM_OutCmd(FunctionalState NewState)
{
if(NewState)
{
LPTIM->CR |= (1<<3);
}
else{
LPTIM->CR &= ~(1<<3);
}
}
/*********************************************************************
* @fn LPTIM_Cmd
*
* @brief Enable or Disable LPTIM.
*
* @param NewState - ENABLE or DISABLE.
*
* @return none
*/
void LPTIM_Cmd(FunctionalState NewState)
{
if(NewState)
{
LPTIM->CR |= (1<<0);
}
else{
LPTIM->CR &= ~(1<<0);
}
}
/*********************************************************************
* @fn LPTIM_GetCounter
*
* @brief Gets the LPTIM Counter value.
*
* @param none
*
* @return LPTIM->CNT - Counter Register value.
*/
uint16_t LPTIM_GetCounter(void)
{
return LPTIM->CNT;
}
/*********************************************************************
* @fn LPTIM_SetAutoreload
*
* @brief Sets the LPTIM Autoreload Register value.
*
* @param Autoreload - specifies the Autoreload register new value.
*
* @return none
*/
void LPTIM_SetAutoreload(uint16_t Autoreload)
{
LPTIM->ARR = Autoreload;
}
/*********************************************************************
* @fn LPTIM_SetCompare
*
* @brief Sets the LPTIM Capture Compare Register value.
*
* @param Compare - specifies the Capture Compare1 register new value.
*
* @return none
*/
void LPTIM_SetCompare(uint16_t Compare)
{
LPTIM->CMP = Compare;
}
/*********************************************************************
* @fn LPTIM_GetCapture
*
* @brief Gets the LPTIM Input Capture value.
*
* @param none
*
* @return LPTIM->CMP - Capture Compare Register value.
*/
uint16_t LPTIM_GetCapture(void)
{
return LPTIM->CMP;
}
/*********************************************************************
* @fn LPTIM_ITConfig
*
* @brief Enables or disables the specified LPTIM interrupts.
*
* @param LPTIM_IT - specifies the LPTIM interrupts sources to be enabled or disabled.
* LPTIM_IT_DOWN - LPTIM counter down Interrupt source.
* LPTIM_IT_UP - LPTIM counter up Interrupt source.
* LPTIM_IT_ARROK - LPTIM be loaded success Interrupt source.
* LPTIM_IT_CMPOK - LPTIM Capture Compare success Interrupt source.
* LPTIM_IT_EXTTRIG - TIM Trigger Interrupt source.
* LPTIM_IT_ARRM - TIM counter Count to ARR register Interrupt source.
* LPTIM_IT_CMPM - TIM counter Count to CMP register Interrupt source.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void LPTIM_ITConfig(uint32_t LPTIM_IT, FunctionalState NewState)
{
if(NewState != DISABLE)
{
LPTIM->IER |= LPTIM_IT;
}
else
{
LPTIM->IER &= (uint32_t)~LPTIM_IT;
}
}
/*********************************************************************
* @fn LPTIM_GetFlagStatus
*
* @brief Checks whether the specified LPTIM flag is set or not.
*
* @param LPTIM_FLAG - specifies the flag to check.
* LPTIM_FLAG_DIR_SYNC - LPTIM counter direction indicate Flag.
* LPTIM_FLAG_DOWN - LPTIM counter down Flag.
* LPTIM_FLAG_UP - LPTIM counter up Flag.
* LPTIM_FLAG_ARROK - LPTIM be loaded success Flag.
* LPTIM_FLAG_CMPOK - LPTIM Capture Compare success Flag.
* LPTIM_FLAG_EXTTRIG - TIM Trigger Flag.
* LPTIM_FLAG_ARRM - TIM counter Count to ARR register Flag.
* LPTIM_FLAG_CMPM - TIM counter Count to CMP register Flag.
*
* @return none
*/
FlagStatus LPTIM_GetFlagStatus(uint32_t LPTIM_FLAG)
{
FlagStatus bitstatus = RESET;
if((LPTIM->ISR & LPTIM_FLAG) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn LPTIM_ClearFlag
*
* @brief Clears the LPTIM's pending flags.
*
* @param LPTIM_FLAG - specifies the flag to check.
* LPTIM_FLAG_DOWN - LPTIM counter down Flag.
* LPTIM_FLAG_UP - LPTIM counter up Flag.
* LPTIM_FLAG_ARROK - LPTIM be loaded success Flag.
* LPTIM_FLAG_CMPOK - LPTIM Capture Compare success Flag.
* LPTIM_FLAG_EXTTRIG - TIM Trigger Flag.
* LPTIM_FLAG_ARRM - TIM counter Count to ARR register Flag.
* LPTIM_FLAG_CMPM - TIM counter Count to CMP register Flag.
*
* @return none
*/
void LPTIM_ClearFlag(uint32_t LPTIM_FLAG)
{
LPTIM->ICR |= (uint32_t)LPTIM_FLAG;
}
/*********************************************************************
* @fn LPTIM_GetITStatus
*
* @brief Checks whether the LPTIM interrupt has occurred or not.
*
* @param LPTIM_IT - specifies the LPTIM interrupt source to check.
* LPTIM_FLAG_DIR_SYNC - LPTIM counter direction indicate Interrupt source.
* LPTIM_IT_DOWN - LPTIM counter down Interrupt source.
* LPTIM_IT_UP - LPTIM counter up Interrupt source.
* LPTIM_IT_ARROK - LPTIM be loaded success Interrupt source.
* LPTIM_IT_CMPOK - LPTIM Capture Compare success Interrupt source.
* LPTIM_IT_EXTTRIG - TIM Trigger Interrupt source.
* LPTIM_IT_ARRM - TIM counter Count to ARR register Interrupt source.
* LPTIM_IT_CMPM - TIM counter Count to CMP register Interrupt source.
*
* @return none
*/
ITStatus LPTIM_GetITStatus(uint32_t LPTIM_IT)
{
ITStatus bitstatus = RESET;
if((LPTIM->ISR & LPTIM_IT) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn LPTIM_ClearITPendingBit
*
* @brief Clears the LPTIM's interrupt pending bits.
*
* @param LPTIM_IT - specifies the LPTIM interrupt source to check.
* LPTIM_IT_DOWN - LPTIM counter down Interrupt source.
* LPTIM_IT_UP - LPTIM counter up Interrupt source.
* LPTIM_IT_ARROK - LPTIM be loaded success Interrupt source.
* LPTIM_IT_CMPOK - LPTIM Capture Compare success Interrupt source.
* LPTIM_IT_EXTTRIG - TIM Trigger Interrupt source.
* LPTIM_IT_ARRM - TIM counter Count to ARR register Interrupt source.
* LPTIM_IT_CMPM - TIM counter Count to CMP register Interrupt source.
*
* @return none
*/
void LPTIM_ClearITPendingBit(uint32_t LPTIM_IT)
{
LPTIM->ICR |= (uint32_t)LPTIM_IT;
}

View File

@ -0,0 +1,81 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_misc.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/12/26
* Description : This file provides all the miscellaneous firmware functions .
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_misc.h"
__IO uint32_t NVIC_Priority_Group = 0;
/*********************************************************************
* @fn NVIC_PriorityGroupConfig
*
* @brief Configures the priority grouping - pre-emption priority and subpriority.
*
* @param NVIC_PriorityGroup - specifies the priority grouping bits length.
* NVIC_PriorityGroup_0 - 0 bits for pre-emption priority
* 3 bits for subpriority
* NVIC_PriorityGroup_1 - 1 bits for pre-emption priority
* 2 bits for subpriority
*
* @return none
*/
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
NVIC_Priority_Group = NVIC_PriorityGroup;
}
/*********************************************************************
* @fn NVIC_Init
*
* @brief Initializes the NVIC peripheral according to the specified parameters in
* the NVIC_InitStruct.
*
* @param NVIC_InitStruct - pointer to a NVIC_InitTypeDef structure that contains the
* configuration information for the specified NVIC peripheral.
* interrupt nesting enable(CSR-0x804 bit1 = 1)
* NVIC_IRQChannelPreemptionPriority - range from 0 to 1.
* NVIC_IRQChannelSubPriority - range from 0 to 3.
*
* interrupt nesting disable(CSR-0x804 bit1 = 0)
* NVIC_IRQChannelPreemptionPriority - range is 0.
* NVIC_IRQChannelSubPriority - range from 0 to 7.
*
* @return none
*/
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
{
#if (INTSYSCR_INEST == INTSYSCR_INEST_NoEN)
if(NVIC_Priority_Group == NVIC_PriorityGroup_0)
{
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4);
}
#else
if(NVIC_Priority_Group == NVIC_PriorityGroup_1)
{
if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 1)
{
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 5));
}
else if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 0)
{
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 5));
}
}
#endif
if(NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
{
NVIC_EnableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
}
else
{
NVIC_DisableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
}
}

View File

@ -0,0 +1,343 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_opa.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/11/05
* Description : This file provides all the OPA firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_opa.h"
/* FLASH Keys */
#define OPCM_KEY1 ((uint32_t)0x45670123)
#define OPCM_KEY2 ((uint32_t)0xCDEF89AB)
/* mask definition*/
#define POLL_CNT_MASK ((uint16_t)0x7000)
volatile uint32_t CTLR2_tmp = 0;
/********************************************************************************
* @fn OPCM_Unlock
*
* @brief Unlocks the OPCM Controller.
*
* @return none
*/
void OPCM_Unlock(void)
{
OPA->OPCMKEY = OPCM_KEY1;
OPA->OPCMKEY = OPCM_KEY2;
}
/********************************************************************************
* @fn OPCM_Lock
*
* @brief Locks the OPCM Controller.
*
* @return none
*/
void OPCM_Lock(void)
{
OPA->CTLR1 |= (1<<7);
}
/*********************************************************************
* @fn OPA_Init
*
* @brief Initializes the OPA peripheral according to the specified
* parameters in the OPA_InitStruct.
*
* @param OPA_InitStruct - pointer to a OPA_InitTypeDef structure
*
* @return none
*/
void OPA_Init(OPA_InitTypeDef *OPA_InitStruct)
{
uint16_t tmp0 = 0, tmp1 = 0;
uint32_t tmp2 = 0;
tmp0 = OPA->CFGR1;
tmp1 = OPA->CFGR2;
tmp2 = OPA->CTLR1;
if(OPA_InitStruct->OPA_NUM == OPA1)
{
tmp1 &= 0xF800;
tmp2 &= 0x80000001;
tmp1 |= (OPA_InitStruct->POLL_NUM << 9);
tmp2 |= (OPA_InitStruct->Mode << 1) | (OPA_InitStruct->PSEL << 4) \
| (OPA_InitStruct->FB << 7) | (OPA_InitStruct->NSEL << 8) \
| OPA_Trim;
}
tmp0 |= (OPA_InitStruct->PSEL_POLL) | (OPA_InitStruct->BKIN_EN << 2)
| (OPA_InitStruct->RST_EN << 4) | (OPA_InitStruct->OUT_IE << 8)
| (OPA_InitStruct->CNT_IE << 10) | (OPA_InitStruct->NMI_IE << 11);
tmp1 |= OPA_InitStruct->OPA_POLL_Interval;
OPA->CFGR1 = tmp0;
OPA->CFGR2 = tmp1;
OPA->CTLR1 = tmp2;
}
/*********************************************************************
* @fn OPA_StructInit
*
* @brief Fills each OPA_StructInit member with its reset value.
*
* @param OPA_StructInit - pointer to a OPA_InitTypeDef structure
*
* @return none
*/
void OPA_StructInit(OPA_InitTypeDef *OPA_InitStruct)
{
OPA_InitStruct->OPA_POLL_Interval = 0;
OPA_InitStruct->OPA_NUM = OPA1;
OPA_InitStruct->Mode = OUT_IO_OFF;
OPA_InitStruct->PSEL = CHP_OFF;
OPA_InitStruct->FB = FB_OFF;
OPA_InitStruct->NSEL = CHN_OFF;
OPA_InitStruct->PSEL_POLL = CHP_OPA1_OFF;
OPA_InitStruct->BKIN_EN = BKIN_OPA1_OFF;
OPA_InitStruct->RST_EN = RST_OPA1_OFF;
OPA_InitStruct->OUT_IE = OUT_IE_OPA1_OFF;
OPA_InitStruct->CNT_IE = CNT_IE_OFF;
OPA_InitStruct->NMI_IE = NMI_IE_OFF;
OPA_InitStruct->POLL_NUM = CHP_POLL_NUM_1;
}
/*********************************************************************
* @fn OPA_Cmd
*
* @brief Enables or disables the specified OPA peripheral.
*
* @param OPA_NUM - Select OPA
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void OPA_Cmd(OPA_Num_TypeDef OPA_NUM, FunctionalState NewState)
{
if(NewState == ENABLE)
{
OPA->CTLR1 |= (uint32_t)(1 << (OPA_NUM*16));
}
else
{
OPA->CTLR1 &= ~(uint32_t)(1 << (OPA_NUM*16));
}
}
/*********************************************************************
* @fn OPA_LP_Cmd
*
* @brief Enables or disables the OPA enter low power mode.
*
* @param NewState - new state of the OPA enter low power mode
* (ENABLE or DISABLE).
*
* @return none
*/
void OPA_LP_Cmd(FunctionalState NewState)
{
if(NewState)
{
OPA->CTLR1 |= (1 << 12);
}
else
{
OPA->CTLR1 &= ~(1 << 12);
}
}
/*********************************************************************
* @fn OPA_CMP_Init
*
* @brief Initializes the CMP peripheral according to the specified
* parameters in the CMP_InitTypeDef.
*
* @param CMP_InitStruct - pointer to a CMP_InitTypeDef structure
*
* @return none
*/
void OPA_CMP_Init(CMP_InitTypeDef *CMP_InitStruct)
{
uint32_t tmp1 = 0;
tmp1 = CTLR2_tmp;
if(CMP_InitStruct->CMP_NUM == CMP1)
{
tmp1 &= 0xFFFFFFC1;
tmp1 |= (CMP_InitStruct->Mode << 1) | (CMP_InitStruct->NSEL << 3)
| (CMP_InitStruct->PSEL << 4) | (CMP_InitStruct->HYEN <<5);
}
else if(CMP_InitStruct->CMP_NUM == CMP2)
{
tmp1 &= 0xFFFFC1FF;
tmp1 |= (CMP_InitStruct->Mode << 9) | (CMP_InitStruct->NSEL << 11)
| (CMP_InitStruct->PSEL << 12) | (CMP_InitStruct->HYEN <<13);
}
else if(CMP_InitStruct->CMP_NUM == CMP3)
{
tmp1 &= 0xFFC1FFFF;
tmp1 |= (CMP_InitStruct->Mode << 17) | (CMP_InitStruct->NSEL << 19)
| (CMP_InitStruct->PSEL << 20) | (CMP_InitStruct->HYEN <<21);
}
CTLR2_tmp = tmp1;
OPA->CTLR2 = tmp1;
}
/*********************************************************************
* @fn OPA_CMP_StructInit
*
* @brief Fills each OPA_CMP_StructInit member with its reset value.
*
* @param CMP_StructInit - pointer to a OPA_CMP_StructInit structure
*
* @return none
*/
void OPA_CMP_StructInit(CMP_InitTypeDef *CMP_InitStruct)
{
CMP_InitStruct->CMP_NUM = CMP1;
CMP_InitStruct->Mode = OUT_IO0;
CMP_InitStruct->NSEL = CMP_CHN0;
CMP_InitStruct->PSEL = CMP_CHP_0;
}
/*********************************************************************
* @fn OPA_CMP_Cmd
*
* @brief Enables or disables the specified CMP peripheral.
*
* @param CMP_NUM - Select CMP
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void OPA_CMP_Cmd(CMP_Num_TypeDef CMP_NUM, FunctionalState NewState)
{
if(NewState == ENABLE)
{
CTLR2_tmp |= (uint32_t)(1 << (CMP_NUM*8));
}
else
{
CTLR2_tmp &= ~(uint32_t)(1 << (CMP_NUM*8));
}
OPA->CTLR2 = CTLR2_tmp;
}
/*********************************************************************
* @fn OPA_CMP_LP_Cmd
*
* @brief Enables or disables the CMP enter low power mode.
*
* @param CMP_NUM - Select CMP
* NewState - new state of the CMP enter low power mode
* (ENABLE or DISABLE).
*
* @return none
*/
void OPA_CMP_LP_Cmd(CMP_Num_TypeDef CMP_NUM, FunctionalState NewState)
{
uint8_t tmp1 = 0;
tmp1 = 6 + CMP_NUM * 8;
if(NewState)
{
OPA->CTLR2 |= (1 << tmp1);
}
else
{
OPA->CTLR2 &= ~(1 << tmp1);
}
}
/*********************************************************************
* @fn OPA_CMP_WakeUp_ModeConfig
*
* @brief Configures the CMP wake up Mode.
*
* @param CMP_WakeUP_Mode - Specifies the trigger signal active edge for wake up of the CMP.
* CMP_WakeUp_Rising_Falling - the trigger signal rise and fall edge for wake up.
* CMP_WakeUp_Rising - the trigger signal rise edge for wake up.
* CMP_WakeUp_Falling - the trigger signal fall edge for wake up.
*
* @return none
*/
void OPA_CMP_WakeUp_ModeConfig(uint32_t CMP_WakeUP_Mode)
{
OPA->CTLR2 &= ~CMP_WakeUp_Falling;
OPA->CTLR2 |= CMP_WakeUP_Mode;
}
/*********************************************************************
* @fn OPA_GetFlagStatus
*
* @brief Checks whether the OPA flag is set or not.
*
* @param OPA_FLAG - specifies the OPA flag to check.
* OPA_FLAG_OUT_OPA1 - OPA1 out flag
* OPA_FLAG_OUT_CNT - OPA out flag rising edge of sampling data
*
* @return FlagStatus - SET or RESET.
*/
FlagStatus OPA_GetFlagStatus(uint16_t OPA_FLAG)
{
FlagStatus bitstatus = RESET;
if((OPA->CFGR1 & OPA_FLAG) != (uint16_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn OPA_ClearFlag
*
* @brief Clears the OPA flag.
*
* @param OPA_FLAG - specifies the OPA flag to clear.
* OPA_FLAG_OUT_OPA1 - OPA1 out flag
* OPA_FLAG_OUT_CNT - OPA out flag rising edge of sampling data
*
* @return none
*/
void OPA_ClearFlag(uint16_t OPA_FLAG)
{
OPA->CFGR1 &= (uint16_t)~OPA_FLAG;
}
/*********************************************************************
* @fn OPA_POLL_CNT
*
* @brief Displays the current channel being polled by the OPA
*
* @param none
*
* @return OPA_POLL_NUM_TypeDef - Current channel for OPA polling
*/
OPA_POLL_NUM_TypeDef OPA_POLL_CNT(void)
{
uint16_t tmp1 = 0;
tmp1 = OPA->CFGR2;
tmp1 &= POLL_CNT_MASK;
tmp1 = tmp1 >> 12;
return tmp1;
}

View File

@ -0,0 +1,466 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_pwr.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/01/22
* Description : This file provides all the PWR firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_pwr.h"
#include "ch32l103_rcc.h"
/* PWR registers bit mask */
/* CTLR register bit mask */
#define CTLR_DS_MASK ((uint32_t)0xFFFFFFFC)
#define CTLR_PLS_MASK ((uint32_t)0xFFFFFF1F)
/*********************************************************************
* @fn PWR_DeInit
*
* @brief Deinitializes the PWR peripheral registers to their default
* reset values.
*
* @return none
*/
void PWR_DeInit(void)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_PWR, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_PWR, DISABLE);
}
/*********************************************************************
* @fn PWR_BackupAccessCmd
*
* @brief Enables or disables access to the RTC and backup registers.
*
* @param NewState - new state of the access to the RTC and backup registers,
* This parameter can be: ENABLE or DISABLE.
*
* @return none
*/
void PWR_BackupAccessCmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CTLR |= (1 << 8);
}
else
{
PWR->CTLR &= ~(1 << 8);
}
}
/*********************************************************************
* @fn PWR_PVDCmd
*
* @brief Enables or disables the Power Voltage Detector(PVD).
*
* @param NewState - new state of the PVD(ENABLE or DISABLE).
*
* @return none
*/
void PWR_PVDCmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CTLR |= (1 << 4);
}
else
{
PWR->CTLR &= ~(1 << 4);
}
}
/*********************************************************************
* @fn PWR_PVDLevelConfig
*
* @brief Configures the voltage threshold detected by the Power Voltage
* Detector(PVD).
*
* @param PWR_PVDLevel - specifies the PVD detection level
* PWR_PVDLevel_0 - PVD detection level set to mode 0.
* PWR_PVDLevel_1 - PVD detection level set to mode 1.
* PWR_PVDLevel_2 - PVD detection level set to mode 2.
* PWR_PVDLevel_3 - PVD detection level set to mode 3.
* PWR_PVDLevel_4 - PVD detection level set to mode 4.
* PWR_PVDLevel_5 - PVD detection level set to mode 5.
* PWR_PVDLevel_6 - PVD detection level set to mode 6.
* PWR_PVDLevel_7 - PVD detection level set to mode 7.
*
* @return none
*/
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
tmpreg &= CTLR_PLS_MASK;
tmpreg |= PWR_PVDLevel;
PWR->CTLR = tmpreg;
}
/*********************************************************************
* @fn PWR_WakeUpPinCmd
*
* @brief Enables or disables the WakeUp Pin functionality.
*
* @param NewState - new state of the WakeUp Pin functionality
* (ENABLE or DISABLE).
*
* @return none
*/
void PWR_WakeUpPinCmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CSR |= (1 << 8);
}
else
{
PWR->CSR &= ~(1 << 8);
}
}
/*********************************************************************
* @fn PWR_EnterSTOPMode
*
* @brief Enters STOP mode.
*
* @param PWR_Regulator - specifies the regulator state in STOP mode.
* PWR_Regulator_ON - STOP mode with regulator ON
* PWR_Regulator_LowPower - STOP mode with regulator in low power mode
* PWR_STOPEntry - specifies if STOP mode in entered with WFI or WFE instruction.
* PWR_STOPEntry_WFI - enter STOP mode with WFI instruction
* PWR_STOPEntry_WFE - enter STOP mode with WFE instruction
*
* @return none
*/
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
tmpreg &= CTLR_DS_MASK;
tmpreg |= PWR_Regulator;
if(PWR_Regulator==PWR_Regulator_LowPower)
{
tmpreg &= ~(3 << 10);
tmpreg |= (1 <<11);
}
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
if(PWR_STOPEntry == PWR_STOPEntry_WFI)
{
__WFI();
}
else
{
__WFE();
}
NVIC->SCTLR &= ~(1 << 2);
}
/*********************************************************************
* @fn PWR_EnterSTANDBYMode
*
* @brief Enters STANDBY mode.
*
* @return none
*/
void PWR_EnterSTANDBYMode(void)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
/* flash low power mode 1 */
tmpreg &= ~(3 << 10);
tmpreg |= (1 << 11);
tmpreg |= PWR_CTLR_CWUF;
tmpreg |= PWR_CTLR_PDDS;
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
__WFI();
}
/*********************************************************************
* @fn PWR_GetFlagStatus
*
* @brief Checks whether the specified PWR flag is set or not.
*
* @param PWR_FLAG - specifies the flag to check.
* PWR_FLAG_WU - Wake Up flag
* PWR_FLAG_SB - StandBy flag
* PWR_FLAG_PVDO - PVD Output
*
* @return none
*/
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)
{
FlagStatus bitstatus = RESET;
if((PWR->CSR & PWR_FLAG) != (uint32_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn PWR_ClearFlag
*
* @brief Clears the PWR's pending flags.
*
* @param PWR_FLAG - specifies the flag to clear.
* PWR_FLAG_WU - Wake Up flag
* PWR_FLAG_SB - StandBy flag
*
* @return none
*/
void PWR_ClearFlag(uint32_t PWR_FLAG)
{
PWR->CTLR |= PWR_FLAG << 2;
}
/*********************************************************************
* @fn PWR_EnterSTANDBYMode_RAM
*
* @brief Enters STANDBY mode with RAM data retention function on.
*
* @return none
*/
void PWR_EnterSTANDBYMode_RAM(void)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
/* flash low power mode 1 */
tmpreg &= ~(3 << 10);
tmpreg |= (1 << 11);
tmpreg |= PWR_CTLR_CWUF;
tmpreg |= PWR_CTLR_PDDS;
//2K+18K in standby power.
tmpreg |= (0x1 << 16) | (0x1 << 17);
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
__WFI();
}
/*********************************************************************
* @fn PWR_EnterSTANDBYMode_RAM_LV
*
* @brief Enters STANDBY mode with RAM data retention function and LV mode on.
*
* @return none
*/
void PWR_EnterSTANDBYMode_RAM_LV(void)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
/* flash low power mode 1 */
tmpreg &= ~(3 << 10);
tmpreg |= (1 << 11);
tmpreg |= PWR_CTLR_CWUF;
tmpreg |= PWR_CTLR_PDDS;
//2K+18K in standby power.
tmpreg |= (0x1 << 16) | (0x1 << 17);
//2K+18K in standby LV .
tmpreg |= (0x1 << 20);
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
__WFI();
}
/*********************************************************************
* @fn PWR_EnterSTANDBYMode_RAM_VBAT_EN
*
* @brief Enters STANDBY mode with RAM data retention function on (VBAT Enable).
*
* @return none
*/
void PWR_EnterSTANDBYMode_RAM_VBAT_EN(void)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
/* flash low power mode 1 */
tmpreg &= ~(3 << 10);
tmpreg |= (1 << 11);
tmpreg |= PWR_CTLR_CWUF;
tmpreg |= PWR_CTLR_PDDS;
//2K+18K in standby power (VBAT Enable).
tmpreg |= (0x1 << 18) | (0x1 << 19);
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
__WFI();
}
/*********************************************************************
* @fn PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN
*
* @brief Enters STANDBY mode with RAM data retention function and LV mode on(VBAT Enable).
*
* @return none
*/
void PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN(void)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
/* flash low power mode 1 */
tmpreg &= ~(3 << 10);
tmpreg |= (1 << 11);
tmpreg |= PWR_CTLR_CWUF;
tmpreg |= PWR_CTLR_PDDS;
//2K+18K in standby power (VBAT Enable).
tmpreg |= (0x1 << 18) | (0x1 << 19);
//2K+18K in standby LV .
tmpreg |= (0x1 << 20);
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
__WFI();
}
/*********************************************************************
* @fn PWR_EnterSTOPMode_RAM_LV
*
* @brief Enters STOP mode with RAM data retention function and LV mode on.
*
* @param PWR_Regulator - specifies the regulator state in STOP mode.
* PWR_Regulator_ON - STOP mode with regulator ON
* PWR_Regulator_LowPower - STOP mode with regulator in low power mode
* PWR_STOPEntry - specifies if STOP mode in entered with WFI or WFE instruction.
* PWR_STOPEntry_WFI - enter STOP mode with WFI instruction
* PWR_STOPEntry_WFE - enter STOP mode with WFE instruction
*
* @return none
*/
void PWR_EnterSTOPMode_RAM_LV(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{
uint32_t tmpreg = 0;
tmpreg = PWR->CTLR;
tmpreg &= CTLR_DS_MASK;
tmpreg |= PWR_Regulator;
tmpreg |= (0x1 << 20);
if(PWR_Regulator==PWR_Regulator_LowPower)
{
tmpreg &= ~(3 << 10);
tmpreg |= (1 << 11);
}
PWR->CTLR = tmpreg;
NVIC->SCTLR |= (1 << 2);
if(PWR_STOPEntry == PWR_STOPEntry_WFI)
{
__WFI();
}
else
{
__WFE();
}
NVIC->SCTLR &= ~(1 << 2);
}
/*********************************************************************
* @fn PWR_LDO_LP_Cmd
*
* @brief Enables or disables the LDO low power mode.
*
* @param NewState - new state of the LDO low power mode(ENABLE or DISABLE).
*
* @return none
*/
void PWR_LDO_LP_Cmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CTLR |= (1 << 13);
}
else
{
PWR->CTLR &= ~(1 << 13);
}
}
/*********************************************************************
* @fn PWR_STOPMode_Auto_LDO_LP_Cmd
*
* @brief Enables or disables the LDO auto enter low power mode in
* stop mode.
*
* @param NewState - new state of the LDO auto enter low power mode
* in stop mode(ENABLE or DISABLE).
*
* @return none
*/
void PWR_STOPMode_Auto_LDO_LP_Cmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CTLR |= (1 << 12);
}
else
{
PWR->CTLR &= ~(1 << 12);
}
}
/*********************************************************************
* @fn PWR_FLASH_LP_Cmd
*
* @brief Enables or disables the FLASH enter low power mode 0.
*
* @param NewState - new state of the FLASH enter low power mode 0.
* (ENABLE or DISABLE).
*
* @return none
*/
void PWR_FLASH_LP_Cmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CTLR |= (7 << 9);
}
else
{
PWR->CTLR &= ~(1 << 9);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,281 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_rtc.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the RTC firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_rtc.h"
/* RTC_Private_Defines */
#define RTC_LSB_MASK ((uint32_t)0x0000FFFF) /* RTC LSB Mask */
#define PRLH_MSB_MASK ((uint32_t)0x000F0000) /* RTC Prescaler MSB Mask */
/*********************************************************************
* @fn RTC_ITConfig
*
* @brief Enables or disables the specified RTC interrupts.
*
* @param RTC_IT - specifies the RTC interrupts sources to be enabled or disabled.
* RTC_IT_OW - Overflow interrupt
* RTC_IT_ALR - Alarm interrupt
* RTC_IT_SEC - Second interrupt
*
* @return NewState - new state of the specified RTC interrupts(ENABLE or DISABLE).
*/
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState)
{
if(NewState != DISABLE)
{
RTC->CTLRH |= RTC_IT;
}
else
{
RTC->CTLRH &= (uint16_t)~RTC_IT;
}
}
/*********************************************************************
* @fn RTC_EnterConfigMode
*
* @brief Enters the RTC configuration mode.
*
* @return none
*/
void RTC_EnterConfigMode(void)
{
RTC->CTLRL |= RTC_CTLRL_CNF;
}
/*********************************************************************
* @fn RTC_ExitConfigMode
*
* @brief Exits from the RTC configuration mode.
*
* @return none
*/
void RTC_ExitConfigMode(void)
{
RTC->CTLRL &= (uint16_t) ~((uint16_t)RTC_CTLRL_CNF);
}
/*********************************************************************
* @fn RTC_GetCounter
*
* @brief Gets the RTC counter value
*
* @return RTC counter value
*/
uint32_t RTC_GetCounter(void)
{
uint16_t high1 = 0, high2 = 0, low = 0;
high1 = RTC->CNTH;
low = RTC->CNTL;
high2 = RTC->CNTH;
if(high1 != high2)
{
return (((uint32_t)high2 << 16) | RTC->CNTL);
}
else
{
return (((uint32_t)high1 << 16) | low);
}
}
/*********************************************************************
* @fn RTC_SetCounter
*
* @brief Sets the RTC counter value.
*
* @param CounterValue - RTC counter new value.
*
* @return RTC counter value
*/
void RTC_SetCounter(uint32_t CounterValue)
{
RTC_EnterConfigMode();
RTC->CNTH = CounterValue >> 16;
RTC->CNTL = (CounterValue & RTC_LSB_MASK);
RTC_ExitConfigMode();
}
/*********************************************************************
* @fn RTC_SetPrescaler
*
* @brief Sets the RTC prescaler value
*
* @param PrescalerValue - RTC prescaler new value
*
* @return none
*/
void RTC_SetPrescaler(uint32_t PrescalerValue)
{
RTC_EnterConfigMode();
RTC->PSCRH = (PrescalerValue & PRLH_MSB_MASK) >> 16;
RTC->PSCRL = (PrescalerValue & RTC_LSB_MASK);
RTC_ExitConfigMode();
}
/*********************************************************************
* @fn RTC_SetAlarm
*
* @brief Sets the RTC alarm value
*
* @param AlarmValue - RTC alarm new value
*
* @return none
*/
void RTC_SetAlarm(uint32_t AlarmValue)
{
RTC_EnterConfigMode();
RTC->ALRMH = AlarmValue >> 16;
RTC->ALRML = (AlarmValue & RTC_LSB_MASK);
RTC_ExitConfigMode();
}
/*********************************************************************
* @fn RTC_GetDivider
*
* @brief Gets the RTC divider value
*
* @return RTC Divider value
*/
uint32_t RTC_GetDivider(void)
{
uint32_t tmp = 0x00;
tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16;
tmp |= RTC->DIVL;
return tmp;
}
/*********************************************************************
* @fn RTC_WaitForLastTask
*
* @brief Waits until last write operation on RTC registers has finished
* Note-
* This function must be called before any write to RTC registers.
* @return none
*/
void RTC_WaitForLastTask(void)
{
while((RTC->CTLRL & RTC_FLAG_RTOFF) == (uint16_t)RESET)
{
}
}
/*********************************************************************
* @fn RTC_WaitForSynchro
*
* @brief Waits until the RTC registers are synchronized with RTC PB clock
* Note-
* This function must be called before any read operation after an PB reset
* or an PB clock stop.
*
* @return none
*/
void RTC_WaitForSynchro(void)
{
RTC->CTLRL &= (uint16_t)~RTC_FLAG_RSF;
while((RTC->CTLRL & RTC_FLAG_RSF) == (uint16_t)RESET)
{
}
}
/*********************************************************************
* @fn RTC_GetFlagStatus
*
* @brief Checks whether the specified RTC flag is set or not
*
* @param RTC_FLAG- specifies the flag to check
* RTC_FLAG_RTOFF - RTC Operation OFF flag
* RTC_FLAG_RSF - Registers Synchronized flag
* RTC_FLAG_OW - Overflow flag
* RTC_FLAG_ALR - Alarm flag
* RTC_FLAG_SEC - Second flag
*
* @return The new state of RTC_FLAG (SET or RESET)
*/
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG)
{
FlagStatus bitstatus = RESET;
if((RTC->CTLRL & RTC_FLAG) != (uint16_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn RTC_ClearFlag
*
* @brief Clears the RTC's pending flags
*
* @param RTC_FLAG - specifies the flag to clear
* RTC_FLAG_RSF - Registers Synchronized flag
* RTC_FLAG_OW - Overflow flag
* RTC_FLAG_ALR - Alarm flag
* RTC_FLAG_SEC - Second flag
*
* @return none
*/
void RTC_ClearFlag(uint16_t RTC_FLAG)
{
RTC->CTLRL &= (uint16_t)~RTC_FLAG;
}
/*********************************************************************
* @fn RTC_GetITStatus
*
* @brief Checks whether the specified RTC interrupt has occurred or not
*
* @param RTC_IT - specifies the RTC interrupts sources to check
* RTC_FLAG_OW - Overflow interrupt
* RTC_FLAG_ALR - Alarm interrupt
* RTC_FLAG_SEC - Second interrupt
*
* @return The new state of the RTC_IT (SET or RESET)
*/
ITStatus RTC_GetITStatus(uint16_t RTC_IT)
{
ITStatus bitstatus = RESET;
bitstatus = (ITStatus)(RTC->CTLRL & RTC_IT);
if(((RTC->CTLRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn RTC_ClearITPendingBit
*
* @brief Clears the RTC's interrupt pending bits
*
* @param RTC_IT - specifies the interrupt pending bit to clear
* RTC_FLAG_OW - Overflow interrupt
* RTC_FLAG_ALR - Alarm interrupt
* RTC_FLAG_SEC - Second interrupt
*
* @return none
*/
void RTC_ClearITPendingBit(uint16_t RTC_IT)
{
RTC->CTLRL &= (uint16_t)~RTC_IT;
}

View File

@ -0,0 +1,536 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_spi.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/06/05
* Description : This file provides all the SPI firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_spi.h"
#include "ch32l103_rcc.h"
/* SPI SPE mask */
#define CTLR1_SPE_Set ((uint16_t)0x0040)
#define CTLR1_SPE_Reset ((uint16_t)0xFFBF)
/* SPI CRCNext mask */
#define CTLR1_CRCNext_Set ((uint16_t)0x1000)
/* SPI CRCEN mask */
#define CTLR1_CRCEN_Set ((uint16_t)0x2000)
#define CTLR1_CRCEN_Reset ((uint16_t)0xDFFF)
/* SPI SSOE mask */
#define CTLR2_SSOE_Set ((uint16_t)0x0004)
#define CTLR2_SSOE_Reset ((uint16_t)0xFFFB)
/* SPI registers Masks */
#define CTLR1_CLEAR_Mask ((uint16_t)0x3040)
#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040)
/*********************************************************************
* @fn SPI_I2S_DeInit
*
* @brief Deinitializes the SPIx peripheral registers to their default
* reset values.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
*
* @return none
*/
void SPI_I2S_DeInit(SPI_TypeDef *SPIx)
{
if(SPIx == SPI1)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_SPI1, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_SPI1, DISABLE);
}
else if(SPIx == SPI2)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_SPI2, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_SPI2, DISABLE);
}
}
/*********************************************************************
* @fn SPI_Init
*
* @brief Initializes the SPIx peripheral according to the specified
* parameters in the SPI_InitStruct.
* When using SPI slave mode to send data, the CPOL bit should be set to 1.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* SPI_InitStruct - pointer to a SPI_InitTypeDef structure that
* contains the configuration information for the specified SPI peripheral.
*
* @return none
*/
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct)
{
uint16_t tmpreg = 0;
tmpreg = SPIx->CTLR1;
tmpreg &= CTLR1_CLEAR_Mask;
tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode |
SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL |
SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS |
SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit);
SPIx->CTLR1 = tmpreg;
SPIx->CRCR = SPI_InitStruct->SPI_CRCPolynomial;
}
/*********************************************************************
* @fn SPI_StructInit
*
* @brief Fills each SPI_InitStruct member with its default value.
*
* @param SPI_InitStruct - pointer to a SPI_InitTypeDef structure which
* will be initialized.
*
* @return none
*/
void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct)
{
SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct->SPI_Mode = SPI_Mode_Slave;
SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct->SPI_CRCPolynomial = 7;
}
/*********************************************************************
* @fn SPI_Cmd
*
* @brief Enables or disables the specified SPI peripheral.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void SPI_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
SPIx->CTLR1 |= CTLR1_SPE_Set;
}
else
{
SPIx->CTLR1 &= CTLR1_SPE_Reset;
}
}
/*********************************************************************
* @fn SPI_I2S_ITConfig
*
* @brief Enables or disables the specified SPI interrupts.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* SPI_I2S_IT - specifies the SPI/I2S interrupt source to be
* enabled or disabled.
* SPI_I2S_IT_TXE - Tx buffer empty interrupt mask.
* SPI_I2S_IT_RXNE - Rx buffer not empty interrupt mask.
* SPI_I2S_IT_ERR - Error interrupt mask.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void SPI_I2S_ITConfig(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState)
{
uint16_t itpos = 0, itmask = 0;
itpos = SPI_I2S_IT >> 4;
itmask = (uint16_t)1 << (uint16_t)itpos;
if(NewState != DISABLE)
{
SPIx->CTLR2 |= itmask;
}
else
{
SPIx->CTLR2 &= (uint16_t)~itmask;
}
}
/*********************************************************************
* @fn SPI_I2S_DMACmd
*
* @brief Enables or disables the SPIx DMA interface.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* SPI_I2S_DMAReq - specifies the SPI DMA transfer request to
* be enabled or disabled.
* SPI_I2S_DMAReq_Tx - Tx buffer DMA transfer request.
* SPI_I2S_DMAReq_Rx - Rx buffer DMA transfer request.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void SPI_I2S_DMACmd(SPI_TypeDef *SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState)
{
if(NewState != DISABLE)
{
SPIx->CTLR2 |= SPI_I2S_DMAReq;
}
else
{
SPIx->CTLR2 &= (uint16_t)~SPI_I2S_DMAReq;
}
}
/*********************************************************************
* @fn SPI_I2S_SendData
*
* @brief Transmits a Data through the SPIx peripheral.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* Data - Data to be transmitted.
*
* @return none
*/
void SPI_I2S_SendData(SPI_TypeDef *SPIx, uint16_t Data)
{
SPIx->DATAR = Data;
}
/*********************************************************************
* @fn SPI_I2S_ReceiveData
*
* @brief Returns the most recent received data by the SPIx peripheral.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* Data - Data to be transmitted.
*
* @return SPIx->DATAR - The value of the received data.
*/
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx)
{
return SPIx->DATAR;
}
/*********************************************************************
* @fn SPI_NSSInternalSoftwareConfig
*
* @brief Configures internally by software the NSS pin for the selected SPI.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* SPI_NSSInternalSoft -
* SPI_NSSInternalSoft_Set - Set NSS pin internally.
* SPI_NSSInternalSoft_Reset - Reset NSS pin internally.
*
* @return none
*/
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef *SPIx, uint16_t SPI_NSSInternalSoft)
{
if(SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset)
{
SPIx->CTLR1 |= SPI_NSSInternalSoft_Set;
}
else
{
SPIx->CTLR1 &= SPI_NSSInternalSoft_Reset;
}
}
/*********************************************************************
* @fn SPI_SSOutputCmd
*
* @brief Enables or disables the SS output for the selected SPI.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* NewState - new state of the SPIx SS output.
*
* @return none
*/
void SPI_SSOutputCmd(SPI_TypeDef *SPIx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
SPIx->CTLR2 |= CTLR2_SSOE_Set;
}
else
{
SPIx->CTLR2 &= CTLR2_SSOE_Reset;
}
}
/*********************************************************************
* @fn SPI_DataSizeConfig
*
* @brief Configures the data size for the selected SPI.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* SPI_DataSize - specifies the SPI data size.
* SPI_DataSize_16b - Set data frame format to 16bit.
* SPI_DataSize_8b - Set data frame format to 8bit.
*
* @return none
*/
void SPI_DataSizeConfig(SPI_TypeDef *SPIx, uint16_t SPI_DataSize)
{
SPIx->CTLR1 &= (uint16_t)~SPI_DataSize_16b;
SPIx->CTLR1 |= SPI_DataSize;
}
/*********************************************************************
* @fn SPI_TransmitCRC
*
* @brief Transmit the SPIx CRC value.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
*
* @return none
*/
void SPI_TransmitCRC(SPI_TypeDef *SPIx)
{
SPIx->CTLR1 |= CTLR1_CRCNext_Set;
}
/*********************************************************************
* @fn SPI_CalculateCRC
*
* @brief Enables or disables the CRC value calculation of the transferred bytes.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* NewState - new state of the SPIx CRC value calculation.
*
* @return none
*/
void SPI_CalculateCRC(SPI_TypeDef *SPIx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
SPIx->CTLR1 |= CTLR1_CRCEN_Set;
}
else
{
SPIx->CTLR1 &= CTLR1_CRCEN_Reset;
}
}
/*********************************************************************
* @fn SPI_GetCRC
*
* @brief Returns the transmit or the receive CRC register value for the specified SPI.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* SPI_CRC - specifies the CRC register to be read.
* SPI_CRC_Tx - Selects Tx CRC register.
* SPI_CRC_Rx - Selects Rx CRC register.
*
* @return crcreg - The selected CRC register value.
*/
uint16_t SPI_GetCRC(SPI_TypeDef *SPIx, uint8_t SPI_CRC)
{
uint16_t crcreg = 0;
if(SPI_CRC != SPI_CRC_Rx)
{
crcreg = SPIx->TCRCR;
}
else
{
crcreg = SPIx->RCRCR;
}
return crcreg;
}
/*********************************************************************
* @fn SPI_GetCRCPolynomial
*
* @brief Returns the CRC Polynomial register value for the specified SPI.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
*
* @return SPIx->CRCR - The CRC Polynomial register value.
*/
uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx)
{
return SPIx->CRCR;
}
/*********************************************************************
* @fn SPI_BiDirectionalLineConfig
*
* @brief Selects the data transfer direction in bi-directional mode
* for the specified SPI.
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* SPI_Direction - specifies the data transfer direction in
* bi-directional mode.
* SPI_Direction_Tx - Selects Tx transmission direction.
* SPI_Direction_Rx - Selects Rx receive direction.
*
* @return none
*/
void SPI_BiDirectionalLineConfig(SPI_TypeDef *SPIx, uint16_t SPI_Direction)
{
if(SPI_Direction == SPI_Direction_Tx)
{
SPIx->CTLR1 |= SPI_Direction_Tx;
}
else
{
SPIx->CTLR1 &= SPI_Direction_Rx;
}
}
/*********************************************************************
* @fn SPI_I2S_GetFlagStatus
*
* @brief Checks whether the specified SPI flag is set or not.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* SPI_I2S_FLAG - specifies the SPI flag to check.
* SPI_I2S_FLAG_TXE - Transmit buffer empty flag.
* SPI_I2S_FLAG_RXNE - Receive buffer not empty flag.
* SPI_I2S_FLAG_BSY - Busy flag.
* SPI_I2S_FLAG_OVR - Overrun flag.
* SPI_FLAG_MODF - Mode Fault flag.
* SPI_FLAG_CRCERR - CRC Error flag.
*
* @return FlagStatus - SET or RESET.
*/
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG)
{
FlagStatus bitstatus = RESET;
if((SPIx->STATR & SPI_I2S_FLAG) != (uint16_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn SPI_I2S_ClearFlag
*
* @brief Clears the SPIx CRC Error (CRCERR) flag.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* SPI_I2S_FLAG - specifies the SPI flag to clear.
* SPI_FLAG_CRCERR - CRC Error flag.
* Note-
* - OVR (OverRun error) flag is cleared by software sequence - a read
* operation to SPI_DATAR register (SPI_I2S_ReceiveData()) followed by a read
* operation to SPI_STATR register (SPI_I2S_GetFlagStatus()).
* - MODF (Mode Fault) flag is cleared by software sequence - a read/write
* operation to SPI_STATR register (SPI_I2S_GetFlagStatus()) followed by a
* write operation to SPI_CTLR1 register (SPI_Cmd() to enable the SPI).
* @return FlagStatus - SET or RESET.
*/
void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG)
{
SPIx->STATR = (uint16_t)~SPI_I2S_FLAG;
}
/*********************************************************************
* @fn SPI_I2S_GetITStatus
*
* @brief Checks whether the specified SPI interrupt has occurred or not.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* SPI_I2S_IT - specifies the SPI interrupt source to check..
* SPI_I2S_IT_TXE - Transmit buffer empty interrupt.
* SPI_I2S_IT_RXNE - Receive buffer not empty interrupt.
* SPI_I2S_IT_OVR - Overrun interrupt.
* SPI_IT_MODF - Mode Fault interrupt.
* SPI_IT_CRCERR - CRC Error interrupt.
*
* @return FlagStatus - SET or RESET.
*/
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT)
{
ITStatus bitstatus = RESET;
uint16_t itpos = 0, itmask = 0, enablestatus = 0;
itpos = 0x01 << (SPI_I2S_IT & 0x0F);
itmask = SPI_I2S_IT >> 4;
itmask = 0x01 << itmask;
enablestatus = (SPIx->CTLR2 & itmask);
if(((SPIx->STATR & itpos) != (uint16_t)RESET) && enablestatus)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn SPI_I2S_ClearITPendingBit
*
* @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit.
*
* @param SPIx - where x can be
* - 1 or 2 in SPI mode.
* SPI_I2S_IT - specifies the SPI interrupt pending bit to clear.
* SPI_IT_CRCERR - CRC Error interrupt.
* Note-
* - OVR (OverRun Error) interrupt pending bit is cleared by software
* sequence - a read operation to SPI_DATAR register (SPI_I2S_ReceiveData())
* followed by a read operation to SPI_STATR register (SPI_I2S_GetITStatus()).
* - MODF (Mode Fault) interrupt pending bit is cleared by software sequence:
* a read/write operation to SPI_STATR register (SPI_I2S_GetITStatus())
* followed by a write operation to SPI_CTLR1 register (SPI_Cmd() to enable
* the SPI).
*
* @return none
*/
void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT)
{
uint16_t itpos = 0;
itpos = 0x01 << (SPI_I2S_IT & 0x0F);
SPIx->STATR = (uint16_t)~itpos;
}
/*********************************************************************
* @fn SPI_HighSpeedRead_Cmd
*
* @brief Enables or disables the SPI high speed read mode.
* Note -
* Read enable in SPI high-speed mode (CLK is more than
* or equal to 36MHz). This mode is valid only when clock
* is divided by 2 (BR in CTLR1 = 000).
*
* @param SPIx - where x can be 1 or 2 to select the SPI peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void SPI_HighSpeedRead_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
SPIx->HSCR |= (1 << 0);
}
else
{
SPIx->HSCR &= ~(1 << 0);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,816 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_usart.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the USART firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_usart.h"
#include "ch32l103_rcc.h"
/* USART_Private_Defines */
#define CTLR1_UE_Set ((uint16_t)0x2000) /* USART Enable Mask */
#define CTLR1_UE_Reset ((uint16_t)0xDFFF) /* USART Disable Mask */
#define CTLR1_WAKE_Mask ((uint16_t)0xF7FF) /* USART WakeUp Method Mask */
#define CTLR1_RWU_Set ((uint16_t)0x0002) /* USART mute mode Enable Mask */
#define CTLR1_RWU_Reset ((uint16_t)0xFFFD) /* USART mute mode Enable Mask */
#define CTLR1_SBK_Set ((uint16_t)0x0001) /* USART Break Character send Mask */
#define CTLR1_CLEAR_Mask ((uint16_t)0xE9F3) /* USART CTLR1 Mask */
#define CTLR2_Address_Mask ((uint16_t)0xFFF0) /* USART address Mask */
#define CTLR2_LINEN_Set ((uint16_t)0x4000) /* USART LIN Enable Mask */
#define CTLR2_LINEN_Reset ((uint16_t)0xBFFF) /* USART LIN Disable Mask */
#define CTLR2_LBDL_Mask ((uint16_t)0xFFDF) /* USART LIN Break detection Mask */
#define CTLR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /* USART CTLR2 STOP Bits Mask */
#define CTLR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /* USART CTLR2 Clock Mask */
#define CTLR3_SCEN_Set ((uint16_t)0x0020) /* USART SC Enable Mask */
#define CTLR3_SCEN_Reset ((uint16_t)0xFFDF) /* USART SC Disable Mask */
#define CTLR3_NACK_Set ((uint16_t)0x0010) /* USART SC NACK Enable Mask */
#define CTLR3_NACK_Reset ((uint16_t)0xFFEF) /* USART SC NACK Disable Mask */
#define CTLR3_HDSEL_Set ((uint16_t)0x0008) /* USART Half-Duplex Enable Mask */
#define CTLR3_HDSEL_Reset ((uint16_t)0xFFF7) /* USART Half-Duplex Disable Mask */
#define CTLR3_IRLP_Mask ((uint16_t)0xFFFB) /* USART IrDA LowPower mode Mask */
#define CTLR3_CLEAR_Mask ((uint16_t)0xFCFF) /* USART CTLR3 Mask */
#define CTLR3_IREN_Set ((uint16_t)0x0002) /* USART IrDA Enable Mask */
#define CTLR3_IREN_Reset ((uint16_t)0xFFFD) /* USART IrDA Disable Mask */
#define GPR_LSB_Mask ((uint16_t)0x00FF) /* Guard Time Register LSB Mask */
#define GPR_MSB_Mask ((uint16_t)0xFF00) /* Guard Time Register MSB Mask */
#define IT_Mask ((uint16_t)0x001F) /* USART Interrupt Mask */
/* USART OverSampling-8 Mask */
#define CTLR1_OVER8_Set ((uint16_t)0x8000) /* USART OVER8 mode Enable Mask */
#define CTLR1_OVER8_Reset ((uint16_t)0x7FFF) /* USART OVER8 mode Disable Mask */
/* USART One Bit Sampling Mask */
#define CTLR3_ONEBITE_Set ((uint16_t)0x0800) /* USART ONEBITE mode Enable Mask */
#define CTLR3_ONEBITE_Reset ((uint16_t)0xF7FF) /* USART ONEBITE mode Disable Mask */
/*********************************************************************
* @fn USART_DeInit
*
* @brief Deinitializes the USARTx peripheral registers to their default
* reset values.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the UART peripheral.
*
* @return none
*/
void USART_DeInit(USART_TypeDef *USARTx)
{
if(USARTx == USART1)
{
RCC_PB2PeriphResetCmd(RCC_PB2Periph_USART1, ENABLE);
RCC_PB2PeriphResetCmd(RCC_PB2Periph_USART1, DISABLE);
}
else if(USARTx == USART2)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_USART2, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_USART2, DISABLE);
}
else if(USARTx == USART3)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_USART3, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_USART3, DISABLE);
}
else if(USARTx == USART4)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_USART4, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_USART4, DISABLE);
}
}
/*********************************************************************
* @fn USART_Init
*
* @brief Initializes the USARTx peripheral according to the specified
* parameters in the USART_InitStruct.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the UART peripheral.
* USART_InitStruct - pointer to a USART_InitTypeDef structure
* that contains the configuration information for the specified
* USART peripheral.
*
* @return none
*/
void USART_Init(USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct)
{
uint32_t tmpreg = 0x00, PBclock = 0x00;
uint32_t integerdivider = 0x00;
uint32_t fractionaldivider = 0x00;
uint32_t usartxbase = 0;
RCC_ClocksTypeDef RCC_ClocksStatus;
if(USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None)
{
}
usartxbase = (uint32_t)USARTx;
tmpreg = USARTx->CTLR2;
tmpreg &= CTLR2_STOP_CLEAR_Mask;
tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
USARTx->CTLR2 = (uint16_t)tmpreg;
tmpreg = USARTx->CTLR1;
tmpreg &= CTLR1_CLEAR_Mask;
tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
USART_InitStruct->USART_Mode;
USARTx->CTLR1 = (uint16_t)tmpreg;
tmpreg = USARTx->CTLR3;
tmpreg &= CTLR3_CLEAR_Mask;
tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
USARTx->CTLR3 = (uint16_t)tmpreg;
RCC_GetClocksFreq(&RCC_ClocksStatus);
if(usartxbase == USART1_BASE)
{
PBclock = RCC_ClocksStatus.PCLK2_Frequency;
}
else
{
PBclock = RCC_ClocksStatus.PCLK1_Frequency;
}
if((USARTx->CTLR1 & CTLR1_OVER8_Set) != 0)
{
integerdivider = ((25 * PBclock) / (2 * (USART_InitStruct->USART_BaudRate)));
}
else
{
integerdivider = ((25 * PBclock) / (4 * (USART_InitStruct->USART_BaudRate)));
}
tmpreg = (integerdivider / 100) << 4;
fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
if((USARTx->CTLR1 & CTLR1_OVER8_Set) != 0)
{
tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
}
else
{
tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
}
USARTx->BRR = (uint16_t)tmpreg;
}
/*********************************************************************
* @fn USART_StructInit
*
* @brief Fills each USART_InitStruct member with its default value.
*
* @param USART_InitStruct: pointer to a USART_InitTypeDef structure
* which will be initialized.
*
* @return none
*/
void USART_StructInit(USART_InitTypeDef *USART_InitStruct)
{
USART_InitStruct->USART_BaudRate = 9600;
USART_InitStruct->USART_WordLength = USART_WordLength_8b;
USART_InitStruct->USART_StopBits = USART_StopBits_1;
USART_InitStruct->USART_Parity = USART_Parity_No;
USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None;
}
/*********************************************************************
* @fn USART_ClockInit
*
* @brief Initializes the USARTx peripheral Clock according to the
* specified parameters in the USART_ClockInitStruct .
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef
* structure that contains the configuration information for the specified
* USART peripheral.
*
* @return none
*/
void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitTypeDef *USART_ClockInitStruct)
{
uint32_t tmpreg = 0x00;
tmpreg = USARTx->CTLR2;
tmpreg &= CTLR2_CLOCK_CLEAR_Mask;
tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL |
USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit;
USARTx->CTLR2 = (uint16_t)tmpreg;
}
/*********************************************************************
* @fn USART_ClockStructInit
*
* @brief Fills each USART_ClockStructInit member with its default value.
*
* @param USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef
* structure which will be initialized.
*
* @return none
*/
void USART_ClockStructInit(USART_ClockInitTypeDef *USART_ClockInitStruct)
{
USART_ClockInitStruct->USART_Clock = USART_Clock_Disable;
USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low;
USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge;
USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;
}
/*********************************************************************
* @fn USART_Cmd
*
* @brief Enables or disables the specified USART peripheral.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_Cmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR1 |= CTLR1_UE_Set;
}
else
{
USARTx->CTLR1 &= CTLR1_UE_Reset;
}
}
/*********************************************************************
* @fn USART_ITConfig
*
* @brief Enables or disables the specified USART interrupts.
* reset values.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_IT - specifies the USART interrupt sources to be enabled or disabled.
* USART_IT_LBD - LIN Break detection interrupt.
* USART_IT_TXE - Transmit Data Register empty interrupt.
* USART_IT_TC - Transmission complete interrupt.
* USART_IT_RXNE - Receive Data register not empty interrupt.
* USART_IT_IDLE - Idle line detection interrupt.
* USART_IT_PE - Parity Error interrupt.
* USART_IT_ERR - Error interrupt.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_ITConfig(USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState)
{
uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00;
uint32_t usartxbase = 0x00;
usartxbase = (uint32_t)USARTx;
usartreg = (((uint8_t)USART_IT) >> 0x05);
itpos = USART_IT & IT_Mask;
itmask = (((uint32_t)0x01) << itpos);
if(usartreg == 0x01)
{
usartxbase += 0x0C;
}
else if(usartreg == 0x02)
{
usartxbase += 0x10;
}
else
{
usartxbase += 0x14;
}
if(NewState != DISABLE)
{
*(__IO uint32_t *)usartxbase |= itmask;
}
else
{
*(__IO uint32_t *)usartxbase &= ~itmask;
}
}
/*********************************************************************
* @fn USART_DMACmd
*
* @brief Enables or disables the USART DMA interface.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_DMAReq - specifies the DMA request.
* USART_DMAReq_Tx - USART DMA transmit request.
* USART_DMAReq_Rx - USART DMA receive request.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_DMACmd(USART_TypeDef *USARTx, uint16_t USART_DMAReq, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR3 |= USART_DMAReq;
}
else
{
USARTx->CTLR3 &= (uint16_t)~USART_DMAReq;
}
}
/*********************************************************************
* @fn USART_SetAddress
*
* @brief Sets the address of the USART node.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_Address - Indicates the address of the USART node.
*
* @return none
*/
void USART_SetAddress(USART_TypeDef *USARTx, uint8_t USART_Address)
{
USARTx->CTLR2 &= CTLR2_Address_Mask;
USARTx->CTLR2 |= USART_Address;
}
/*********************************************************************
* @fn USART_WakeUpConfig
*
* @brief Selects the USART WakeUp method.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_WakeUp - specifies the USART wakeup method.
* USART_WakeUp_IdleLine - WakeUp by an idle line detection.
* USART_WakeUp_AddressMark - WakeUp by an address mark.
*
* @return none
*/
void USART_WakeUpConfig(USART_TypeDef *USARTx, uint16_t USART_WakeUp)
{
USARTx->CTLR1 &= CTLR1_WAKE_Mask;
USARTx->CTLR1 |= USART_WakeUp;
}
/*********************************************************************
* @fn USART_ReceiverWakeUpCmd
*
* @brief Determines if the USART is in mute mode or not.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_ReceiverWakeUpCmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR1 |= CTLR1_RWU_Set;
}
else
{
USARTx->CTLR1 &= CTLR1_RWU_Reset;
}
}
/*********************************************************************
* @fn USART_LINBreakDetectLengthConfig
*
* @brief Sets the USART LIN Break detection length.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_LINBreakDetectLength - specifies the LIN break detection length.
* USART_LINBreakDetectLength_10b - 10-bit break detection.
* USART_LINBreakDetectLength_11b - 11-bit break detection.
*
* @return none
*/
void USART_LINBreakDetectLengthConfig(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength)
{
USARTx->CTLR2 &= CTLR2_LBDL_Mask;
USARTx->CTLR2 |= USART_LINBreakDetectLength;
}
/*********************************************************************
* @fn USART_LINCmd
*
* @brief Enables or disables the USART LIN mode.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_LINCmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR2 |= CTLR2_LINEN_Set;
}
else
{
USARTx->CTLR2 &= CTLR2_LINEN_Reset;
}
}
/*********************************************************************
* @fn USART_SendData
*
* @brief Transmits single data through the USARTx peripheral.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* Data - the data to transmit.
*
* @return none
*/
void USART_SendData(USART_TypeDef *USARTx, uint16_t Data)
{
USARTx->DATAR = (Data & (uint16_t)0x01FF);
}
/*********************************************************************
* @fn USART_ReceiveData
*
* @brief Returns the most recent received data by the USARTx peripheral.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
*
* @return The received data.
*/
uint16_t USART_ReceiveData(USART_TypeDef *USARTx)
{
return (uint16_t)(USARTx->DATAR & (uint16_t)0x01FF);
}
/*********************************************************************
* @fn USART_SendBreak
*
* @brief Transmits break characters.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
*
* @return none
*/
void USART_SendBreak(USART_TypeDef *USARTx)
{
USARTx->CTLR1 |= CTLR1_SBK_Set;
}
/*********************************************************************
* @fn USART_SetGuardTime
*
* @brief Sets the specified USART guard time.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_GuardTime - specifies the guard time.
*
* @return none
*/
void USART_SetGuardTime(USART_TypeDef *USARTx, uint8_t USART_GuardTime)
{
USARTx->GPR &= GPR_LSB_Mask;
USARTx->GPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08);
}
/*********************************************************************
* @fn USART_SetPrescaler
*
* @brief Sets the system clock prescaler.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_Prescaler - specifies the prescaler clock.
*
* @return none
*/
void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler)
{
USARTx->GPR &= GPR_MSB_Mask;
USARTx->GPR |= USART_Prescaler;
}
/*********************************************************************
* @fn USART_SmartCardCmd
*
* @brief Enables or disables the USART Smart Card mode.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_SmartCardCmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR3 |= CTLR3_SCEN_Set;
}
else
{
USARTx->CTLR3 &= CTLR3_SCEN_Reset;
}
}
/*********************************************************************
* @fn USART_SmartCardNACKCmd
*
* @brief Enables or disables NACK transmission.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_SmartCardNACKCmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR3 |= CTLR3_NACK_Set;
}
else
{
USARTx->CTLR3 &= CTLR3_NACK_Reset;
}
}
/*********************************************************************
* @fn USART_HalfDuplexCmd
*
* @brief Enables or disables the USART Half Duplex communication.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_HalfDuplexCmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR3 |= CTLR3_HDSEL_Set;
}
else
{
USARTx->CTLR3 &= CTLR3_HDSEL_Reset;
}
}
/*********************************************************************
* @fn USART_OverSampling8Cmd
*
* @brief Enables or disables the USART's 8x oversampling mode.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
* Note-
* This function has to be called before calling USART_Init()
* function in order to have correct baudrate Divider value.
* @return none
*/
void USART_OverSampling8Cmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR1 |= CTLR1_OVER8_Set;
}
else
{
USARTx->CTLR1 &= CTLR1_OVER8_Reset;
}
}
/*********************************************************************
* @fn USART_OneBitMethodCmd
*
* @brief Enables or disables the USART's one bit sampling method.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_OneBitMethodCmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR3 |= CTLR3_ONEBITE_Set;
}
else
{
USARTx->CTLR3 &= CTLR3_ONEBITE_Reset;
}
}
/*********************************************************************
* @fn USART_IrDAConfig
*
* @brief Configures the USART's IrDA interface.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_IrDAMode - specifies the IrDA mode.
* USART_IrDAMode_LowPower.
* USART_IrDAMode_Normal.
*
* @return none
*/
void USART_IrDAConfig(USART_TypeDef *USARTx, uint16_t USART_IrDAMode)
{
USARTx->CTLR3 &= CTLR3_IRLP_Mask;
USARTx->CTLR3 |= USART_IrDAMode;
}
/*********************************************************************
* @fn USART_IrDACmd
*
* @brief Enables or disables the USART's IrDA interface.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* NewState - ENABLE or DISABLE.
*
* @return none
*/
void USART_IrDACmd(USART_TypeDef *USARTx, FunctionalState NewState)
{
if(NewState != DISABLE)
{
USARTx->CTLR3 |= CTLR3_IREN_Set;
}
else
{
USARTx->CTLR3 &= CTLR3_IREN_Reset;
}
}
/*********************************************************************
* @fn USART_GetFlagStatus
*
* @brief Checks whether the specified USART flag is set or not.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_FLAG - specifies the flag to check.
* USART_FLAG_RX_BUSY - Receive data busy flag.
* USART_FLAG_CTS - CTS state detection flag.
* USART_FLAG_LBD - LIN Break detection flag.
* USART_FLAG_TXE - Transmit data register empty flag.
* USART_FLAG_TC - Transmission Complete flag.
* USART_FLAG_RXNE - Receive data register not empty flag.
* USART_FLAG_IDLE - Idle Line detection flag.
* USART_FLAG_ORE - OverRun Error flag.
* USART_FLAG_NE - Noise Error flag.
* USART_FLAG_FE - Framing Error flag.
* USART_FLAG_PE - Parity Error flag.
*
* @return bitstatus: SET or RESET
*/
FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx, uint16_t USART_FLAG)
{
FlagStatus bitstatus = RESET;
if((USARTx->STATR & USART_FLAG) != (uint16_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn USART_ClearFlag
*
* @brief Clears the USARTx's pending flags.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_FLAG - specifies the flag to clear.
* USART_FLAG_CTS - CTS state detection flag.
* USART_FLAG_LBD - LIN Break detection flag.
* USART_FLAG_TC - Transmission Complete flag.
* USART_FLAG_RXNE - Receive data register not empty flag.
* Note-
* - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
* error) and IDLE (Idle line detected) flags are cleared by software
* sequence: a read operation to USART_STATR register (USART_GetFlagStatus())
* followed by a read operation to USART_DATAR register (USART_ReceiveData()).
* - RXNE flag can be also cleared by a read to the USART_DATAR register
* (USART_ReceiveData()).
* - TC flag can be also cleared by software sequence: a read operation to
* USART_STATR register (USART_GetFlagStatus()) followed by a write operation
* to USART_DATAR register (USART_SendData()).
* - TXE flag is cleared only by a write to the USART_DATAR register
* (USART_SendData()).
* @return none
*/
void USART_ClearFlag(USART_TypeDef *USARTx, uint16_t USART_FLAG)
{
USARTx->STATR = (uint16_t)~USART_FLAG;
}
/*********************************************************************
* @fn USART_GetITStatus
*
* @brief Checks whether the specified USART interrupt has occurred or not.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_IT - specifies the USART interrupt source to check.
* USART_IT_CTS - CTS state detection interrupt.
* USART_IT_LBD - LIN Break detection interrupt.
* USART_IT_TXE - Tansmit Data Register empty interrupt.
* USART_IT_TC - Transmission complete interrupt.
* USART_IT_RXNE - Receive Data register not empty interrupt.
* USART_IT_IDLE - Idle line detection interrupt.
* USART_IT_ORE_RX - OverRun Error interrupt if the RXNEIE bit is set.
* USART_IT_ORE_ER - OverRun Error interrupt if the EIE bit is set.
* USART_IT_NE - Noise Error interrupt.
* USART_IT_FE - Framing Error interrupt.
* USART_IT_PE - Parity Error interrupt.
*
* @return bitstatus - SET or RESET.
*/
ITStatus USART_GetITStatus(USART_TypeDef *USARTx, uint16_t USART_IT)
{
uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
ITStatus bitstatus = RESET;
usartreg = (((uint8_t)USART_IT) >> 0x05);
itmask = USART_IT & IT_Mask;
itmask = (uint32_t)0x01 << itmask;
if(usartreg == 0x01)
{
itmask &= USARTx->CTLR1;
}
else if(usartreg == 0x02)
{
itmask &= USARTx->CTLR2;
}
else
{
itmask &= USARTx->CTLR3;
}
bitpos = USART_IT >> 0x08;
bitpos = (uint32_t)0x01 << bitpos;
bitpos &= USARTx->STATR;
if((itmask != (uint16_t)RESET) && (bitpos != (uint16_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
/*********************************************************************
* @fn USART_ClearITPendingBit
*
* @brief Clears the USARTx's interrupt pending bits.
*
* @param USARTx - where x can be 1, 2, 3 or 4 to select the USART peripheral.
* USART_IT - specifies the interrupt pending bit to clear.
* USART_IT_CTS - CTS state detection interrupt.
* USART_IT_LBD - LIN Break detection interrupt.
* USART_IT_TC - Transmission complete interrupt.
* USART_IT_RXNE - Receive Data register not empty interrupt.
* Note-
* - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
* error) and IDLE (Idle line detected) pending bits are cleared by
* software sequence: a read operation to USART_STATR register
* (USART_GetITStatus()) followed by a read operation to USART_DATAR register
* (USART_ReceiveData()).
* - RXNE pending bit can be also cleared by a read to the USART_DATAR register
* (USART_ReceiveData()).
* - TC pending bit can be also cleared by software sequence: a read
* operation to USART_STATR register (USART_GetITStatus()) followed by a write
* operation to USART_DATAR register (USART_SendData()).
* - TXE pending bit is cleared only by a write to the USART_DATAR register
* (USART_SendData()).
*
* @return none
*/
void USART_ClearITPendingBit(USART_TypeDef *USARTx, uint16_t USART_IT)
{
uint16_t bitpos = 0x00, itmask = 0x00;
bitpos = USART_IT >> 0x08;
itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
USARTx->STATR = (uint16_t)~itmask;
}

View File

@ -0,0 +1,142 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_wwdg.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file provides all the WWDG firmware functions.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_wwdg.h"
#include "ch32l103_rcc.h"
/* CTLR register bit mask */
#define CTLR_WDGA_Set ((uint32_t)0x00000080)
/* CFGR register bit mask */
#define CFGR_WDGTB_Mask ((uint32_t)0xFFFFFE7F)
#define CFGR_W_Mask ((uint32_t)0xFFFFFF80)
#define BIT_Mask ((uint8_t)0x7F)
/*********************************************************************
* @fn WWDG_DeInit
*
* @brief Deinitializes the WWDG peripheral registers to their default reset values
*
* @return none
*/
void WWDG_DeInit(void)
{
RCC_PB1PeriphResetCmd(RCC_PB1Periph_WWDG, ENABLE);
RCC_PB1PeriphResetCmd(RCC_PB1Periph_WWDG, DISABLE);
}
/*********************************************************************
* @fn WWDG_SetPrescaler
*
* @brief Sets the WWDG Prescaler
*
* @param WWDG_Prescaler - specifies the WWDG Prescaler
* WWDG_Prescaler_1 - WWDG counter clock = (PCLK1/4096)/1
* WWDG_Prescaler_2 - WWDG counter clock = (PCLK1/4096)/2
* WWDG_Prescaler_4 - WWDG counter clock = (PCLK1/4096)/4
* WWDG_Prescaler_8 - WWDG counter clock = (PCLK1/4096)/8
*
* @return none
*/
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)
{
uint32_t tmpreg = 0;
tmpreg = WWDG->CFGR & CFGR_WDGTB_Mask;
tmpreg |= WWDG_Prescaler;
WWDG->CFGR = tmpreg;
}
/*********************************************************************
* @fn WWDG_SetWindowValue
*
* @brief Sets the WWDG window value
*
* @param WindowValue - specifies the window value to be compared to the
* downcounter,which must be lower than 0x80
*
* @return none
*/
void WWDG_SetWindowValue(uint8_t WindowValue)
{
__IO uint32_t tmpreg = 0;
tmpreg = WWDG->CFGR & CFGR_W_Mask;
tmpreg |= WindowValue & (uint32_t)BIT_Mask;
WWDG->CFGR = tmpreg;
}
/*********************************************************************
* @fn WWDG_EnableIT
*
* @brief Enables the WWDG Early Wakeup interrupt(EWI)
*
* @return none
*/
void WWDG_EnableIT(void)
{
WWDG->CFGR |= (1 << 9);
}
/*********************************************************************
* @fn WWDG_SetCounter
*
* @brief Sets the WWDG counter value
*
* @param Counter - specifies the watchdog counter value,which must be a
* number between 0x40 and 0x7F
*
* @return none
*/
void WWDG_SetCounter(uint8_t Counter)
{
WWDG->CTLR = Counter & BIT_Mask;
}
/*********************************************************************
* @fn WWDG_Enable
*
* @brief Enables WWDG and load the counter value
*
* @param Counter - specifies the watchdog counter value,which must be a
* number between 0x40 and 0x7F
*
* @return none
*/
void WWDG_Enable(uint8_t Counter)
{
WWDG->CTLR = CTLR_WDGA_Set | Counter;
}
/*********************************************************************
* @fn WWDG_GetFlagStatus
*
* @brief Checks whether the Early Wakeup interrupt flag is set or not
*
* @return The new state of the Early Wakeup interrupt flag (SET or RESET)
*/
FlagStatus WWDG_GetFlagStatus(void)
{
return (FlagStatus)(WWDG->STATR);
}
/*********************************************************************
* @fn WWDG_ClearFlag
*
* @brief Clears Early Wakeup interrupt flag
*
* @return none
*/
void WWDG_ClearFlag(void)
{
WWDG->STATR = (uint32_t)RESET;
}

View File

@ -0,0 +1,269 @@
;/********************************** (C) COPYRIGHT *******************************
;* File Name : startup_ch32l103.s
;* Author : WCH
;* Version : V1.0.0
;* Date : 2024/05/06
;* Description : CH32L103 vector table for eclipse toolchain.
;*********************************************************************************
;* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
;* Attention: This software (modified or not) and binary are used for
;* microcontroller manufactured by Nanjing Qinheng Microelectronics.
;*******************************************************************************/
.section .init,"ax",@progbits
.global _start
.align 1
_start:
j handle_reset
.section .vector,"ax",@progbits
.align 1
_vector_base:
.option norvc;
.word _start
.word 0
.word NMI_Handler /* NMI */
.word HardFault_Handler /* Hard Fault */
.word 0
.word Ecall_M_Mode_Handler /* Ecall M Mode */
.word 0
.word 0
.word Ecall_U_Mode_Handler /* Ecall U Mode */
.word Break_Point_Handler /* Break Point */
.word 0
.word 0
.word SysTick_Handler /* SysTick */
.word 0
.word SW_Handler /* SW */
.word 0
/* External Interrupts */
.word WWDG_IRQHandler /* Window Watchdog */
.word PVD_IRQHandler /* PVD through EXTI Line detect */
.word TAMPER_IRQHandler /* TAMPER */
.word RTC_IRQHandler /* RTC */
.word FLASH_IRQHandler /* Flash */
.word RCC_IRQHandler /* RCC */
.word EXTI0_IRQHandler /* EXTI Line 0 */
.word EXTI1_IRQHandler /* EXTI Line 1 */
.word EXTI2_IRQHandler /* EXTI Line 2 */
.word EXTI3_IRQHandler /* EXTI Line 3 */
.word EXTI4_IRQHandler /* EXTI Line 4 */
.word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
.word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */
.word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */
.word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */
.word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */
.word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */
.word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */
.word ADC_IRQHandler /* ADC */
.word USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */
.word USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */
.word CAN1_RX1_IRQHandler /* CAN1 RX1 */
.word CAN1_SCE_IRQHandler /* CAN1 SCE */
.word EXTI9_5_IRQHandler /* EXTI Line 9..5 */
.word TIM1_BRK_IRQHandler /* TIM1 Break */
.word TIM1_UP_IRQHandler /* TIM1 Update */
.word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */
.word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
.word TIM2_IRQHandler /* TIM2 */
.word TIM3_IRQHandler /* TIM3 */
.word TIM4_IRQHandler /* TIM4 */
.word I2C1_EV_IRQHandler /* I2C1 Event */
.word I2C1_ER_IRQHandler /* I2C1 Error */
.word I2C2_EV_IRQHandler /* I2C2 Event */
.word I2C2_ER_IRQHandler /* I2C2 Error */
.word SPI1_IRQHandler /* SPI1 */
.word SPI2_IRQHandler /* SPI2 */
.word USART1_IRQHandler /* USART1 */
.word USART2_IRQHandler /* USART2 */
.word USART3_IRQHandler /* USART3 */
.word EXTI15_10_IRQHandler /* EXTI Line 15..10 */
.word RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */
.word LPTIMWakeUp_IRQHandler /* LPTIM Wake up */
.word USBFS_IRQHandler /* USBFS Break */
.word USBFSWakeUp_IRQHandler /* USBFS Wake up from suspend */
.word USART4_IRQHandler /* USART4 */
.word DMA1_Channel8_IRQHandler /* DMA1 Channel8 */
.word LPTIM_IRQHandler /* LPTIM */
.word OPA_IRQHandler /* OPA */
.word USBPD_IRQHandler /* USBPD */
.word 0
.word USBPDWakeUp_IRQHandler /* USBPD Wake Up */
.word CMPWakeUp_IRQHandler /* CMP Wake Up */
.option rvc;
.section .text.vector_handler, "ax", @progbits
.weak NMI_Handler /* NMI */
.weak HardFault_Handler /* Hard Fault */
.weak Ecall_M_Mode_Handler /* Ecall M Mode */
.weak Ecall_U_Mode_Handler /* Ecall U Mode */
.weak Break_Point_Handler /* Break Point */
.weak SysTick_Handler /* SysTick */
.weak SW_Handler /* SW */
.weak WWDG_IRQHandler /* Window Watchdog */
.weak PVD_IRQHandler /* PVD through EXTI Line detect */
.weak TAMPER_IRQHandler /* TAMPER */
.weak RTC_IRQHandler /* RTC */
.weak FLASH_IRQHandler /* Flash */
.weak RCC_IRQHandler /* RCC */
.weak EXTI0_IRQHandler /* EXTI Line 0 */
.weak EXTI1_IRQHandler /* EXTI Line 1 */
.weak EXTI2_IRQHandler /* EXTI Line 2 */
.weak EXTI3_IRQHandler /* EXTI Line 3 */
.weak EXTI4_IRQHandler /* EXTI Line 4 */
.weak DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
.weak DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */
.weak DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */
.weak DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */
.weak DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */
.weak DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */
.weak DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */
.weak ADC_IRQHandler /* ADC */
.weak USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */
.weak USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */
.weak CAN1_RX1_IRQHandler /* CAN1 RX1 */
.weak CAN1_SCE_IRQHandler /* CAN1 SCE */
.weak EXTI9_5_IRQHandler /* EXTI Line 9..5 */
.weak TIM1_BRK_IRQHandler /* TIM1 Break */
.weak TIM1_UP_IRQHandler /* TIM1 Update */
.weak TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */
.weak TIM1_CC_IRQHandler /* TIM1 Capture Compare */
.weak TIM2_IRQHandler /* TIM2 */
.weak TIM3_IRQHandler /* TIM3 */
.weak TIM4_IRQHandler /* TIM4 */
.weak I2C1_EV_IRQHandler /* I2C1 Event */
.weak I2C1_ER_IRQHandler /* I2C1 Error */
.weak I2C2_EV_IRQHandler /* I2C2 Event */
.weak I2C2_ER_IRQHandler /* I2C2 Error */
.weak SPI1_IRQHandler /* SPI1 */
.weak SPI2_IRQHandler /* SPI2 */
.weak USART1_IRQHandler /* USART1 */
.weak USART2_IRQHandler /* USART2 */
.weak USART3_IRQHandler /* USART3 */
.weak EXTI15_10_IRQHandler /* EXTI Line 15..10 */
.weak RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */
.weak LPTIMWakeUp_IRQHandler /* LPTIM Wake up */
.weak USBFS_IRQHandler /* USBFS */
.weak USBFSWakeUp_IRQHandler /* USBFS Wake Up */
.weak USART4_IRQHandler /* USART4 */
.weak DMA1_Channel8_IRQHandler /* DMA1 Channel8 */
.weak LPTIM_IRQHandler /* LPTIM */
.weak OPA_IRQHandler /* OPA */
.weak USBPD_IRQHandler /* USBPD */
.weak USBPDWakeUp_IRQHandler /* USBPD Wake Up */
.weak CMPWakeUp_IRQHandler /* CMP Wake Up */
NMI_Handler:
HardFault_Handler:
Ecall_M_Mode_Handler:
Ecall_U_Mode_Handler:
Break_Point_Handler:
SysTick_Handler:
SW_Handler:
WWDG_IRQHandler:
PVD_IRQHandler:
TAMPER_IRQHandler:
RTC_IRQHandler:
FLASH_IRQHandler:
RCC_IRQHandler:
EXTI0_IRQHandler:
EXTI1_IRQHandler:
EXTI2_IRQHandler:
EXTI3_IRQHandler:
EXTI4_IRQHandler:
DMA1_Channel1_IRQHandler:
DMA1_Channel2_IRQHandler:
DMA1_Channel3_IRQHandler:
DMA1_Channel4_IRQHandler:
DMA1_Channel5_IRQHandler:
DMA1_Channel6_IRQHandler:
DMA1_Channel7_IRQHandler:
ADC_IRQHandler:
USB_HP_CAN1_TX_IRQHandler:
USB_LP_CAN1_RX0_IRQHandler:
CAN1_RX1_IRQHandler:
CAN1_SCE_IRQHandler:
EXTI9_5_IRQHandler:
TIM1_BRK_IRQHandler:
TIM1_UP_IRQHandler:
TIM1_TRG_COM_IRQHandler:
TIM1_CC_IRQHandler:
TIM2_IRQHandler:
TIM3_IRQHandler:
TIM4_IRQHandler:
I2C1_EV_IRQHandler:
I2C1_ER_IRQHandler:
I2C2_EV_IRQHandler:
I2C2_ER_IRQHandler:
SPI1_IRQHandler:
SPI2_IRQHandler:
USART1_IRQHandler:
USART2_IRQHandler:
USART3_IRQHandler:
EXTI15_10_IRQHandler:
RTCAlarm_IRQHandler:
LPTIMWakeUp_IRQHandler:
USBFS_IRQHandler:
USBFSWakeUp_IRQHandler:
USART4_IRQHandler:
DMA1_Channel8_IRQHandler:
LPTIM_IRQHandler:
OPA_IRQHandler:
USBPD_IRQHandler:
USBPDWakeUp_IRQHandler:
CMPWakeUp_IRQHandler:
1:
j 1b
.section .text.handle_reset,"ax",@progbits
.weak handle_reset
.align 1
handle_reset:
.option push
.option norelax
la gp, __global_pointer$
.option pop
1:
la sp, _eusrstack
2:
/* Load data section from flash to RAM */
la a0, _data_lma
la a1, _data_vma
la a2, _edata
bgeu a1, a2, 2f
1:
lw t0, (a0)
sw t0, (a1)
addi a0, a0, 4
addi a1, a1, 4
bltu a1, a2, 1b
2:
/* Clear bss section */
la a0, _sbss
la a1, _ebss
bgeu a0, a1, 2f
1:
sw zero, (a0)
addi a0, a0, 4
bltu a0, a1, 1b
2:
/* Configure pipelining and instruction prediction */
li t0, 0x1f
csrw 0xbc0, t0
/* Enable interrupt nesting and hardware stack */
li t0, 0x3
csrw 0x804, t0
/* Enable global interrupt and configure privileged mode */
li t0, 0x88
csrw mstatus, t0
/* Configure the interrupt vector table recognition mode and entry address mode */
la t0, _vector_base
ori t0, t0, 3
csrw mtvec, t0
jal SystemInit
la t0, main
csrw mepc, t0
mret

View File

@ -0,0 +1,38 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_conf.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : Library configuration file.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_CONF_H
#define __CH32L103_CONF_H
#include "ch32l103_adc.h"
#include "ch32l103_bkp.h"
#include "ch32l103_can.h"
#include "ch32l103_crc.h"
#include "ch32l103_dbgmcu.h"
#include "ch32l103_dma.h"
#include "ch32l103_exti.h"
#include "ch32l103_flash.h"
#include "ch32l103_gpio.h"
#include "ch32l103_i2c.h"
#include "ch32l103_iwdg.h"
#include "ch32l103_pwr.h"
#include "ch32l103_rcc.h"
#include "ch32l103_rtc.h"
#include "ch32l103_spi.h"
#include "ch32l103_tim.h"
#include "ch32l103_usart.h"
#include "ch32l103_wwdg.h"
#include "ch32l103_it.h"
#include "ch32l103_misc.h"
#include "ch32l103_lptim.h"
#include "ch32l103_opa.h"
#endif

View File

@ -0,0 +1,47 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_it.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/10/30
* Description : Main Interrupt Service Routines.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103_it.h"
void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
/*********************************************************************
* @fn NMI_Handler
*
* @brief This function handles NMI exception.
*
* @return none
*/
void NMI_Handler(void)
{
while (1)
{
}
}
/*********************************************************************
* @fn HardFault_Handler
*
* @brief This function handles Hard Fault exception.
*
* @return none
*/
void HardFault_Handler(void)
{
NVIC_SystemReset();
while (1)
{
}
}

View File

@ -0,0 +1,17 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : ch32l103_it.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : This file contains the headers of the interrupt handlers.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH32L103_IT_H
#define __CH32L103_IT_H
#include "debug.h"
#endif

50
ZDBMS/BMS_CC/User/main.c Normal file
View File

@ -0,0 +1,50 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/12/26
* Description : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
/*
*@Note
*USART Print debugging routine:
*USART1_Tx(PA9).
*This example demonstrates using USART1(PA9) as a print debug port output.
*
*/
#include "debug.h"
/* Global typedef */
/* Global define */
/* Global Variable */
/*********************************************************************
* @fn main
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
while(1)
{
Delay_Ms(1000);
printf("This is printf example cc\r\n");
}
}

View File

@ -0,0 +1,754 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : system_ch32l103.c
* Author : WCH
* Version : V1.0.0
* Date : 2024/01/22
* Description : Device Peripheral Access Layer System Source File.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32l103.h"
/*
* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after
* reset the HSI is used as SYSCLK source).
* If none of the define below is enabled, the HSI is used as System clock source.
*/
//#define SYSCLK_FREQ_HSE HSE_VALUE
//#define SYSCLK_FREQ_48MHz_HSE 48000000
//#define SYSCLK_FREQ_56MHz_HSE 56000000
//#define SYSCLK_FREQ_72MHz_HSE 72000000
//#define SYSCLK_FREQ_96MHz_HSE 96000000
//#define SYSCLK_FREQ_HSI HSI_VALUE
//#define SYSCLK_FREQ_48MHz_HSI 48000000
//#define SYSCLK_FREQ_56MHz_HSI 56000000
//#define SYSCLK_FREQ_72MHz_HSI 72000000
#define SYSCLK_FREQ_96MHz_HSI 96000000
//#define SYSCLK_FREQ_HSI_LP HSI_LP_VALUE /* Baud rate support less than 62.5Kbps when using UART */
/* Clock Definitions */
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSE; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz_HSE; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSE; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_96MHz_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz_HSE; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz_HSI
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSI; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz_HSI
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz_HSI; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz_HSI
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSI; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_96MHz_HSI
uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz_HSI; /* System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_HSI_LP
uint32_t SystemCoreClock = SYSCLK_FREQ_HSI_LP; /* System Clock Frequency (Core Clock) */
#else
uint32_t SystemCoreClock = HSI_VALUE; /* System Clock Frequency (Core Clock) */
#endif
__I uint8_t HBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
/* system_private_function_proto_types */
static void SetSysClock(void);
#ifdef SYSCLK_FREQ_HSE
static void SetSysClockToHSE( void );
#elif defined SYSCLK_FREQ_48MHz_HSE
static void SetSysClockTo48_HSE( void );
#elif defined SYSCLK_FREQ_56MHz_HSE
static void SetSysClockTo56_HSE( void );
#elif defined SYSCLK_FREQ_72MHz_HSE
static void SetSysClockTo72_HSE( void );
#elif defined SYSCLK_FREQ_96MHz_HSE
static void SetSysClockTo96_HSE( void );
#elif defined SYSCLK_FREQ_48MHz_HSI
static void SetSysClockTo48_HSI( void );
#elif defined SYSCLK_FREQ_56MHz_HSI
static void SetSysClockTo56_HSI( void );
#elif defined SYSCLK_FREQ_72MHz_HSI
static void SetSysClockTo72_HSI( void );
#elif defined SYSCLK_FREQ_96MHz_HSI
static void SetSysClockTo96_HSI( void );
#elif defined SYSCLK_FREQ_HSI_LP
static void SetSysClockToHSI_LP( void );
#endif
/*********************************************************************
* @fn SystemInit
*
* @brief Setup the microcontroller system Initialize the Embedded Flash Interface,
* the PLL and update the SystemCoreClock variable.
*
* @return none
*/
void SystemInit (void)
{
RCC->CTLR |= (uint32_t)0x00000001;
RCC->CFGR0 &= (uint32_t)0x08FF0000;
RCC->CTLR &= (uint32_t)0xFEF6FFFB;
RCC->CTLR &= (uint32_t)0xFFFBFFFF;
RCC->CFGR0 &= (uint32_t)0xFF00FFFF;
RCC->INTR = 0x009F0000;
SetSysClock();
}
/*********************************************************************
* @fn SystemCoreClockUpdate
*
* @brief Update SystemCoreClock variable according to Clock Register Values.
*
* @return none
*/
void SystemCoreClockUpdate (void)
{
uint32_t tmp = 0, pllmull = 0, pllsource = 0;
tmp = RCC->CFGR0 & RCC_SWS;
switch (tmp)
{
case 0x00:
if(RCC->CTLR & (1<<2))
{
SystemCoreClock = HSI_LP_VALUE;
}
else {
SystemCoreClock = HSI_VALUE;
}
break;
case 0x04:
SystemCoreClock = HSE_VALUE;
break;
case 0x08:
pllmull = RCC->CFGR0 & RCC_PLLMULL;
pllsource = RCC->CFGR0 & RCC_PLLSRC;
pllmull = ( pllmull >> 18) + 2;
if(pllmull == 17) pllmull = 18;
if (pllsource == 0x00)
{
if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE){
SystemCoreClock = HSI_VALUE * pllmull;
}
else{
SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
}
}
else
{
if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)
{
SystemCoreClock = (HSE_VALUE >> 1) * pllmull;
}
else
{
SystemCoreClock = HSE_VALUE * pllmull;
}
}
break;
default:
SystemCoreClock = HSI_VALUE;
break;
}
tmp = HBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)];
SystemCoreClock >>= tmp;
}
/*********************************************************************
* @fn SetSysClock
*
* @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClock(void)
{
GPIO_IPD_Unused();
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_48MHz_HSE
SetSysClockTo48_HSE();
#elif defined SYSCLK_FREQ_56MHz_HSE
SetSysClockTo56_HSE();
#elif defined SYSCLK_FREQ_72MHz_HSE
SetSysClockTo72_HSE();
#elif defined SYSCLK_FREQ_96MHz_HSE
SetSysClockTo96_HSE();
#elif defined SYSCLK_FREQ_48MHz_HSI
SetSysClockTo48_HSI();
#elif defined SYSCLK_FREQ_56MHz_HSI
SetSysClockTo56_HSI();
#elif defined SYSCLK_FREQ_72MHz_HSI
SetSysClockTo72_HSI();
#elif defined SYSCLK_FREQ_96MHz_HSI
SetSysClockTo96_HSI();
#elif defined SYSCLK_FREQ_HSI_LP
SetSysClockToHSI_LP();
#endif
/* If none of the define above is enabled, the HSI is used as System clock
* source (default after reset)
*/
}
#ifdef SYSCLK_FREQ_HSE
/*********************************************************************
* @fn SetSysClockToHSE
*
* @brief Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockToHSE(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Flash 0 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_0;
RCC->CTLR |= ((uint32_t)RCC_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CTLR & RCC_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CTLR & RCC_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;
/* Select HSE as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_HSE;
/* Wait till HSE is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04)
{
}
}
else
{
/* Flash 0 wait state */
FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
/* If HSE fails to start-up, the application will have wrong clock
* configuration. User can add here some code to deal with this error
*/
}
}
#elif defined SYSCLK_FREQ_48MHz_HSE
/*********************************************************************
* @fn SetSysClockTo48_HSE
*
* @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo48_HSE(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Flash 1 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_1;
RCC->CTLR |= ((uint32_t)RCC_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CTLR & RCC_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CTLR & RCC_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 6 = 48 MHz (HSE=8MHZ) */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
else
{
/* Flash 0 wait state */
FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
/* If HSE fails to start-up, the application will have wrong clock
* configuration. User can add here some code to deal with this error
*/
}
}
#elif defined SYSCLK_FREQ_56MHz_HSE
/*********************************************************************
* @fn SetSysClockTo56_HSE
*
* @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo56_HSE(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Flash 1 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_1;
RCC->CTLR |= ((uint32_t)RCC_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CTLR & RCC_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CTLR & RCC_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 7 = 56 MHz (HSE=8MHZ) */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
else
{
/* Flash 0 wait state */
FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
/* If HSE fails to start-up, the application will have wrong clock
* configuration. User can add here some code to deal with this error
*/
}
}
#elif defined SYSCLK_FREQ_72MHz_HSE
/*********************************************************************
* @fn SetSysClockTo72_HSE
*
* @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo72_HSE(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Flash 1 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_1;
RCC->CTLR |= ((uint32_t)RCC_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CTLR & RCC_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CTLR & RCC_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz (HSE=8MHZ) */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
else
{
/* Flash 0 wait state */
FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
/* If HSE fails to start-up, the application will have wrong clock
* configuration. User can add here some code to deal with this error
*/
}
}
#elif defined SYSCLK_FREQ_96MHz_HSE
/*********************************************************************
* @fn SetSysClockTo96_HSE
*
* @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo96_HSE(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Flash 2 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_2;
RCC->CTLR |= ((uint32_t)RCC_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CTLR & RCC_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CTLR & RCC_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8MHZ) */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
else
{
/* Flash 0 wait state */
FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
/* If HSE fails to start-up, the application will have wrong clock
* configuration. User can add here some code to deal with this error
*/
}
}
#elif defined SYSCLK_FREQ_48MHz_HSI
/*********************************************************************
* @fn SetSysClockTo48_HSI
*
* @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo48_HSI(void)
{
/* Flash 1 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_1;
EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSI * 6 = 48 MHz */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
#elif defined SYSCLK_FREQ_56MHz_HSI
/*********************************************************************
* @fn SetSysClockTo56_HSI
*
* @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo56_HSI(void)
{
/* Flash 1 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_1;
EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSI * 7 = 56 MHz */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
#elif defined SYSCLK_FREQ_72MHz_HSI
/*********************************************************************
* @fn SetSysClockTo72_HSI
*
* @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo72_HSI(void)
{
/* Flash 1 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_1;
EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSI * 9 = 72 MHz */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
#elif defined SYSCLK_FREQ_96MHz_HSI
/*********************************************************************
* @fn SetSysClockTo96_HSI
*
* @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
*
* @return none
*/
static void SetSysClockTo96_HSI(void)
{
/* Flash 2 wait state */
FLASH->ACTLR = (uint32_t)FLASH_ACTLR_LATENCY_2;
EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSI * 12 = 96 MHz */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12);
/* Enable PLL */
RCC->CTLR |= RCC_PLLON;
/* Wait till PLL is ready */
while((RCC->CTLR & RCC_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));
RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
{
}
}
#elif defined SYSCLK_FREQ_HSI_LP
/*********************************************************************
* @fn SetSysClockToHSI_LP
*
* @brief Sets HSI as System clock source of Low power and configure HCLK, PCLK2 and PCLK1 prescalers.
* In this mode, HSI is 1MHz and Baud rate support less than 62.5Kbps when using UART.
*
* @return none
*/
static void SetSysClockToHSI_LP(void)
{
RCC_HSI_LP_Cmd(ENABLE);
/* HCLK = SYSCLK */
RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;
/* Low power mode HSI */
RCC_AdjustHSICalibrationValue((*(uint8_t*)HSI_LP_TRIM_BASE)&0x1F);
}
#endif

View File

@ -0,0 +1,29 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : system_ch32l103.h
* Author : WCH
* Version : V1.0.0
* Date : 2023/07/08
* Description : CH32L103 Device Peripheral Access Layer System Header File.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __SYSTEM_ch32l103_H
#define __SYSTEM_ch32l103_H
#ifdef __cplusplus
extern "C" {
#endif
extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */
/* System_Exported_Functions */
extern void SystemInit(void);
extern void SystemCoreClockUpdate(void);
#ifdef __cplusplus
}
#endif
#endif

BIN
ZDBMS/BMS_CC/obj/BMS_CC.elf Normal file

Binary file not shown.

488
ZDBMS/BMS_CC/obj/BMS_CC.hex Normal file
View File

@ -0,0 +1,488 @@
:040000006F00C0408D
:100004000000000000000000480200004A02000056
:10001400000000000A0400000000000000000000CE
:100024000A0400000A0400000000000000000000B0
:100034000A040000000000000A04000000000000A0
:100044000A0400000A0400000A0400000A04000074
:100054000A0400000A0400000A0400000A04000064
:100064000A0400000A0400000A0400000A04000054
:100074000A0400000A0400000A0400000A04000044
:100084000A0400000A0400000A0400000A04000034
:100094000A0400000A0400000A0400000A04000024
:1000A4000A0400000A0400000A0400000A04000014
:1000B4000A0400000A0400000A0400000A04000004
:1000C4000A0400000A0400000A0400000A040000F4
:1000D4000A0400000A0400000A0400000A040000E4
:1000E4000A0400000A0400000A0400000A040000D4
:1000F4000A0400000A0400000A0400000A040000C4
:100104000A0400000A040000000000000A040000C1
:100114000A040000000000000000000000000000CD
:1001240000000000000000000000000000000000CB
:0C013400000000000000000000000000BF
:10014000397101436EC619A0397141536AC866CA34
:1001500062CC5ECE19A0397101535AD056D252D416
:100160004ED64AD826DA22DC06DE3301614082828E
:1001700041114AC026C222C406C68282B24D410144
:10018000024D924C224CB24B4101024B924A224A00
:10019000B2494101024992442244B2404101828065
:1001A0003D432A876373C3029377F700BDEFADE544
:1001B000937606FF3D8ABA960CC34CC30CC74CC756
:1001C0004107E36BD7FE11E28280B306C3408A0683
:1001D0009702000096966780A6002307B700A30643
:1001E000B7002306B700A305B7002305B700A30493
:1001F000B7002304B700A303B7002303B700A3028B
:10020000B7002302B700A301B7002301B700A30082
:10021000B7002300B700828093F5F50F9396850011
:10022000D58D93960501D58D61B7939627009702DA
:10023000000096968682E78086FA9680C1171D8F09
:100240003E96E374C3F8A5B701A0B707EFBE37E742
:1002500000E0938707083CC701A0EFF27FF1054556
:10026000DD231122EF00E07B716513050520EF000F
:10027000B000B707002083A5070837250000130545
:1002800005CEEF00900A3124AA853725000013051A
:1002900005CFEF009009372400001305803EEF00E2
:1002A000407A130504D0EF009019C5BFEFF25FEC60
:1002B000371402401C403707FF0893E717001CC0A3
:1002C0005C40F98F5CC01C403707F7FE6D17F98F53
:1002D0001CC01C403707FCFF7D17F98F1CC05C4019
:1002E000370701FF7D17F98F5CC0B7079F001CC45B
:1002F000512EB7270240094798C33747024083274A
:10030000078093E707012320F7805C403707C1FF90
:100310007D175CC05C405CC05C4093E707405CC0FC
:100320005C40F98F5CC05C4037072800D98F5CC007
:100330001C4037070001D98F1CC0B71702409843F3
:1003400093166700E3DD06FED843B7160240719BA3
:10035000D8C3D84313672700D8C32147DC42B18BE9
:10036000E39EE7FE05BDB7160240DC4237070020DA
:100370001146B18B13070708638FC70221466381BB
:10038000C70495EB9C42918B9DC7B7470F0093879D
:1003900007241CC3B7170240DC43918393F6F70090
:1003A000B707002093870700B69794231C43B3D761
:1003B000D7001CC38280B7177A0093870720D1BF6C
:1003C000DC42D4424166C983BD8BF18E8907454624
:1003D0006393C700C94781EEB746024083A60680F3
:1003E000C18A89CEB7167A009386062021A8B7164F
:1003F0000240D4421396E600E35606FEB7163D00CF
:1004000093860690B387D70269B701A097010020B1
:1004100093814147175100201301C1BE17250000E9
:100420001305C599970500209385C5BD1386818165
:1004300063FAC5008322050023A05500110591052C
:10044000E3EAC5FE13858181938501846377B50056
:10045000232005001105E36DB5FEFD42739002BC3B
:100460008D4273904280930280087390023097020D
:100470000000938262B993E2320073905230EFF041
:10048000FFE297020000938282DD739012347300C2
:10049000203003A5C18182809C4513F7070113F822
:1004A000F70001C7D8413368E8008E2113F7F50F34
:1004B00039C318418146854E3D4F930F8002930208
:1004C0008004214E3396DE00B3F8C5006311160395
:1004D0009398260033131F011343F3FF3377E30090
:1004E000B318180133E7E800639FF70550C9850684
:1004F000E39AC6FD18C11307F00F6375B7045441A2
:100500002146854E3D4F930F800293028004414E59
:10051000B398CE0033F715016392E8021317260053
:1005200001173313EF001343F3FFB376D3003317F0
:10053000E800D98E639DF701232A15010506E3190A
:10054000C6FD54C18280E39457FA10C94DB7E397B2
:1005500057FE23281501DDB7370700C0B377E50044
:100560006395E708370701405C439356B501584F40
:100570009D8A9DE6F99BB70600FFFD16758F89C918
:1005800093160501C182D58FB706FF01758D498F7E
:10059000B7060007D58FB7060140DCC2D8CE8280EF
:1005A00005466396C600F59BB70680FFF9B7094676
:1005B0006396C600ED9BB706E8FFC1B70D4663968C
:1005C000C600DD9BB706FCFF4DBF11466397C60012
:1005D00093F7F7F3B706C0FF4DB71546E391C6FA98
:1005E00093F7F7CFB706E0FF49BF370700406391A5
:1005F000E702B7070140D84F4205B367A70089E576
:100600001345F5FFB377E500370701405CCF8280E3
:10061000A9E337080140B707300003264800131745
:100620000501B376F50041836396F602B70600F93B
:10063000FD16B377D60003264800F18E2322D8009A
:1006400091C5558112053315A700C98F37070140A1
:100650005CC382809317B50063D0070293570501EE
:1006600093F6F7008D47B397D70093C7F7FFF18F45
:10067000B7060007D58FE9B7935755019207B3170F
:10068000F700E5B7EFF2DFAE37F4FF1F0327447240
:100690003706003E4111931797019346F7FFF18FFC
:1006A000060737063E00718FD98F37060001139772
:1006B0009600718FD98FBD824167F98E02C202C444
:1006C00002C6D58F23A0F182035784728545239CEF
:1006D000E180032704721305D00323A2E1820327DC
:1006E000447023AEE180035704732394E182152CF8
:1006F0008327447037073A101307077093F7F7F012
:100700006383E710636AF700370732101307077037
:10071000638FE7064101BDBC37073B101307077025
:10072000638BE70837073D1013070770E394E7FE74
:1007300085452165153537140140E1779304800420
:100740004C00130504807C8226C6B93385679387E5
:1007500087334C00130504C07C8226C6353B914785
:100760007C824C0093078002130504C03EC62D33E3
:10077000F9774C00371501407C8226C6313B8D4706
:100780007C8226C64C0013050440393361B7E177FB
:100790003715014093C707C0130480044C001305AC
:1007A00005C07C8222C6CD3989677C8222C64C0076
:1007B00037150140D9BF85452165793B3714014084
:1007C000E177930480044C00130504807C8226C6E4
:1007D000E131930700214C00130504C07C8226C63A
:1007E000653991477C824C0093078002130504C051
:1007F0003EC65D31F9774C00371501407C8226C634
:1008000061398947B5BFB7140140E1779387077015
:10081000130480044C00138504807C8222C6AD3909
:10082000930790E34C00138504C07C8222C6AD314F
:1008300091477C824C0093078002138504C03EC61A
:10084000A139F9779DB723A6A1828280371702408C
:100850005C439146B18B638CD706A146638ED70665
:10086000BDE71C43918BA5C7B7470F0093870724AB
:100870001CC1371602405C423707002013070701EE
:100880009183BD8BBA9794231C41B3D7D7005CC129
:100890005442A1829D8ABA969422B3D6D70014C539
:1008A0005442AD829D8A36971423B3D6D70054C5DF
:1008B0005842634C07005C42B98313F737009387B3
:1008C0004180BA979C23B3D7F6021CC98280B71720
:1008D0007A009387072069BF5C435843C166C98388
:1008E000BD8B758F8907C5466393D700C94701EF54
:1008F0003747024003270780418B09CF37177A001B
:100900001307072021A83717024058439316E70022
:10091000E3D606FE37173D0013070790B387E702BB
:1009200081BF99C5371702401C4F5D8D08CF82806B
:10093000B7170240984F1345F5FF798D88CF828015
:10094000EFF21F831629F577FD17F58FF621DA25CB
:100950007971D58F1EA95625FD779387379FF58F1F
:10096000D6212A842EC6D58F9625D58FB625D58F2C
:100970005EA55E29C207C18393F7F7CFD98F5EA921
:100980006808E935B747014093870780B245631A85
:10099000F404A25756246547B387E702C206C1860E
:1009A000984163D20604060752244206B3D7E702F1
:1009B000130740064186B3D6E702B3F7E702920673
:1009C000635506028E0793872703B3D7E70213F711
:1009D0007700B367D700C207C1831EA445616FF0DB
:1009E0006FFB925745BF0A07C1B79207938727034A
:1009F000B3D7E702BD8BD58FF9BF91C55E250967D7
:100A0000D98F5EA582805A25F977FD17F98FD5BF5A
:100A100093F5F51F4EA182800A216D8D3335A0001C
:100A20008280B707002083A707080967130707F428
:100A3000B3D7E702C207C1832399F1822398F182D9
:100A40008280B7F700E0D8438146799BD8C303D7AB
:100A500001833306A70290CBD4CB984313670701D9
:100A600098C398431367170298C3D843058B75DF63
:100A70009843799B98C38280EFF28FEF2A841165A7
:100A8000011185451105713D930700207C823715C2
:100A900001408D473EC44C00E147130505803EC62A
:100AA000E53A22C837440140B70708000C0813058F
:100AB00004803ECC02CA231E01005935854513052A
:100AC0000480253F05616FF0EFECEFF2CFE8B7440B
:100AD0000140AE8932890144938404806345240136
:100AE0004A856FF08FEA930500042685353765DD6A
:100AF000B38789008385070026850504C205C18167
:100B0000013FE9BF138781801C43938601843E9592
:100B1000636BD500B75600209386068063E5A60078
:100B200008C33E858280FD57EDBF39713EDA2ED273
:100B300032D436D63AD842DC46DE9387C18022CC06
:100B4000804326CA06CEAA8409C41C4C99E3228598
:100B5000ED290C4454102686228536C6EF0070120B
:100B6000F2406244D24421618280011126CA4AC8FF
:100B700006CE22CC4EC652C4AA842E8901C51C4D75
:100B800091E3E1219C4C804499E326857D299717C8
:100B900000009387E71A631BF402C0405E24A18B18
:100BA000B1C71C48A1C7FD59294A1C448345090007
:100BB000FD17B1E91CC463DD07062286A945268519
:100BC0006120FD576308F502294535A097170000FD
:100BD000938707196314F4008044C9B7971700007E
:100BE00093870714E31CF4FAC0444DBFA285268501
:100BF000112A55D97D55F2406244D2444249B24946
:100C0000224A056182801CC4050963D70700184C7D
:100C100063CAE700638845011C401387170018C0AA
:100C20008CA361B7228626850520E31035F9D9B754
:100C30001C401387170018C0294798A371B79387E2
:100C4000C180AA85884315B7011122CC26CA4AC89B
:100C500006CE4EC6AA842E89328401C51C4D91E36E
:100C6000ED26971700009387A70D6317F406C04081
:100C70001C4C1CC45E24A18BC1C31C48B5CF1C48AE
:100C800008409379F90F1379F90F1D8D5C4863467D
:100C9000F500A2852685692C25E51C440505FD1770
:100CA0001CC41C401387170018C0238037015C4800
:100CB0006388A7005E24858B81CBA9476316F90062
:100CC000A2852685B5240DEDF24062444A85D244C2
:100CD0004249B2490561828097170000938747080F
:100CE0006314F400804469B79717000093874703A3
:100CF000E310F4F8C044ADBFA2852685212041D180
:100D00007D59D9B741119387C18026C2844322C43B
:100D10004AC006C62A892E8489C49C4C99E326853C
:100D20002D26971700009387A701631BF402C0408C
:100D30000317C40093170701C18393F68700ADEA38
:100D400093F6070195EEA5472320F90013670704E2
:100D50005AA47D55B2402244924402494101828006
:100D6000971700009387C7FF6314F4008044C9B746
:100D7000971700009387C7FAE31CF4FAC0444DBFED
:100D8000918B9DC34C5889C9930744046384F50033
:100D90004A853123232A04025E242322040093F788
:100DA000B7FD5EA41C481CC05E2493E787005EA4C8
:100DB0001C4899EB5E241307002093F707286385EE
:100DC000E700A2854A85A1215E2413F717001DC301
:100DD0005C4823240400B307F0401CCC1C480145A8
:100DE000B5FB8317C40013F707082DD793E7070453
:100DF0005EA485B7898B014791E3584818C4F9BFB1
:100E0000DE25011122CC26CA06CE4AC84EC613F7EB
:100E10008700AA842E8479EBD841634DE000B84165
:100E2000634AE0000145F2406244D2444249B2497B
:100E30000561828058547DD703A904009396370139
:100E400023A0040063DB060670485E24918B99C7DB
:100E50005C401D8E5C5899C33C401D8E5C540C5008
:100E6000814626858297FD575A24631DF5009440DC
:100E7000F54763E8D706B70740208507B3D7D70003
:100E8000858BA5C31C48232204001CC0931737017F
:100E900063D80700FD576314F5009C4091E368C8D0
:100EA0004C5823A02401BDDD930744046384F5005E
:100EB0002685F526232A0402B5B70C50014685463F
:100EC00026850297FD572A86E311F5F89C40B5DF89
:100ED00075476385E70059476393E70423A024011E
:100EE00091B7136707045AA47D5535BF83A905013F
:100EF000E38A09F203A905008D8B23A0350133098C
:100F00003941014791E3D84918C4E35D20F11C54ED
:100F10000C50CA864E86268582976347A0005E24C1
:100F200093E707045EA4C9B7AA993309A940F1BFA2
:100F30009C49B9CF011122CC06CE2A8411C51C4D83
:100F400081E72EC61922B24597170000938747DF25
:100F5000639BF5004C408397C50095C7228562448A
:100F6000F240056171BD97170000938767DF6394B6
:100F7000F5000C44CDB797170000938767DAE39C20
:100F8000F5FC4C44C9BFF2406244014505618280D2
:100F900001458280411122C406C62A844EA572A54D
:100FA0002320050023220500232405002322050613
:100FB00023280500232A0500232C0500214681450E
:100FC0001305C505EFF0CF9D97170000938747B134
:100FD0005CD097170000938767B31CD49717000065
:100FE000938747B75CD4971700009387A7B900D0C1
:100FF0001CD8B240224441018280970500009385AD
:1010000065F3A9A2411126C2130680069384F5FF59
:10101000B384C4024AC02E8922C406C693854407FD
:101020001D262A8401CD2320050023222501310518
:1010300008C4138684068145EFF08F962285B2405E
:10104000224492440249410182801C4DADE341118A
:1010500006C622C497070000938767FA1CD59387BA
:1010600001819C4323240504232605042328050429
:101070006314F50085471CCD2A841D2848C02285AD
:10108000052808C422852D2048C4484001469145C2
:10109000113708440546A545F53D48440946C9456C
:1010A000D53D85471CCCB2402244410182808280DC
:1010B00041119387018126C284434AC006C69C4CD5
:1010C00022C42A8999E3268549379384840480447D
:1010D000DC40FD1763D607009C40B9CF8440C5BFF4
:1010E0000317C40039E7C1778507232204062320AC
:1010F000040023220400232404005CC423280400E9
:10110000232A0400232C0400214681451305C4052D
:10111000EFF00F89232A0402232C04022324040461
:10112000232604042285B24022449244024941010C
:1011300082801304840671BF91454A85E13588C0D9
:1011400051FDB1472320F9000144E9BF797122D450
:101150004AD052CC56CA5AC85EC606D626D24ECE01
:101160002A8AAE8A130485040149054BFD5B09EC0C
:10117000B25022544A8592540259F249624AD24AE4
:10118000424BB24B45618280044483294400FD19DF
:1011900063D409000040E1BFDE24637BFB0083973A
:1011A000E40063877701A6855285829A3369A90096
:1011B00093848406E9BF1971A6DAAE848395E500AD
:1011C000A2DC86DE328463DB0500DE2423A0060079
:1011D00093F7070885E7930700401DA0300836C63F
:1011E000EF00D01FB246E34205FE7247BD67F98F9C
:1011F0007977BA9793B717009CC2F1BF93070004A1
:101200001CC0F6506654D654014509618280DE2523
:10121000011122CC06CE26CA4AC8898B2E8489CFDA
:10122000930774041CC01CC885475CC8F240624424
:10123000D24442490561828074003000AA84A53FEF
:10124000A2452A892685012219E98317C40013F7CC
:10125000072069FFF19B93E727005EA4D1B79707AA
:1012600000009387C7D99CD45E2408C008C893E7C0
:1012700007085EA4A2475CC8B24781CF8315E4008B
:101280002685EF00501811C55E24F19B93E71700E7
:101290005EA45E243369F9002316240141BFDDC139
:1012A00083A7C5FF411122C406C626C21384C5FF09
:1012B00063D307003E94AA84EF00B01B9387418359
:1012C0009C4381EF2322040023AA81822244B2405E
:1012D0002685924441016F00F019637EF4001440AA
:1012E0003307D4006396E7009843DC43369718C071
:1012F0005CC0D9BFBA87D84319C3E37DE4FE9443E9
:101300003386D700631F86001040B29694C333869D
:10131000D700E31DC7FA10435843B29694C3D8C30D
:1013200075B76375C400B1479CC04DB71040B30694
:10133000C4006316D70014435843B29614C058C073
:10134000C0C369B78280011126CA93843500F19821
:1013500006CE22CC4AC84EC6A104B14763F3F404BA
:10136000B14463E2B4042A89EF00B010938741834B
:1013700098433A8439E0938781839C4391E7814580
:101380004A85052F23ACA182A6854A851D27FD59D4
:1013900063193507B1472320F9004A85EF00900D06
:1013A00029A0E3D004FCB1471CC10145F2406244CE
:1013B000D2444249B249056182801C40858F63CF87
:1013C0000702AD4663F6F6001CC03E9404C031A08F
:1013D0005C406313870223AAF1824A85EF009009DB
:1013E0001305B4009307440061993307F5405DDFAE
:1013F0003A94898F1CC05DBF5CC3C5B7228740404B
:1014000095BF130435007198E30285FCB305A44031
:101410004A854525E31C35FBB5BF1C46FD171CC698
:1014200063DA0700184E63C5E700A9476394F50027
:101430006FF09F811C422E851387170018C28CA362
:101440008280011122CC26CA4AC84EC652C406CE9A
:101450002A89AE893284B304D6007D5A631494007D
:10146000014501A80C204E864A85453F0504E31737
:1014700045FFF2406244D2444249B249224A0561E2
:101480008280357122CD26CB4AC94EC706CF52C5C0
:1014900056C35AC1DEDEE2DCE6DAAA89AE843289BE
:1014A000368401C51C4D91E34D3697170000938794
:1014B00027896397F40C83A44900DE24A18BFDC324
:1014C0009C48EDC393070002A304F10293070003B5
:1014D00002D22305F10222C6930B5002971A000094
:1014E000938A0A8A054C294B4A841C2099C3639E1F
:1014F000770DB30C2441638D0C00E6864A86A685E1
:101500004E858137FD57630FF51C9256E69636D20D
:101510001C206389071CFD571309140002C802CE62
:101520003ECA02CCA309010482D4834509001546B2
:101530005685252713041900C24751E913F70701FF
:1015400009C713070002A309E10413F7870009C7BD
:101550001307B002A309E104834609001307A002A0
:10156000638FE606F2474A84814625461820930594
:101570001400130707FD6377E60AB5CA3ECE85A8B7
:10158000970700009387C77D6395F40083A48900C3
:101590002DB7970700009387A778E390F4F283A410
:1015A000C90021BFA6854E85EFF0CFF501DD7D5541
:1015B000FA406A44DA444A49BA492A4A9A4A0A4BE2
:1015C000F65B665CD65C0D618280050439BF33052D
:1015D00055413315AC00C98F3EC82289B9B732478F
:1015E00093064700184336C6634707023ACE1820D1
:1015F0009307E002631DF70418309307A002631BF2
:10160000F702B2470904138747009C433AC663C1F7
:1016100007023ECA2DA83307E04093E727003ACEE1
:101620003EC8F1B7B387670385462E84BA973DBF9E
:10163000FD57C5B7050402CA8146814725461820D3
:1016400093051400130707FD6374E606F9F20C20F6
:101650000D461705000013052573012511CD9707C9
:101660000000938767721D8D93070004B397A7004E
:10167000424505045D8D2AC80C2019461705000057
:101680001305C570130914002304B102F92335C1F1
:1016900097F7FFFF9387079795E74247B24713777E
:1016A000071009CF91073EC69257D2973ED22DBD63
:1016B000B387670385462E84BA9751B79D07E19B90
:1016C000A107D5B77800970600009386C6D726866F
:1016D0000C084E8597000000E7000000FD572A8A9D
:1016E000E314F5FCDE2493F70704E39207EC1255AC
:1016F000C1B57800970600009386E6D426860C08CC
:101700004E85012AE1BF797156CA9C49BA8A98452B
:1017100022D426D24ECE52CC06D64AD05AC85EC665
:10172000AA892E84B284368A63D3E700BA879CC024
:101730000347340419C385079CC01C4093F7070274
:1017400081C79C4089079CC0032904001379690064
:10175000631A0900130B9401FD5B5C449840998F58
:10176000634CF9041C408346340493F70702B336F4
:10177000D000A5EB13063404D2854E85829AFD571E
:101780006303F5041C4011469840998B54448144EE
:101790006397C700B384E64063D3040081441C44CC
:1017A00018486354F700998FBE94014969047D5B22
:1017B00063982405014509A885465A86D2854E8539
:1017C000829A631E75017D55B2502254925402597B
:1017D000F249624AD24A424BB24B456182800509C6
:1017E000ADBF3307D40013060003A301C7040347AA
:1017F000540493871600A2978906A381E7049DBF2E
:1018000085462286D2854E85829AE30E65FB0509C0
:1018100045B7797122D426D24AD04ECE06D652CCC4
:1018200056CA5AC8B689942D930790063289AA845D
:101830002E8413863504638DF60263E2D706930780
:1018400080056385F61863EDD700638D0620930746
:101850003004638EF60A930A24042301D404C9A039
:10186000930730066385F60A93074006E395F6FE74
:101870001C40084393F6070893054500C5C61C4164
:101880000CC363D807001307D002B307F040A301CD
:10189000E404970600009386E64F294765A893075E
:1018A00000076381F61663E5D7029307E0066388B5
:1018B000F6189307F006E390F6FA0C401C4313F871
:1018C0000508138547006307080608C39C4385A8DD
:1018D00093075007E383F6FE930780076388F612A9
:1018E00093073007E399F6F61C43D0418145938670
:1018F000470014C383AA07005685852601C5330512
:10190000554148C05C401CC8A301040461A81C43A5
:10191000930A2404938647009C4314C32301F404D0
:101920008547D5B793F607041C410CC3B9DAC20743
:10193000C18781BF93F5050408C3C9D99E23130746
:10194000F0066386E60E970600009386A6442947B4
:10195000A30104044C400CC463C5050008406D9904
:1019600008C099E3B28A89CDB28AB3F5E702FD1ABD
:10197000B6958C212380BA00B3D5E70263FFE70A4E
:10198000A147631EF7001C40858B91CB58401C4833
:1019900063C7E70093070003A38FFAFEFD1A33061F
:1019A000564110C84E87CA867000A2852685A13B85
:1019B0007D5A631D450B7D55B250225492540259F5
:1019C000F249624AD24A424B45618280A382D504E1
:1019D000970600009386063C0C40084313F8050860
:1019E0001C411105630D080208C313F7150001C758
:1019F00093E505020CC04147A1FF0C4093F5F5FDAE
:101A00000CC0B9B79C4193E707029CC193078007BC
:101A1000A302F404970600009386063975BF13F8F5
:101A2000050408C3E30308FCC207C1837DBF970612
:101A3000000093862636214721BFAE873DB79441EB
:101A40001C43CC4913F806081385470063060800B9
:101A500008C39C438CC339A008C393F606049C4377
:101A6000F5DA8EA323280400B28A2DBF14485686C7
:101A7000CA8526858299E30045F51C40898B8DE750
:101A8000B2474844E35AF5F23E853DB7854656864F
:101A9000CA8526858299E30065F3050A5C443247CE
:101AA000998FE345FAFEE9BF014A930A94017D5BF1
:101AB000F5B7411122C42A842E8523AE018206C6C1
:101AC000EFF04F84FD576317F5009387C1839C4364
:101AD00091C31CC0B240224441018280411122C402
:101AE0002E848395E50006C67922634905007C486B
:101AF000AA977CC8B2402244410182805E247D774F
:101B00007D17F98F5EA4FDB7DE25011122CC26CA10
:101B10004AC84EC606CE93F70710AA842E8432898F
:101B2000B68991C78395E5008946014609225E245E
:101B30007D777D17F98F5EA48315E4006244F2403F
:101B4000CE864A86B24942492685D244056125A8F7
:101B5000411122C42E848395E50006C6C928FD578D
:101B60005A24631AF500FD77FD17F98F5EA4B24081
:101B70002244410182808567D98F5EA468C8C5BFB1
:101B80008395E50005A8411122C42A842E85B285DB
:101B9000368623AE018206C6EFE03FF3FD5763179A
:101BA000F5009387C1839C4391C31CC0B24022447B
:101BB00041018280411122C42A842E8523AE0182F4
:101BC00006C6C520FD576317F5009387C1839C4364
:101BD00091C31CC0B240224441018280411122C401
:101BE0002A842E85B28523AE018206C6C920FD5700
:101BF0006317F5009387C1839C4391C31CC0B24017
:101C0000224441018280411122C42A842E8523AEC0
:101C1000018206C65D20FD576317F5009387C183D7
:101C20009C4391C31CC0B2402244410182804111B7
:101C300022C42A842E85B285368623AE018206C64A
:101C40005920FD576317F5009387C1839C4391C3C7
:101C50001CC0B24022444101828093F5F50F2A96C0
:101C60006314C500014582801C21E38EB7FE050583
:101C7000C5BF82808280411122C42A842E85B2850C
:101C8000368623AE018206C6A920FD576317F500EC
:101C90009387C1839C4391C31CC0B240224441013D
:101CA00082809307800523AEF1827D558280930761
:101CB000800523AEF1827D5582809307800523AE97
:101CC000F182014582809307800523AEF1827D5524
:101CD00082809307800523AEF1827D5582800000CB
:101CE00053797374656D436C6B3A25640D0A00007B
:101CF0004368697049443A253038780D0A0000007D
:101D000054686973206973207072696E7466206507
:101D100078616D706C652063630D00000000000049
:101D200000000000000000000000000000000000B3
:101D300000000000000000000000000000000000A3
:101D40000000000000000000000000000000000093
:101D50000000000000000000000000000000000083
:101D60000000000000000000000000000000000073
:101D7000000000000000000000000000232D302BB8
:101D800020000000686C4C0065666745464700000F
:101D900030313233343536373839414243444546A1
:101DA0000000000030313233343536373839616263
:081DB000636465660000000099
:101DB80000000000000000000102030406070809F3
:101DC80000000000010203040102030406070809D9
:101DD800000000003C1D00005C1D00001C1D0000F0
:101DE80000000000000000000000000000000000EB
:101DF80000000000000000000000000000000000DB
:101E080000000000000000000000000000000000CA
:101E180000000000000000000000000000000000BA
:101E280000000000000000000000000000000000AA
:101E380000D8B80502040608C000002020000020D1
:081E4800200000200000000052
:00000001FF

3311
ZDBMS/BMS_CC/obj/BMS_CC.lst Normal file

File diff suppressed because it is too large Load Diff

2101
ZDBMS/BMS_CC/obj/BMS_CC.map Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
Core/core_riscv.o: ../Core/core_riscv.c

Binary file not shown.

View File

@ -0,0 +1,21 @@
################################################################################
# MRS Version: 1.9.2
# 自动生成的文件。不要编辑!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../Core/core_riscv.c
OBJS += \
./Core/core_riscv.o
C_DEPS += \
./Core/core_riscv.d
# Each subdirectory must supply rules for building sources it contributes
Core/%.o: ../Core/%.c
@ @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"E:\Y\MounRiver\ZDBMS\BMS_CC\Debug" -I"E:\Y\MounRiver\ZDBMS\BMS_CC\Core" -I"E:\Y\MounRiver\ZDBMS\BMS_CC\User" -I"E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
@ @

View File

@ -0,0 +1,87 @@
Debug/debug.o: ../Debug/debug.c ../Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
../Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,21 @@
################################################################################
# MRS Version: 1.9.2
# 自动生成的文件。不要编辑!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../Debug/debug.c
OBJS += \
./Debug/debug.o
C_DEPS += \
./Debug/debug.d
# Each subdirectory must supply rules for building sources it contributes
Debug/%.o: ../Debug/%.c
@ @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"E:\Y\MounRiver\ZDBMS\BMS_CC\Debug" -I"E:\Y\MounRiver\ZDBMS\BMS_CC\Core" -I"E:\Y\MounRiver\ZDBMS\BMS_CC\User" -I"E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
@ @

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_adc.o: ../Peripheral/src/ch32l103_adc.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_bkp.o: ../Peripheral/src/ch32l103_bkp.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_can.o: ../Peripheral/src/ch32l103_can.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_crc.o: ../Peripheral/src/ch32l103_crc.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_dbgmcu.o: ../Peripheral/src/ch32l103_dbgmcu.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_dma.o: ../Peripheral/src/ch32l103_dma.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_exti.o: ../Peripheral/src/ch32l103_exti.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_flash.o: ../Peripheral/src/ch32l103_flash.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_gpio.o: ../Peripheral/src/ch32l103_gpio.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_i2c.o: ../Peripheral/src/ch32l103_i2c.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_iwdg.o: ../Peripheral/src/ch32l103_iwdg.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_lptim.o: ../Peripheral/src/ch32l103_lptim.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_misc.o: ../Peripheral/src/ch32l103_misc.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:

Binary file not shown.

View File

@ -0,0 +1,85 @@
Peripheral/src/ch32l103_opa.o: ../Peripheral/src/ch32l103_opa.c \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h \
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_opa.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Core/core_riscv.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/system_ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_conf.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_adc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_bkp.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_can.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_crc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dbgmcu.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_dma.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_exti.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_flash.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_gpio.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_i2c.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_iwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_pwr.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rcc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_rtc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_spi.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_tim.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_usart.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_wwdg.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\User/ch32l103_it.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Debug/debug.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_misc.h:
E:\Y\MounRiver\ZDBMS\BMS_CC\Peripheral\inc/ch32l103_lptim.h:

Some files were not shown because too many files have changed in this diff Show More