Эх сурвалжийг харах

初版,成功控制MS933X环出投屏功能

robbin 1 долоо хоног өмнө
commit
a748880a94
100 өөрчлөгдсөн 36360 нэмэгдсэн , 0 устгасан
  1. 158 0
      EVT/EXAM/CodePro/YJD-CH32V30X/.cproject
  2. 64 0
      EVT/EXAM/CodePro/YJD-CH32V30X/.project
  3. 14 0
      EVT/EXAM/CodePro/YJD-CH32V30X/.settings/language.settings.xml
  4. 73 0
      EVT/EXAM/CodePro/YJD-CH32V30X/.settings/org.eclipse.cdt.codan.core.prefs
  5. 8 0
      EVT/EXAM/CodePro/YJD-CH32V30X/.settings/org.eclipse.core.resources.prefs
  6. 16 0
      EVT/EXAM/CodePro/YJD-CH32V30X/.template
  7. 2 0
      EVT/EXAM/CodePro/YJD-CH32V30X/YJD-CH32V30X.wvproj
  8. BIN
      EVT/EXAM/CodePro/YJD-CH32V30X/lib/libms933x_V2.3.3.a
  9. 20 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/Core/subdir.mk
  10. 20 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/Debug/subdir.mk
  11. 170 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/Peripheral/src/subdir.mk
  12. 20 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/Startup/subdir.mk
  13. 4035 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/YJD-CH32V30X.map
  14. 77 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/makefile
  15. 8 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/objects.mk
  16. 33 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/sources.mk
  17. 29 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/IIC_hal/subdir.mk
  18. 20 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/ms933x/subdir.mk
  19. 41 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/subdir.mk
  20. 20 0
      EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/uart_ht7315/subdir.mk
  21. 93 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/BoardConfig.h
  22. 37 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC2_Software.h
  23. 39 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC3_Software.h
  24. 43 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC_Hardware.h
  25. 44 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC_Software.h
  26. 74 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/TaskProcessCom.h
  27. 45 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ch32v30x_conf.h
  28. 20 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ch32v30x_it.h
  29. 128 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/mculib_common.h
  30. 978 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x.h
  31. 34 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_app.h
  32. 97 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_comm.h
  33. 91 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_config.h
  34. 45 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_edid.h
  35. 338 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_mpi.h
  36. 173 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_mpi_dummy.h
  37. 218 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_timing_table.h
  38. 767 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_typedef.h
  39. 31 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/pipe.h
  40. 32 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/system_ch32v30x.h
  41. 29 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/tmos.h
  42. 18 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/uart_ht7315.h
  43. 126 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/BoardConfig.c
  44. 335 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC2_Software.c
  45. 385 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC3_Software.c
  46. 347 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC_Hardware.c
  47. 985 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC_Software.c
  48. 395 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/TaskProcessCom.c
  49. 46 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/ch32v30x_it.c
  50. 148 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/main.c
  51. 118 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/mculib_common.c
  52. 4336 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/ms933x/ms933x_app.c
  53. 138 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/ms933x/ms933x_mpi_dummy.cx
  54. 101 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/pipe.c
  55. 1036 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/system_ch32v30x.c
  56. 201 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/tmos.c
  57. 146 0
      EVT/EXAM/CodePro/YJD-CH32V30X/src/src/uart_ht7315/uart_ht7315.c
  58. 392 0
      EVT/EXAM/SRC/Core/core_riscv.c
  59. 599 0
      EVT/EXAM/SRC/Core/core_riscv.h
  60. 269 0
      EVT/EXAM/SRC/Debug/debug.c
  61. 56 0
      EVT/EXAM/SRC/Debug/debug.h
  62. 185 0
      EVT/EXAM/SRC/Ld/Link.ld
  63. 266 0
      EVT/EXAM/SRC/Peripheral/inc/PIOC_SFR.h
  64. 6637 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x.h
  65. 230 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_adc.h
  66. 99 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_bkp.h
  67. 376 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_can.h
  68. 39 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_crc.h
  69. 122 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dac.h
  70. 60 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dbgmcu.h
  71. 270 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dma.h
  72. 69 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dvp.h
  73. 1338 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_eth.h
  74. 92 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_exti.h
  75. 148 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_flash.h
  76. 268 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_fsmc.h
  77. 196 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_gpio.h
  78. 439 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_i2c.h
  79. 58 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_iwdg.h
  80. 93 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_misc.h
  81. 77 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_opa.h
  82. 77 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_pwr.h
  83. 464 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_rcc.h
  84. 43 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_rng.h
  85. 56 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_rtc.h
  86. 266 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_sdio.h
  87. 231 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_spi.h
  88. 517 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_tim.h
  89. 195 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_usart.h
  90. 834 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_usb.h
  91. 44 0
      EVT/EXAM/SRC/Peripheral/inc/ch32v30x_wwdg.h
  92. 127 0
      EVT/EXAM/SRC/Peripheral/inc/ch32x035_usbpd.h
  93. 1182 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_adc.c
  94. 244 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_bkp.c
  95. 1297 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_can.c
  96. 100 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_crc.c
  97. 304 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_dac.c
  98. 129 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_dbgmcu.c
  99. 692 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_dma.c
  100. 135 0
      EVT/EXAM/SRC/Peripheral/src/ch32v30x_dvp.c

+ 158 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/.cproject

@@ -0,0 +1,158 @@
+<?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>
+					<externalSetting/>
+				</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.target.isa.xw.1620578118" name="Extra Compressed extension (RVXW)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.xw" value="true" valueType="boolean"/>
+							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.saverestore.134483797" name="Small prologue/epilogue (-msave-restore)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.saverestore" value="true" valueType="boolean"/>
+							<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nocommon.2073671084" name="No common unitialized (-fno-common)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nocommon" 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:/I2C_7bit_Mode}/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}/Peripheral/inc}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/src}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/inc}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/lib}&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="false" 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">
+									<listOptionValue builtIn="false" value="__STD_GCC__"/>
+								</option>
+								<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="false" 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">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/lib}&quot;"/>
+								</option>
+								<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"/>
+								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs.306593646" name="Libraries (-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs" useByScannerDiscovery="false" valueType="libs">
+									<listOptionValue builtIn="false" srcPrefixMapping="" srcRootPath="" value="ms933x_V2.3.3"/>
+								</option>
+								<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>
+						</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_ch32v30x_D8.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"/>
+	<storageModule moduleId="refreshScope" versionNumber="2">
+		<configuration configurationName="obj">
+			<resource resourceType="PROJECT" workspacePath="/I2C_7bit_Mode"/>
+		</configuration>
+	</storageModule>
+</cproject>

+ 64 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/.project

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<projectDescription>
+	<name>YJD-CH32V30X</name>
+	<comment/>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</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>
+	<linkedResources>
+		<link>
+			<name>Core</name>
+			<type>2</type>
+			<locationURI>PARENT-2-PROJECT_LOC/SRC/Core</locationURI>
+		</link>
+		<link>
+			<name>Debug</name>
+			<type>2</type>
+			<locationURI>PARENT-2-PROJECT_LOC/SRC/Debug</locationURI>
+		</link>
+		<link>
+			<name>Ld</name>
+			<type>2</type>
+			<locationURI>PARENT-2-PROJECT_LOC/SRC/Ld</locationURI>
+		</link>
+		<link>
+			<name>Peripheral</name>
+			<type>2</type>
+			<locationURI>PARENT-2-PROJECT_LOC/SRC/Peripheral</locationURI>
+		</link>
+		<link>
+			<name>Startup</name>
+			<type>2</type>
+			<locationURI>PARENT-2-PROJECT_LOC/SRC/Startup</locationURI>
+		</link>
+	</linkedResources>
+	<filteredResources>
+		<filter>
+			<id>1751344051642</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>

+ 14 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/.settings/language.settings.xml

@@ -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="391012066886060987" 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>

+ 73 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/.settings/org.eclipse.cdt.codan.core.prefs

@@ -0,0 +1,73 @@
+eclipse.preferences.version=1
+org.eclipse.cdt.codan.checkers.errnoreturn=Warning
+org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false}
+org.eclipse.cdt.codan.checkers.errreturnvalue=Error
+org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"}
+org.eclipse.cdt.codan.checkers.nocommentinside=-Error
+org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"}
+org.eclipse.cdt.codan.checkers.nolinecomment=-Error
+org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"}
+org.eclipse.cdt.codan.checkers.noreturn=Error
+org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false}
+org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
+org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"}
+org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
+org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"}
+org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"}
+org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
+org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"}
+org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false}
+org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
+org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()}
+org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
+org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"}
+org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
+org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true}
+org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error
+org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"}
+org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
+org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"}
+org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
+org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"}
+org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
+org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"}
+org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
+org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"}
+org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
+org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
+org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"}
+org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
+org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"}
+org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
+org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"}
+org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"}
+org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
+org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"}
+org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
+org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"}
+org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()}
+org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false}
+org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false}
+org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true}
+org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true}
+org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")}
+org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"}

+ 8 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+encoding//src/inc/IIC_Software.h=UTF-8
+encoding//src/src/IIC_hal/IIC2_Software.c=UTF-8
+encoding//src/src/IIC_hal/IIC_Software.c=UTF-8
+encoding//src/src/TaskProcessCom.c=UTF-8
+encoding//src/src/mculib_common.c=UTF-8
+encoding//src/src/ms933x/ms933x_app.c=UTF-8
+encoding//src/src/uart_ht7315/uart_ht7315.c=UTF-8

+ 16 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/.template

@@ -0,0 +1,16 @@
+Mcu Type=CH32V30x
+Address=0x08000000
+Erase All=true
+Program=true
+Verify=true
+Reset=true
+
+Vendor=WCH
+Link=WCH-Link
+Toolchain=RISC-V
+Series=CH32V307
+Description=ROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 64, GPIO PORTS: 51.\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools.
+
+PeripheralVersion=1.4
+Target Path=obj\YJD-CH32V30X.hex
+MCU=CH32V307RVT6

+ 2 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/YJD-CH32V30X.wvproj

@@ -0,0 +1,2 @@
+�i“CZ	?"Ç�¸rŸ�F<Fy8E9Y‡½„%Pa³D¶La†%Ã'y€¡]Ç;’¶ŸS)1†1+R4><‚.„ÇÅ¿º°?/£XO©Ä¿ChQN$*¢”»EÅBk‹!2tŒ+buh†nUb]xl‹l|
++"Ÿ<“¯AH42}z8p;m€u1Ž-¦eh»Od¼Âwµª7x{5�CqEx©=;¦¢e¢º»2£Š	‚«*BPMš"

BIN
EVT/EXAM/CodePro/YJD-CH32V30X/lib/libms933x_V2.3.3.a


+ 20 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/Core/subdir.mk

@@ -0,0 +1,20 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/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/core_riscv.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Core/core_riscv.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 20 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/Debug/subdir.mk

@@ -0,0 +1,20 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Debug/debug.c 
+
+OBJS += \
+./Debug/debug.o 
+
+C_DEPS += \
+./Debug/debug.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+Debug/debug.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Debug/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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 170 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/Peripheral/src/subdir.mk

@@ -0,0 +1,170 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_adc.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_bkp.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_can.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_crc.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dac.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dbgmcu.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dma.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dvp.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_eth.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_exti.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_flash.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_fsmc.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_gpio.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_i2c.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_iwdg.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_misc.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_opa.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_pwr.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_rcc.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_rng.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_rtc.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_sdio.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_spi.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_tim.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_usart.c \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_wwdg.c 
+
+OBJS += \
+./Peripheral/src/ch32v30x_adc.o \
+./Peripheral/src/ch32v30x_bkp.o \
+./Peripheral/src/ch32v30x_can.o \
+./Peripheral/src/ch32v30x_crc.o \
+./Peripheral/src/ch32v30x_dac.o \
+./Peripheral/src/ch32v30x_dbgmcu.o \
+./Peripheral/src/ch32v30x_dma.o \
+./Peripheral/src/ch32v30x_dvp.o \
+./Peripheral/src/ch32v30x_eth.o \
+./Peripheral/src/ch32v30x_exti.o \
+./Peripheral/src/ch32v30x_flash.o \
+./Peripheral/src/ch32v30x_fsmc.o \
+./Peripheral/src/ch32v30x_gpio.o \
+./Peripheral/src/ch32v30x_i2c.o \
+./Peripheral/src/ch32v30x_iwdg.o \
+./Peripheral/src/ch32v30x_misc.o \
+./Peripheral/src/ch32v30x_opa.o \
+./Peripheral/src/ch32v30x_pwr.o \
+./Peripheral/src/ch32v30x_rcc.o \
+./Peripheral/src/ch32v30x_rng.o \
+./Peripheral/src/ch32v30x_rtc.o \
+./Peripheral/src/ch32v30x_sdio.o \
+./Peripheral/src/ch32v30x_spi.o \
+./Peripheral/src/ch32v30x_tim.o \
+./Peripheral/src/ch32v30x_usart.o \
+./Peripheral/src/ch32v30x_wwdg.o 
+
+C_DEPS += \
+./Peripheral/src/ch32v30x_adc.d \
+./Peripheral/src/ch32v30x_bkp.d \
+./Peripheral/src/ch32v30x_can.d \
+./Peripheral/src/ch32v30x_crc.d \
+./Peripheral/src/ch32v30x_dac.d \
+./Peripheral/src/ch32v30x_dbgmcu.d \
+./Peripheral/src/ch32v30x_dma.d \
+./Peripheral/src/ch32v30x_dvp.d \
+./Peripheral/src/ch32v30x_eth.d \
+./Peripheral/src/ch32v30x_exti.d \
+./Peripheral/src/ch32v30x_flash.d \
+./Peripheral/src/ch32v30x_fsmc.d \
+./Peripheral/src/ch32v30x_gpio.d \
+./Peripheral/src/ch32v30x_i2c.d \
+./Peripheral/src/ch32v30x_iwdg.d \
+./Peripheral/src/ch32v30x_misc.d \
+./Peripheral/src/ch32v30x_opa.d \
+./Peripheral/src/ch32v30x_pwr.d \
+./Peripheral/src/ch32v30x_rcc.d \
+./Peripheral/src/ch32v30x_rng.d \
+./Peripheral/src/ch32v30x_rtc.d \
+./Peripheral/src/ch32v30x_sdio.d \
+./Peripheral/src/ch32v30x_spi.d \
+./Peripheral/src/ch32v30x_tim.d \
+./Peripheral/src/ch32v30x_usart.d \
+./Peripheral/src/ch32v30x_wwdg.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+Peripheral/src/ch32v30x_adc.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_adc.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_bkp.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_bkp.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_can.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_can.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_crc.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_crc.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_dac.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dac.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_dbgmcu.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dbgmcu.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_dma.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dma.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_dvp.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_dvp.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_eth.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_eth.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_exti.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_exti.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_flash.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_flash.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_fsmc.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_fsmc.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_gpio.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_gpio.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_i2c.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_i2c.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_iwdg.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_iwdg.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_misc.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_misc.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_opa.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_opa.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_pwr.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_pwr.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_rcc.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_rcc.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_rng.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_rng.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_rtc.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_rtc.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_sdio.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_sdio.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_spi.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_spi.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_tim.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_tim.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_usart.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_usart.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+Peripheral/src/ch32v30x_wwdg.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Peripheral/src/ch32v30x_wwdg.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 20 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/Startup/subdir.mk

@@ -0,0 +1,20 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+S_UPPER_SRCS += \
+D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Startup/startup_ch32v30x_D8C.S 
+
+OBJS += \
+./Startup/startup_ch32v30x_D8C.o 
+
+S_UPPER_DEPS += \
+./Startup/startup_ch32v30x_D8C.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+Startup/startup_ch32v30x_D8C.o: D:/Wingcool/WingCool/CH32V30X/EVT/EXAM/SRC/Startup/startup_ch32v30x_D8C.S
+	@	@	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 -x assembler-with-cpp -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Startup" -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 4035 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/YJD-CH32V30X.map

@@ -0,0 +1,4035 @@
+Archive member included to satisfy reference by file (symbol)
+
+D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                              ./src/src/ms933x/ms933x_app.o (ms933xdrv_hdmi_rx_init)
+D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                              ./src/src/ms933x/ms933x_app.o (ms933xdrv_hdmi_tx_set_channel)
+D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+                              ./src/src/ms933x/ms933x_app.o (ms933xdrv_misc_chipisvalid)
+D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                              D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o) (ms933x_HAL_ReadByte)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a(save-restore.o)
+                              ./src/src/ms933x/ms933x_app.o (__riscv_save_12)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memcpy.o)
+                              ./src/src/ms933x/ms933x_app.o (memcpy)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memset.o)
+                              ./src/src/ms933x/ms933x_app.o (memset)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+                              ./src/src/ms933x/ms933x_app.o (printf)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+                              ./src/src/uart_ht7315/uart_ht7315.o (puts)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o) (__swbuf_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o) (__swsetup_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o) (_fflush_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o) (__sinit)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o) (_fwalk)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o) (_global_impure_ptr)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o) (__smakebuf_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o) (_free_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o) (_malloc_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o) (_vfprintf_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o) (_printf_i)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o) (_sbrk_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o) (__sread)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-writer.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o) (_write_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o) (_close_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o) (_fstat_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o) (__sfvwrite_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o) (_isatty_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o) (_lseek_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memchr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o) (memchr)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memmove.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o) (memmove)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o) (__malloc_lock)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o) (_realloc_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o) (_read_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o) (errno)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-msizer.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o) (_malloc_usable_size_r)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o) (_close)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o) (_fstat)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o) (_isatty)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o) (_lseek)
+c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+                              c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o) (_read)
+
+Allocating common symbols
+Common symbol       size              file
+
+errno               0x4               c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+
+Discarded input sections
+
+ .text          0x0000000000000000        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .data          0x0000000000000000        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .bss           0x0000000000000000        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .text.initQueue
+                0x0000000000000000        0xe ./src/src/uart_ht7315/uart_ht7315.o
+ .text.isQueueFull
+                0x0000000000000000        0xa ./src/src/uart_ht7315/uart_ht7315.o
+ .text.isQueueEmpty
+                0x0000000000000000        0x8 ./src/src/uart_ht7315/uart_ht7315.o
+ .text.enqueue  0x0000000000000000       0x1e ./src/src/uart_ht7315/uart_ht7315.o
+ .text.dequeue  0x0000000000000000       0x24 ./src/src/uart_ht7315/uart_ht7315.o
+ .text.clearQueue
+                0x0000000000000000        0xe ./src/src/uart_ht7315/uart_ht7315.o
+ .text.Uart_u6710_GPIO_Init
+                0x0000000000000000       0xd4 ./src/src/uart_ht7315/uart_ht7315.o
+ .text.USART1_SendData
+                0x0000000000000000       0x4c ./src/src/uart_ht7315/uart_ht7315.o
+ .bss.rxQueue   0x0000000000000000       0x14 ./src/src/uart_ht7315/uart_ht7315.o
+ .text          0x0000000000000000        0x0 ./src/src/ms933x/ms933x_app.o
+ .data          0x0000000000000000        0x0 ./src/src/ms933x/ms933x_app.o
+ .bss           0x0000000000000000        0x0 ./src/src/ms933x/ms933x_app.o
+ .text.sys_hdmi_rx_tmds_overload_service
+                0x0000000000000000        0x2 ./src/src/ms933x/ms933x_app.o
+ .text._rxpll_errdet_wrong_status
+                0x0000000000000000       0xbc ./src/src/ms933x/ms933x_app.o
+ .text._hdmi_rx_phy_config
+                0x0000000000000000       0x8e ./src/src/ms933x/ms933x_app.o
+ .text._hdmi_rx_audio_fs_type_get
+                0x0000000000000000       0x5c ./src/src/ms933x/ms933x_app.o
+ .text.sys_hdmi_rx_audio_cts_change_param_set
+                0x0000000000000000        0xa ./src/src/ms933x/ms933x_app.o
+ .text.sys_hdmi_rx_audio_cts_change_param_get
+                0x0000000000000000        0xa ./src/src/ms933x/ms933x_app.o
+ .text.sys_pad_audio_ctrl_service
+                0x0000000000000000       0xbe ./src/src/ms933x/ms933x_app.o
+ .text._mask_hpd_status
+                0x0000000000000000       0x1e ./src/src/ms933x/ms933x_app.o
+ .text._edid_file_save
+                0x0000000000000000        0x2 ./src/src/ms933x/ms933x_app.o
+ .text._check_hdmi_sink_exist
+                0x0000000000000000       0x2c ./src/src/ms933x/ms933x_app.o
+ .text._check_hdmi_sink
+                0x0000000000000000       0x2e ./src/src/ms933x/ms933x_app.o
+ .text._tx_edid_read_again
+                0x0000000000000000       0x7c ./src/src/ms933x/ms933x_app.o
+ .text._check_tx_hpd_plug_in
+                0x0000000000000000       0x22 ./src/src/ms933x/ms933x_app.o
+ .text.edid_block_x_convert1
+                0x0000000000000000      0x370 ./src/src/ms933x/ms933x_app.o
+ .rodata.edid_block_x_convert1
+                0x0000000000000000       0x1c ./src/src/ms933x/ms933x_app.o
+ .text.sys_edid_convert1
+                0x0000000000000000      0x294 ./src/src/ms933x/ms933x_app.o
+ .text._packet_fifo_init
+                0x0000000000000000        0x2 ./src/src/ms933x/ms933x_app.o
+ .text._get_packet_fifo_data
+                0x0000000000000000        0x2 ./src/src/ms933x/ms933x_app.o
+ .text._get_packet_fifo_spd_code
+                0x0000000000000000        0x6 ./src/src/ms933x/ms933x_app.o
+ .text._config_output_spd_info
+                0x0000000000000000        0x2 ./src/src/ms933x/ms933x_app.o
+ .text._tx_drive_for_short_cable
+                0x0000000000000000       0x32 ./src/src/ms933x/ms933x_app.o
+ .text._tx_drive_for_long_cable
+                0x0000000000000000       0x46 ./src/src/ms933x/ms933x_app.o
+ .text._config_output_audio_fs
+                0x0000000000000000       0x28 ./src/src/ms933x/ms933x_app.o
+ .text._hdmi_tx_gcp_avmute_param_default
+                0x0000000000000000        0xa ./src/src/ms933x/ms933x_app.o
+ .text._rx_edid_update
+                0x0000000000000000       0x80 ./src/src/ms933x/ms933x_app.o
+ .text._rx_hpd_toggle
+                0x0000000000000000       0x70 ./src/src/ms933x/ms933x_app.o
+ .text._hdmi_tx_hdcp_restart
+                0x0000000000000000       0x46 ./src/src/ms933x/ms933x_app.o
+ .text._rx_hdcp_rpt_param_ready_reset
+                0x0000000000000000        0xa ./src/src/ms933x/ms933x_app.o
+ .text._rx_hdcp_rpt_ready_reset
+                0x0000000000000000        0x4 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_bcaps_repeater_flag_get
+                0x0000000000000000       0x2c ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_bcaps_repeater_ready_get
+                0x0000000000000000       0x62 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_rpt_param_repeater_flag_set
+                0x0000000000000000       0x26 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_rpt_param_repeater_flag_get
+                0x0000000000000000       0x12 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_rpt_param_repeater_flag_default
+                0x0000000000000000       0x10 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_rpt_init
+                0x0000000000000000        0x2 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_param_encoding_enable_flag_verify
+                0x0000000000000000       0x34 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_ksv_collect
+                0x0000000000000000        0x4 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_rpt_check_all_repeater_sink_ready
+                0x0000000000000000       0x58 ./src/src/ms933x/ms933x_app.o
+ .text._tx_hdcp_rpt_process
+                0x0000000000000000        0x4 ./src/src/ms933x/ms933x_app.o
+ .text._rx_hdcp_rpt_ksv_list_write
+                0x0000000000000000        0x4 ./src/src/ms933x/ms933x_app.o
+ .text.sys_hdmi_hdcp_repeater_service
+                0x0000000000000000       0x84 ./src/src/ms933x/ms933x_app.o
+ .text.sys_tx_hdcp_port_service
+                0x0000000000000000       0x72 ./src/src/ms933x/ms933x_app.o
+ .text.ms933x_interrupt_service
+                0x0000000000000000       0x22 ./src/src/ms933x/ms933x_app.o
+ .rodata        0x0000000000000000       0x12 ./src/src/ms933x/ms933x_app.o
+ .rodata._tx_edid_read_again.str1.4
+                0x0000000000000000       0x37 ./src/src/ms933x/ms933x_app.o
+ .rodata.edid_block_x_convert1.str1.4
+                0x0000000000000000       0x11 ./src/src/ms933x/ms933x_app.o
+ .rodata.sys_hdmi_hdcp_repeater_service.str1.4
+                0x0000000000000000       0x17 ./src/src/ms933x/ms933x_app.o
+ .rodata.sys_tx_hdcp_port_service.str1.4
+                0x0000000000000000       0x17 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_rx_hdcp_rpt_ready
+                0x0000000000000000        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_port_service_timer_count
+                0x0000000000000000        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_repeater_flag_buf
+                0x0000000000000000        0x4 ./src/src/ms933x/ms933x_app.o
+ .sbss.s_b_audio_sample.3971
+                0x0000000000000000        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.s_b_pad_audio_en.3972
+                0x0000000000000000        0x1 ./src/src/ms933x/ms933x_app.o
+ .sdata.g_u8_hdmi_tx_drive_mode
+                0x0000000000000000        0x1 ./src/src/ms933x/ms933x_app.o
+ .text          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC2_Software.o
+ .data          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC2_Software.o
+ .bss           0x0000000000000000        0x0 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Set_Speed
+                0x0000000000000000        0xa ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_sf_Init
+                0x0000000000000000       0x78 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Delay
+                0x0000000000000000       0x12 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Start
+                0x0000000000000000       0x8e ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Stop
+                0x0000000000000000       0x8e ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Wait_Ack
+                0x0000000000000000       0xaa ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Ack
+                0x0000000000000000       0x90 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_NAck
+                0x0000000000000000       0x90 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Send_Byte
+                0x0000000000000000       0xbc ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Read_Byte
+                0x0000000000000000       0xba ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Check_Address
+                0x0000000000000000       0x44 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Send_8bitMultiBytes
+                0x0000000000000000       0x86 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Read_8bitMultiBytes
+                0x0000000000000000       0xb0 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Send_16bit_LE_MultiBytes
+                0x0000000000000000       0xa4 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Read_16bit_LE_MultiBytes
+                0x0000000000000000       0xcc ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Send_16bit_BE_MultiBytes
+                0x0000000000000000       0xa2 ./src/src/IIC_hal/IIC2_Software.o
+ .text.IIC2_Read_16bit_BE_MultiBytes
+                0x0000000000000000       0xcc ./src/src/IIC_hal/IIC2_Software.o
+ .sbss.iic2_speed_us
+                0x0000000000000000        0x1 ./src/src/IIC_hal/IIC2_Software.o
+ .debug_info    0x0000000000000000     0x177a ./src/src/IIC_hal/IIC2_Software.o
+ .debug_abbrev  0x0000000000000000      0x3cc ./src/src/IIC_hal/IIC2_Software.o
+ .debug_loc     0x0000000000000000      0x671 ./src/src/IIC_hal/IIC2_Software.o
+ .debug_aranges
+                0x0000000000000000       0xa0 ./src/src/IIC_hal/IIC2_Software.o
+ .debug_ranges  0x0000000000000000       0x90 ./src/src/IIC_hal/IIC2_Software.o
+ .debug_line    0x0000000000000000      0xef0 ./src/src/IIC_hal/IIC2_Software.o
+ .debug_str     0x0000000000000000      0x8e7 ./src/src/IIC_hal/IIC2_Software.o
+ .comment       0x0000000000000000       0x34 ./src/src/IIC_hal/IIC2_Software.o
+ .debug_frame   0x0000000000000000      0x28c ./src/src/IIC_hal/IIC2_Software.o
+ .text          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC3_Software.o
+ .data          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC3_Software.o
+ .bss           0x0000000000000000        0x0 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Set_Speed
+                0x0000000000000000        0xa ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_sf_Init
+                0x0000000000000000       0x72 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Delay
+                0x0000000000000000       0x12 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Start
+                0x0000000000000000       0x8e ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Stop
+                0x0000000000000000       0x8e ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Wait_Ack
+                0x0000000000000000       0xb6 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Ack
+                0x0000000000000000       0x8e ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_NAck
+                0x0000000000000000       0x8e ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Send_Byte
+                0x0000000000000000       0xc0 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Read_Byte
+                0x0000000000000000       0xb8 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Check_Address
+                0x0000000000000000       0x44 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Send_8bitMultiBytes
+                0x0000000000000000       0x86 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Read_8bitMultiBytes
+                0x0000000000000000       0xb0 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Read_8bitMultiBytes_sgm832
+                0x0000000000000000       0xb2 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Send_16bit_LE_MultiBytes
+                0x0000000000000000       0xa6 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Read_16bit_LE_MultiBytes
+                0x0000000000000000       0xcc ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Send_16bit_BE_MultiBytes
+                0x0000000000000000       0xa2 ./src/src/IIC_hal/IIC3_Software.o
+ .text.IIC3_Read_16bit_BE_MultiBytes
+                0x0000000000000000       0xcc ./src/src/IIC_hal/IIC3_Software.o
+ .sbss.iic3_speed_us
+                0x0000000000000000        0x1 ./src/src/IIC_hal/IIC3_Software.o
+ .debug_info    0x0000000000000000     0x1890 ./src/src/IIC_hal/IIC3_Software.o
+ .debug_abbrev  0x0000000000000000      0x3dd ./src/src/IIC_hal/IIC3_Software.o
+ .debug_loc     0x0000000000000000      0x73e ./src/src/IIC_hal/IIC3_Software.o
+ .debug_aranges
+                0x0000000000000000       0xa8 ./src/src/IIC_hal/IIC3_Software.o
+ .debug_ranges  0x0000000000000000       0x98 ./src/src/IIC_hal/IIC3_Software.o
+ .debug_line    0x0000000000000000      0xf83 ./src/src/IIC_hal/IIC3_Software.o
+ .debug_str     0x0000000000000000      0x911 ./src/src/IIC_hal/IIC3_Software.o
+ .comment       0x0000000000000000       0x34 ./src/src/IIC_hal/IIC3_Software.o
+ .debug_frame   0x0000000000000000      0x2a0 ./src/src/IIC_hal/IIC3_Software.o
+ .text          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC_Hardware.o
+ .data          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC_Hardware.o
+ .bss           0x0000000000000000        0x0 ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IIC_hd_Init
+                0x0000000000000000       0xa4 ./src/src/IIC_hal/IIC_Hardware.o
+ .text.I2C_WaitForIdle
+                0x0000000000000000       0x48 ./src/src/IIC_hal/IIC_Hardware.o
+ .text.Check_I2C_Address
+                0x0000000000000000       0x88 ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IICReadOneByte
+                0x0000000000000000      0x13c ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IICReadBytes
+                0x0000000000000000      0x1ae ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IICWriteOneByte
+                0x0000000000000000       0xcc ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IICWriteBytes
+                0x0000000000000000      0x126 ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IICRead  0x0000000000000000       0x3c ./src/src/IIC_hal/IIC_Hardware.o
+ .text.IICWrite
+                0x0000000000000000       0x42 ./src/src/IIC_hal/IIC_Hardware.o
+ .sdata2.IIC_hd_AddrWR
+                0x0000000000000000        0x1 ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_info    0x0000000000000000     0x16fb ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_abbrev  0x0000000000000000      0x3d4 ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_loc     0x0000000000000000      0x45b ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_aranges
+                0x0000000000000000       0x60 ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_ranges  0x0000000000000000       0x50 ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_line    0x0000000000000000      0xe89 ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_str     0x0000000000000000      0xa0d ./src/src/IIC_hal/IIC_Hardware.o
+ .comment       0x0000000000000000       0x34 ./src/src/IIC_hal/IIC_Hardware.o
+ .debug_frame   0x0000000000000000      0x18c ./src/src/IIC_hal/IIC_Hardware.o
+ .text          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC_Software.o
+ .data          0x0000000000000000        0x0 ./src/src/IIC_hal/IIC_Software.o
+ .bss           0x0000000000000000        0x0 ./src/src/IIC_hal/IIC_Software.o
+ .text.IIC_Delay
+                0x0000000000000000       0x12 ./src/src/IIC_hal/IIC_Software.o
+ .text.mculib_i2c_burstread_8bidx8bval_ext
+                0x0000000000000000       0x74 ./src/src/IIC_hal/IIC_Software.o
+ .text.mculib_i2c_burstwrite_8bidx8bval
+                0x0000000000000000       0x7a ./src/src/IIC_hal/IIC_Software.o
+ .text          0x0000000000000000        0x0 ./src/src/BoardConfig.o
+ .data          0x0000000000000000        0x0 ./src/src/BoardConfig.o
+ .bss           0x0000000000000000        0x0 ./src/src/BoardConfig.o
+ .text.MS1826a_RST_GPIO_PP
+                0x0000000000000000       0x44 ./src/src/BoardConfig.o
+ .text.MS1826a_RST_GPIO_IPU
+                0x0000000000000000       0x42 ./src/src/BoardConfig.o
+ .text.LED_GPIO_Init
+                0x0000000000000000       0xc4 ./src/src/BoardConfig.o
+ .text.CH444G_GPIO_Init
+                0x0000000000000000       0x86 ./src/src/BoardConfig.o
+ .text.CH444G_XY_2
+                0x0000000000000000       0x34 ./src/src/BoardConfig.o
+ .text.CH444G_XY_1
+                0x0000000000000000       0x34 ./src/src/BoardConfig.o
+ .text.CH444G_XY_0
+                0x0000000000000000       0x34 ./src/src/BoardConfig.o
+ .text.CH444G_XY_NONE
+                0x0000000000000000       0x34 ./src/src/BoardConfig.o
+ .text          0x0000000000000000        0x0 ./src/src/TaskProcessCom.o
+ .data          0x0000000000000000        0x0 ./src/src/TaskProcessCom.o
+ .bss           0x0000000000000000        0x0 ./src/src/TaskProcessCom.o
+ .text.TIM4_Init
+                0x0000000000000000       0x84 ./src/src/TaskProcessCom.o
+ .text.TIM3_Init
+                0x0000000000000000       0x84 ./src/src/TaskProcessCom.o
+ .text.SearchAddress
+                0x0000000000000000       0x40 ./src/src/TaskProcessCom.o
+ .text.CheckUsbStatus
+                0x0000000000000000        0x2 ./src/src/TaskProcessCom.o
+ .highcode      0x0000000000000000       0x12 ./src/src/TaskProcessCom.o
+ .bss.ShareBuf  0x0000000000000000        0xa ./src/src/TaskProcessCom.o
+ .sbss.DeviceMode
+                0x0000000000000000        0x1 ./src/src/TaskProcessCom.o
+ .sbss.GT_CMD_RD
+                0x0000000000000000        0x1 ./src/src/TaskProcessCom.o
+ .sbss.GT_CMD_WR
+                0x0000000000000000        0x1 ./src/src/TaskProcessCom.o
+ .sbss.ReleaseFlag
+                0x0000000000000000        0x1 ./src/src/TaskProcessCom.o
+ .sbss.TouchProc
+                0x0000000000000000        0x4 ./src/src/TaskProcessCom.o
+ .sbss.Uart1IdleTime
+                0x0000000000000000        0x1 ./src/src/TaskProcessCom.o
+ .text          0x0000000000000000        0x0 ./src/src/ch32v30x_it.o
+ .data          0x0000000000000000        0x0 ./src/src/ch32v30x_it.o
+ .bss           0x0000000000000000        0x0 ./src/src/ch32v30x_it.o
+ .text          0x0000000000000000        0x0 ./src/src/main.o
+ .data          0x0000000000000000        0x0 ./src/src/main.o
+ .bss           0x0000000000000000        0x0 ./src/src/main.o
+ .text.IWDG_Feed_Init
+                0x0000000000000000       0x4e ./src/src/main.o
+ .text.GPIO_Toggle_INIT
+                0x0000000000000000       0x6a ./src/src/main.o
+ .text          0x0000000000000000        0x0 ./src/src/mculib_common.o
+ .data          0x0000000000000000        0x0 ./src/src/mculib_common.o
+ .bss           0x0000000000000000        0x0 ./src/src/mculib_common.o
+ .text.mculib_i2c_write_8bidx16bval
+                0x0000000000000000       0x3a ./src/src/mculib_common.o
+ .text          0x0000000000000000        0x0 ./src/src/pipe.o
+ .data          0x0000000000000000        0x0 ./src/src/pipe.o
+ .bss           0x0000000000000000        0x0 ./src/src/pipe.o
+ .text.pipe_init
+                0x0000000000000000        0xa ./src/src/pipe.o
+ .text.pipe_read
+                0x0000000000000000       0x32 ./src/src/pipe.o
+ .text.pipe_write_c
+                0x0000000000000000       0x20 ./src/src/pipe.o
+ .text.pipe_write
+                0x0000000000000000       0x40 ./src/src/pipe.o
+ .bss.coor_pipe
+                0x0000000000000000      0x104 ./src/src/pipe.o
+ .bss.debug_pipe
+                0x0000000000000000      0x104 ./src/src/pipe.o
+ .bss.sys_pipe  0x0000000000000000      0x104 ./src/src/pipe.o
+ .bss.uart_cmd_pipe
+                0x0000000000000000      0x104 ./src/src/pipe.o
+ .debug_info    0x0000000000000000      0x24f ./src/src/pipe.o
+ .debug_abbrev  0x0000000000000000      0x147 ./src/src/pipe.o
+ .debug_loc     0x0000000000000000       0xee ./src/src/pipe.o
+ .debug_aranges
+                0x0000000000000000       0x38 ./src/src/pipe.o
+ .debug_ranges  0x0000000000000000       0x28 ./src/src/pipe.o
+ .debug_line    0x0000000000000000      0x316 ./src/src/pipe.o
+ .debug_str     0x0000000000000000      0x1f3 ./src/src/pipe.o
+ .comment       0x0000000000000000       0x34 ./src/src/pipe.o
+ .debug_frame   0x0000000000000000       0x50 ./src/src/pipe.o
+ .text          0x0000000000000000        0x0 ./src/src/system_ch32v30x.o
+ .data          0x0000000000000000        0x0 ./src/src/system_ch32v30x.o
+ .bss           0x0000000000000000        0x0 ./src/src/system_ch32v30x.o
+ .text          0x0000000000000000        0x0 ./src/src/tmos.o
+ .data          0x0000000000000000        0x0 ./src/src/tmos.o
+ .bss           0x0000000000000000        0x0 ./src/src/tmos.o
+ .text.TIM1_Init
+                0x0000000000000000       0x88 ./src/src/tmos.o
+ .text.tmos_init
+                0x0000000000000000       0x62 ./src/src/tmos.o
+ .text.tmos_set_event
+                0x0000000000000000       0x1c ./src/src/tmos.o
+ .text.tmos_stop_task
+                0x0000000000000000       0x4a ./src/src/tmos.o
+ .text.TMOS_SystemProcess
+                0x0000000000000000       0xa6 ./src/src/tmos.o
+ .sbss.time_stamp
+                0x0000000000000000        0x4 ./src/src/tmos.o
+ .text          0x0000000000000000        0x0 ./Startup/startup_ch32v30x_D8C.o
+ .data          0x0000000000000000        0x0 ./Startup/startup_ch32v30x_D8C.o
+ .bss           0x0000000000000000        0x0 ./Startup/startup_ch32v30x_D8C.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_adc.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_adc.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_DeInit
+                0x0000000000000000       0x5a ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_Init
+                0x0000000000000000       0x56 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_StructInit
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_Cmd  0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_DMACmd
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ITConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ResetCalibration
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetResetCalibrationStatus
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_StartCalibration
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetCalibrationStatus
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_SoftwareStartConvCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetSoftwareStartConvStatus
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_DiscModeChannelCountConfig
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_DiscModeCmd
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_RegularChannelConfig
+                0x0000000000000000       0xb8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ExternalTrigConvCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetConversionValue
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetDualModeConversionValue
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_AutoInjectedConvCmd
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_InjectedDiscModeCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ExternalTrigInjectedConvConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ExternalTrigInjectedConvCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_SoftwareStartInjectedConvCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetSoftwareStartInjectedConvCmdStatus
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_InjectedChannelConfig
+                0x0000000000000000       0x7a ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_InjectedSequencerLengthConfig
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_SetInjectedOffset
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetInjectedConversionValue
+                0x0000000000000000       0x1c ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_AnalogWatchdogCmd
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_AnalogWatchdogThresholdsConfig
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_AnalogWatchdogSingleChannelConfig
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_TempSensorVrefintCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetFlagStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ClearFlag
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_GetITStatus
+                0x0000000000000000       0x1c ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_ClearITPendingBit
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_adc.o
+ .text.TempSensor_Volt_To_Temper
+                0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_adc.o
+ .text.ADC_BufferCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_adc.o
+ .text.Get_CalibrationValue
+                0x0000000000000000      0x144 ./Peripheral/src/ch32v30x_adc.o
+ .debug_info    0x0000000000000000     0x1703 ./Peripheral/src/ch32v30x_adc.o
+ .debug_abbrev  0x0000000000000000      0x3a9 ./Peripheral/src/ch32v30x_adc.o
+ .debug_loc     0x0000000000000000      0xab6 ./Peripheral/src/ch32v30x_adc.o
+ .debug_aranges
+                0x0000000000000000      0x150 ./Peripheral/src/ch32v30x_adc.o
+ .debug_ranges  0x0000000000000000      0x140 ./Peripheral/src/ch32v30x_adc.o
+ .debug_line    0x0000000000000000     0x188c ./Peripheral/src/ch32v30x_adc.o
+ .debug_str     0x0000000000000000      0xc4d ./Peripheral/src/ch32v30x_adc.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_adc.o
+ .debug_frame   0x0000000000000000      0x2b4 ./Peripheral/src/ch32v30x_adc.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_bkp.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_bkp.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_DeInit
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_TamperPinLevelConfig
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_TamperPinCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_ITConfig
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_RTCOutputConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_SetRTCCalibrationValue
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_WriteBackupRegister
+                0x0000000000000000       0x1c ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_ReadBackupRegister
+                0x0000000000000000       0x1c ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_GetFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_ClearFlag
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_GetITStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_bkp.o
+ .text.BKP_ClearITPendingBit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_info    0x0000000000000000     0x10d3 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_abbrev  0x0000000000000000      0x2cc ./Peripheral/src/ch32v30x_bkp.o
+ .debug_loc     0x0000000000000000       0xd8 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_aranges
+                0x0000000000000000       0x78 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_ranges  0x0000000000000000       0x68 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_line    0x0000000000000000      0x689 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_str     0x0000000000000000      0xad1 ./Peripheral/src/ch32v30x_bkp.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_bkp.o
+ .debug_frame   0x0000000000000000       0xec ./Peripheral/src/ch32v30x_bkp.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_can.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_can.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_DeInit
+                0x0000000000000000       0x4c ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_FilterInit
+                0x0000000000000000       0xee ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_StructInit
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_SlaveStartBank
+                0x0000000000000000       0x38 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_Init
+                0x0000000000000000      0x2e4 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_DBGFreeze
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_TTComModeCmd
+                0x0000000000000000       0x58 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_Transmit
+                0x0000000000000000       0xbc ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_TransmitStatus
+                0x0000000000000000       0x62 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_CancelTransmit
+                0x0000000000000000       0x2a ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_Receive
+                0x0000000000000000       0x8c ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_FIFORelease
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_MessagePending
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_OperatingModeRequest
+                0x0000000000000000       0x72 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_Sleep
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_WakeUp
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_GetLastErrorCode
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_GetReceiveErrorCounter
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_GetLSBTransmitErrorCounter
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_ITConfig
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_GetFlagStatus
+                0x0000000000000000       0x56 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_ClearFlag
+                0x0000000000000000       0x40 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_GetITStatus
+                0x0000000000000000       0xd0 ./Peripheral/src/ch32v30x_can.o
+ .text.CAN_ClearITPendingBit
+                0x0000000000000000       0x94 ./Peripheral/src/ch32v30x_can.o
+ .debug_info    0x0000000000000000     0x1860 ./Peripheral/src/ch32v30x_can.o
+ .debug_abbrev  0x0000000000000000      0x3fe ./Peripheral/src/ch32v30x_can.o
+ .debug_loc     0x0000000000000000      0xa45 ./Peripheral/src/ch32v30x_can.o
+ .debug_aranges
+                0x0000000000000000       0xd8 ./Peripheral/src/ch32v30x_can.o
+ .debug_ranges  0x0000000000000000       0xf8 ./Peripheral/src/ch32v30x_can.o
+ .debug_line    0x0000000000000000     0x1f10 ./Peripheral/src/ch32v30x_can.o
+ .debug_str     0x0000000000000000      0xc0a ./Peripheral/src/ch32v30x_can.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_can.o
+ .debug_frame   0x0000000000000000      0x1b4 ./Peripheral/src/ch32v30x_can.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_crc.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_crc.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_crc.o
+ .text.CRC_ResetDR
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_crc.o
+ .text.CRC_CalcCRC
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_crc.o
+ .text.CRC_CalcBlockCRC
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_crc.o
+ .text.CRC_GetCRC
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_crc.o
+ .text.CRC_SetIDRegister
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_crc.o
+ .text.CRC_GetIDRegister
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_crc.o
+ .debug_info    0x0000000000000000      0xab3 ./Peripheral/src/ch32v30x_crc.o
+ .debug_abbrev  0x0000000000000000      0x25f ./Peripheral/src/ch32v30x_crc.o
+ .debug_loc     0x0000000000000000       0x75 ./Peripheral/src/ch32v30x_crc.o
+ .debug_aranges
+                0x0000000000000000       0x48 ./Peripheral/src/ch32v30x_crc.o
+ .debug_ranges  0x0000000000000000       0x38 ./Peripheral/src/ch32v30x_crc.o
+ .debug_line    0x0000000000000000      0x3e4 ./Peripheral/src/ch32v30x_crc.o
+ .debug_str     0x0000000000000000      0x6a7 ./Peripheral/src/ch32v30x_crc.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_crc.o
+ .debug_frame   0x0000000000000000       0x70 ./Peripheral/src/ch32v30x_crc.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dac.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dac.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_DeInit
+                0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_Init
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_StructInit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_Cmd  0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_DMACmd
+                0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_SoftwareTriggerCmd
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_DualSoftwareTriggerCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_WaveGenerationCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_SetChannel1Data
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_SetChannel2Data
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_SetDualChannelData
+                0x0000000000000000       0x1c ./Peripheral/src/ch32v30x_dac.o
+ .text.DAC_GetDataOutputValue
+                0x0000000000000000       0x26 ./Peripheral/src/ch32v30x_dac.o
+ .debug_info    0x0000000000000000      0xdbd ./Peripheral/src/ch32v30x_dac.o
+ .debug_abbrev  0x0000000000000000      0x2fe ./Peripheral/src/ch32v30x_dac.o
+ .debug_loc     0x0000000000000000      0x23b ./Peripheral/src/ch32v30x_dac.o
+ .debug_aranges
+                0x0000000000000000       0x78 ./Peripheral/src/ch32v30x_dac.o
+ .debug_ranges  0x0000000000000000       0x68 ./Peripheral/src/ch32v30x_dac.o
+ .debug_line    0x0000000000000000      0x809 ./Peripheral/src/ch32v30x_dac.o
+ .debug_str     0x0000000000000000      0x82b ./Peripheral/src/ch32v30x_dac.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_dac.o
+ .debug_frame   0x0000000000000000       0xf4 ./Peripheral/src/ch32v30x_dac.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .text.DBGMCU_GetREVID
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_dbgmcu.o
+ .text.DBGMCU_GetDEVID
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_dbgmcu.o
+ .text.__get_DEBUG_CR
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .text.__set_DEBUG_CR
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .text.DBGMCU_Config
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dma.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dma.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_DeInit
+                0x0000000000000000      0x16c ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_Init
+                0x0000000000000000       0x38 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_StructInit
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_Cmd  0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_ITConfig
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_SetCurrDataCounter
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_GetCurrDataCounter
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_GetFlagStatus
+                0x0000000000000000       0x32 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_ClearFlag
+                0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_GetITStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_dma.o
+ .text.DMA_ClearITPendingBit
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_dma.o
+ .debug_info    0x0000000000000000      0xd16 ./Peripheral/src/ch32v30x_dma.o
+ .debug_abbrev  0x0000000000000000      0x2fd ./Peripheral/src/ch32v30x_dma.o
+ .debug_loc     0x0000000000000000      0x19a ./Peripheral/src/ch32v30x_dma.o
+ .debug_aranges
+                0x0000000000000000       0x60 ./Peripheral/src/ch32v30x_dma.o
+ .debug_ranges  0x0000000000000000       0x50 ./Peripheral/src/ch32v30x_dma.o
+ .debug_line    0x0000000000000000      0x9f0 ./Peripheral/src/ch32v30x_dma.o
+ .debug_str     0x0000000000000000      0x81f ./Peripheral/src/ch32v30x_dma.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_dma.o
+ .debug_frame   0x0000000000000000       0xd8 ./Peripheral/src/ch32v30x_dma.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dvp.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dvp.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_dvp.o
+ .text.DVP_INTCfg
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_dvp.o
+ .text.DVP_Mode
+                0x0000000000000000       0x32 ./Peripheral/src/ch32v30x_dvp.o
+ .text.DVP_Cfg  0x0000000000000000       0x62 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_info    0x0000000000000000      0xbc5 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_abbrev  0x0000000000000000      0x241 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_loc     0x0000000000000000       0x74 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_aranges
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_ranges  0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_line    0x0000000000000000      0x457 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_str     0x0000000000000000      0x768 ./Peripheral/src/ch32v30x_dvp.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_dvp.o
+ .debug_frame   0x0000000000000000       0x40 ./Peripheral/src/ch32v30x_dvp.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_eth.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_eth.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DeInit
+                0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_StructInit
+                0x0000000000000000       0xd8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_HandleTxPkt
+                0x0000000000000000       0x8c ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_HandleRxPkt
+                0x0000000000000000       0x9e ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetRxPktSize
+                0x0000000000000000       0x32 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DropRxPkt
+                0x0000000000000000       0x3c ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_ReadPHYRegister
+                0x0000000000000000       0x58 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_WritePHYRegister
+                0x0000000000000000       0x52 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_PHYLoopBackCmd
+                0x0000000000000000       0x40 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACTransmissionCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACReceptionCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetFlowControlBusyStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_InitiatePauseControlFrame
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_BackPressureActivationCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetMACFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetMACITStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACITConfig
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACAddressConfig
+                0x0000000000000000       0x32 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetMACAddress
+                0x0000000000000000       0x32 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACAddressPerfectFilterCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACAddressFilterConfig
+                0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MACAddressMaskBytesFilterConfig
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescChainInit
+                0x0000000000000000       0x46 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescRingInit
+                0x0000000000000000       0x44 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMATxDescFlagStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMATxDescCollisionCount
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetDMATxDescOwnBit
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescTransmitITConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescFrameSegmentConfig
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescChecksumInsertionConfig
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescCRCCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescEndOfRingCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescSecondAddressChainedCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescShortFramePaddingCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescTimeStampCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATxDescBufferSizeConfig
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMARxDescChainInit
+                0x0000000000000000       0x50 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMARxDescRingInit
+                0x0000000000000000       0x52 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMARxDescFlagStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetDMARxDescOwnBit
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMARxDescFrameLength
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMARxDescReceiveITConfig
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMARxDescEndOfRingCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMARxDescSecondAddressChainedCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMARxDescBufferSize
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SoftwareReset
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetSoftwareResetStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetlinkStaus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMAFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMAClearFlag
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMAITStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMAClearITPendingBit
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetTransmitProcessState
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetReceiveProcessState
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_FlushTransmitFIFO
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_Start
+                0x0000000000000000       0x40 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetFlushTransmitFIFOStatus
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMATransmissionCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMAReceptionCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMAITConfig
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetDMAOverflowStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetRxOverflowMissedFrameCounter
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetBufferUnavailableMissedFrameCounter
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetCurrentTxDescStartAddress
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetCurrentRxDescStartAddress
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetCurrentTxBufferAddress
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetCurrentRxBufferAddress
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_ResumeDMATransmission
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_ResumeDMAReception
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_ResetWakeUpFrameFilterRegisterPointer
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetWakeUpFrameFilterRegister
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GlobalUnicastWakeUpCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetPMTFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_WakeUpFrameDetectionCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MagicPacketDetectionCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_PowerDownCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MMCCounterFreezeCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MMCResetOnReadCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MMCCounterRolloverCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MMCCountersReset
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_MMCITConfig
+                0x0000000000000000       0x5c ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetMMCITStatus
+                0x0000000000000000       0x3a ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetMMCRegister
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_EnablePTPTimeStampAddend
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_EnablePTPTimeStampInterruptTrigger
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_EnablePTPTimeStampUpdate
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_InitializePTPTimeStamp
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_PTPUpdateMethodConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_PTPTimeStampCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetPTPFlagStatus
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetPTPSubSecondIncrement
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetPTPTimeStampUpdate
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetPTPTimeStampAddend
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_SetPTPTargetTime
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_GetPTPRegister
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMAPTPTxDescChainInit
+                0x0000000000000000       0x66 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_DMAPTPRxDescChainInit
+                0x0000000000000000       0x70 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_HandlePTPTxPkt
+                0x0000000000000000       0xe6 ./Peripheral/src/ch32v30x_eth.o
+ .text.ETH_HandlePTPRxPkt
+                0x0000000000000000       0xd0 ./Peripheral/src/ch32v30x_eth.o
+ .text.RGMII_TXC_Delay
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_eth.o
+ .sbss.DMAPTPRxDescToGet
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_eth.o
+ .sbss.DMAPTPTxDescToSet
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_eth.o
+ .sbss.DMARxDescToGet
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_eth.o
+ .sbss.DMATxDescToSet
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_eth.o
+ .debug_info    0x0000000000000000     0x270c ./Peripheral/src/ch32v30x_eth.o
+ .debug_abbrev  0x0000000000000000      0x47b ./Peripheral/src/ch32v30x_eth.o
+ .debug_loc     0x0000000000000000      0xef1 ./Peripheral/src/ch32v30x_eth.o
+ .debug_aranges
+                0x0000000000000000      0x300 ./Peripheral/src/ch32v30x_eth.o
+ .debug_ranges  0x0000000000000000      0x368 ./Peripheral/src/ch32v30x_eth.o
+ .debug_line    0x0000000000000000     0x324f ./Peripheral/src/ch32v30x_eth.o
+ .debug_str     0x0000000000000000     0x193c ./Peripheral/src/ch32v30x_eth.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_eth.o
+ .debug_frame   0x0000000000000000      0x6a4 ./Peripheral/src/ch32v30x_eth.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_exti.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_exti.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_DeInit
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_Init
+                0x0000000000000000       0x6a ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_StructInit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_GenerateSWInterrupt
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_GetFlagStatus
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_ClearFlag
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_GetITStatus
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_exti.o
+ .text.EXTI_ClearITPendingBit
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_exti.o
+ .debug_info    0x0000000000000000      0xc0d ./Peripheral/src/ch32v30x_exti.o
+ .debug_abbrev  0x0000000000000000      0x2da ./Peripheral/src/ch32v30x_exti.o
+ .debug_loc     0x0000000000000000      0x181 ./Peripheral/src/ch32v30x_exti.o
+ .debug_aranges
+                0x0000000000000000       0x50 ./Peripheral/src/ch32v30x_exti.o
+ .debug_ranges  0x0000000000000000       0x40 ./Peripheral/src/ch32v30x_exti.o
+ .debug_line    0x0000000000000000      0x5f5 ./Peripheral/src/ch32v30x_exti.o
+ .debug_str     0x0000000000000000      0x7b9 ./Peripheral/src/ch32v30x_exti.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_exti.o
+ .debug_frame   0x0000000000000000       0x90 ./Peripheral/src/ch32v30x_exti.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_flash.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_flash.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_flash.o
+ .text.ROM_ERASE
+                0x0000000000000000       0xa0 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_Unlock
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_UnlockBank1
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_Lock
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_LockBank1
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_GetUserOptionByte
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_GetWriteProtectionOptionByte
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_GetReadOutProtectionStatus
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ITConfig
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_GetFlagStatus
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ClearFlag
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_GetStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_GetBank1Status
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_WaitForLastOperation
+                0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ErasePage
+                0x0000000000000000       0x4c ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_EraseAllPages
+                0x0000000000000000       0x56 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_EraseAllBank1Pages
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_EraseOptionBytes
+                0x0000000000000000       0xe6 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ProgramWord
+                0x0000000000000000       0x68 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ProgramHalfWord
+                0x0000000000000000       0x48 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ProgramOptionByteData
+                0x0000000000000000      0x11a ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_EnableWriteProtection
+                0x0000000000000000      0x106 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ReadOutProtection
+                0x0000000000000000       0xf4 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_UserOptionByteConfig
+                0x0000000000000000      0x110 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_WaitForLastBank1Operation
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_Unlock_Fast
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_Lock_Fast
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ErasePage_Fast
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_EraseBlock_32K_Fast
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ProgramPage_Fast
+                0x0000000000000000       0x64 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_Access_Clock_Cfg
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_Enhance_Mode
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ROM_ERASE
+                0x0000000000000000      0x1a4 ./Peripheral/src/ch32v30x_flash.o
+ .text.FLASH_ROM_WRITE
+                0x0000000000000000       0xce ./Peripheral/src/ch32v30x_flash.o
+ .debug_info    0x0000000000000000     0x15c3 ./Peripheral/src/ch32v30x_flash.o
+ .debug_abbrev  0x0000000000000000      0x496 ./Peripheral/src/ch32v30x_flash.o
+ .debug_loc     0x0000000000000000      0xcca ./Peripheral/src/ch32v30x_flash.o
+ .debug_aranges
+                0x0000000000000000      0x108 ./Peripheral/src/ch32v30x_flash.o
+ .debug_ranges  0x0000000000000000      0x110 ./Peripheral/src/ch32v30x_flash.o
+ .debug_line    0x0000000000000000     0x24b2 ./Peripheral/src/ch32v30x_flash.o
+ .debug_str     0x0000000000000000      0xb2a ./Peripheral/src/ch32v30x_flash.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_flash.o
+ .debug_frame   0x0000000000000000      0x370 ./Peripheral/src/ch32v30x_flash.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_fsmc.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_fsmc.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NORSRAMDeInit
+                0x0000000000000000       0x3c ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NANDDeInit
+                0x0000000000000000       0x26 ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NORSRAMInit
+                0x0000000000000000       0xaa ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NANDInit
+                0x0000000000000000       0x84 ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NORSRAMStructInit
+                0x0000000000000000       0x58 ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NANDStructInit
+                0x0000000000000000       0x36 ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NORSRAMCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NANDCmd
+                0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_NANDECCCmd
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_GetECC
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_fsmc.o
+ .text.FSMC_GetFlagStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_info    0x0000000000000000      0xefb ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_abbrev  0x0000000000000000      0x2d9 ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_loc     0x0000000000000000      0x2ae ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_aranges
+                0x0000000000000000       0x70 ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_ranges  0x0000000000000000       0x60 ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_line    0x0000000000000000      0xc1b ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_str     0x0000000000000000      0xa7e ./Peripheral/src/ch32v30x_fsmc.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_fsmc.o
+ .debug_frame   0x0000000000000000       0xc0 ./Peripheral/src/ch32v30x_fsmc.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_gpio.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_gpio.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_DeInit
+                0x0000000000000000       0xa4 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_AFIODeInit
+                0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_StructInit
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_ReadInputData
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_ReadOutputDataBit
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_ReadOutputData
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_SetBits
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_ResetBits
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_Write
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_PinLockConfig
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_EventOutputConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_EventOutputCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_PinRemapConfig
+                0x0000000000000000       0xd6 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_EXTILineConfig
+                0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_ETH_MediaInterfaceConfig
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_gpio.o
+ .text.GPIO_IPD_Unused
+                0x0000000000000000      0x23c ./Peripheral/src/ch32v30x_gpio.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_i2c.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_i2c.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_DeInit
+                0x0000000000000000       0x4c ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_Init
+                0x0000000000000000      0x10c ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_StructInit
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_Cmd  0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_DMACmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_DMALastTransferCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GenerateSTART
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GenerateSTOP
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_AcknowledgeConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_OwnAddress2Config
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_DualAddressCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GeneralCallCmd
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_ITConfig
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_SendData
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_ReceiveData
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_Send7bitAddress
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_ReadRegister
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_SoftwareResetCmd
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_NACKPositionConfig
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_SMBusAlertConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_TransmitPEC
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_PECPositionConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_CalculatePEC
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GetPEC
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_ARPCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_StretchClockCmd
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_FastModeDutyCycleConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_CheckEvent
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GetLastEvent
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GetFlagStatus
+                0x0000000000000000       0x32 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_ClearFlag
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_GetITStatus
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_i2c.o
+ .text.I2C_ClearITPendingBit
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_i2c.o
+ .debug_info    0x0000000000000000     0x1481 ./Peripheral/src/ch32v30x_i2c.o
+ .debug_abbrev  0x0000000000000000      0x3a7 ./Peripheral/src/ch32v30x_i2c.o
+ .debug_loc     0x0000000000000000      0x6cc ./Peripheral/src/ch32v30x_i2c.o
+ .debug_aranges
+                0x0000000000000000      0x110 ./Peripheral/src/ch32v30x_i2c.o
+ .debug_ranges  0x0000000000000000      0x100 ./Peripheral/src/ch32v30x_i2c.o
+ .debug_line    0x0000000000000000     0x1158 ./Peripheral/src/ch32v30x_i2c.o
+ .debug_str     0x0000000000000000      0xb0c ./Peripheral/src/ch32v30x_i2c.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_i2c.o
+ .debug_frame   0x0000000000000000      0x264 ./Peripheral/src/ch32v30x_i2c.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_iwdg.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_iwdg.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_iwdg.o
+ .text.IWDG_WriteAccessCmd
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_iwdg.o
+ .text.IWDG_SetPrescaler
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_iwdg.o
+ .text.IWDG_SetReload
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_iwdg.o
+ .text.IWDG_ReloadCounter
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_iwdg.o
+ .text.IWDG_Enable
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_iwdg.o
+ .text.IWDG_GetFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_info    0x0000000000000000      0xb74 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_abbrev  0x0000000000000000      0x282 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_loc     0x0000000000000000       0x68 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_aranges
+                0x0000000000000000       0x48 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_ranges  0x0000000000000000       0x38 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_line    0x0000000000000000      0x414 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_str     0x0000000000000000      0x730 ./Peripheral/src/ch32v30x_iwdg.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_iwdg.o
+ .debug_frame   0x0000000000000000       0x70 ./Peripheral/src/ch32v30x_iwdg.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_misc.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_misc.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_misc.o
+ .text.NVIC_Init
+                0x0000000000000000       0x60 ./Peripheral/src/ch32v30x_misc.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_opa.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_opa.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_opa.o
+ .text.OPA_DeInit
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_opa.o
+ .text.OPA_Init
+                0x0000000000000000       0x36 ./Peripheral/src/ch32v30x_opa.o
+ .text.OPA_StructInit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_opa.o
+ .text.OPA_Cmd  0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_opa.o
+ .debug_info    0x0000000000000000      0xb28 ./Peripheral/src/ch32v30x_opa.o
+ .debug_abbrev  0x0000000000000000      0x252 ./Peripheral/src/ch32v30x_opa.o
+ .debug_loc     0x0000000000000000       0x56 ./Peripheral/src/ch32v30x_opa.o
+ .debug_aranges
+                0x0000000000000000       0x38 ./Peripheral/src/ch32v30x_opa.o
+ .debug_ranges  0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_opa.o
+ .debug_line    0x0000000000000000      0x47d ./Peripheral/src/ch32v30x_opa.o
+ .debug_str     0x0000000000000000      0x6e7 ./Peripheral/src/ch32v30x_opa.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_opa.o
+ .debug_frame   0x0000000000000000       0x50 ./Peripheral/src/ch32v30x_opa.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_pwr.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_pwr.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_DeInit
+                0x0000000000000000       0x2c ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_BackupAccessCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_PVDCmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_PVDLevelConfig
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_WakeUpPinCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTOPMode
+                0x0000000000000000       0x7c ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTANDBYMode
+                0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_GetFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_ClearFlag
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTANDBYMode_RAM
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTANDBYMode_RAM_LV
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTANDBYMode_RAM_VBAT_EN
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_pwr.o
+ .text.PWR_EnterSTOPMode_RAM_LV
+                0x0000000000000000       0x82 ./Peripheral/src/ch32v30x_pwr.o
+ .debug_info    0x0000000000000000     0x101d ./Peripheral/src/ch32v30x_pwr.o
+ .debug_abbrev  0x0000000000000000      0x3aa ./Peripheral/src/ch32v30x_pwr.o
+ .debug_loc     0x0000000000000000      0x278 ./Peripheral/src/ch32v30x_pwr.o
+ .debug_aranges
+                0x0000000000000000       0x88 ./Peripheral/src/ch32v30x_pwr.o
+ .debug_ranges  0x0000000000000000       0xf8 ./Peripheral/src/ch32v30x_pwr.o
+ .debug_line    0x0000000000000000      0xae0 ./Peripheral/src/ch32v30x_pwr.o
+ .debug_str     0x0000000000000000      0x883 ./Peripheral/src/ch32v30x_pwr.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_pwr.o
+ .debug_frame   0x0000000000000000       0xfc ./Peripheral/src/ch32v30x_pwr.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rcc.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rcc.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_DeInit
+                0x0000000000000000       0x52 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_HSEConfig
+                0x0000000000000000       0x3c ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_AdjustHSICalibrationValue
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_HSICmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PLLConfig
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PLLCmd
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_SYSCLKConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_GetSYSCLKSource
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_HCLKConfig
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PCLK1Config
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PCLK2Config
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ITConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ADCCLKConfig
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_LSEConfig
+                0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_LSICmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_RTCCLKConfig
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_RTCCLKCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_AHBPeriphClockCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_APB2PeriphResetCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_APB1PeriphResetCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_BackupResetCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ClockSecuritySystemCmd
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_MCOConfig
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_GetFlagStatus
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_WaitForHSEStartUp
+                0x0000000000000000       0x42 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ClearFlag
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_GetITStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ClearITPendingBit
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PREDIV1Config
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PREDIV2Config
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PLL2Config
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PLL2Cmd
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PLL3Config
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_PLL3Cmd
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_USBFSCLKConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_I2S2CLKConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_I2S3CLKConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_AHBPeriphResetCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ADCCLKADJcmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_RNGCLKConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ETH1GCLKConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_ETH1G_125Mcmd
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_USBHSConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_USBHSPLLCLKConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_USBHSPLLCKREFCLKConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_USBHSPHYPLLALIVEcmd
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rcc.o
+ .text.RCC_USBCLK48MConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_rcc.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rng.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rng.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_Cmd  0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_GetRandomNumber
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_ITConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_GetFlagStatus
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_ClearFlag
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_GetITStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rng.o
+ .text.RNG_ClearITPendingBit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rng.o
+ .debug_info    0x0000000000000000      0xb02 ./Peripheral/src/ch32v30x_rng.o
+ .debug_abbrev  0x0000000000000000      0x2c8 ./Peripheral/src/ch32v30x_rng.o
+ .debug_loc     0x0000000000000000       0xa8 ./Peripheral/src/ch32v30x_rng.o
+ .debug_aranges
+                0x0000000000000000       0x48 ./Peripheral/src/ch32v30x_rng.o
+ .debug_ranges  0x0000000000000000       0x38 ./Peripheral/src/ch32v30x_rng.o
+ .debug_line    0x0000000000000000      0x44a ./Peripheral/src/ch32v30x_rng.o
+ .debug_str     0x0000000000000000      0x6b8 ./Peripheral/src/ch32v30x_rng.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_rng.o
+ .debug_frame   0x0000000000000000       0x8c ./Peripheral/src/ch32v30x_rng.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rtc.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rtc.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_ITConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_EnterConfigMode
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_ExitConfigMode
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_GetCounter
+                0x0000000000000000       0x5a ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_SetCounter
+                0x0000000000000000       0x3c ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_SetPrescaler
+                0x0000000000000000       0x3e ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_SetAlarm
+                0x0000000000000000       0x3c ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_GetDivider
+                0x0000000000000000       0x60 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_WaitForLastTask
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_WaitForSynchro
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_GetFlagStatus
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_ClearFlag
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_GetITStatus
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_rtc.o
+ .text.RTC_ClearITPendingBit
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_info    0x0000000000000000      0xdd4 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_abbrev  0x0000000000000000      0x30b ./Peripheral/src/ch32v30x_rtc.o
+ .debug_loc     0x0000000000000000      0x377 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_aranges
+                0x0000000000000000       0x80 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_ranges  0x0000000000000000       0x70 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_line    0x0000000000000000      0x9c4 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_str     0x0000000000000000      0x832 ./Peripheral/src/ch32v30x_rtc.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_rtc.o
+ .debug_frame   0x0000000000000000      0x12c ./Peripheral/src/ch32v30x_rtc.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_sdio.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_sdio.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_DeInit
+                0x0000000000000000       0x30 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_Init
+                0x0000000000000000       0x2a ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_StructInit
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_ClockCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_SetPowerState
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetPowerState
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_ITConfig
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_DMACmd
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_SendCommand
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_CmdStructInit
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetCommandResponse
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetResponse
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_DataConfig
+                0x0000000000000000       0x26 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_DataStructInit
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetDataCounter
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_ReadData
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_WriteData
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetFIFOCount
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_StartSDIOReadWait
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_StopSDIOReadWait
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_SetSDIOReadWaitMode
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_SetSDIOOperation
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_SendSDIOSuspendCmd
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_CommandCompletionCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_CEATAITCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_SendCEATACmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetFlagStatus
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_ClearFlag
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_GetITStatus
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_sdio.o
+ .text.SDIO_ClearITPendingBit
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_sdio.o
+ .debug_info    0x0000000000000000     0x10fd ./Peripheral/src/ch32v30x_sdio.o
+ .debug_abbrev  0x0000000000000000      0x385 ./Peripheral/src/ch32v30x_sdio.o
+ .debug_loc     0x0000000000000000      0x1bb ./Peripheral/src/ch32v30x_sdio.o
+ .debug_aranges
+                0x0000000000000000       0xf8 ./Peripheral/src/ch32v30x_sdio.o
+ .debug_ranges  0x0000000000000000       0xe8 ./Peripheral/src/ch32v30x_sdio.o
+ .debug_line    0x0000000000000000      0xcba ./Peripheral/src/ch32v30x_sdio.o
+ .debug_str     0x0000000000000000      0xa9b ./Peripheral/src/ch32v30x_sdio.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_sdio.o
+ .debug_frame   0x0000000000000000      0x204 ./Peripheral/src/ch32v30x_sdio.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_spi.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_spi.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_DeInit
+                0x0000000000000000       0x70 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_Init
+                0x0000000000000000       0x3e ./Peripheral/src/ch32v30x_spi.o
+ .text.I2S_Init
+                0x0000000000000000       0xc6 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_StructInit
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_spi.o
+ .text.I2S_StructInit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_Cmd  0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_spi.o
+ .text.I2S_Cmd  0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_ITConfig
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_DMACmd
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_SendData
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_ReceiveData
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_NSSInternalSoftwareConfig
+                0x0000000000000000       0x24 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_SSOutputCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_DataSizeConfig
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_TransmitCRC
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_CalculateCRC
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_GetCRC
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_GetCRCPolynomial
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_BiDirectionalLineConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_GetFlagStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_ClearFlag
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_GetITStatus
+                0x0000000000000000       0x28 ./Peripheral/src/ch32v30x_spi.o
+ .text.SPI_I2S_ClearITPendingBit
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_spi.o
+ .debug_info    0x0000000000000000     0x12cd ./Peripheral/src/ch32v30x_spi.o
+ .debug_abbrev  0x0000000000000000      0x312 ./Peripheral/src/ch32v30x_spi.o
+ .debug_loc     0x0000000000000000      0x598 ./Peripheral/src/ch32v30x_spi.o
+ .debug_aranges
+                0x0000000000000000       0xd0 ./Peripheral/src/ch32v30x_spi.o
+ .debug_ranges  0x0000000000000000       0xc0 ./Peripheral/src/ch32v30x_spi.o
+ .debug_line    0x0000000000000000      0xd4f ./Peripheral/src/ch32v30x_spi.o
+ .debug_str     0x0000000000000000      0xabb ./Peripheral/src/ch32v30x_spi.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_spi.o
+ .debug_frame   0x0000000000000000      0x1a8 ./Peripheral/src/ch32v30x_spi.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_tim.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_tim.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_tim.o
+ .text.TI1_Config
+                0x0000000000000000       0x36 ./Peripheral/src/ch32v30x_tim.o
+ .text.TI2_Config
+                0x0000000000000000       0x44 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_DeInit
+                0x0000000000000000      0x138 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_TimeBaseInit
+                0x0000000000000000       0xaa ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC1Init
+                0x0000000000000000       0x82 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC2Init
+                0x0000000000000000       0xae ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC3Init
+                0x0000000000000000       0xac ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC4Init
+                0x0000000000000000       0x88 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_BDTRConfig
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_TimeBaseStructInit
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OCStructInit
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ICStructInit
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_BDTRStructInit
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_Cmd  0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_CtrlPWMOutputs
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ITConfig
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GenerateEvent
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_DMAConfig
+                0x0000000000000000        0x8 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_DMACmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_InternalClockConfig
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ITRxExternalClockConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_TIxExternalClockConfig
+                0x0000000000000000       0x48 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ETRConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ETRClockMode1Config
+                0x0000000000000000       0x2a ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ETRClockMode2Config
+                0x0000000000000000       0x22 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_PrescalerConfig
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_CounterModeConfig
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectInputTrigger
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_EncoderInterfaceConfig
+                0x0000000000000000       0x3c ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ForcedOC1Config
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ForcedOC2Config
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ForcedOC3Config
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ForcedOC4Config
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ARRPreloadConfig
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectCOM
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectCCDMA
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_CCPreloadControl
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC1PreloadConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC2PreloadConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC3PreloadConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC4PreloadConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC1FastConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC2FastConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC3FastConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC4FastConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ClearOC1Ref
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ClearOC2Ref
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ClearOC3Ref
+                0x0000000000000000       0x10 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ClearOC4Ref
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC1PolarityConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC1NPolarityConfig
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC2PolarityConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC2NPolarityConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC3PolarityConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC3NPolarityConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_OC4PolarityConfig
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_CCxCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_CCxNCmd
+                0x0000000000000000       0x20 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectOCxM
+                0x0000000000000000       0x4c ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_UpdateDisableConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_UpdateRequestConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectHallSensor
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectOnePulseMode
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectOutputTrigger
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectSlaveMode
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SelectMasterSlaveMode
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetCounter
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetAutoreload
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetCompare1
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetCompare2
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetCompare3
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetCompare4
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetIC1Prescaler
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetIC2Prescaler
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_PWMIConfig
+                0x0000000000000000       0x92 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetIC3Prescaler
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetIC4Prescaler
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ICInit
+                0x0000000000000000       0xfa ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_SetClockDivision
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetCapture1
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetCapture2
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetCapture3
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetCapture4
+                0x0000000000000000        0x6 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetCounter
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetPrescaler
+                0x0000000000000000        0x4 ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_GetFlagStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_tim.o
+ .text.TIM_ClearFlag
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_tim.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_usart.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_usart.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_DeInit
+                0x0000000000000000      0x112 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_StructInit
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_ClockInit
+                0x0000000000000000       0x1e ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_ClockStructInit
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_ITConfig
+                0x0000000000000000       0x36 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_DMACmd
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_SetAddress
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_WakeUpConfig
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_ReceiverWakeUpCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_LINBreakDetectLengthConfig
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_LINCmd
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_SendBreak
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_SetGuardTime
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_SetPrescaler
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_SmartCardCmd
+                0x0000000000000000       0x1a ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_SmartCardNACKCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_HalfDuplexCmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_IrDAConfig
+                0x0000000000000000       0x16 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_IrDACmd
+                0x0000000000000000       0x18 ./Peripheral/src/ch32v30x_usart.o
+ .text.USART_ClearFlag
+                0x0000000000000000        0xc ./Peripheral/src/ch32v30x_usart.o
+ .text          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_wwdg.o
+ .data          0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_wwdg.o
+ .bss           0x0000000000000000        0x0 ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_DeInit
+                0x0000000000000000       0x2e ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_SetPrescaler
+                0x0000000000000000       0x14 ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_SetWindowValue
+                0x0000000000000000       0x26 ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_EnableIT
+                0x0000000000000000       0x12 ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_SetCounter
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_Enable
+                0x0000000000000000        0xe ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_GetFlagStatus
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_wwdg.o
+ .text.WWDG_ClearFlag
+                0x0000000000000000        0xa ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_info    0x0000000000000000      0xb28 ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_abbrev  0x0000000000000000      0x29d ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_loc     0x0000000000000000       0xae ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_aranges
+                0x0000000000000000       0x58 ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_ranges  0x0000000000000000       0x48 ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_line    0x0000000000000000      0x4b8 ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_str     0x0000000000000000      0x6de ./Peripheral/src/ch32v30x_wwdg.o
+ .comment       0x0000000000000000       0x34 ./Peripheral/src/ch32v30x_wwdg.o
+ .debug_frame   0x0000000000000000       0xa4 ./Peripheral/src/ch32v30x_wwdg.o
+ .text          0x0000000000000000        0x0 ./Debug/debug.o
+ .data          0x0000000000000000        0x0 ./Debug/debug.o
+ .bss           0x0000000000000000        0x0 ./Debug/debug.o
+ .text.SDI_Printf_Enable
+                0x0000000000000000       0x2a ./Debug/debug.o
+ .text          0x0000000000000000        0x0 ./Core/core_riscv.o
+ .data          0x0000000000000000        0x0 ./Core/core_riscv.o
+ .bss           0x0000000000000000        0x0 ./Core/core_riscv.o
+ .text.__get_FFLAGS
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_FFLAGS
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_FRM
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_FRM
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_FCSR
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_FCSR
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MSTATUS
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MSTATUS
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MISA
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MISA
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MTVEC
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MTVEC
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MSCRATCH
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MSCRATCH
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MEPC
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MEPC
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MCAUSE
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MCAUSE
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MTVAL
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__set_MTVAL
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MVENDORID
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MARCHID
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MIMPID
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_MHARTID
+                0x0000000000000000        0x6 ./Core/core_riscv.o
+ .text.__get_SP
+                0x0000000000000000        0x4 ./Core/core_riscv.o
+ .debug_info    0x0000000000000000      0x46d ./Core/core_riscv.o
+ .debug_abbrev  0x0000000000000000      0x10d ./Core/core_riscv.o
+ .debug_aranges
+                0x0000000000000000       0xe0 ./Core/core_riscv.o
+ .debug_ranges  0x0000000000000000       0xd0 ./Core/core_riscv.o
+ .debug_line    0x0000000000000000      0x56a ./Core/core_riscv.o
+ .debug_str     0x0000000000000000      0x30c ./Core/core_riscv.o
+ .comment       0x0000000000000000       0x34 ./Core/core_riscv.o
+ .debug_frame   0x0000000000000000      0x1a0 ./Core/core_riscv.o
+ .text          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .data          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .bss           0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_pi_cdr_reset
+                0x0000000000000000       0x2c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_oversample_designed_pll_release
+                0x0000000000000000       0x30 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_oversample_designed_rxpll_iband
+                0x0000000000000000       0x62 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_oversample_designed_pll_kband_enable
+                0x0000000000000000       0x7a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_get_tmds_overload
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_edid_config
+                0x0000000000000000       0x46 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_phy_select_get
+                0x0000000000000000       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_phy_select_set
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_mode_get
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_mode_set
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_waittime_get
+                0x0000000000000000       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_waittime_set
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_trigger
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_done_flag
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_cal_result
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_resoveride_get
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_resoveride_set
+                0x0000000000000000       0x28 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_term_cmp_flag
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_mode_get
+                0x0000000000000000       0x3e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_mode_set
+                0x0000000000000000       0x50 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_autosel_get
+                0x0000000000000000       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_autosel_set
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_waittime_get
+                0x0000000000000000       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_waittime_set
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_value_get
+                0x0000000000000000       0x3e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_value_set
+                0x0000000000000000       0x5c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_trigger
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_done_flag
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_cal_result
+                0x0000000000000000       0x3e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_offset_cal_count
+                0x0000000000000000       0x3a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_mode_get
+                0x0000000000000000       0x3e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_mode_set
+                0x0000000000000000       0x4a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_cal_time_get
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_cal_time_set
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_loop_num_get
+                0x0000000000000000       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_loop_num_set
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_pass_threshold_get
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_pass_threshold_set
+                0x0000000000000000       0x28 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_gain_sel_get
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_gain_sel_set
+                0x0000000000000000       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_gain_value_get
+                0x0000000000000000       0x3c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_gain_value_set
+                0x0000000000000000       0x40 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_trigger
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_done_flag
+                0x0000000000000000       0x50 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_fail_flag
+                0x0000000000000000       0x52 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_result_value_get
+                0x0000000000000000       0x46 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_rd_sel_get
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_rd_sel_set
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_hit_num_get
+                0x0000000000000000       0x3a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_eq_phase_cnt_get
+                0x0000000000000000       0x3a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_netlist_phy_init
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_term_resoveride_set
+                0x0000000000000000       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_phy_term_enable
+                0x0000000000000000       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_phy_eq_gain_set
+                0x0000000000000000       0x4a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_phy_28eq_gain_set
+                0x0000000000000000       0xce D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_pi_28eq_set_and_get_error
+                0x0000000000000000       0x76 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_tmds_error_detect
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_rxpll_lock_status
+                0x0000000000000000       0x4a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_rxpll_mode_set
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_rxpll_trigger
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_rxpll_done_flag
+                0x0000000000000000       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_rxpll_lock_flag
+                0x0000000000000000       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_phy_init
+                0x0000000000000000       0xc0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_designed_phy_config
+                0x0000000000000000      0x386 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_netlist_rxpll_mode_set
+                0x0000000000000000       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_netlist_rxpll_trigger
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_netlist_rxpll_done_flag
+                0x0000000000000000       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_netlist_rxpll_lock_flag
+                0x0000000000000000       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_oversample_netlist_pll_init
+                0x0000000000000000       0xfa D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_rxpll_done_flag
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_rxpll_lock_flag
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_hdmi_mode_set
+                0x0000000000000000        0x2 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_get_Ri
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_bcaps_fast_ddc_support_enable
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_shav_enable
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_reset_enable.part.9
+                0x0000000000000000       0x2e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_reset_enable
+                0x0000000000000000       0x2c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_device_config
+                0x0000000000000000       0x28 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_bcaps_rpt_enable
+                0x0000000000000000       0x32 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_ready_get
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_get_mdt_interrupt_status_ext
+                0x0000000000000000       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_dvidet
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_ksv_fifo_set
+                0x0000000000000000       0x82 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_hdcp_rpt_ksv_init
+                0x0000000000000000       0x62 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_hdcp_detect_enable
+                0x0000000000000000       0x18 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_enable
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_get_pdec_header_audio_mode
+                0x0000000000000000       0x3c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_get_inforframe_audio_mode
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status_ext
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_28eq_config
+                0x0000000000000000      0x2d6 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_phy_config_with_28eq
+                0x0000000000000000      0x1de D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_audio_fifo_interrupt_get_status
+                0x0000000000000000       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_audio_fifo_interrupt_get_status_ext
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl
+                0x0000000000000000       0x54 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_packet_fifo_init
+                0x0000000000000000       0x5c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_core_packet_fifo_get
+                0x0000000000000000       0x92 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_controller_scdc_config
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .rodata.CSWTCH.71
+                0x0000000000000000       0x1f D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .rodata.ptEqGainVal
+                0x0000000000000000       0x70 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .rodata.ptOffsetVal
+                0x0000000000000000       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .data          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .bss           0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_get_channel
+                0x0000000000000000        0xa D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_phy_data_R200_enable
+                0x0000000000000000       0x36 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_phy_clk_drive_config
+                0x0000000000000000       0x60 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_phy_data_drive_config
+                0x0000000000000000       0xce D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_phy_data_drive_enhance
+                0x0000000000000000       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_drive_config
+                0x0000000000000000       0xf0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_shell_video_mute_color_set
+                0x0000000000000000       0x96 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_shell_set_clk_repeat
+                0x0000000000000000       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_cbyte_from_channel
+                0x0000000000000000       0x28 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_shell_get_audio_cbyte_status
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_lrck
+                0x0000000000000000       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_shell_set_spd_infoframe
+                0x0000000000000000      0x10a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_audio_fs_update
+                0x0000000000000000       0x18 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xcdrv_hdmi_tx_csc_setting_get
+                0x0000000000000000       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xcdrv_hdmi_tx_fifo_enable
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_get_bcaps_from_rx
+                0x0000000000000000       0x4c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_get_bstatus_from_rx
+                0x0000000000000000       0x4c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_encryption_enable
+                0x0000000000000000       0x44 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_rpt_ksv_fifo_set
+                0x0000000000000000       0x78 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_rpt_shav_fifo_set
+                0x0000000000000000       0x3e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_rpt_enable
+                0x0000000000000000       0x30 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_rpt_shav_enable
+                0x0000000000000000       0x32 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_rpt_status_get
+                0x0000000000000000       0x2a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_repeat_init
+                0x0000000000000000      0x16a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_parse_edid
+                0x0000000000000000       0x1a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .data          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .bss           0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .text.ms933xdrv_misc_chip_id_get
+                0x0000000000000000       0x38 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .text.ms933xdrv_misc_audio_out_pad_enable
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .text.ms933xdrv_misc_audio_i2s_mclk_pad_enable
+                0x0000000000000000       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .text.ms933xdrv_misc_audio_i2s_mclk_div
+                0x0000000000000000       0x28 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .text          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ .data          0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ .bss           0x0000000000000000        0x0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ .text.ms933x_HAL_SetChipAddr
+                0x0000000000000000        0xa D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ .text.ms933x_HAL_ReadDWord
+                0x0000000000000000       0x30 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ .text.ms933x_HAL_WriteDWord
+                0x0000000000000000       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a(save-restore.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a(save-restore.o)
+ .eh_frame      0x0000000000000000       0xf8 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a(save-restore.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memcpy.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memcpy.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memcpy.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memset.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memset.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+ .text._printf_r
+                0x0000000000000000       0x40 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+ .text.__swbuf  0x0000000000000000       0x16 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+ .text.fflush   0x0000000000000000       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__fp_lock
+                0x0000000000000000        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__fp_unlock
+                0x0000000000000000        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text._cleanup
+                0x0000000000000000       0x12 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__sfp_lock_acquire
+                0x0000000000000000        0x2 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__sfp_lock_release
+                0x0000000000000000        0x2 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__sinit_lock_acquire
+                0x0000000000000000        0x2 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__sinit_lock_release
+                0x0000000000000000        0x2 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__fp_lock_all
+                0x0000000000000000       0x1a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text.__fp_unlock_all
+                0x0000000000000000       0x1a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+ .text._fwalk   0x0000000000000000       0x62 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .text.__sprint_r
+                0x0000000000000000       0x2c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .text.vfprintf
+                0x0000000000000000       0x18 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+ .text.__seofread
+                0x0000000000000000        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-writer.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-writer.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-writer.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o)
+ .text.__sfvwrite_r
+                0x0000000000000000      0x31a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o)
+ .debug_frame   0x0000000000000000       0x60 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fvwrite.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memchr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memchr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memchr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memmove.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memmove.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memmove.o)
+ .text.memmove  0x0000000000000000       0x4a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memmove.o)
+ .debug_frame   0x0000000000000000       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memmove.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o)
+ .text._realloc_r
+                0x0000000000000000       0x72 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o)
+ .debug_frame   0x0000000000000000       0x40 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-reallocr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+ .text.cleanup_glue
+                0x0000000000000000       0x2c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+ .text._reclaim_reent
+                0x0000000000000000      0x10c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-msizer.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-msizer.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-msizer.o)
+ .text._malloc_usable_size_r
+                0x0000000000000000       0x14 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-msizer.o)
+ .debug_frame   0x0000000000000000       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-msizer.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+ .text          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+ .data          0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+ .bss           0x0000000000000000        0x0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+
+Memory Configuration
+
+Name             Origin             Length             Attributes
+FLASH            0x0000000000000000 0x0000000000048000 xr
+RAM              0x0000000020000000 0x0000000000008000 xrw
+*default*        0x0000000000000000 0xffffffffffffffff
+
+Linker script and memory map
+
+LOAD ./src/src/uart_ht7315/uart_ht7315.o
+LOAD ./src/src/ms933x/ms933x_app.o
+LOAD ./src/src/IIC_hal/IIC2_Software.o
+LOAD ./src/src/IIC_hal/IIC3_Software.o
+LOAD ./src/src/IIC_hal/IIC_Hardware.o
+LOAD ./src/src/IIC_hal/IIC_Software.o
+LOAD ./src/src/BoardConfig.o
+LOAD ./src/src/TaskProcessCom.o
+LOAD ./src/src/ch32v30x_it.o
+LOAD ./src/src/main.o
+LOAD ./src/src/mculib_common.o
+LOAD ./src/src/pipe.o
+LOAD ./src/src/system_ch32v30x.o
+LOAD ./src/src/tmos.o
+LOAD ./Startup/startup_ch32v30x_D8C.o
+LOAD ./Peripheral/src/ch32v30x_adc.o
+LOAD ./Peripheral/src/ch32v30x_bkp.o
+LOAD ./Peripheral/src/ch32v30x_can.o
+LOAD ./Peripheral/src/ch32v30x_crc.o
+LOAD ./Peripheral/src/ch32v30x_dac.o
+LOAD ./Peripheral/src/ch32v30x_dbgmcu.o
+LOAD ./Peripheral/src/ch32v30x_dma.o
+LOAD ./Peripheral/src/ch32v30x_dvp.o
+LOAD ./Peripheral/src/ch32v30x_eth.o
+LOAD ./Peripheral/src/ch32v30x_exti.o
+LOAD ./Peripheral/src/ch32v30x_flash.o
+LOAD ./Peripheral/src/ch32v30x_fsmc.o
+LOAD ./Peripheral/src/ch32v30x_gpio.o
+LOAD ./Peripheral/src/ch32v30x_i2c.o
+LOAD ./Peripheral/src/ch32v30x_iwdg.o
+LOAD ./Peripheral/src/ch32v30x_misc.o
+LOAD ./Peripheral/src/ch32v30x_opa.o
+LOAD ./Peripheral/src/ch32v30x_pwr.o
+LOAD ./Peripheral/src/ch32v30x_rcc.o
+LOAD ./Peripheral/src/ch32v30x_rng.o
+LOAD ./Peripheral/src/ch32v30x_rtc.o
+LOAD ./Peripheral/src/ch32v30x_sdio.o
+LOAD ./Peripheral/src/ch32v30x_spi.o
+LOAD ./Peripheral/src/ch32v30x_tim.o
+LOAD ./Peripheral/src/ch32v30x_usart.o
+LOAD ./Peripheral/src/ch32v30x_wwdg.o
+LOAD ./Debug/debug.o
+LOAD ./Core/core_riscv.o
+LOAD D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libc_nano.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a
+START GROUP
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libc_nano.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a
+END GROUP
+START GROUP
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libc_nano.a
+LOAD c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a
+END GROUP
+                0x0000000000000800                __stack_size = 0x800
+                [!provide]                        PROVIDE (_stack_size = __stack_size)
+
+.init           0x0000000000000000        0x4
+                0x0000000000000000                _sinit = .
+                0x0000000000000000                . = ALIGN (0x4)
+ *(SORT_NONE(.init))
+ .init          0x0000000000000000        0x4 ./Startup/startup_ch32v30x_D8C.o
+                0x0000000000000000                _start
+                0x0000000000000004                . = ALIGN (0x4)
+                0x0000000000000004                _einit = .
+
+.vector         0x0000000000000004      0x1bc
+ *(.vector)
+ .vector        0x0000000000000004      0x1a0 ./Startup/startup_ch32v30x_D8C.o
+                0x00000000000001c0                . = ALIGN (0x40)
+ *fill*         0x00000000000001a4       0x1c 
+
+.text           0x00000000000001c0     0x6a90
+                0x00000000000001c0                . = ALIGN (0x4)
+ *(.text)
+ .text          0x00000000000001c0       0x60 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0\libgcc.a(save-restore.o)
+                0x00000000000001c0                __riscv_save_12
+                0x00000000000001c8                __riscv_save_9
+                0x00000000000001c8                __riscv_save_11
+                0x00000000000001c8                __riscv_save_10
+                0x00000000000001c8                __riscv_save_8
+                0x00000000000001d6                __riscv_save_4
+                0x00000000000001d6                __riscv_save_6
+                0x00000000000001d6                __riscv_save_5
+                0x00000000000001d6                __riscv_save_7
+                0x00000000000001f0                __riscv_save_3
+                0x00000000000001f0                __riscv_save_2
+                0x00000000000001f0                __riscv_save_1
+                0x00000000000001f0                __riscv_save_0
+                0x00000000000001fc                __riscv_restore_12
+                0x0000000000000200                __riscv_restore_11
+                0x0000000000000200                __riscv_restore_9
+                0x0000000000000200                __riscv_restore_10
+                0x0000000000000200                __riscv_restore_8
+                0x000000000000020a                __riscv_restore_5
+                0x000000000000020a                __riscv_restore_7
+                0x000000000000020a                __riscv_restore_6
+                0x000000000000020a                __riscv_restore_4
+                0x0000000000000214                __riscv_restore_3
+                0x0000000000000214                __riscv_restore_0
+                0x0000000000000214                __riscv_restore_2
+                0x0000000000000214                __riscv_restore_1
+ .text          0x0000000000000220       0xa8 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memset.o)
+                0x0000000000000220                memset
+ *(.text.*)
+ .text.USART1_IRQHandler
+                0x00000000000002c8       0xac ./src/src/uart_ht7315/uart_ht7315.o
+                0x00000000000002c8                USART1_IRQHandler
+ .text._tx_sink_unsupport_yuv_check
+                0x0000000000000374       0x34 ./src/src/ms933x/ms933x_app.o
+ .text._tx_sink_exist_unsupport_yuv_check
+                0x00000000000003a8       0x2a ./src/src/ms933x/ms933x_app.o
+ .text.ms933x_app_check_chip_version
+                0x00000000000003d2       0x26 ./src/src/ms933x/ms933x_app.o
+                0x00000000000003d2                ms933x_app_check_chip_version
+ .text._tx_common_init
+                0x00000000000003f8       0x38 ./src/src/ms933x/ms933x_app.o
+                0x00000000000003f8                _tx_common_init
+ .text.sys_error_service_reset
+                0x0000000000000430        0xa ./src/src/ms933x/ms933x_app.o
+                0x0000000000000430                sys_error_service_reset
+ .text._hdmi_tx_shell_error_service
+                0x000000000000043a       0x40 ./src/src/ms933x/ms933x_app.o
+                0x000000000000043a                _hdmi_tx_shell_error_service
+ .text._hdmi_rx_phy_errdet
+                0x000000000000047a       0x3e ./src/src/ms933x/ms933x_app.o
+                0x000000000000047a                _hdmi_rx_phy_errdet
+ .text.sys_hdmi_rx_audio_config
+                0x00000000000004b8       0x5a ./src/src/ms933x/ms933x_app.o
+                0x00000000000004b8                sys_hdmi_rx_audio_config
+ .text.sys_hdmi_rx_audio_service
+                0x0000000000000512       0x3c ./src/src/ms933x/ms933x_app.o
+                0x0000000000000512                sys_hdmi_rx_audio_service
+ .text.sys_hdmi_rx_video_fifo_reset
+                0x000000000000054e       0x1a ./src/src/ms933x/ms933x_app.o
+                0x000000000000054e                sys_hdmi_rx_video_fifo_reset
+ .text.printf_input_timing
+                0x0000000000000568      0x152 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000568                printf_input_timing
+ .text.printf_input_video_config
+                0x00000000000006ba       0xda ./src/src/ms933x/ms933x_app.o
+                0x00000000000006ba                printf_input_video_config
+ .text.printf_input_vendor_specific_config
+                0x0000000000000794       0x72 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000794                printf_input_vendor_specific_config
+ .text.printf_input_audio_config
+                0x0000000000000806       0x7e ./src/src/ms933x/ms933x_app.o
+                0x0000000000000806                printf_input_audio_config
+ .text.printf_input_av_config
+                0x0000000000000884       0x44 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000884                printf_input_av_config
+ .text.sys_default_hdmi_video_config
+                0x00000000000008c8       0x12 ./src/src/ms933x/ms933x_app.o
+                0x00000000000008c8                sys_default_hdmi_video_config
+ .text.sys_default_hdmi_vendor_specific_config
+                0x00000000000008da        0xe ./src/src/ms933x/ms933x_app.o
+                0x00000000000008da                sys_default_hdmi_vendor_specific_config
+ .text.sys_default_hdmi_audio_config
+                0x00000000000008e8       0x12 ./src/src/ms933x/ms933x_app.o
+                0x00000000000008e8                sys_default_hdmi_audio_config
+ .text.ms933x_app_hdmi_tx_hpd_det
+                0x00000000000008fa       0x18 ./src/src/ms933x/ms933x_app.o
+                0x00000000000008fa                ms933x_app_hdmi_tx_hpd_det
+ .text._hdmi_tx_edid_param_default
+                0x0000000000000912       0x2a ./src/src/ms933x/ms933x_app.o
+                0x0000000000000912                _hdmi_tx_edid_param_default
+ .text._config_output_audio
+                0x000000000000093c       0x14 ./src/src/ms933x/ms933x_app.o
+                0x000000000000093c                _config_output_audio
+ .text._config_output_avmute
+                0x0000000000000950       0x1a ./src/src/ms933x/ms933x_app.o
+                0x0000000000000950                _config_output_avmute
+ .text._get_infoframe_status
+                0x000000000000096a       0x86 ./src/src/ms933x/ms933x_app.o
+                0x000000000000096a                _get_infoframe_status
+ .text.sys_hdmi_rx_hdcp_service
+                0x00000000000009f0       0x5c ./src/src/ms933x/ms933x_app.o
+                0x00000000000009f0                sys_hdmi_rx_hdcp_service
+ .text._hdmi_tx_hdcp_param_default
+                0x0000000000000a4c       0x34 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000a4c                _hdmi_tx_hdcp_param_default
+ .text._param_default
+                0x0000000000000a80       0x96 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000a80                _param_default
+ .text._shutdown_output
+                0x0000000000000b16       0x22 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000b16                _shutdown_output
+ .text.sys_shutdown_output
+                0x0000000000000b38       0x2e ./src/src/ms933x/ms933x_app.o
+                0x0000000000000b38                sys_shutdown_output
+ .text.sys_hdmi_rx_pll_service
+                0x0000000000000b66      0x160 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000b66                sys_hdmi_rx_pll_service
+ .text._hdmi_tx_hdcp_start
+                0x0000000000000cc6       0x34 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000cc6                _hdmi_tx_hdcp_start
+ .text._config_output
+                0x0000000000000cfa       0xca ./src/src/ms933x/ms933x_app.o
+                0x0000000000000cfa                _config_output
+ .text.sys_config_output
+                0x0000000000000dc4       0x62 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000dc4                sys_config_output
+ .text.sys_hdmi_av_config
+                0x0000000000000e26       0xd2 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000e26                sys_hdmi_av_config
+ .text.sys_hdmi_gcp_packet_avmute_service
+                0x0000000000000ef8       0x3a ./src/src/ms933x/ms933x_app.o
+                0x0000000000000ef8                sys_hdmi_gcp_packet_avmute_service
+ .text.sys_hdmi_rx_packet_service
+                0x0000000000000f32       0x70 ./src/src/ms933x/ms933x_app.o
+                0x0000000000000f32                sys_hdmi_rx_packet_service
+ .text._hdmi_tx_hdcp_service
+                0x0000000000000fa2       0xea ./src/src/ms933x/ms933x_app.o
+                0x0000000000000fa2                _hdmi_tx_hdcp_service
+ .text._tx_ddc_error_check
+                0x000000000000108c       0x50 ./src/src/ms933x/ms933x_app.o
+                0x000000000000108c                _tx_ddc_error_check
+ .text._tx_ddc_error_get
+                0x00000000000010dc       0x28 ./src/src/ms933x/ms933x_app.o
+                0x00000000000010dc                _tx_ddc_error_get
+ .text._hotplug_process
+                0x0000000000001104      0x194 ./src/src/ms933x/ms933x_app.o
+                0x0000000000001104                _hotplug_process
+ .text._hotplug_service
+                0x0000000000001298       0x90 ./src/src/ms933x/ms933x_app.o
+                0x0000000000001298                _hotplug_service
+ .text.sys_hotplug_service
+                0x0000000000001328       0x64 ./src/src/ms933x/ms933x_app.o
+                0x0000000000001328                sys_hotplug_service
+ .text.sys_hotplug_init
+                0x000000000000138c       0x28 ./src/src/ms933x/ms933x_app.o
+                0x000000000000138c                sys_hotplug_init
+ .text.ms933x_init
+                0x00000000000013b4       0x72 ./src/src/ms933x/ms933x_app.o
+                0x00000000000013b4                ms933x_init
+ .text.sys_hdmi_tx_hdcp_service
+                0x0000000000001426       0x78 ./src/src/ms933x/ms933x_app.o
+                0x0000000000001426                sys_hdmi_tx_hdcp_service
+ .text.sys_ms933x_chip_valid_check
+                0x000000000000149e       0x38 ./src/src/ms933x/ms933x_app.o
+                0x000000000000149e                sys_ms933x_chip_valid_check
+ .text.sys_error_service
+                0x00000000000014d6       0x4a ./src/src/ms933x/ms933x_app.o
+                0x00000000000014d6                sys_error_service
+ .text.sys_mdt_service
+                0x0000000000001520       0xe0 ./src/src/ms933x/ms933x_app.o
+                0x0000000000001520                sys_mdt_service
+ .text.ms933x_media_service
+                0x0000000000001600       0x28 ./src/src/ms933x/ms933x_app.o
+                0x0000000000001600                ms933x_media_service
+ .text._i2c_start
+                0x0000000000001628       0x4c ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001628                _i2c_start
+ .text._i2c_stop
+                0x0000000000001674       0x44 ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001674                _i2c_stop
+ .text._i2c_write_byte
+                0x00000000000016b8       0xe8 ./src/src/IIC_hal/IIC_Software.o
+                0x00000000000016b8                _i2c_write_byte
+ .text._i2c_read_byte
+                0x00000000000017a0       0xba ./src/src/IIC_hal/IIC_Software.o
+                0x00000000000017a0                _i2c_read_byte
+ .text.mculib_i2c_init
+                0x000000000000185a       0x36 ./src/src/IIC_hal/IIC_Software.o
+                0x000000000000185a                mculib_i2c_init
+ .text.mculib_i2c_set_speed
+                0x0000000000001890        0x2 ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001890                mculib_i2c_set_speed
+ .text.mculib_i2c_read_16bidx8bval
+                0x0000000000001892       0x58 ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001892                mculib_i2c_read_16bidx8bval
+ .text.mculib_i2c_write_16bidx8bval
+                0x00000000000018ea       0x46 ./src/src/IIC_hal/IIC_Software.o
+                0x00000000000018ea                mculib_i2c_write_16bidx8bval
+ .text.mculib_i2c_burstread_16bidx8bval
+                0x0000000000001930       0x6a ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001930                mculib_i2c_burstread_16bidx8bval
+ .text.mculib_i2c_burstwrite_16bidx8bval
+                0x000000000000199a       0x66 ./src/src/IIC_hal/IIC_Software.o
+                0x000000000000199a                mculib_i2c_burstwrite_16bidx8bval
+ .text.mculib_i2c_read_8bidx8bval
+                0x0000000000001a00       0x48 ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001a00                mculib_i2c_read_8bidx8bval
+ .text.mculib_i2c_write_8bidx8bval
+                0x0000000000001a48       0x38 ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001a48                mculib_i2c_write_8bidx8bval
+ .text.mculib_i2c_burstread_8bidx8bval
+                0x0000000000001a80       0x5e ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001a80                mculib_i2c_burstread_8bidx8bval
+ .text.mculib_i2c_write_blank
+                0x0000000000001ade       0x24 ./src/src/IIC_hal/IIC_Software.o
+                0x0000000000001ade                mculib_i2c_write_blank
+ .text.MS933x_RST_GPIO_PP
+                0x0000000000001b02       0x2e ./src/src/BoardConfig.o
+                0x0000000000001b02                MS933x_RST_GPIO_PP
+ .text.MS933x_RST_GPIO_IPU
+                0x0000000000001b30       0x2c ./src/src/BoardConfig.o
+                0x0000000000001b30                MS933x_RST_GPIO_IPU
+ .text.Task_ProcessEvent
+                0x0000000000001b5c       0x66 ./src/src/TaskProcessCom.o
+ .text.TIM4_IRQHandler
+                0x0000000000001bc2       0x26 ./src/src/TaskProcessCom.o
+                0x0000000000001bc2                TIM4_IRQHandler
+ .text.TIM3_IRQHandler
+                0x0000000000001be8       0x26 ./src/src/TaskProcessCom.o
+                0x0000000000001be8                TIM3_IRQHandler
+ .text.InitChipStartTask
+                0x0000000000001c0e       0x22 ./src/src/TaskProcessCom.o
+                0x0000000000001c0e                InitChipStartTask
+ .text.IICTouchInit
+                0x0000000000001c30       0x16 ./src/src/TaskProcessCom.o
+                0x0000000000001c30                IICTouchInit
+ .text.NMI_Handler
+                0x0000000000001c46        0x2 ./src/src/ch32v30x_it.o
+                0x0000000000001c46                NMI_Handler
+ .text.HardFault_Handler
+                0x0000000000001c48       0x10 ./src/src/ch32v30x_it.o
+                0x0000000000001c48                HardFault_Handler
+ .text.startup.main
+                0x0000000000001c58       0x60 ./src/src/main.o
+                0x0000000000001c58                main
+ .text.mculib_chip_reset
+                0x0000000000001cb8       0x30 ./src/src/mculib_common.o
+                0x0000000000001cb8                mculib_chip_reset
+ .text.mculib_delay_ms
+                0x0000000000001ce8        0xa ./src/src/mculib_common.o
+                0x0000000000001ce8                mculib_delay_ms
+ .text.mculib_delay_us
+                0x0000000000001cf2        0xa ./src/src/mculib_common.o
+                0x0000000000001cf2                mculib_delay_us
+ .text.SystemInit
+                0x0000000000001cfc       0xfa ./src/src/system_ch32v30x.o
+                0x0000000000001cfc                SystemInit
+ .text.SystemCoreClockUpdate
+                0x0000000000001df6      0x12a ./src/src/system_ch32v30x.o
+                0x0000000000001df6                SystemCoreClockUpdate
+ .text.TIM1_UP_IRQHandler
+                0x0000000000001f20       0x2c ./src/src/tmos.o
+                0x0000000000001f20                TIM1_UP_IRQHandler
+ .text.tmos_start_task
+                0x0000000000001f4c       0x40 ./src/src/tmos.o
+                0x0000000000001f4c                tmos_start_task
+ .text.TMOS_ProcessEventRegister
+                0x0000000000001f8c       0x2e ./src/src/tmos.o
+                0x0000000000001f8c                TMOS_ProcessEventRegister
+ .text.vector_handler
+                0x0000000000001fba        0x2 ./Startup/startup_ch32v30x_D8C.o
+                0x0000000000001fba                EXTI2_IRQHandler
+                0x0000000000001fba                TIM8_TRG_COM_IRQHandler
+                0x0000000000001fba                TIM8_CC_IRQHandler
+                0x0000000000001fba                UART8_IRQHandler
+                0x0000000000001fba                TIM1_CC_IRQHandler
+                0x0000000000001fba                TIM6_IRQHandler
+                0x0000000000001fba                SysTick_Handler
+                0x0000000000001fba                PVD_IRQHandler
+                0x0000000000001fba                SDIO_IRQHandler
+                0x0000000000001fba                TIM9_BRK_IRQHandler
+                0x0000000000001fba                DMA2_Channel8_IRQHandler
+                0x0000000000001fba                CAN2_RX1_IRQHandler
+                0x0000000000001fba                EXTI3_IRQHandler
+                0x0000000000001fba                USBHS_IRQHandler
+                0x0000000000001fba                DMA2_Channel9_IRQHandler
+                0x0000000000001fba                TIM10_CC_IRQHandler
+                0x0000000000001fba                USBFS_IRQHandler
+                0x0000000000001fba                EXTI0_IRQHandler
+                0x0000000000001fba                I2C2_EV_IRQHandler
+                0x0000000000001fba                TIM10_TRG_COM_IRQHandler
+                0x0000000000001fba                CAN2_SCE_IRQHandler
+                0x0000000000001fba                ADC1_2_IRQHandler
+                0x0000000000001fba                Break_Point_Handler
+                0x0000000000001fba                SPI1_IRQHandler
+                0x0000000000001fba                TAMPER_IRQHandler
+                0x0000000000001fba                CAN2_RX0_IRQHandler
+                0x0000000000001fba                TIM8_UP_IRQHandler
+                0x0000000000001fba                Ecall_M_Mode_Handler
+                0x0000000000001fba                DMA2_Channel2_IRQHandler
+                0x0000000000001fba                DMA1_Channel4_IRQHandler
+                0x0000000000001fba                TIM9_UP_IRQHandler
+                0x0000000000001fba                USART3_IRQHandler
+                0x0000000000001fba                RTC_IRQHandler
+                0x0000000000001fba                DMA1_Channel7_IRQHandler
+                0x0000000000001fba                CAN1_RX1_IRQHandler
+                0x0000000000001fba                DVP_IRQHandler
+                0x0000000000001fba                UART5_IRQHandler
+                0x0000000000001fba                DMA2_Channel1_IRQHandler
+                0x0000000000001fba                I2C1_EV_IRQHandler
+                0x0000000000001fba                DMA1_Channel6_IRQHandler
+                0x0000000000001fba                UART4_IRQHandler
+                0x0000000000001fba                DMA2_Channel4_IRQHandler
+                0x0000000000001fba                RCC_IRQHandler
+                0x0000000000001fba                TIM1_TRG_COM_IRQHandler
+                0x0000000000001fba                DMA1_Channel1_IRQHandler
+                0x0000000000001fba                DMA2_Channel7_IRQHandler
+                0x0000000000001fba                EXTI15_10_IRQHandler
+                0x0000000000001fba                TIM7_IRQHandler
+                0x0000000000001fba                CAN2_TX_IRQHandler
+                0x0000000000001fba                TIM5_IRQHandler
+                0x0000000000001fba                EXTI9_5_IRQHandler
+                0x0000000000001fba                ETH_WKUP_IRQHandler
+                0x0000000000001fba                SPI2_IRQHandler
+                0x0000000000001fba                TIM10_BRK_IRQHandler
+                0x0000000000001fba                TIM9_CC_IRQHandler
+                0x0000000000001fba                DMA2_Channel5_IRQHandler
+                0x0000000000001fba                DMA1_Channel5_IRQHandler
+                0x0000000000001fba                EXTI4_IRQHandler
+                0x0000000000001fba                USB_LP_CAN1_RX0_IRQHandler
+                0x0000000000001fba                RNG_IRQHandler
+                0x0000000000001fba                USB_HP_CAN1_TX_IRQHandler
+                0x0000000000001fba                DMA1_Channel3_IRQHandler
+                0x0000000000001fba                ETH_IRQHandler
+                0x0000000000001fba                WWDG_IRQHandler
+                0x0000000000001fba                USBHSWakeup_IRQHandler
+                0x0000000000001fba                DMA2_Channel11_IRQHandler
+                0x0000000000001fba                Ecall_U_Mode_Handler
+                0x0000000000001fba                DMA2_Channel6_IRQHandler
+                0x0000000000001fba                TIM2_IRQHandler
+                0x0000000000001fba                SW_Handler
+                0x0000000000001fba                TIM1_BRK_IRQHandler
+                0x0000000000001fba                DMA2_Channel10_IRQHandler
+                0x0000000000001fba                EXTI1_IRQHandler
+                0x0000000000001fba                RTCAlarm_IRQHandler
+                0x0000000000001fba                TIM10_UP_IRQHandler
+                0x0000000000001fba                TIM9_TRG_COM_IRQHandler
+                0x0000000000001fba                UART7_IRQHandler
+                0x0000000000001fba                USART2_IRQHandler
+                0x0000000000001fba                UART6_IRQHandler
+                0x0000000000001fba                I2C2_ER_IRQHandler
+                0x0000000000001fba                DMA1_Channel2_IRQHandler
+                0x0000000000001fba                TIM8_BRK_IRQHandler
+                0x0000000000001fba                CAN1_SCE_IRQHandler
+                0x0000000000001fba                FLASH_IRQHandler
+                0x0000000000001fba                SPI3_IRQHandler
+                0x0000000000001fba                I2C1_ER_IRQHandler
+                0x0000000000001fba                USBWakeUp_IRQHandler
+                0x0000000000001fba                DMA2_Channel3_IRQHandler
+ .text.handle_reset
+                0x0000000000001fbc       0x8a ./Startup/startup_ch32v30x_D8C.o
+                0x0000000000001fbc                handle_reset
+ .text.DBGMCU_GetCHIPID
+                0x0000000000002046        0xa ./Peripheral/src/ch32v30x_dbgmcu.o
+                0x0000000000002046                DBGMCU_GetCHIPID
+ .text.GPIO_Init
+                0x0000000000002050       0xc0 ./Peripheral/src/ch32v30x_gpio.o
+                0x0000000000002050                GPIO_Init
+ .text.GPIO_ReadInputDataBit
+                0x0000000000002110        0xa ./Peripheral/src/ch32v30x_gpio.o
+                0x0000000000002110                GPIO_ReadInputDataBit
+ .text.GPIO_WriteBit
+                0x000000000000211a        0xa ./Peripheral/src/ch32v30x_gpio.o
+                0x000000000000211a                GPIO_WriteBit
+ .text.NVIC_PriorityGroupConfig
+                0x0000000000002124        0x6 ./Peripheral/src/ch32v30x_misc.o
+                0x0000000000002124                NVIC_PriorityGroupConfig
+ .text.RCC_GetClocksFreq
+                0x000000000000212a      0x176 ./Peripheral/src/ch32v30x_rcc.o
+                0x000000000000212a                RCC_GetClocksFreq
+ .text.RCC_APB2PeriphClockCmd
+                0x00000000000022a0       0x1e ./Peripheral/src/ch32v30x_rcc.o
+                0x00000000000022a0                RCC_APB2PeriphClockCmd
+ .text.RCC_APB1PeriphClockCmd
+                0x00000000000022be       0x1e ./Peripheral/src/ch32v30x_rcc.o
+                0x00000000000022be                RCC_APB1PeriphClockCmd
+ .text.TIM_GetITStatus
+                0x00000000000022dc       0x18 ./Peripheral/src/ch32v30x_tim.o
+                0x00000000000022dc                TIM_GetITStatus
+ .text.TIM_ClearITPendingBit
+                0x00000000000022f4        0xc ./Peripheral/src/ch32v30x_tim.o
+                0x00000000000022f4                TIM_ClearITPendingBit
+ .text.USART_Init
+                0x0000000000002300       0x90 ./Peripheral/src/ch32v30x_usart.o
+                0x0000000000002300                USART_Init
+ .text.USART_Cmd
+                0x0000000000002390       0x16 ./Peripheral/src/ch32v30x_usart.o
+                0x0000000000002390                USART_Cmd
+ .text.USART_SendData
+                0x00000000000023a6        0x8 ./Peripheral/src/ch32v30x_usart.o
+                0x00000000000023a6                USART_SendData
+ .text.USART_ReceiveData
+                0x00000000000023ae        0x8 ./Peripheral/src/ch32v30x_usart.o
+                0x00000000000023ae                USART_ReceiveData
+ .text.USART_GetFlagStatus
+                0x00000000000023b6        0xa ./Peripheral/src/ch32v30x_usart.o
+                0x00000000000023b6                USART_GetFlagStatus
+ .text.USART_GetITStatus
+                0x00000000000023c0       0x3c ./Peripheral/src/ch32v30x_usart.o
+                0x00000000000023c0                USART_GetITStatus
+ .text.USART_ClearITPendingBit
+                0x00000000000023fc       0x14 ./Peripheral/src/ch32v30x_usart.o
+                0x00000000000023fc                USART_ClearITPendingBit
+ .text.Delay_Init
+                0x0000000000002410       0x26 ./Debug/debug.o
+                0x0000000000002410                Delay_Init
+ .text.Delay_Us
+                0x0000000000002436       0x36 ./Debug/debug.o
+                0x0000000000002436                Delay_Us
+ .text.Delay_Ms
+                0x000000000000246c       0x36 ./Debug/debug.o
+                0x000000000000246c                Delay_Ms
+ .text.USART_Printf_Init
+                0x00000000000024a2       0x5c ./Debug/debug.o
+                0x00000000000024a2                USART_Printf_Init
+ .text._write   0x00000000000024fe       0x3e ./Debug/debug.o
+                0x00000000000024fe                _write
+ .text._sbrk    0x000000000000253c       0x26 ./Debug/debug.o
+                0x000000000000253c                _sbrk
+ .text._drv_hdmi_rx_pi_fifo_reset
+                0x0000000000002562       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_errdet_clr_ext
+                0x000000000000257e       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_errdet_clr
+                0x00000000000025a4       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_pi_mixer_config
+                0x00000000000025ca       0xb0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_audio_clk_sel
+                0x000000000000267a       0x82 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_errdet_counter
+                0x00000000000026fc       0x5c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text._drv_hdmi_rx_audio_pll_config
+                0x0000000000002758      0x156 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xcdrv_hdmi_rx_pll_default
+                0x00000000000028ae       0x4c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000028ae                ms933xcdrv_hdmi_rx_pll_default
+ .text.ms933xdrv_hdmi_rx_audio_output_enable
+                0x00000000000028fa       0x1a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000028fa                ms933xdrv_hdmi_rx_audio_output_enable
+ .text.ms933xdrv_hdmi_rx_init
+                0x0000000000002914      0x1c8 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002914                ms933xdrv_hdmi_rx_init
+ .text.ms933xdrv_misc_chip_new_version_get
+                0x0000000000002adc       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002adc                ms933xdrv_misc_chip_new_version_get
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_data_enable
+                0x0000000000002af2       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002af2                ms933xdrv_hdmi_rx_controller_hdcp_data_enable
+ .text.ms933xdrv_hdmi_rx_5v_det
+                0x0000000000002b12       0x10 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002b12                ms933xdrv_hdmi_rx_5v_det
+ .text.ms933xdrv_hdmi_rx_tmds_overload_protect_disable
+                0x0000000000002b22       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002b22                ms933xdrv_hdmi_rx_tmds_overload_protect_disable
+ .text.ms933xdrv_hdmi_rx_full_edid_config
+                0x0000000000002b38       0x32 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002b38                ms933xdrv_hdmi_rx_full_edid_config
+ .text.ms933xdrv_hdmi_rx_pi_offset_enable_set
+                0x0000000000002b6a       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002b6a                ms933xdrv_hdmi_rx_pi_offset_enable_set
+ .text.ms933xdrv_hdmi_rx_pi_offset_dec_set
+                0x0000000000002b88       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002b88                ms933xdrv_hdmi_rx_pi_offset_dec_set
+ .text.ms933xdrv_hdmi_rx_pi_offset_inc_set
+                0x0000000000002bac       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002bac                ms933xdrv_hdmi_rx_pi_offset_inc_set
+ .text.ms933xdrv_hdmi_rx_pi_offset_cmpout_get
+                0x0000000000002bc8       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002bc8                ms933xdrv_hdmi_rx_pi_offset_cmpout_get
+ .text.ms933xdrv_errdet_wrong_status
+                0x0000000000002bde       0x3a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002bde                ms933xdrv_errdet_wrong_status
+ .text.ms933xdrv_hdmi_rx_pi_phy_eq_gain_set_ext
+                0x0000000000002c18       0x84 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002c18                ms933xdrv_hdmi_rx_pi_phy_eq_gain_set_ext
+ .text.ms933xdrv_hdmi_rx_pi_pll_release
+                0x0000000000002c9c       0x2a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002c9c                ms933xdrv_hdmi_rx_pi_pll_release
+ .text.ms933xdrv_hdmi_rx_pi_rxpll_mode_set
+                0x0000000000002cc6       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002cc6                ms933xdrv_hdmi_rx_pi_rxpll_mode_set
+ .text.ms933xdrv_hdmi_rx_pi_rxpll_trigger
+                0x0000000000002cdc       0x12 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002cdc                ms933xdrv_hdmi_rx_pi_rxpll_trigger
+ .text._drv_hdmi_rx_pi_rxpll_config.constprop.13
+                0x0000000000002cee       0xb2 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_phy_init
+                0x0000000000002da0      0x104 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002da0                ms933xdrv_hdmi_rx_pi_phy_init
+ .text.ms933xdrv_hdmi_rx_phy_power_down
+                0x0000000000002ea4       0x30 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002ea4                ms933xdrv_hdmi_rx_phy_power_down
+ .text.ms933xdrv_hdmi_rx_controller_hpd_set
+                0x0000000000002ed4       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002ed4                ms933xdrv_hdmi_rx_controller_hpd_set
+ .text.ms933xdrv_hdmi_rx_controller_hpd_get
+                0x0000000000002ef2       0x10 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002ef2                ms933xdrv_hdmi_rx_controller_hpd_get
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_encryption_enable
+                0x0000000000002f02       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002f02                ms933xdrv_hdmi_rx_controller_hdcp_encryption_enable
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_bksv_set
+                0x0000000000002f18       0x32 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002f18                ms933xdrv_hdmi_rx_controller_hdcp_bksv_set
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_key_set
+                0x0000000000002f4a       0x54 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002f4a                ms933xdrv_hdmi_rx_controller_hdcp_key_set
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_init
+                0x0000000000002f9e       0x1a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002f9e                ms933xdrv_hdmi_rx_controller_hdcp_init
+ .text.ms933xdrv_hdmi_rx_controller_hdcp_get_status
+                0x0000000000002fb8       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002fb8                ms933xdrv_hdmi_rx_controller_hdcp_get_status
+ .text.ms933xdrv_hdmi_rx_controller_mdt_syncvalid
+                0x0000000000002fce       0x36 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000002fce                ms933xdrv_hdmi_rx_controller_mdt_syncvalid
+ .text.ms933xdrv_mdt_get_sync_polarity
+                0x0000000000003004       0x2a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003004                ms933xdrv_mdt_get_sync_polarity
+ .text.ms933xdrv_mdt_get_htotal
+                0x000000000000302e       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x000000000000302e                ms933xdrv_mdt_get_htotal
+ .text.ms933xdrv_mdt_get_vtotal
+                0x0000000000003042       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003042                ms933xdrv_mdt_get_vtotal
+ .text.ms933xdrv_mdt_get_hactive
+                0x0000000000003058       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003058                ms933xdrv_mdt_get_hactive
+ .text.ms933xdrv_mdt_get_vactive
+                0x000000000000306e       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x000000000000306e                ms933xdrv_mdt_get_vactive
+ .text.ms933xdrv_mdt_get_hfreq
+                0x0000000000003084       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003084                ms933xdrv_mdt_get_hfreq
+ .text.ms933xdrv_hdmi_rx_get_tmds_clk
+                0x00000000000030a6       0x38 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000030a6                ms933xdrv_hdmi_rx_get_tmds_clk
+ .text.ms933xdrv_mdt_get_hoffset
+                0x00000000000030de       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000030de                ms933xdrv_mdt_get_hoffset
+ .text.ms933xdrv_mdt_get_vback
+                0x00000000000030f4       0x10 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000030f4                ms933xdrv_mdt_get_vback
+ .text.ms933xdrv_mdt_get_hsw
+                0x0000000000003104       0x10 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003104                ms933xdrv_mdt_get_hsw
+ .text.ms933xdrv_mdt_get_vsw
+                0x0000000000003114       0x10 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003114                ms933xdrv_mdt_get_vsw
+ .text.ms933xdrv_hdmi_rx_get_mdt_interrupt_status
+                0x0000000000003124       0x2c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003124                ms933xdrv_hdmi_rx_get_mdt_interrupt_status
+ .text.ms933xdrv_hdmi_rx_get_input_timing
+                0x0000000000003150       0xd4 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003150                ms933xdrv_hdmi_rx_get_input_timing
+ .text.ms933xdrv_hdmi_rx_controller_reset
+                0x0000000000003224       0x12 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003224                ms933xdrv_hdmi_rx_controller_reset
+ .text.ms933xdrv_hdmi_rx_core_data_enable
+                0x0000000000003236       0x52 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003236                ms933xdrv_hdmi_rx_core_data_enable
+ .text.ms933xdrv_hdmi_rx_get_audio_fifo_status
+                0x0000000000003288       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003288                ms933xdrv_hdmi_rx_get_audio_fifo_status
+ .text.ms933xdrv_hdmi_rx_audio_fifo_reset
+                0x000000000000329c       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x000000000000329c                ms933xdrv_hdmi_rx_audio_fifo_reset
+ .text.ms933xdrv_hdmi_rx_video_fifo_reset
+                0x00000000000032c2       0x18 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000032c2                ms933xdrv_hdmi_rx_video_fifo_reset
+ .text.ms933xdrv_hdmi_rx_controller_get_gcp_avmute
+                0x00000000000032da       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000032da                ms933xdrv_hdmi_rx_controller_get_gcp_avmute
+ .text.ms933xdrv_hdmi_rx_controller_set_avmute_black_color
+                0x00000000000032f0       0x3c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000032f0                ms933xdrv_hdmi_rx_controller_set_avmute_black_color
+ .text.ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status
+                0x000000000000332c       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x000000000000332c                ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status
+ .text.ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status
+                0x0000000000003350       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003350                ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status
+ .text.ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status_ext
+                0x0000000000003374       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003374                ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status_ext
+ .text._drv_hdmi_rx_phy_eq_set_and_get_error
+                0x0000000000003388       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .text.ms933xdrv_hdmi_rx_pi_eq_config
+                0x00000000000033bc      0x11a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000033bc                ms933xdrv_hdmi_rx_pi_eq_config
+ .text.ms933xdrv_hdmi_rx_pi_phy_config
+                0x00000000000034d6       0xe8 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000034d6                ms933xdrv_hdmi_rx_pi_phy_config
+ .text.ms933xdrv_hdmi_rx_controller_get_input_config
+                0x00000000000035be      0x1d4 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000035be                ms933xdrv_hdmi_rx_controller_get_input_config
+ .text.ms933xdrv_hdmi_rx_controller_audio_channel_config
+                0x0000000000003792       0x58 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x0000000000003792                ms933xdrv_hdmi_rx_controller_audio_channel_config
+ .text.ms933xdrv_hdmi_rx_controller_pixel_clk_config
+                0x00000000000037ea       0x40 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x00000000000037ea                ms933xdrv_hdmi_rx_controller_pixel_clk_config
+ .text.ms933xdrv_hdmi_rx_audio_config
+                0x000000000000382a       0xe6 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+                0x000000000000382a                ms933xdrv_hdmi_rx_audio_config
+ .text._drv_edid_checksum
+                0x0000000000003910       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.EDID_Parse861Extensions
+                0x0000000000003930      0x18a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_ddc_enable.part.5
+                0x0000000000003aba       0x2e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_set_channel
+                0x0000000000003ae8        0x8 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003ae8                ms933xdrv_hdmi_tx_set_channel
+ .text.ms933xdrv_hdmi_tx_phy_power_enable
+                0x0000000000003af0       0x50 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003af0                ms933xdrv_hdmi_tx_phy_power_enable
+ .text.ms933xdrv_hdmi_tx_phy_output_enable
+                0x0000000000003b40       0x5e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003b40                ms933xdrv_hdmi_tx_phy_output_enable
+ .text.ms933xdrv_hdmi_tx_phy_output_auto_ctrl
+                0x0000000000003b9e       0x36 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003b9e                ms933xdrv_hdmi_tx_phy_output_auto_ctrl
+ .text.ms933xdrv_hdmi_tx_init
+                0x0000000000003bd4       0x2e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003bd4                ms933xdrv_hdmi_tx_init
+ .text.ms933xdrv_hdmi_tx_phy_init
+                0x0000000000003c02      0x238 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003c02                ms933xdrv_hdmi_tx_phy_init
+ .text.ms933xdrv_hdmi_tx_phy_set_clk
+                0x0000000000003e3a       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003e3a                ms933xdrv_hdmi_tx_phy_set_clk
+ .text.ms933xdrv_hdmi_tx_shell_video_mute_enable
+                0x0000000000003e60       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003e60                ms933xdrv_hdmi_tx_shell_video_mute_enable
+ .text.ms933xdrv_hdmi_tx_shell_audio_mute_enable
+                0x0000000000003e80       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003e80                ms933xdrv_hdmi_tx_shell_audio_mute_enable
+ .text.ms933xdrv_hdmi_tx_shell_set_hdmi_out
+                0x0000000000003ea0       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003ea0                ms933xdrv_hdmi_tx_shell_set_hdmi_out
+ .text.ms933xdrv_hdmi_tx_shell_set_color_space
+                0x0000000000003ec2       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003ec2                ms933xdrv_hdmi_tx_shell_set_color_space
+ .text.ms933xdrv_hdmi_tx_shell_set_color_depth
+                0x0000000000003ee8       0x38 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003ee8                ms933xdrv_hdmi_tx_shell_set_color_depth
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_mode
+                0x0000000000003f20       0xee D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000003f20                ms933xdrv_hdmi_tx_shell_set_audio_mode
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_rate
+                0x000000000000400e       0x5c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x000000000000400e                ms933xdrv_hdmi_tx_shell_set_audio_rate
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_bits
+                0x000000000000406a       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x000000000000406a                ms933xdrv_hdmi_tx_shell_set_audio_bits
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_channels
+                0x000000000000408a       0x38 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x000000000000408a                ms933xdrv_hdmi_tx_shell_set_audio_channels
+ .text.ms933xdrv_hdmi_tx_shell_set_video_infoframe
+                0x00000000000040c2      0x182 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000040c2                ms933xdrv_hdmi_tx_shell_set_video_infoframe
+ .text.ms933xdrv_hdmi_tx_shell_set_audio_infoframe
+                0x0000000000004244      0x122 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004244                ms933xdrv_hdmi_tx_shell_set_audio_infoframe
+ .text.ms933xdrv_hdmi_tx_shell_set_vendor_specific_infoframe
+                0x0000000000004366       0xf0 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004366                ms933xdrv_hdmi_tx_shell_set_vendor_specific_infoframe
+ .text.ms933xdrv_hdmi_tx_shell_set_gcp_packet_avmute
+                0x0000000000004456       0x22 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004456                ms933xdrv_hdmi_tx_shell_set_gcp_packet_avmute
+ .text.ms933xdrv_hdmi_tx_shell_init
+                0x0000000000004478       0x4e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004478                ms933xdrv_hdmi_tx_shell_init
+ .text.ms933xdrv_hdmi_tx_shell_reset_enable
+                0x00000000000044c6       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000044c6                ms933xdrv_hdmi_tx_shell_reset_enable
+ .text._drv_hdmi_tx_config
+                0x00000000000044e6       0x82 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_audio_config
+                0x0000000000004568       0x6a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004568                ms933xdrv_hdmi_tx_audio_config
+ .text.ms933xdrv_hdmi_tx_config
+                0x00000000000045d2       0x82 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000045d2                ms933xdrv_hdmi_tx_config
+ .text.ms933xdrv_hdmi_tx_csc
+                0x0000000000004654       0x72 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004654                ms933xdrv_hdmi_tx_csc
+ .text.ms933xdrv_hdmi_tx_phy_power_down
+                0x00000000000046c6       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000046c6                ms933xdrv_hdmi_tx_phy_power_down
+ .text.ms933xcdrv_hdmi_tx_core_power_down
+                0x00000000000046fa       0x2c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000046fa                ms933xcdrv_hdmi_tx_core_power_down
+ .text.ms933xdrv_hdmi_tx_shell_hpd
+                0x0000000000004726       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004726                ms933xdrv_hdmi_tx_shell_hpd
+ .text.ms933xcdrv_hdmi_tx_shell_hpd
+                0x0000000000004742       0x1e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004742                ms933xcdrv_hdmi_tx_shell_hpd
+ .text.ms933xdrv_hdmi_tx_shell_timing_stable
+                0x0000000000004760       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004760                ms933xdrv_hdmi_tx_shell_timing_stable
+ .text.ms933xdrv_hdmi_tx_ddc_is_busy
+                0x000000000000477c       0x36 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x000000000000477c                ms933xdrv_hdmi_tx_ddc_is_busy
+ .text.ms933xdrv_hdmi_tx_ddc_bus_clear
+                0x00000000000047b2       0x44 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000047b2                ms933xdrv_hdmi_tx_ddc_bus_clear
+ .text.ms933xdrv_hdmi_tx_ddc_enable
+                0x00000000000047f6       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x00000000000047f6                ms933xdrv_hdmi_tx_ddc_enable
+ .text._drv_hdmi_tx_parse_edid
+                0x0000000000004812      0x224 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .text.ms933xdrv_hdmi_tx_hdcp_ksv_verify
+                0x0000000000004a36       0x36 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004a36                ms933xdrv_hdmi_tx_hdcp_ksv_verify
+ .text.ms933xdrv_hdmi_tx_hdcp_get_bksv_from_rx
+                0x0000000000004a6c       0x32 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004a6c                ms933xdrv_hdmi_tx_hdcp_get_bksv_from_rx
+ .text.ms933xdrv_hdmi_tx_hdcp_set_bksv_to_tx
+                0x0000000000004a9e       0x56 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004a9e                ms933xdrv_hdmi_tx_hdcp_set_bksv_to_tx
+ .text.ms933xdrv_hdmi_tx_hdcp_set_an
+                0x0000000000004af4       0x56 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004af4                ms933xdrv_hdmi_tx_hdcp_set_an
+ .text.ms933xdrv_hdmi_tx_hdcp_set_aksv_to_rx
+                0x0000000000004b4a       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004b4a                ms933xdrv_hdmi_tx_hdcp_set_aksv_to_rx
+ .text.ms933xdrv_hdmi_tx_hdcp_set_key_to_tx
+                0x0000000000004b7e       0x2c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004b7e                ms933xdrv_hdmi_tx_hdcp_set_key_to_tx
+ .text.ms933xdrv_hdmi_tx_hdcp_enable
+                0x0000000000004baa       0x3a D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004baa                ms933xdrv_hdmi_tx_hdcp_enable
+ .text.ms933xdrv_hdmi_tx_hdcp_get_hw_version
+                0x0000000000004be4       0x1c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004be4                ms933xdrv_hdmi_tx_hdcp_get_hw_version
+ .text.ms933xdrv_hdmi_tx_hdcp_key_init
+                0x0000000000004c00       0x2e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004c00                ms933xdrv_hdmi_tx_hdcp_key_init
+ .text.ms933xdrv_hdmi_tx_hdcp_init
+                0x0000000000004c2e       0x4c D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004c2e                ms933xdrv_hdmi_tx_hdcp_init
+ .text.ms933xdrv_hdmi_tx_hdcp_get_status
+                0x0000000000004c7a       0x76 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004c7a                ms933xdrv_hdmi_tx_hdcp_get_status
+ .text.ms933xdrv_hdmi_tx_parse_full_edid
+                0x0000000000004cf0        0xe D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+                0x0000000000004cf0                ms933xdrv_hdmi_tx_parse_full_edid
+ .text.ms933xdrv_misc_chipisvalid
+                0x0000000000004cfe       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+                0x0000000000004cfe                ms933xdrv_misc_chipisvalid
+ .text.ms933xdrv_misc_chip_C_version_get
+                0x0000000000004d12       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+                0x0000000000004d12                ms933xdrv_misc_chip_C_version_get
+ .text.ms933x_HAL_ReadByte
+                0x0000000000004d26       0x12 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004d26                ms933x_HAL_ReadByte
+ .text.ms933x_HAL_WriteByte
+                0x0000000000004d38       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004d38                ms933x_HAL_WriteByte
+ .text.ms933x_HAL_ReadWord
+                0x0000000000004d4c       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004d4c                ms933x_HAL_ReadWord
+ .text.ms933x_HAL_WriteWord
+                0x0000000000004d70       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004d70                ms933x_HAL_WriteWord
+ .text.ms933x_HAL_ModBits
+                0x0000000000004d94       0x2e D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004d94                ms933x_HAL_ModBits
+ .text.ms933x_HAL_SetBits
+                0x0000000000004dc2        0xe D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004dc2                ms933x_HAL_SetBits
+ .text.ms933x_HAL_ClrBits
+                0x0000000000004dd0        0xe D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004dd0                ms933x_HAL_ClrBits
+ .text.ms933x_HAL_ToggleBits
+                0x0000000000004dde       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004dde                ms933x_HAL_ToggleBits
+ .text.ms933x_HAL_ReadBytes
+                0x0000000000004df2       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004df2                ms933x_HAL_ReadBytes
+ .text.ms933x_HAL_WriteBytes
+                0x0000000000004e08       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e08                ms933x_HAL_WriteBytes
+ .text.ms933x_HAL_ReadDWord_Ex
+                0x0000000000004e1e       0x24 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e1e                ms933x_HAL_ReadDWord_Ex
+ .text.ms933x_HAL_WriteDWord_Ex
+                0x0000000000004e42       0x16 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e42                ms933x_HAL_WriteDWord_Ex
+ .text.ms933x_HAL_ModBits_Ex
+                0x0000000000004e58       0x26 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e58                ms933x_HAL_ModBits_Ex
+ .text.ms933x_HAL_SetBits_Ex
+                0x0000000000004e7e        0xe D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e7e                ms933x_HAL_SetBits_Ex
+ .text.ms933x_HAL_ClrBits_Ex
+                0x0000000000004e8c        0xe D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e8c                ms933x_HAL_ClrBits_Ex
+ .text.ms933x_HAL_ToggleBits_Ex
+                0x0000000000004e9a       0x14 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+                0x0000000000004e9a                ms933x_HAL_ToggleBits_Ex
+ .text.memcpy   0x0000000000004eae       0xb6 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memcpy.o)
+                0x0000000000004eae                memcpy
+ .text.printf   0x0000000000004f64       0x40 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+                0x0000000000004f64                iprintf
+                0x0000000000004f64                printf
+ .text._puts_r  0x0000000000004fa4       0xda c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+                0x0000000000004fa4                _puts_r
+ .text.puts     0x000000000000507e        0xc c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+                0x000000000000507e                puts
+ .text.__swbuf_r
+                0x000000000000508a       0xc0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+                0x000000000000508a                __swbuf_r
+ .text.__swsetup_r
+                0x000000000000514a      0x10c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o)
+                0x000000000000514a                __swsetup_r
+ .text.__sflush_r
+                0x0000000000005256      0x13c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+                0x0000000000005256                __sflush_r
+ .text._fflush_r
+                0x0000000000005392       0x66 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+                0x0000000000005392                _fflush_r
+ .text.std      0x00000000000053f8       0x6a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .text._cleanup_r
+                0x0000000000005462        0xa c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x0000000000005462                _cleanup_r
+ .text.__sfmoreglue
+                0x000000000000546c       0x46 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x000000000000546c                __sfmoreglue
+ .text.__sinit  0x00000000000054b2       0x6c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x00000000000054b2                __sinit
+ .text.__sfp    0x000000000000551e       0xa0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x000000000000551e                __sfp
+ .text._fwalk_reent
+                0x00000000000055be       0x6c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+                0x00000000000055be                _fwalk_reent
+ .text.__swhatbuf_r
+                0x000000000000562a       0x5a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+                0x000000000000562a                __swhatbuf_r
+ .text.__smakebuf_r
+                0x0000000000005684       0xa0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+                0x0000000000005684                __smakebuf_r
+ .text._free_r  0x0000000000005724       0xa8 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o)
+                0x0000000000005724                _free_r
+ .text._malloc_r
+                0x00000000000057cc       0xd4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+                0x00000000000057cc                _malloc_r
+ .text.__sfputc_r
+                0x00000000000058a0       0x2a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .text.__sfputs_r
+                0x00000000000058ca       0x44 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+                0x00000000000058ca                __sfputs_r
+ .text._vfprintf_r
+                0x000000000000590e      0x29c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+                0x000000000000590e                _vfprintf_r
+                0x000000000000590e                _vfiprintf_r
+ .text._printf_common
+                0x0000000000005baa      0x10c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+                0x0000000000005baa                _printf_common
+ .text._printf_i
+                0x0000000000005cb6      0x2a4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+                0x0000000000005cb6                _printf_i
+ .text._sbrk_r  0x0000000000005f5a       0x2a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o)
+                0x0000000000005f5a                _sbrk_r
+ .text.__sread  0x0000000000005f84       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+                0x0000000000005f84                __sread
+ .text.__swrite
+                0x0000000000005fb4       0x4e c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+                0x0000000000005fb4                __swrite
+ .text.__sseek  0x0000000000006002       0x36 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+                0x0000000000006002                __sseek
+ .text.__sclose
+                0x0000000000006038        0x6 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+                0x0000000000006038                __sclose
+ .text._write_r
+                0x000000000000603e       0x2e c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-writer.o)
+                0x000000000000603e                _write_r
+ .text._close_r
+                0x000000000000606c       0x28 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o)
+                0x000000000000606c                _close_r
+ .text._fstat_r
+                0x0000000000006094       0x2a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o)
+                0x0000000000006094                _fstat_r
+ .text._isatty_r
+                0x00000000000060be       0x28 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o)
+                0x00000000000060be                _isatty_r
+ .text._lseek_r
+                0x00000000000060e6       0x2c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o)
+                0x00000000000060e6                _lseek_r
+ .text.memchr   0x0000000000006112       0x1a c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memchr.o)
+                0x0000000000006112                memchr
+ .text.__malloc_lock
+                0x000000000000612c        0x2 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+                0x000000000000612c                __malloc_lock
+ .text.__malloc_unlock
+                0x000000000000612e        0x2 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+                0x000000000000612e                __malloc_unlock
+ .text._read_r  0x0000000000006130       0x2c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o)
+                0x0000000000006130                _read_r
+ .text._close   0x000000000000615c        0xc c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+                0x000000000000615c                _close
+ .text._fstat   0x0000000000006168        0xc c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+                0x0000000000006168                _fstat
+ .text._isatty  0x0000000000006174        0xc c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+                0x0000000000006174                _isatty
+ .text._lseek   0x0000000000006180        0xc c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+                0x0000000000006180                _lseek
+ .text._read    0x000000000000618c        0xc c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+                0x000000000000618c                _read
+ *(.rodata)
+ *(.rodata*)
+ .rodata.USART1_IRQHandler.str1.4
+                0x0000000000006198        0xd ./src/src/uart_ht7315/uart_ht7315.o
+ *fill*         0x00000000000061a5        0x3 
+ .rodata._config_output.str1.4
+                0x00000000000061a8       0x23 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000061cb        0x1 
+ .rodata._hdmi_rx_phy_errdet.str1.4
+                0x00000000000061cc        0xf ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000061db        0x1 
+ .rodata._hdmi_tx_hdcp_service.str1.4
+                0x00000000000061dc       0x6a ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006246        0x2 
+ .rodata._hdmi_tx_shell_error_service.str1.4
+                0x0000000000006248        0xf ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006257        0x1 
+ .rodata._hotplug_process.str1.4
+                0x0000000000006258       0x87 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000062df        0x1 
+ .rodata._hotplug_service.str1.4
+                0x00000000000062e0       0x18 ./src/src/ms933x/ms933x_app.o
+ .rodata.ms933x_app_check_chip_version.str1.4
+                0x00000000000062f8        0xe ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006306        0x2 
+ .rodata.ms933x_init.str1.4
+                0x0000000000006308       0x6d ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006375        0x3 
+ .rodata.printf_input_audio_config.str1.4
+                0x0000000000006378       0x75 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000063ed        0x3 
+ .rodata.printf_input_av_config.str1.4
+                0x00000000000063f0       0x15 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006405        0x3 
+ .rodata.printf_input_timing.str1.4
+                0x0000000000006408      0x12d ./src/src/ms933x/ms933x_app.o
+                                        0x131 (size before relaxing)
+ *fill*         0x0000000000006535        0x3 
+ .rodata.printf_input_vendor_specific_config.str1.4
+                0x0000000000006538       0x5d ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006595        0x3 
+ .rodata.printf_input_video_config.str1.4
+                0x0000000000006598       0xf5 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x000000000000668d        0x3 
+ .rodata.sys_hdmi_av_config.str1.4
+                0x0000000000006690       0x12 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000066a2        0x2 
+ .rodata.sys_hdmi_gcp_packet_avmute_service.str1.4
+                0x00000000000066a4        0xc ./src/src/ms933x/ms933x_app.o
+ .rodata.sys_hdmi_rx_audio_config.str1.4
+                0x00000000000066b0       0x28 ./src/src/ms933x/ms933x_app.o
+ .rodata.sys_hdmi_rx_audio_service.str1.4
+                0x00000000000066d8       0x12 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000066ea        0x2 
+ .rodata.sys_hdmi_rx_hdcp_service.str1.4
+                0x00000000000066ec       0x1e ./src/src/ms933x/ms933x_app.o
+ *fill*         0x000000000000670a        0x2 
+ .rodata.sys_hdmi_rx_packet_service.str1.4
+                0x000000000000670c       0x12 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x000000000000671e        0x2 
+ .rodata.sys_hdmi_rx_pll_service.str1.4
+                0x0000000000006720       0x1d ./src/src/ms933x/ms933x_app.o
+ *fill*         0x000000000000673d        0x3 
+ .rodata.sys_hotplug_init.str1.4
+                0x0000000000006740       0x11 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006751        0x3 
+ .rodata.sys_hotplug_service.str1.4
+                0x0000000000006754       0x11 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x0000000000006765        0x3 
+ .rodata.sys_mdt_service.str1.4
+                0x0000000000006768       0x28 ./src/src/ms933x/ms933x_app.o
+ .rodata.sys_ms933x_chip_valid_check.str1.4
+                0x0000000000006790       0x15 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000000067a5        0x3 
+ .rodata.sys_pad_audio_ctrl_service.str1.4
+                0x00000000000067a8       0x28 ./src/src/ms933x/ms933x_app.o
+ .rodata.u8_rx_key_buf
+                0x00000000000067d0      0x118 ./src/src/ms933x/ms933x_app.o
+ .rodata.u8_sys_edid_default_buf
+                0x00000000000068e8      0x100 ./src/src/ms933x/ms933x_app.o
+ .rodata.u8_tx_key_buf
+                0x00000000000069e8      0x118 ./src/src/ms933x/ms933x_app.o
+ .rodata.Task_ProcessEvent.str1.4
+                0x0000000000006b00       0x1e ./src/src/TaskProcessCom.o
+ *fill*         0x0000000000006b1e        0x2 
+ .rodata.main.str1.4
+                0x0000000000006b20       0x5b ./src/src/main.o
+ *fill*         0x0000000000006b7b        0x1 
+ .rodata.pt14EqGainVal
+                0x0000000000006b7c       0x38 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .rodata.__sf_fake_stderr
+                0x0000000000006bb4       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x0000000000006bb4                __sf_fake_stderr
+ .rodata.__sf_fake_stdin
+                0x0000000000006bd4       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x0000000000006bd4                __sf_fake_stdin
+ .rodata.__sf_fake_stdout
+                0x0000000000006bf4       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+                0x0000000000006bf4                __sf_fake_stdout
+ .rodata._vfprintf_r.str1.4
+                0x0000000000006c14       0x13 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ *fill*         0x0000000000006c27        0x1 
+ .rodata._printf_i.str1.4
+                0x0000000000006c28       0x28 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+                                         0x25 (size before relaxing)
+ *(.gnu.linkonce.t.*)
+                0x0000000000006c50                . = ALIGN (0x4)
+
+.rela.dyn       0x0000000000006c50        0x0
+ .rela.init     0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.vector   0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text.handle_reset
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._sbrk
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.sdata.curbrk.5273
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._vfprintf_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._sbrk_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._write_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._close_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._fstat_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._isatty_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._lseek_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._read_r
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._close
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._fstat
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._isatty
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._lseek
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+ .rela.text._read
+                0x0000000000006c50        0x0 ./src/src/uart_ht7315/uart_ht7315.o
+
+.fini           0x0000000000006c50        0x0
+ *(SORT_NONE(.fini))
+                0x0000000000006c50                . = ALIGN (0x4)
+                [!provide]                        PROVIDE (_etext = .)
+                [!provide]                        PROVIDE (_eitcm = .)
+
+.preinit_array  0x0000000000006c50        0x0
+                [!provide]                        PROVIDE (__preinit_array_start = .)
+ *(.preinit_array)
+                [!provide]                        PROVIDE (__preinit_array_end = .)
+
+.init_array     0x0000000000006c50        0x0
+                [!provide]                        PROVIDE (__init_array_start = .)
+ *(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))
+ *(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors)
+                [!provide]                        PROVIDE (__init_array_end = .)
+
+.fini_array     0x0000000000006c50        0x0
+                [!provide]                        PROVIDE (__fini_array_start = .)
+ *(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))
+ *(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors)
+                [!provide]                        PROVIDE (__fini_array_end = .)
+
+.ctors
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT_BY_NAME(.ctors.*))
+ *(.ctors)
+
+.dtors
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT_BY_NAME(.dtors.*))
+ *(.dtors)
+
+.dalign         0x0000000020000000        0x0 load address 0x0000000000006c50
+                0x0000000020000000                . = ALIGN (0x4)
+                0x0000000020000000                PROVIDE (_data_vma = .)
+
+.dlalign        0x0000000000006c50        0x0
+                0x0000000000006c50                . = ALIGN (0x4)
+                0x0000000000006c50                PROVIDE (_data_lma = .)
+
+.data           0x0000000020000000       0xc8 load address 0x0000000000006c50
+ *(.gnu.linkonce.r.*)
+ *(.data .data.*)
+ .data.AHBPrescTable
+                0x0000000020000000       0x10 ./src/src/system_ch32v30x.o
+                0x0000000020000000                AHBPrescTable
+ .data.APBAHBPrescTable
+                0x0000000020000010       0x10 ./Peripheral/src/ch32v30x_rcc.o
+ .data.impure_data
+                0x0000000020000020       0x60 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+ *(.gnu.linkonce.d.*)
+                0x0000000020000080                . = ALIGN (0x8)
+                0x0000000020000880                PROVIDE (__global_pointer$ = (. + 0x800))
+ *(.sdata .sdata.*)
+ .sdata.g_u32_dvi_sink_min_timing
+                0x0000000020000080        0x4 ./src/src/ms933x/ms933x_app.o
+ .sdata.g_u32_hdmi_sink_min_timing
+                0x0000000020000084        0x4 ./src/src/ms933x/ms933x_app.o
+ .sdata.g_u8_hdmi_rx_hpd_off_count
+                0x0000000020000088        0x1 ./src/src/ms933x/ms933x_app.o
+ .sdata.g_u8_sys_edid_buf_last_id
+                0x0000000020000089        0x1 ./src/src/ms933x/ms933x_app.o
+ .sdata.g_u8_sys_edid_flag
+                0x000000002000008a        0x1 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x000000002000008b        0x1 
+ .sdata.SystemCoreClock
+                0x000000002000008c        0x4 ./src/src/system_ch32v30x.o
+                0x000000002000008c                SystemCoreClock
+ .sdata.ADCPrescTable
+                0x0000000020000090        0x4 ./Peripheral/src/ch32v30x_rcc.o
+ .sdata.curbrk.5273
+                0x0000000020000094        0x4 ./Debug/debug.o
+ .sdata.s_u8chipAddr
+                0x0000000020000098        0x1 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+ *fill*         0x0000000020000099        0x3 
+ .sdata._impure_ptr
+                0x000000002000009c        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+                0x000000002000009c                _impure_ptr
+ *(.sdata2.*)
+ .sdata2.u8_rx_ksv_buf
+                0x00000000200000a0        0x5 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000200000a5        0x3 
+ .sdata2.u8_tx_ksv_buf
+                0x00000000200000a8        0x5 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000200000ad        0x3 
+ .sdata2.CSWTCH.67
+                0x00000000200000b0        0x7 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ *fill*         0x00000000200000b7        0x1 
+ .sdata2.HDCP_AN_DATA
+                0x00000000200000b8        0x8 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .sdata2._global_impure_ptr
+                0x00000000200000c0        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-impure.o)
+                0x00000000200000c0                _global_impure_ptr
+ *(.gnu.linkonce.s.*)
+                0x00000000200000c8                . = ALIGN (0x8)
+ *fill*         0x00000000200000c4        0x4 
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+                0x00000000200000c8                . = ALIGN (0x4)
+                0x00000000200000c8                PROVIDE (_edata = .)
+
+.bss            0x00000000200000c8      0xa6c load address 0x0000000000006d18
+                0x00000000200000c8                . = ALIGN (0x4)
+                0x00000000200000c8                PROVIDE (_sbss = .)
+ *(.sbss*)
+ .sbss.buffer   0x00000000200000c8        0x4 ./src/src/uart_ht7315/uart_ht7315.o
+                0x00000000200000c8                buffer
+ .sbss.buffer_index
+                0x00000000200000cc        0x4 ./src/src/uart_ht7315/uart_ht7315.o
+                0x00000000200000cc                buffer_index
+ .sbss.g_b_hdmi_input_valid
+                0x00000000200000d0        0x1 ./src/src/ms933x/ms933x_app.o
+                0x00000000200000d0                g_b_hdmi_input_valid
+ .sbss.g_b_hdmi_rx_audio_cts_change_flag
+                0x00000000200000d1        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_b_rx_gcp_avmute_flag
+                0x00000000200000d2        0x1 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000200000d3        0x1 
+ .sbss.g_u16_input_tmds_clk
+                0x00000000200000d4        0x2 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_chip_valid_check_timer_count
+                0x00000000200000d6        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_hdcp_rpt_ready_timer_count
+                0x00000000200000d7        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_hdcp_rpt_service_timer_count
+                0x00000000200000d8        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_hdmi_shell_error_timer_count
+                0x00000000200000d9        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_hdmi_tx_hpd_detect_count
+                0x00000000200000da        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_mdt_change_timer_count
+                0x00000000200000db        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_ms933xc_version_flag
+                0x00000000200000dc        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_rx_hdcp_timer_count
+                0x00000000200000dd        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_rx_hdcp_woking_flag
+                0x00000000200000de        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_rx_packet_timer_count
+                0x00000000200000df        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_rxpll_configed_status
+                0x00000000200000e0        0x1 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000200000e1        0x3 
+ .sbss.g_u8_sink_hpd_connect
+                0x00000000200000e4        0x4 ./src/src/ms933x/ms933x_app.o
+                0x00000000200000e4                g_u8_sink_hpd_connect
+ .sbss.g_u8_source_5v_connect
+                0x00000000200000e8        0x1 ./src/src/ms933x/ms933x_app.o
+                0x00000000200000e8                g_u8_source_5v_connect
+ .sbss.g_u8_system_error_flag
+                0x00000000200000e9        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_system_error_timer_count_10s
+                0x00000000200000ea        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_ddc_error_flag
+                0x00000000200000eb        0x1 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_enable_flag_buf
+                0x00000000200000ec        0x4 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_init_flag_buf
+                0x00000000200000f0        0x4 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_process_flag_buf
+                0x00000000200000f4        0x4 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_timer_count_buf
+                0x00000000200000f8        0x4 ./src/src/ms933x/ms933x_app.o
+ .sbss.g_u8_tx_hdcp_verify_first_R0_flag_buf
+                0x00000000200000fc        0x4 ./src/src/ms933x/ms933x_app.o
+ .sbss.ChipType
+                0x0000000020000100        0x4 ./src/src/TaskProcessCom.o
+                0x0000000020000100                ChipType
+ .sbss.enable_ESD_check
+                0x0000000020000104        0x1 ./src/src/TaskProcessCom.o
+                0x0000000020000104                enable_ESD_check
+ .sbss.enable_INT_irq
+                0x0000000020000105        0x1 ./src/src/TaskProcessCom.o
+                0x0000000020000105                enable_INT_irq
+ .sbss.tmos_num
+                0x0000000020000106        0x1 ./src/src/tmos.o
+ *fill*         0x0000000020000107        0x1 
+ .sbss.toms_tick
+                0x0000000020000108        0x4 ./src/src/tmos.o
+ .sbss.NVIC_Priority_Group
+                0x000000002000010c        0x4 ./Peripheral/src/ch32v30x_misc.o
+                0x000000002000010c                NVIC_Priority_Group
+ .sbss.p_ms     0x0000000020000110        0x2 ./Debug/debug.o
+ .sbss.p_us     0x0000000020000112        0x1 ./Debug/debug.o
+ .sbss.g_u8_hdmi_tx_channel
+                0x0000000020000113        0x1 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .sbss.__malloc_free_list
+                0x0000000020000114        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+                0x0000000020000114                __malloc_free_list
+ .sbss.__malloc_sbrk_start
+                0x0000000020000118        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+                0x0000000020000118                __malloc_sbrk_start
+ *(.gnu.linkonce.sb.*)
+ *(.bss*)
+ .bss.g_st_hdmi_edid_flag
+                0x000000002000011c       0x78 ./src/src/ms933x/ms933x_app.o
+ .bss.g_st_hdmi_in_timing
+                0x0000000020000194       0x16 ./src/src/ms933x/ms933x_app.o
+ *fill*         0x00000000200001aa        0x2 
+ .bss.g_st_hdmi_timing
+                0x00000000200001ac       0x14 ./src/src/ms933x/ms933x_app.o
+ .bss.g_u8_sys_edid_buf
+                0x00000000200001c0      0x200 ./src/src/ms933x/ms933x_app.o
+ .bss.g_u8_sys_edid_used_buf
+                0x00000000200003c0      0x200 ./src/src/ms933x/ms933x_app.o
+ .bss.tmosTask  0x00000000200005c0      0x550 ./src/src/tmos.o
+ .bss.arrInfoFrameBuffer
+                0x0000000020000b10       0x20 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ *(.gnu.linkonce.b.*)
+ *(COMMON*)
+ COMMON         0x0000000020000b30        0x4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+                0x0000000020000b30                errno
+                0x0000000020000b34                . = ALIGN (0x4)
+                0x0000000020000b34                PROVIDE (_ebss = .)
+                0x0000000020000b34                PROVIDE (_end = _ebss)
+                [!provide]                        PROVIDE (end = .)
+
+.stack          0x0000000020007800      0x800
+                0x0000000020007800                PROVIDE (_heap_end = .)
+                0x0000000020007800                . = ALIGN (0x4)
+                [!provide]                        PROVIDE (_susrstack = .)
+                0x0000000020008000                . = (. + __stack_size)
+ *fill*         0x0000000020007800      0x800 
+                0x0000000020008000                PROVIDE (_eusrstack = .)
+OUTPUT(YJD-CH32V30X.elf elf32-littleriscv)
+
+.debug_info     0x0000000000000000    0x16ddc
+ .debug_info    0x0000000000000000     0x1605 ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_info    0x0000000000001605     0x442b ./src/src/ms933x/ms933x_app.o
+ .debug_info    0x0000000000005a30     0x1991 ./src/src/IIC_hal/IIC_Software.o
+ .debug_info    0x00000000000073c1      0xf7b ./src/src/BoardConfig.o
+ .debug_info    0x000000000000833c     0x1561 ./src/src/TaskProcessCom.o
+ .debug_info    0x000000000000989d      0xbc0 ./src/src/ch32v30x_it.o
+ .debug_info    0x000000000000a45d      0xe3c ./src/src/main.o
+ .debug_info    0x000000000000b299      0xc99 ./src/src/mculib_common.o
+ .debug_info    0x000000000000bf32      0xbb5 ./src/src/system_ch32v30x.o
+ .debug_info    0x000000000000cae7     0x1336 ./src/src/tmos.o
+ .debug_info    0x000000000000de1d       0x22 ./Startup/startup_ch32v30x_D8C.o
+ .debug_info    0x000000000000de3f      0xa94 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_info    0x000000000000e8d3     0x12aa ./Peripheral/src/ch32v30x_gpio.o
+ .debug_info    0x000000000000fb7d      0xf5b ./Peripheral/src/ch32v30x_misc.o
+ .debug_info    0x0000000000010ad8     0x158a ./Peripheral/src/ch32v30x_rcc.o
+ .debug_info    0x0000000000012062     0x2a3c ./Peripheral/src/ch32v30x_tim.o
+ .debug_info    0x0000000000014a9e     0x13cd ./Peripheral/src/ch32v30x_usart.o
+ .debug_info    0x0000000000015e6b      0xf71 ./Debug/debug.o
+
+.debug_abbrev   0x0000000000000000     0x3656
+ .debug_abbrev  0x0000000000000000      0x42a ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_abbrev  0x000000000000042a      0x51f ./src/src/ms933x/ms933x_app.o
+ .debug_abbrev  0x0000000000000949      0x31a ./src/src/IIC_hal/IIC_Software.o
+ .debug_abbrev  0x0000000000000c63      0x260 ./src/src/BoardConfig.o
+ .debug_abbrev  0x0000000000000ec3      0x3da ./src/src/TaskProcessCom.o
+ .debug_abbrev  0x000000000000129d      0x22c ./src/src/ch32v30x_it.o
+ .debug_abbrev  0x00000000000014c9      0x2cb ./src/src/main.o
+ .debug_abbrev  0x0000000000001794      0x287 ./src/src/mculib_common.o
+ .debug_abbrev  0x0000000000001a1b      0x2c0 ./src/src/system_ch32v30x.o
+ .debug_abbrev  0x0000000000001cdb      0x327 ./src/src/tmos.o
+ .debug_abbrev  0x0000000000002002       0x12 ./Startup/startup_ch32v30x_D8C.o
+ .debug_abbrev  0x0000000000002014      0x2f7 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_abbrev  0x000000000000230b      0x31a ./Peripheral/src/ch32v30x_gpio.o
+ .debug_abbrev  0x0000000000002625      0x2da ./Peripheral/src/ch32v30x_misc.o
+ .debug_abbrev  0x00000000000028ff      0x351 ./Peripheral/src/ch32v30x_rcc.o
+ .debug_abbrev  0x0000000000002c50      0x3ee ./Peripheral/src/ch32v30x_tim.o
+ .debug_abbrev  0x000000000000303e      0x312 ./Peripheral/src/ch32v30x_usart.o
+ .debug_abbrev  0x0000000000003350      0x306 ./Debug/debug.o
+
+.debug_loc      0x0000000000000000     0x5b08
+ .debug_loc     0x0000000000000000      0x17a ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_loc     0x000000000000017a     0x16be ./src/src/ms933x/ms933x_app.o
+ .debug_loc     0x0000000000001838      0x782 ./src/src/IIC_hal/IIC_Software.o
+ .debug_loc     0x0000000000001fba      0x231 ./src/src/TaskProcessCom.o
+ .debug_loc     0x00000000000021eb       0x42 ./src/src/main.o
+ .debug_loc     0x000000000000222d       0xd7 ./src/src/mculib_common.o
+ .debug_loc     0x0000000000002304      0x163 ./src/src/system_ch32v30x.o
+ .debug_loc     0x0000000000002467      0x236 ./src/src/tmos.o
+ .debug_loc     0x000000000000269d       0x6e ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_loc     0x000000000000270b      0x72b ./Peripheral/src/ch32v30x_gpio.o
+ .debug_loc     0x0000000000002e36       0x61 ./Peripheral/src/ch32v30x_misc.o
+ .debug_loc     0x0000000000002e97      0xadb ./Peripheral/src/ch32v30x_rcc.o
+ .debug_loc     0x0000000000003972     0x18a6 ./Peripheral/src/ch32v30x_tim.o
+ .debug_loc     0x0000000000005218      0x779 ./Peripheral/src/ch32v30x_usart.o
+ .debug_loc     0x0000000000005991      0x177 ./Debug/debug.o
+
+.debug_aranges  0x0000000000000000      0xca0
+ .debug_aranges
+                0x0000000000000000       0x58 ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_aranges
+                0x0000000000000058      0x2c0 ./src/src/ms933x/ms933x_app.o
+ .debug_aranges
+                0x0000000000000318       0xa0 ./src/src/IIC_hal/IIC_Software.o
+ .debug_aranges
+                0x00000000000003b8       0x68 ./src/src/BoardConfig.o
+ .debug_aranges
+                0x0000000000000420       0x68 ./src/src/TaskProcessCom.o
+ .debug_aranges
+                0x0000000000000488       0x28 ./src/src/ch32v30x_it.o
+ .debug_aranges
+                0x00000000000004b0       0x30 ./src/src/main.o
+ .debug_aranges
+                0x00000000000004e0       0x38 ./src/src/mculib_common.o
+ .debug_aranges
+                0x0000000000000518       0x28 ./src/src/system_ch32v30x.o
+ .debug_aranges
+                0x0000000000000540       0x58 ./src/src/tmos.o
+ .debug_aranges
+                0x0000000000000598       0x30 ./Startup/startup_ch32v30x_D8C.o
+ .debug_aranges
+                0x00000000000005c8       0x48 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_aranges
+                0x0000000000000610       0xb0 ./Peripheral/src/ch32v30x_gpio.o
+ .debug_aranges
+                0x00000000000006c0       0x28 ./Peripheral/src/ch32v30x_misc.o
+ .debug_aranges
+                0x00000000000006e8      0x1a8 ./Peripheral/src/ch32v30x_rcc.o
+ .debug_aranges
+                0x0000000000000890      0x2d0 ./Peripheral/src/ch32v30x_tim.o
+ .debug_aranges
+                0x0000000000000b60       0xf0 ./Peripheral/src/ch32v30x_usart.o
+ .debug_aranges
+                0x0000000000000c50       0x50 ./Debug/debug.o
+
+.debug_ranges   0x0000000000000000      0xd10
+ .debug_ranges  0x0000000000000000       0x78 ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_ranges  0x0000000000000078      0x388 ./src/src/ms933x/ms933x_app.o
+ .debug_ranges  0x0000000000000400       0x90 ./src/src/IIC_hal/IIC_Software.o
+ .debug_ranges  0x0000000000000490       0x58 ./src/src/BoardConfig.o
+ .debug_ranges  0x00000000000004e8       0x88 ./src/src/TaskProcessCom.o
+ .debug_ranges  0x0000000000000570       0x18 ./src/src/ch32v30x_it.o
+ .debug_ranges  0x0000000000000588       0x20 ./src/src/main.o
+ .debug_ranges  0x00000000000005a8       0x28 ./src/src/mculib_common.o
+ .debug_ranges  0x00000000000005d0       0x38 ./src/src/system_ch32v30x.o
+ .debug_ranges  0x0000000000000608       0x48 ./src/src/tmos.o
+ .debug_ranges  0x0000000000000650       0x28 ./Startup/startup_ch32v30x_D8C.o
+ .debug_ranges  0x0000000000000678       0x50 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_ranges  0x00000000000006c8       0xa0 ./Peripheral/src/ch32v30x_gpio.o
+ .debug_ranges  0x0000000000000768       0x30 ./Peripheral/src/ch32v30x_misc.o
+ .debug_ranges  0x0000000000000798      0x198 ./Peripheral/src/ch32v30x_rcc.o
+ .debug_ranges  0x0000000000000930      0x2c0 ./Peripheral/src/ch32v30x_tim.o
+ .debug_ranges  0x0000000000000bf0       0xe0 ./Peripheral/src/ch32v30x_usart.o
+ .debug_ranges  0x0000000000000cd0       0x40 ./Debug/debug.o
+
+.debug_line     0x0000000000000000    0x110d7
+ .debug_line    0x0000000000000000      0x8e0 ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_line    0x00000000000008e0     0x4f69 ./src/src/ms933x/ms933x_app.o
+ .debug_line    0x0000000000005849      0xe2e ./src/src/IIC_hal/IIC_Software.o
+ .debug_line    0x0000000000006677      0x7f3 ./src/src/BoardConfig.o
+ .debug_line    0x0000000000006e6a      0x8e5 ./src/src/TaskProcessCom.o
+ .debug_line    0x000000000000774f      0x2a7 ./src/src/ch32v30x_it.o
+ .debug_line    0x00000000000079f6      0x59f ./src/src/main.o
+ .debug_line    0x0000000000007f95      0x3e5 ./src/src/mculib_common.o
+ .debug_line    0x000000000000837a      0x8e8 ./src/src/system_ch32v30x.o
+ .debug_line    0x0000000000008c62      0x811 ./src/src/tmos.o
+ .debug_line    0x0000000000009473      0x14a ./Startup/startup_ch32v30x_D8C.o
+ .debug_line    0x00000000000095bd      0x3a7 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_line    0x0000000000009964     0x1276 ./Peripheral/src/ch32v30x_gpio.o
+ .debug_line    0x000000000000abda      0x3f4 ./Peripheral/src/ch32v30x_misc.o
+ .debug_line    0x000000000000afce     0x19a8 ./Peripheral/src/ch32v30x_rcc.o
+ .debug_line    0x000000000000c976     0x30f8 ./Peripheral/src/ch32v30x_tim.o
+ .debug_line    0x000000000000fa6e      0xf15 ./Peripheral/src/ch32v30x_usart.o
+ .debug_line    0x0000000000010983      0x754 ./Debug/debug.o
+
+.debug_str      0x0000000000000000     0x572f
+ .debug_str     0x0000000000000000      0xf63 ./src/src/uart_ht7315/uart_ht7315.o
+                                       0x1024 (size before relaxing)
+ .debug_str     0x0000000000000f63     0x258c ./src/src/ms933x/ms933x_app.o
+                                       0x2bc6 (size before relaxing)
+ .debug_str     0x00000000000034ef      0x242 ./src/src/IIC_hal/IIC_Software.o
+                                        0x9b3 (size before relaxing)
+ .debug_str     0x0000000000003731       0xcd ./src/src/BoardConfig.o
+                                        0x7ec (size before relaxing)
+ .debug_str     0x00000000000037fe      0x3e3 ./src/src/TaskProcessCom.o
+                                       0x1016 (size before relaxing)
+ .debug_str     0x0000000000003be1       0x37 ./src/src/ch32v30x_it.o
+                                        0x68c (size before relaxing)
+ .debug_str     0x0000000000003c18       0xed ./src/src/main.o
+                                        0x90e (size before relaxing)
+ .debug_str     0x0000000000003d05       0x97 ./src/src/mculib_common.o
+                                        0x7cc (size before relaxing)
+ .debug_str     0x0000000000003d9c      0x10c ./src/src/system_ch32v30x.o
+                                        0x6f1 (size before relaxing)
+ .debug_str     0x0000000000003ea8       0xec ./src/src/tmos.o
+                                        0xf20 (size before relaxing)
+ .debug_str     0x0000000000003f94       0x56 ./Startup/startup_ch32v30x_D8C.o
+                                         0x96 (size before relaxing)
+ .debug_str     0x0000000000003fea       0xaf ./Peripheral/src/ch32v30x_dbgmcu.o
+                                        0x672 (size before relaxing)
+ .debug_str     0x0000000000004099      0x260 ./Peripheral/src/ch32v30x_gpio.o
+                                        0x9dc (size before relaxing)
+ .debug_str     0x00000000000042f9       0xab ./Peripheral/src/ch32v30x_misc.o
+                                        0xce5 (size before relaxing)
+ .debug_str     0x00000000000043a4      0x5d3 ./Peripheral/src/ch32v30x_rcc.o
+                                        0xd0b (size before relaxing)
+ .debug_str     0x0000000000004977      0xa1b ./Peripheral/src/ch32v30x_tim.o
+                                       0x12b2 (size before relaxing)
+ .debug_str     0x0000000000005392      0x301 ./Peripheral/src/ch32v30x_usart.o
+                                        0xb26 (size before relaxing)
+ .debug_str     0x0000000000005693       0x9c ./Debug/debug.o
+                                        0x964 (size before relaxing)
+
+.comment        0x0000000000000000       0x33
+ .comment       0x0000000000000000       0x33 ./src/src/uart_ht7315/uart_ht7315.o
+                                         0x34 (size before relaxing)
+ .comment       0x0000000000000033       0x34 ./src/src/ms933x/ms933x_app.o
+ .comment       0x0000000000000033       0x34 ./src/src/IIC_hal/IIC_Software.o
+ .comment       0x0000000000000033       0x34 ./src/src/BoardConfig.o
+ .comment       0x0000000000000033       0x34 ./src/src/TaskProcessCom.o
+ .comment       0x0000000000000033       0x34 ./src/src/ch32v30x_it.o
+ .comment       0x0000000000000033       0x34 ./src/src/main.o
+ .comment       0x0000000000000033       0x34 ./src/src/mculib_common.o
+ .comment       0x0000000000000033       0x34 ./src/src/system_ch32v30x.o
+ .comment       0x0000000000000033       0x34 ./src/src/tmos.o
+ .comment       0x0000000000000033       0x34 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .comment       0x0000000000000033       0x34 ./Peripheral/src/ch32v30x_gpio.o
+ .comment       0x0000000000000033       0x34 ./Peripheral/src/ch32v30x_misc.o
+ .comment       0x0000000000000033       0x34 ./Peripheral/src/ch32v30x_rcc.o
+ .comment       0x0000000000000033       0x34 ./Peripheral/src/ch32v30x_tim.o
+ .comment       0x0000000000000033       0x34 ./Peripheral/src/ch32v30x_usart.o
+ .comment       0x0000000000000033       0x34 ./Debug/debug.o
+ .comment       0x0000000000000033       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_rx.o)
+ .comment       0x0000000000000033       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_hdmi_tx.o)
+ .comment       0x0000000000000033       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_drv_misc.o)
+ .comment       0x0000000000000033       0x34 D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib\libms933x_V2.3.3.a(ms933x_mpi.o)
+
+.debug_frame    0x0000000000000000     0x297c
+ .debug_frame   0x0000000000000000       0xe0 ./src/src/uart_ht7315/uart_ht7315.o
+ .debug_frame   0x00000000000000e0      0xa34 ./src/src/ms933x/ms933x_app.o
+ .debug_frame   0x0000000000000b14      0x24c ./src/src/IIC_hal/IIC_Software.o
+ .debug_frame   0x0000000000000d60      0x158 ./src/src/BoardConfig.o
+ .debug_frame   0x0000000000000eb8      0x130 ./src/src/TaskProcessCom.o
+ .debug_frame   0x0000000000000fe8       0x30 ./src/src/ch32v30x_it.o
+ .debug_frame   0x0000000000001018       0x78 ./src/src/main.o
+ .debug_frame   0x0000000000001090       0x88 ./src/src/mculib_common.o
+ .debug_frame   0x0000000000001118       0x3c ./src/src/system_ch32v30x.o
+ .debug_frame   0x0000000000001154       0xec ./src/src/tmos.o
+ .debug_frame   0x0000000000001240       0x70 ./Peripheral/src/ch32v30x_dbgmcu.o
+ .debug_frame   0x00000000000012b0      0x174 ./Peripheral/src/ch32v30x_gpio.o
+ .debug_frame   0x0000000000001424       0x30 ./Peripheral/src/ch32v30x_misc.o
+ .debug_frame   0x0000000000001454      0x344 ./Peripheral/src/ch32v30x_rcc.o
+ .debug_frame   0x0000000000001798      0x614 ./Peripheral/src/ch32v30x_tim.o
+ .debug_frame   0x0000000000001dac      0x1e4 ./Peripheral/src/ch32v30x_usart.o
+ .debug_frame   0x0000000000001f90       0xb8 ./Debug/debug.o
+ .debug_frame   0x0000000000002048       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memcpy.o)
+ .debug_frame   0x0000000000002068       0x54 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-printf.o)
+ .debug_frame   0x00000000000020bc       0x54 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-puts.o)
+ .debug_frame   0x0000000000002110       0x50 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wbuf.o)
+ .debug_frame   0x0000000000002160       0x3c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-wsetup.o)
+ .debug_frame   0x000000000000219c       0x7c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fflush.o)
+ .debug_frame   0x0000000000002218      0x148 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-findfp.o)
+ .debug_frame   0x0000000000002360       0x88 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fwalk.o)
+ .debug_frame   0x00000000000023e8       0x64 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-makebuf.o)
+ .debug_frame   0x000000000000244c       0x40 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-freer.o)
+ .debug_frame   0x000000000000248c       0x40 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-mallocr.o)
+ .debug_frame   0x00000000000024cc       0xd0 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf.o)
+ .debug_frame   0x000000000000259c       0x8c c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-nano-vfprintf_i.o)
+ .debug_frame   0x0000000000002628       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-sbrkr.o)
+ .debug_frame   0x0000000000002658       0xa4 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-stdio.o)
+ .debug_frame   0x00000000000026fc       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-writer.o)
+ .debug_frame   0x000000000000272c       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-closer.o)
+ .debug_frame   0x000000000000275c       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-fstatr.o)
+ .debug_frame   0x000000000000278c       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-isattyr.o)
+ .debug_frame   0x00000000000027bc       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-lseekr.o)
+ .debug_frame   0x00000000000027ec       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-memchr.o)
+ .debug_frame   0x000000000000280c       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-mlock.o)
+ .debug_frame   0x000000000000283c       0x30 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-readr.o)
+ .debug_frame   0x000000000000286c       0x70 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libg_nano.a(lib_a-reent.o)
+ .debug_frame   0x00000000000028dc       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+ .debug_frame   0x00000000000028fc       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+ .debug_frame   0x000000000000291c       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+ .debug_frame   0x000000000000293c       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+ .debug_frame   0x000000000000295c       0x20 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+
+.stab           0x0000000000000000       0x84
+ .stab          0x0000000000000000       0x24 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)
+ .stab          0x0000000000000024       0x18 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(fstat.o)
+                                         0x24 (size before relaxing)
+ .stab          0x000000000000003c       0x18 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(isatty.o)
+                                         0x24 (size before relaxing)
+ .stab          0x0000000000000054       0x18 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(lseek.o)
+                                         0x24 (size before relaxing)
+ .stab          0x000000000000006c       0x18 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(read.o)
+                                         0x24 (size before relaxing)
+
+.stabstr        0x0000000000000000      0x117
+ .stabstr       0x0000000000000000      0x117 c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib\libnosys.a(close.o)

+ 77 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/makefile

@@ -0,0 +1,77 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+-include ../makefile.init
+
+RM := rm -rf
+
+# All of the sources participating in the build are defined here
+-include sources.mk
+-include src/src/uart_ht7315/subdir.mk
+-include src/src/ms933x/subdir.mk
+-include src/src/IIC_hal/subdir.mk
+-include src/src/subdir.mk
+-include Startup/subdir.mk
+-include Peripheral/src/subdir.mk
+-include Debug/subdir.mk
+-include Core/subdir.mk
+-include subdir.mk
+-include objects.mk
+
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(strip $(ASM_UPPER_DEPS)),)
+-include $(ASM_UPPER_DEPS)
+endif
+ifneq ($(strip $(ASM_DEPS)),)
+-include $(ASM_DEPS)
+endif
+ifneq ($(strip $(S_DEPS)),)
+-include $(S_DEPS)
+endif
+ifneq ($(strip $(S_UPPER_DEPS)),)
+-include $(S_UPPER_DEPS)
+endif
+ifneq ($(strip $(C_DEPS)),)
+-include $(C_DEPS)
+endif
+endif
+
+-include ../makefile.defs
+
+# Add inputs and outputs from these tool invocations to the build variables 
+SECONDARY_FLASH += \
+YJD-CH32V30X.hex \
+
+SECONDARY_LIST += \
+YJD-CH32V30X.lst \
+
+SECONDARY_SIZE += \
+YJD-CH32V30X.siz \
+
+
+# All Target
+all: YJD-CH32V30X.elf secondary-outputs
+
+# Tool invocations
+YJD-CH32V30X.elf: $(OBJS) $(USER_OBJS)
+	@	@	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 -T "D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Ld\Link.ld" -nostartfiles -Xlinker --gc-sections -L"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -Wl,-Map,"YJD-CH32V30X.map" --specs=nano.specs --specs=nosys.specs -o "YJD-CH32V30X.elf" $(OBJS) $(USER_OBJS) $(LIBS)
+	@	@
+YJD-CH32V30X.hex: YJD-CH32V30X.elf
+	@	riscv-none-embed-objcopy -O ihex "YJD-CH32V30X.elf"  "YJD-CH32V30X.hex"
+	@	@
+YJD-CH32V30X.lst: YJD-CH32V30X.elf
+	@	riscv-none-embed-objdump --all-headers --demangle --disassemble -M xw "YJD-CH32V30X.elf" > "YJD-CH32V30X.lst"
+	@	@
+YJD-CH32V30X.siz: YJD-CH32V30X.elf
+	@	riscv-none-embed-size --format=berkeley "YJD-CH32V30X.elf"
+	@	@
+# Other Targets
+clean:
+	-$(RM) $(ASM_UPPER_DEPS)$(OBJS)$(SECONDARY_FLASH)$(SECONDARY_LIST)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_DEPS)$(S_UPPER_DEPS)$(C_DEPS) YJD-CH32V30X.elf
+	-@
+secondary-outputs: $(SECONDARY_FLASH) $(SECONDARY_LIST) $(SECONDARY_SIZE)
+
+.PHONY: all clean dependents
+
+-include ../makefile.targets

+ 8 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/objects.mk

@@ -0,0 +1,8 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+USER_OBJS :=
+
+LIBS := -lms933x_V2.3.3
+

+ 33 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/sources.mk

@@ -0,0 +1,33 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+ELF_SRCS := 
+OBJ_SRCS := 
+S_SRCS := 
+ASM_UPPER_SRCS := 
+ASM_SRCS := 
+C_SRCS := 
+S_UPPER_SRCS := 
+O_SRCS := 
+ASM_UPPER_DEPS := 
+OBJS := 
+SECONDARY_FLASH := 
+SECONDARY_LIST := 
+SECONDARY_SIZE := 
+ASM_DEPS := 
+S_DEPS := 
+S_UPPER_DEPS := 
+C_DEPS := 
+
+# Every subdirectory with source files must be described here
+SUBDIRS := \
+Core \
+Debug \
+Peripheral/src \
+Startup \
+src/src \
+src/src/IIC_hal \
+src/src/ms933x \
+src/src/uart_ht7315 \
+

+ 29 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/IIC_hal/subdir.mk

@@ -0,0 +1,29 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+../src/src/IIC_hal/IIC2_Software.c \
+../src/src/IIC_hal/IIC3_Software.c \
+../src/src/IIC_hal/IIC_Hardware.c \
+../src/src/IIC_hal/IIC_Software.c 
+
+OBJS += \
+./src/src/IIC_hal/IIC2_Software.o \
+./src/src/IIC_hal/IIC3_Software.o \
+./src/src/IIC_hal/IIC_Hardware.o \
+./src/src/IIC_hal/IIC_Software.o 
+
+C_DEPS += \
+./src/src/IIC_hal/IIC2_Software.d \
+./src/src/IIC_hal/IIC3_Software.d \
+./src/src/IIC_hal/IIC_Hardware.d \
+./src/src/IIC_hal/IIC_Software.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+src/src/IIC_hal/%.o: ../src/src/IIC_hal/%.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 20 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/ms933x/subdir.mk

@@ -0,0 +1,20 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+../src/src/ms933x/ms933x_app.c 
+
+OBJS += \
+./src/src/ms933x/ms933x_app.o 
+
+C_DEPS += \
+./src/src/ms933x/ms933x_app.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+src/src/ms933x/%.o: ../src/src/ms933x/%.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 41 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/subdir.mk

@@ -0,0 +1,41 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+../src/src/BoardConfig.c \
+../src/src/TaskProcessCom.c \
+../src/src/ch32v30x_it.c \
+../src/src/main.c \
+../src/src/mculib_common.c \
+../src/src/pipe.c \
+../src/src/system_ch32v30x.c \
+../src/src/tmos.c 
+
+OBJS += \
+./src/src/BoardConfig.o \
+./src/src/TaskProcessCom.o \
+./src/src/ch32v30x_it.o \
+./src/src/main.o \
+./src/src/mculib_common.o \
+./src/src/pipe.o \
+./src/src/system_ch32v30x.o \
+./src/src/tmos.o 
+
+C_DEPS += \
+./src/src/BoardConfig.d \
+./src/src/TaskProcessCom.d \
+./src/src/ch32v30x_it.d \
+./src/src/main.d \
+./src/src/mculib_common.d \
+./src/src/pipe.d \
+./src/src/system_ch32v30x.d \
+./src/src/tmos.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+src/src/%.o: ../src/src/%.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 20 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/obj/src/src/uart_ht7315/subdir.mk

@@ -0,0 +1,20 @@
+################################################################################
+# Automatically-generated file. Do not edit!
+################################################################################
+
+# Add inputs and outputs from these tool invocations to the build variables 
+C_SRCS += \
+../src/src/uart_ht7315/uart_ht7315.c 
+
+OBJS += \
+./src/src/uart_ht7315/uart_ht7315.o 
+
+C_DEPS += \
+./src/src/uart_ht7315/uart_ht7315.d 
+
+
+# Each subdirectory must supply rules for building sources it contributes
+src/src/uart_ht7315/%.o: ../src/src/uart_ht7315/%.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 -D__STD_GCC__ -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Debug" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Core" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\SRC\Peripheral\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\src" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\src\inc" -I"D:\Wingcool\WingCool\CH32V30X\EVT\EXAM\CodePro\YJD-CH32V30X\lib" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+	@	@
+

+ 93 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/BoardConfig.h

@@ -0,0 +1,93 @@
+#ifndef __BOARDCONFIG_H__
+#define __BOARDCONFIG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "ch32v30x.h"
+#include "ch32x035_usbpd.h"
+
+#define  IIC_ADDR_MS933X  0xB2
+#define  IIC_ADDR_MS1826  0xB6
+
+
+
+//ms1826a ==> [PB]
+#define   MS1826_SCL    (GPIO_Pin_10)
+#define   MS1826_SDA    (GPIO_Pin_11)
+#define   MS1826_INT    (GPIO_Pin_1)
+#define   MS1826_RST    (GPIO_Pin_0)
+
+//a common set of IICs (MS933X,SGM832A,SGM452)
+//MS933X ==> [PC]
+#define   MS933X_SCL      (GPIO_Pin_7) //
+#define   MS933X_SDA      (GPIO_Pin_6) //
+//SGM832A,SGM452 [PB]
+#define   SENSOR_SCL   (GPIO_Pin_4)
+#define   SENSOR_SDA   (GPIO_Pin_5)
+
+//ms933x [PC]
+#define   MS933X_RST    (GPIO_Pin_0)
+
+//CH444G ==> [PB]
+#define   CH444G_A      (GPIO_Pin_15)
+#define   CH444G_B      (GPIO_Pin_14)
+
+//HDMI_LED ==> [PA]
+#define   HDMI1_LED      (GPIO_Pin_8)
+//HDMI_LED ==> [PC]
+#define   HDMI2_LED      (GPIO_Pin_9)
+#define   HDMI3_LED      (GPIO_Pin_8)
+
+//UART for Debug log ==> [PC]
+#define   UART_TX7      (GPIO_Pin_2)
+#define   UART_RX7      (GPIO_Pin_3)
+//UART for 6710x ==> [PA]
+#define   UART_TX1      (GPIO_Pin_9)
+#define   UART_RX1      (GPIO_Pin_10)
+//UART for reserved ==> [PA]
+//Output for customer Rs232
+//#define   UART_TX4      (GPIO_Pin_15)
+//#define   UART_RX4      (GPIO_Pin_16)
+//fixme to debug
+//PC10->UART4-Tx,PC11
+#define   UART_TX4      (GPIO_Pin_10)
+#define   UART_RX4      (GPIO_Pin_11)
+
+//ADC Key ==> [PC]
+#define   ADC_KEY       (GPIO_Pin_5) //adc15
+//BOOT IAP ==> [PB] 12
+#define   BOOT_IAP      (GPIO_Pin_12)
+
+//I2C1 ==> [PB]  hardware I2C for Slave ADDR is 7Bit (0xC6/0xC7)
+#define  I2C1_SCL   (GPIO_Pin_6)
+#define  I2C1_SDA   (GPIO_Pin_7)
+
+
+//reserved GPIO ==> [PA]
+#define  RESERVED_GPIO_A7      (GPIO_Pin_7)
+#define  RESERVED_GPIO_A6      (GPIO_Pin_6)
+#define  RESERVED_GPIO_A5      (GPIO_Pin_5)
+#define  RESERVED_GPIO_A4      (GPIO_Pin_4)
+
+
+void MS1826a_RST_GPIO_PP(void);
+void MS1826a_RST_GPIO_IPU(void);
+
+void MS933x_RST_GPIO_PP(void);
+void MS933x_RST_GPIO_IPU(void);
+
+void LED_GPIO_Init(void);
+void CH444G_GPIO_Init(void);
+
+void CH444G_XY_0(void);
+void CH444G_XY_1(void);
+void CH444G_XY_2(void);
+void CH444G_XY_NONE(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 37 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC2_Software.h

@@ -0,0 +1,37 @@
+#ifndef __IIC2_SOFTWARE_H__
+#define __IIC2_SOFTWARE_H__
+
+#include "BoardConfig.h"
+#include "ch32v30x.h"
+
+//IO方向设置
+//0XFFFF0FFF -> GPIOB-Pin11
+//GPIOB->CFGHR PB8-PB15 , GPIOB->CFGLR PB0-PB7
+#define SDA2_IN()  {GPIOB->CFGHR&=0XFFFF0FFF;GPIOB->CFGHR|=8<<(4*3);} //GPIOB11 配置成上拉(下拉)输入模式
+#define SDA2_OUT() {GPIOB->CFGHR&=0XFFFF0FFF;GPIOB->CFGHR|=3<<(4*3);}
+
+// #define SDA_IN()  {GPIOB->CFGLR&=0XFF0FFFFF;GPIOB->CFGLR|=8<<(4*5);} //PB5
+// #define SDA_OUT() {GPIOB->CFGLR&=0XFF0FFFFF;GPIOB->CFGLR|=3<<(4*5);}
+
+// #define SDA2_IN()  {}//{GPIOB->CFGLR&=0X0FFFFFFF;GPIOB->CFGLR|=8<<(4*7);} //PB7
+// #define SDA2_OUT() {}//{GPIOB->CFGLR&=0X0FFFFFFF;GPIOB->CFGLR|=3<<(4*7);}
+
+//IO操作函数
+#define IIC2_SCL(i)       GPIO_WriteBit(GPIOB,MS1826_SCL,i) //SCL
+#define IIC2_SDA(i)       GPIO_WriteBit(GPIOB,MS1826_SDA,i)
+#define READ2_SDA         GPIO_ReadInputDataBit(GPIOB,MS1826_SDA) //输入SDA
+
+//Public functions
+void IIC2_sf_Init(void);            //初始化IIC的IO口
+
+u8 IIC2_Check_Address(u8 Address);
+u8 IIC2_Send_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num);
+u8 IIC2_Read_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num);
+
+u8 IIC2_Send_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u16 num);
+u8 IIC2_Read_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+
+u8 IIC2_Send_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+u8 IIC2_Read_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+
+#endif

+ 39 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC3_Software.h

@@ -0,0 +1,39 @@
+#ifndef __IIC3_SOFTWARE_H__
+#define __IIC3_SOFTWARE_H__
+
+#include "BoardConfig.h"
+#include "ch32v30x.h"
+
+//IO方向设置
+//0XFFFF0FFF -> GPIOB-Pin11
+//GPIOB->CFGHR PB8-PB15 , GPIOB->CFGLR PB0-PB7
+//#define SDA3_IN()  {GPIOB->CFGHR&=0XFFFF0FFF;GPIOB->CFGHR|=8<<(4*3);} //GPIOB11 配置成上拉(下拉)输入模式
+//#define SDA3_OUT() {GPIOB->CFGHR&=0XFFFF0FFF;GPIOB->CFGHR|=3<<(4*3);}
+
+#define SDA3_IN()  {GPIOB->CFGLR&=0XFF0FFFFF;GPIOB->CFGLR|=8<<(4*5);} //PB5
+#define SDA3_OUT() {GPIOB->CFGLR&=0XFF0FFFFF;GPIOB->CFGLR|=3<<(4*5);}
+
+// #define SDA2_IN()  {}//{GPIOB->CFGLR&=0X0FFFFFFF;GPIOB->CFGLR|=8<<(4*7);} //PB7
+// #define SDA2_OUT() {}//{GPIOB->CFGLR&=0X0FFFFFFF;GPIOB->CFGLR|=3<<(4*7);}
+
+//IO操作函数
+#define IIC3_SCL(i)       GPIO_WriteBit(GPIOB,SENSOR_SCL,i) //SCL
+#define IIC3_SDA(i)       GPIO_WriteBit(GPIOB,SENSOR_SDA,i)
+#define READ3_SDA         GPIO_ReadInputDataBit(GPIOB,SENSOR_SDA) //输入SDA
+
+//Public functions
+void IIC3_sf_Init(void);            //初始化IIC的IO口
+
+u8 IIC3_Check_Address(u8 Address);
+u8 IIC3_Send_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num);
+u8 IIC3_Read_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num);
+
+u8 IIC3_Send_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u16 num);
+u8 IIC3_Read_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+
+u8 IIC3_Send_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+u8 IIC3_Read_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+
+u8 IIC3_Read_8bitMultiBytes_sgm832(u8 address, u8 reg, u16 *str, u8 num);
+
+#endif

+ 43 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC_Hardware.h

@@ -0,0 +1,43 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : IIC_Hardware.h
+* Author             : WCH
+* Version            : V1.0
+* Date               : 2018/12/12
+* Description        :
+*******************************************************************************/
+
+#ifndef __IIC_HARDWARE_H__
+#define __IIC_HARDWARE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ch32x035_usbpd.h"
+#include "ch32v30x.h"
+
+// #define   IIC_SDA     (GPIO_Pin_18)  //PC18
+// #define   IIC_SCL     (GPIO_Pin_19)  //PC19
+// #define   RST_PIN     (GPIO_Pin_0)   //PA0
+// #define   INT_PIN     (GPIO_Pin_1)   //PA1
+
+
+void MS1826A_IIC_Init(void);
+
+BOOL Check_I2C_Address(u8 Address);
+u8 IICReadOneByte(u32 ReadAddr);
+BOOL IICReadBytes(u32 ReadAddr, u8 *pBuffer, u16 Length);
+BOOL IICWriteOneByte(u32 WriteAddr, u8 DataToWrite);
+BOOL IICWriteBytes(u32 WriteAddr, u8 *pBuffer, u16 Length);
+
+void IICRead(u16 ReadAddr, u8 *pBuffer, u16 NumToRead);
+void IICWrite(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite);
+
+
+void IIC_hd_Init(u32 bound, u16 address);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 44 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/IIC_Software.h

@@ -0,0 +1,44 @@
+#ifndef __IIC_SOFTWARE_H__
+#define __IIC_SOFTWARE_H__
+
+#include "BoardConfig.h"
+#include "ch32v30x_conf.h"
+
+// #define   MS933X_SCL      (GPIO_Pin_19)
+// #define   MS933X_SDA      (GPIO_Pin_18)
+
+//IO鏂瑰悜璁剧疆
+//0XFFFF0FFF -> GPIOB-Pin11
+//GPIOB->CFGHR PB8-PB15 , GPIOB->CFGLR PB0-PB7
+// #define SDA_IN()  {GPIOB->CFGHR&=0XFFFFFF0F;GPIOB->CFGHR|=8<<(4*1);} //GPIOB9 配置成上拉(下拉)输入模式
+// #define SDA_OUT() {GPIOB->CFGHR&=0XFFFFFF0F;GPIOB->CFGHR|=3<<(4*1);}
+
+// #define SDA_IN()  {GPIOB->CFGLR&=0XFF0FFFFF;GPIOB->CFGLR|=8<<(4*5);} //PB5
+// #define SDA_OUT() {GPIOB->CFGLR&=0XFF0FFFFF;GPIOB->CFGLR|=3<<(4*5);}
+
+#define SDA_IN()  {GPIOC->CFGLR&=0XF0FFFFFF;GPIOC->CFGLR|=8<<(4*6);} //PC6
+#define SDA_OUT() {GPIOC->CFGLR&=0XF0FFFFFF;GPIOC->CFGLR|=3<<(4*6);}
+
+//IO鎿嶄綔鍑芥暟
+#define IIC_SCL(i)       GPIO_WriteBit(GPIOC,MS933X_SCL,i) //SCL
+#define IIC_SDA(i)       GPIO_WriteBit(GPIOC,MS933X_SDA,i)
+#define READ_SDA         GPIO_ReadInputDataBit(GPIOC,MS933X_SDA) //输入SDA
+
+//Public functions
+//void IIC_sf_Init(void);            //初始化IIC的IO口
+
+VOID mculib_i2c_init(VOID);            //初始化IIC的IO口
+
+u8 IIC_Check_Address(u8 Address);
+u8 IIC_Send_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num);
+u8 IIC_Read_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num);
+u8 IIC_Read_8bitMultiBytes_sgm832(u8 address, u8 reg, u16 *str, u8 num);
+
+
+u8 IIC_Send_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+u8 IIC_Read_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+
+u8 IIC_Send_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+u8 IIC_Read_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num);
+
+#endif

+ 74 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/TaskProcessCom.h

@@ -0,0 +1,74 @@
+/*
+ * TouchCommon.h
+ *
+ *  Created on: Nov 10, 2021
+ *      Author: Administrator
+ */
+#ifndef INCLUDE_TASKPROCESSCOM_H_
+#define INCLUDE_TASKPROCESSCOM_H_
+#include "ch32v30x.h"
+#include "ch32x035_usbpd.h"
+#include "ms933x_app.h"
+
+#define PERIO_10ms 1
+#define PERIO_50ms 80
+#define PERIO_100ms 160
+#define PERIO_200ms (160 * 2)
+#define PERIO_300ms (160 * 3)
+#define PERIO_500ms (160 * 5)
+#define PERIO_800ms (160 * 8)
+#define PERIO_1s 1600
+#define PERIO_2s (PERIO_1s*2)
+#define PERIO_5s (PERIO_1s*5)
+#define PERIO_40s (PERIO_1s*40)
+
+
+#define RESOLUTION_X  (16384-1)
+#define RESOLUTION_Y  (9600-1)
+
+#define DEVICE_MODE_MOUSE 0
+#define DEVICE_MODE_SIGLETOUCH 1
+#define DEVICE_MODE_MULTITOUCH  2
+
+typedef enum {
+  CHIP_TYPE_UNKNOW,
+  CHIP_TYPE_MS1826A, //0xB6-B7
+}CHIP_TYPE;
+
+
+#define   BIT0                    (0X01)
+#define   BIT1                    (0X02)
+#define   BIT2                    (0X04)
+#define   BIT3                    (0X08)
+#define   BIT4                    (0X10)
+#define   BIT5                    (0X20)
+#define   BIT6                    (0X40)
+#define   BIT7                    (0X80)
+
+
+extern uint8_t GT_CMD_WR;
+extern uint8_t GT_CMD_RD;
+
+extern CHIP_TYPE ChipType;
+
+
+extern uint8_t DeviceMode;
+extern volatile BOOL UsbReportPosEn;
+
+extern uint16_t wESDCheckTime;
+extern BOOL enable_INT_irq;
+extern BOOL enable_ESD_check;
+extern uint8_t IdleTimer;
+extern uint16_t UsbInitTimer;
+extern void (*TouchProc)(void);
+//extern UINT16 g_u16_timer_out;
+
+void CheckUsbStatus();
+void IICTouchInit();
+void InitChipStartTask();
+
+BOOL SearchAddress( uint8_t num );
+
+void USART4_SendData(PUINT8 txbuf, uint16_t length);
+void TIM3_Init( uint16_t arr, uint16_t psc );
+#endif

+ 45 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ch32v30x_conf.h

@@ -0,0 +1,45 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : ch32v30x_conf.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_CONF_H
+#define __CH32V30x_CONF_H
+
+#include "ch32v30x_adc.h"
+#include "ch32v30x_bkp.h"
+#include "ch32v30x_can.h"
+#include "ch32v30x_crc.h"
+#include "ch32v30x_dac.h"
+#include "ch32v30x_dbgmcu.h"
+#include "ch32v30x_dma.h"
+#include "ch32v30x_exti.h"
+#include "ch32v30x_flash.h"
+#include "ch32v30x_fsmc.h"
+#include "ch32v30x_gpio.h"
+#include "ch32v30x_i2c.h"
+#include "ch32v30x_iwdg.h"
+#include "ch32v30x_pwr.h"
+#include "ch32v30x_rcc.h"
+#include "ch32v30x_rtc.h"
+#include "ch32v30x_sdio.h"
+#include "ch32v30x_spi.h"
+#include "ch32v30x_tim.h"
+#include "ch32v30x_usart.h"
+#include "ch32v30x_wwdg.h"
+#include "ch32v30x_it.h"
+#include "ch32v30x_misc.h"
+
+
+#endif /* __CH32V30x_CONF_H */
+
+
+	
+	
+	

+ 20 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ch32v30x_it.h

@@ -0,0 +1,20 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : ch32v30x_it.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_IT_H
+#define __CH32V30x_IT_H
+
+#include "debug.h"
+
+
+#endif /* __CH32V30x_IT_H */
+
+

+ 128 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/mculib_common.h

@@ -0,0 +1,128 @@
+#ifndef __MCULIB_COMMON_H
+#define __MCULIB_COMMON_H
+
+#include "string.h"
+#include "stdio.h"
+
+#include "BoardConfig.h"
+// #include "hc32f46x.h"
+// #include "hc32_ddl.h"
+// #include "hc32f46x_usart.h"
+// #include "hc32f46x_timer0.h"
+
+//#include "ms_typedef.h"
+//#include "mculib_i2c.h"
+// #include "mculib_peripheral.h"
+// #include "mculib_gpio.h"
+// #include "mculib_uart.h"
+// #include "mculib_timer.h"
+// #include "mculib_key.h"
+// #include "mculib_ir.h"
+// #include "mculib_flash.h"
+// #include "mculib_systick.h"
+#include "TaskProcessCom.h" //g_u16_timer_out
+
+#define _MS1826_LOG_ENABLE_  (1)
+
+
+#define HD_RX_LED3(x)     (x == TRUE) ?   GPIO_WriteBit(GPIOA, HDMI1_LED, Bit_RESET) : GPIO_WriteBit(GPIOA, HDMI1_LED, Bit_SET)
+#define HD_RX_LED2(x)     (x == TRUE) ?   GPIO_WriteBit(GPIOC, HDMI2_LED, Bit_RESET) : GPIO_WriteBit(GPIOC, HDMI2_LED, Bit_SET)
+#define HD_RX_LED1(x)     (x == TRUE) ?   GPIO_WriteBit(GPIOC, HDMI3_LED, Bit_RESET) : GPIO_WriteBit(GPIOC, HDMI3_LED, Bit_SET)
+#define HD_RX_LED4(x)     //	(x == TRUE) ? PORT_ResetBits(LED_IN4_PORT, LED_IN4_PIN) : PORT_SetBits(LED_IN4_PORT, LED_IN4_PIN)
+#define HD_TX_LED1(x)     //(x == TRUE) ?   GPIO_WriteBit(GPIOA, HDMI1_LED, Bit_SET) : GPIO_WriteBit(GPIOA, HDMI1_LED, Bit_RESET)
+#define HD_TX_LED2(x)     //	(x == TRUE) ? PORT_ResetBits(LED_OUT2_PORT, LED_OUT2_PIN)  : PORT_SetBits(LED_OUT2_PORT, LED_OUT2_PIN)
+#define HD_TX_LED3(x)     //	(x == TRUE) ? PORT_ResetBits(LED_OUT3_PORT, LED_OUT3_PIN)  : PORT_SetBits(LED_OUT3_PORT, LED_OUT3_PIN)
+#define HD_TX_LED4(x)     //	(x == TRUE) ? PORT_ResetBits(LED_OUT4_PORT, LED_OUT4_PIN)  : PORT_SetBits(LED_OUT4_PORT, LED_OUT4_PIN)
+
+#define HD_POWERON_LED(x)  //(x == TRUE) ? PORT_ResetBits(LED_POWER_ON_PORT, LED_POWER_ON_PIN)  : PORT_SetBits(LED_POWER_ON_PORT, LED_POWER_ON_PIN)
+#define HD_POWEROFF_LED(x) //(x == TRUE) ? PORT_ResetBits(LED_POWER_OFF_PORT, LED_POWER_OFF_PIN)  : PORT_SetBits(LED_POWER_OFF_PORT, LED_POWER_OFF_PIN)
+
+#define I2S1_SW_OUTPUT     //	PORT_SetBits(I2S1_SW_PORT, I2S1_SW_PIN)
+#define I2S2_SW_OUTPUT     //	PORT_SetBits(I2S2_SW_PORT, I2S2_SW_PIN)
+#define I2S3_SW_OUTPUT     //	PORT_SetBits(I2S3_SW_PORT, I2S3_SW_PIN)
+#define I2S4_SW_OUTPUT     //	PORT_SetBits(I2S4_SW_PORT, I2S4_SW_PIN)
+#define I2S1_SW_INPUT     //	PORT_ResetBits(I2S1_SW_PORT, I2S1_SW_PIN)
+#define I2S2_SW_INPUT     //	PORT_ResetBits(I2S2_SW_PORT, I2S2_SW_PIN)
+#define I2S3_SW_INPUT     //	PORT_ResetBits(I2S3_SW_PORT, I2S3_SW_PIN)
+#define I2S4_SW_INPUT     //	PORT_ResetBits(I2S4_SW_PORT, I2S4_SW_PIN)
+
+#define SPDIF1_SW_OUTPUT    // 	PORT_SetBits(SPDIF1_SW_PORT, SPDIF1_SW_PIN)
+#define SPDIF2_SW_OUTPUT    // 	PORT_SetBits(SPDIF2_SW_PORT, SPDIF2_SW_PIN)
+#define SPDIF3_SW_OUTPUT    // 	PORT_SetBits(SPDIF3_SW_PORT, SPDIF3_SW_PIN)
+#define SPDIF4_SW_OUTPUT    // 	PORT_SetBits(SPDIF4_SW_PORT, SPDIF4_SW_PIN)
+#define SPDIF1_SW_INPUT     //	PORT_ResetBits(SPDIF1_SW_PORT, SPDIF1_SW_PIN)
+#define SPDIF2_SW_INPUT     //	PORT_ResetBits(SPDIF2_SW_PORT, SPDIF2_SW_PIN)
+#define SPDIF3_SW_INPUT     //	PORT_ResetBits(SPDIF3_SW_PORT, SPDIF3_SW_PIN)
+#define SPDIF4_SW_INPUT     //	PORT_ResetBits(SPDIF4_SW_PORT, SPDIF4_SW_PIN)
+
+#define TRUE 1
+#define FALSE 0
+
+#define _ENABLE_  1
+#define _DISABLE_ 0
+
+
+
+
+#ifndef LOG
+#if _MS1826_LOG_ENABLE_
+#define LOG(X) printf("%s\n", X)
+#else
+#define LOG(X)
+#endif
+#endif
+
+#ifndef LOG1
+#if _MS1826_LOG_ENABLE_
+#define LOG1(X, Y) printf("%s %x\n", X, Y)
+#else
+#define LOG1(X, Y)
+#endif
+#endif
+
+#ifndef LOG2
+#if _MS1826_LOG_ENABLE_
+#define LOG2(X, Y) printf("%s %d\n", X, Y)
+#else
+#define LOG2(X, Y)
+#endif
+#endif
+
+void mculib_chip_reset(void);
+
+
+
+#define KEY_NUM_1			0x00
+#define KEY_NUM_2			0x01
+#define KEY_NUM_3			0x02
+#define KEY_NUM_4			0x03
+#define KEY_FUNCTION		0x04
+#define KEY_MODE			0x05
+#define KEY_AUDIO			0x06
+#define KEY_RESOLU			0x07
+#define KEY_POWER			0x08
+#define KEY_UP				0x09
+#define KEY_DOWN			0x0A
+#define KEY_LEFT			0x0B
+#define KEY_RIGHT			0x0C
+#define KEY_OK				0x0D
+#define KEY_RETURN			0x0E
+#define KEY_RX_VIDEO_SEL 	0x0F
+
+#define KEY_AUDIO_MUTE		0x10
+#define KEY_NUM_5			0x11
+#define KEY_NUM_6			0x12
+#define KEY_NUM_7			0x13
+#define KEY_NUM_8			0x14
+#define KEY_NUM_9			0x15
+#define KEY_AUDIO_ADD		0x16
+#define KEY_AUDIO_SUB		0x17
+#define KEY_DEFAULT			0x18
+#define KEY_MENU			0x19
+
+
+
+
+
+#endif
+

+ 978 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x.h

@@ -0,0 +1,978 @@
+/**
+******************************************************************************
+* @file    ms933x.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   ms933x SDK Library interfaces declare
+* @history    
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_H__
+#define __MACROSILICON_MS933X_H__
+
+#include "ms933x_comm.h"
+#include "ms933x_edid.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+///////////////////////////////////////////////////////////////////
+//misc module APIs
+
+/***************************************************************
+*  Function name:   ms933xdrv_misc_chipisvalid
+*  Description:     check ms933x chip is valid or not
+*  Entry:           None
+*
+*  Returned value:  BOOL (valid is true)
+*  Remark: 
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_misc_chipisvalid(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_misc_chip_id_get
+*  Description:     get ms933x chip id
+*  Entry:           NULL             
+*  Returned value:  UINT32 id.
+*  Remark: 
+***************************************************************/
+MS933X_DRV_API UINT32 ms933xdrv_misc_chip_id_get(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_misc_chip_new_version_get
+*  Description:     get ms933x chip whether is new version(support CSC function...)
+*  Entry:           NULL             
+*  Returned value:  BOOL (new version is true)
+*  Remark: 
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_misc_chip_new_version_get(VOID);
+
+MS933X_DRV_API BOOL ms933xdrv_misc_chip_C_version_get(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_misc_audio_out_pad_enable
+*  Description:     I2S and SPDIF output PAD enable. Don't ctrl i2s mclk
+*  Entry:           [in]b_enable, if true enable output, else disable output         
+*  Returned value:  None
+*  Remark: 
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_misc_audio_out_pad_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_misc_audio_i2s_mclk_pad_enable
+*  Description:     I2S mclk output PAD enable
+*  Entry:           [in]b_enable, if true enable output, else disable output         
+*  Returned value:  None
+*  Remark: 
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_misc_audio_i2s_mclk_pad_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_misc_audio_i2s_mclk_div
+*  Description:     I2S mclk divider, 
+*                   when RX_AUDIO_MCLK_BASE_256FS_ENABLE = 1, default 256fs; else default 128fs
+*  Entry:           [in]u8_div
+*                       0: div 1
+*                       1: div 2
+*                       2: div 4
+*                       3: div 8
+*
+*  Returned value:  None
+*  Remark: 
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_misc_audio_i2s_mclk_div(UINT8 u8_div);
+
+
+///////////////////////////////////////////////////////////////////
+//hdmi rx module APIs
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_init
+*  Description:     hdmi rx controllor module init
+*  Entry:           [in]None
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_init(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_pi_phy_init
+*  Description:     hdmi rxphy config, default init term enable
+*  Entry:           None
+*
+*  Returned value:  BOOL (init success is true)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_pi_phy_init(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_5v_det
+*  Description:     get hdmi rx 5V status
+*  Entry:           [in]None
+*
+*  Returned value:  BOOL (5V connect is true)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_5v_det(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hpd_set
+*  Description:     set hdmi rx hpd status
+*  Entry:           [in]bReady, if true set HPD High
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_hpd_set(BOOL bReady);
+
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_controller_hpd_get(VOID);
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_edid_config
+*  Description:     hdmi rx edid config
+*  Entry:           [in]u8Edid, const 256byte
+*                   
+*  Returned value: None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_edid_config(UINT8 *u8Edid);
+
+//u8Edid, const 512byte
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_full_edid_config(UINT8 *u8Edid);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_get_tmds_clk
+*  Description:     get hdmi rx input tmds clk
+*  Entry:           [in]None
+*
+*  Returned value:  return UINT16 value, uint 10000Hz
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT16 ms933xdrv_hdmi_rx_get_tmds_clk(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_pi_pll_config
+*  Description:     hdmi rxphy config base on detect input tmds clk
+*  Entry:           [in]u16TmdsClk, uint 10000Hz
+*                       u8_eq_gain, EQ value config. 
+*                          manual EQ, set value from 0~7
+*                          auto EQ, set value 0xFF
+*
+*  Returned value:  return config status. [0]rxpll_lock, [1]rxphy_eq_ok, [2]rx_clk_stable
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_pi_phy_config(UINT16 u16TmdsClk, UINT8 u8_eq_gain);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_pi_phy_config_with_28eq
+*  Description:     hdmi rxphy config with 28eq base on detect input tmds clk
+*  Entry:           [in]u16TmdsClk, uint 10000Hz
+*                       u8_eq_gain, EQ value config. 
+*                          manual EQ, set value from 0~27
+*                          auto EQ, set value 0xFF
+*
+*  Returned value:  return config status. [0]rxpll_lock, [1]rxphy_eq_ok, [2]rx_clk_stable
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_pi_phy_config_with_28eq(UINT16 u16TmdsClk, UINT8 u8_eq_gain);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_errdet_wrong_status
+*  Description:     hdmi rxphy error counter detect(exclude of video_data(resolve some source not match to HDMI_SPEC))
+*  Entry:           [in]u16_error_val, max thresthod of error
+*
+*  Returned value:  BOOL (when detect error large than u16_error_val, return true)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_errdet_wrong_status(UINT16 u16_error_val);
+
+//tmds data full error detect, u16ErrCnt[3] for 3_channel_data
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_tmds_error_detect(UINT16 *p_u16ErrCnt);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_rxpll_lock_status
+*  Description:     hdmi rxpll lock status detect
+*  Entry:           [in]None
+*
+*  Returned value:  BOOL (when rxpll lock return true)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_rxpll_lock_status(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_pi_pll_release
+*  Description:     hdmi rxpll enable ctrl
+*  Entry:           [in]bEnable, if false disable rxpll
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_pi_pll_release(BOOL bEnable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_phy_power_down
+*  Description:     hdmi rxphy power down
+*  Entry:           [in]None
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_phy_power_down(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hdcp_init
+*  Description:     hdmi rx hdcp init key
+*  Entry:           [in]u8RxKsv, 5byte 
+*                       u8RxKey, 280byte
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_hdcp_init(UINT8 *u8RxKsv, UINT8 *u8RxKey);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hdcp_encryption_enable
+*  Description:     hdmi rx hdcp enable
+*  Entry:           [in]bEnable, if true eanble HDCP decode
+*                   
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_hdcp_encryption_enable(BOOL bEnable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hdcp_get_status
+*  Description:     hdmi rx hdcp working status
+*  Entry:           [in]None
+*
+*  Returned value:  return true if hdcp working
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_controller_hdcp_get_status(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hdcp_get_Ri
+*  Description:     hdmi rx hdcp get Link verification response value 
+*  Entry:           [in]None
+*
+*  Returned value:  return UINT16 value
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT16 ms933xdrv_hdmi_rx_controller_hdcp_get_Ri(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_hdcp_detect_enable
+*  Description:     enable hdmi rx hdcp detect encoding start   
+*  Entry:           [in]bEnable, if true enable hdcp detect source encoding
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_hdcp_detect_enable(BOOL bEnable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hdcp_data_enable
+*  Description:     enable hdmi rxphy data to hdcp moudle  
+*  Entry:           [in]bEnable, if true enable
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_hdcp_data_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_get_mdt_interrupt_status
+*  Description:     get hdmi rx mdt interrupt status, auto clear status
+*  Entry:           [in]u16_mask, mask bit
+*               
+*  Returned value:  return UINT16 status, enum refer to MDTISTS_E
+*  Remark:
+***************************************************************/ 
+MS933X_DRV_API UINT16 ms933xdrv_hdmi_rx_get_mdt_interrupt_status(UINT16 u16_mask);
+
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_get_input_timing
+*  Description:     get hdmi rx input video timing information
+*  Entry:           [out]ptTiming
+*                        u8_polarity, enum to e_RxMdtPol
+*                        u16_htotal,  by tmds clk
+*                        u16_vtotal,  uint line
+*                        u16_hactive, by tmds clk
+*                        u16_vactive, uint line
+*                        u16_pixclk,  input tmds clk, uint 10000Hz,
+*                        u16_vfreq,   uint 0.01Hz
+*                        u16_hoffset, by pixel clk
+*                        u16_voffset, uint line
+*                        u16_hsyncwidth, by tmds clk
+*                        u16_vsyncwidth, uint line
+*
+*  Returned value:  if input timing valid return true, else return false
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_get_input_timing(VIDEOTIMING_T *ptTiming);
+
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_controller_mdt_syncvalid(VOID);
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_reset
+*  Description:     reset hdmi rx controller logic
+*  Entry:           [in]eModule, define refer to hdmi_rx_reset_ctrl
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_reset(UINT32 eModule);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_get_audio_fifo_status
+*  Description:     get hdmi rx audio fifo status
+*  Entry:           [in]None
+*
+*  Returned value:  return UINT8 value, refer to AUDIO_FIFO_STATUS_E
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_get_audio_fifo_status(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_audio_fifo_reset
+*  Description:     hdmi rx audio fifo reset
+*  Entry:           [in]b_reset, if true reset fifo, else release fifo reset
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_audio_fifo_reset(BOOL b_reset);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_video_fifo_reset
+*  Description:     hdmi rx video fifo reset
+*  Entry:           [in]b_reset, if true reset fifo, else release fifo reset
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_video_fifo_reset(BOOL b_reset);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status
+*  Description:     get hdmi rx packet decode change int stauts, auto clear status
+*  Entry:           [in]u32_mask, mask bit
+*
+*  Returned value:  return UINT32 status, define refer to hdmi_rx_packet_ists
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT32 ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status(UINT32 u32_mask);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status
+*  Description:     get hdmi rx hdmi information change int stauts, auto clear status
+*  Entry:           [in]u32_mask, mask bit
+*
+*  Returned value:  return UINT32 status, define refer to hdmi_rx_hdmi_ists
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT32 ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status(UINT32 u32_mask);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_audio_fifo_interrupt_get_status
+*  Description:     get hdmi rx audio fifo information change int stauts, auto clear status
+*  Entry:           [in]u32_mask, mask bit
+*
+*  Returned value:  return UINT32 status, define refer to AUDIO_FIFO_STATUS_E
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT32 ms933xdrv_hdmi_rx_controller_audio_fifo_interrupt_get_status(UINT32 u32_mask);
+
+
+//get status, but do not clear interrput status.
+MS933X_DRV_API UINT32 ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status_ext(UINT32 u32_mask);
+MS933X_DRV_API UINT32 ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status_ext(UINT32 u32_mask);
+MS933X_DRV_API UINT32 ms933xdrv_hdmi_rx_controller_audio_fifo_interrupt_get_status_ext(UINT32 u32_mask);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl
+*  Description:     hdmi rx interrupt status to INT_PIN ctrl. 
+                    when interrupt coming, INT_PIN 1->0.
+                    when interrupt register bit be cleared, INT_PIN 0->1
+*  Entry:           [in]u8_module,
+*                                 0: HDMI_RX_CTRL_PDEC,  mask refer to hdmi_rx_packet_ists
+*                                 1: HDMI_RX_CTRL_MODET, mask refer to MDTISTS_E
+*                                 2: HDMI_RX_CTRL_HDMI,  mask refer to hdmi_rx_packet_ists
+*                                                        default enable CLK_CHANGE_ISTS on hdmi rx init
+*                                 3: HDMI_RX_CTRL_AUD,   mask refer to AUDIO_FIFO_STATUS_E
+*                       b_enable_to_pin: interruput to pin enable
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl(UINT8 u8_module, UINT32 u32_mask, BOOL b_enable_to_pin);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_get_mdt_interrupt_status_ext
+*  Description:     get hdmi rx mdt interrupt status, but not clear status
+*  Entry:           [in]u16_mask, mask bit
+*               
+*  Returned value:  return UINT16 status, enum refer to MDTISTS_E
+*  Remark:
+***************************************************************/ 
+MS933X_DRV_API UINT16 ms933xdrv_hdmi_rx_get_mdt_interrupt_status_ext(UINT16 u16_mask);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_get_gcp_avmute
+*  Description:     get hdmi rx controller receive gcp avmute packet
+*  Entry:           [in]None
+*
+*  Returned value:  BOOL (return true if receive gcp avmute packet)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_controller_get_gcp_avmute(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_set_avmute_black_color
+*  Description:     set hdmi rx avmute black color by different color space
+*  Entry:           [in]u8_cs, enum refer to HDMI_CS_E
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_set_avmute_black_color(UINT8 u8_cs);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_get_input_config
+*  Description:     get hdmi rx input HDMI information
+*  Entry:           [out]pt_hdmi_rx, refer to HDMI_CONFIG_T
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_get_input_config(HDMI_CONFIG_T *pt_hdmi_rx);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_get_pdec_header_audio_mode
+*  Description:     get hdmi rx audio mode from audio packet 192bit header
+*  Entry:           None
+*
+*  Returned value:  UINT8 audio mode
+*                   0:AUDS_RCV; 0:OBA_RCV; 2:DST_RCV; 3:HBR_RCV; 4:OBM_RCV; 5:MAS_RCV
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_controller_get_pdec_header_audio_mode(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_get_inforframe_audio_mode
+*  Description:     get hdmi rx audio mode from audio inforframe
+*  Entry:           None
+*
+*  Returned value:  UINT8 audio mode, refer to HDMI_AUDIO_CT_E
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_controller_get_inforframe_audio_mode(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_pixel_clk_config
+*  Description:     hdmi rx set pixel clock based on detect input deep color mode and clk repeat
+*  Entry:           [in]u8ColorDepth, refer to HDMI_COLOR_DEPTH_E
+*                       u8ClkRepeat,  refer to HDMI_CLK_RPT_E
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_controller_pixel_clk_config(UINT8 u8ColorDepth, UINT8 u8ClkRepeat);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_controller_audio_channel_config
+*  Description:     hdmi rx set audio channel based on detect Audio infoframe
+*  Entry:           [in]u8_chn, refer to HDMI_AUDIO_CHN_E
+*                       u8_speaker_locations,  refer to CEA-861 audio infoframe, BYTE4
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_controller_audio_channel_config(UINT8 u8_chn, UINT8 u8_speaker_locations);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_audio_config
+*  Description:     config hdmi rx audio clk base detect input tmds clk
+*  Entry:           [in]u8_audio_clk_mode: bit3_0 refer to e_RxAudioClkMode. bit7 refer to RX_AUDIO_MCLK_BASE_256FS_ENABLE.
+*                       u16_tmds_clk: uint:10000Hz
+*                       
+*  Returned value: return UINT16 audio fs, uint:100Hz
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT16 ms933xdrv_hdmi_rx_audio_config(UINT8 u8_audio_clk_mode, UINT16 u16_tmds_clk);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_audio_output_enable
+*  Description:     hdmi rx audio output ctrl, default enable in ms933xdrv_hdmi_rx_init
+*  Entry:           [in]b_enable: if true enable 
+*
+*  Returned value: None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_audio_output_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_pi_phy_term_enable
+*  Description:     hdmi rxphy clk and data internal term ctrl
+*  Entry:           [in]b_enable: if true enable hdmi rxphy internal term
+*                   
+*  Returned value: None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_pi_phy_term_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_get_tmds_overload
+*  Description:     get hdmi rx tmds whether overload, (reserve function) 
+*  Entry:           [in]None
+*                   
+*  Returned value: return UINT8 stauts
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_get_tmds_overload(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_rx_tmds_overload_protect_disable
+*  Description:     hdmi rx tmds overload ctrl, (reserve function)
+*  Entry:           [in]b_disable: if true disable tmds overload protect
+*                   
+*  Returned value: None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_tmds_overload_protect_disable(BOOL b_disable);
+
+
+///////////////////////////////////////////////////////////////////
+//hdmi tx APIs
+
+
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_init(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_set_channel
+*  Description:     select which hdmi tx channel need to be configed
+*  Entry:           [in]u8_chn: enum refer to HDMI_CHANNEL_E
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_set_channel(UINT8 u8_chn);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_get_channel
+*  Description:     get current keep hdmi tx channel id
+*  Entry:           [in]None
+*               
+*  Returned value:  return UINT8 value enum refer to HDMI_CHANNEL_E
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_get_channel(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_hpd
+*  Description:     hdmi tx hot plug detection
+*  Entry:           [in] None
+*               
+*  Returned value:  if hdmi cable plug in return true, else return false
+*  Remark:
+***************************************************************/ 
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_shell_hpd(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_config
+*  Description:     hdmi tx config
+*  Entry:           [in]pt_hdmi_tx: struct refer to HDMI_CONFIG_T
+*                      
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_config(HDMI_CONFIG_T *pt_hdmi_tx);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_output_enable
+*  Description:     hdmi tx module output timing on/off
+*  Entry:           [in]b_enable: if true turn on 
+*                                 else turn off
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_output_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_video_mute_enable
+*  Description:     hdmi tx shell module video mute
+*  Entry:           [in]b_enable, if true mute screen else normal video
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_shell_video_mute_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_audio_mute_enable
+*  Description:     hdmi tx shell module audio mute
+*  Entry:           [in]b_enable, if true mute audio else normal audio
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_shell_audio_mute_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_set_gcp_packet_avmute
+*  Description:     hdmi tx shell send gcp avmute packet
+*  Entry:           [in]b_mute, if true tx will send gcp avmute packet per frame.
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_shell_set_gcp_packet_avmute(BOOL b_mute);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_csc
+*  Description:     hdmi tx shell color space covertion fucntion.unsupport YUV420 csc
+*                   if yuv2rgb, rgb fixed to limit range
+*  Entry:           [in]in_color, [3:0]shell input color space, refer to HDMI_CS_E. [7:4] input colorimetry, refer to HDMI_COLORIMETRY_E
+*                       out_color, shell output color space, refer to HDMI_CS_E. 
+*
+*  Returned value:  BOOL (if support csc return TRUE)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_csc(UINT8 in_color, UINT8 out_color);
+MS933X_DRV_API BOOL ms933xcdrv_hdmi_tx_csc_setting_get(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_audio_config
+*  Description:     hdmi tx audio config
+*  Entry:           [in]pt_hdmi_tx: struct refer to HDMI_CONFIG_T
+*                      
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_audio_config(HDMI_CONFIG_T *pt_hdmi_tx);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_audio_fs_update
+*  Description:     hdmi tx audio sample rate update
+*  Entry:           [in]u8_audio_rate: refer to HDMI_AUDIO_RATE_E
+*                      
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_audio_fs_update(UINT8 u8_audio_rate);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_set_audio_cbyte_from_channel
+*  Description:     set hdmi tx cbyte status from which tx channel
+*  Entry:           [in]u8_tx_chn: refer to HDMI_CHANNEL_E
+*                      
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_shell_set_audio_cbyte_from_channel(UINT8 u8_tx_chn);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_get_audio_cbyte_status
+*  Description:     get hdmi tx input audio c byte
+*  Entry:           [in]None
+*                      
+*  Returned value:  UINT8
+*                   BIT0: 0:PCM; 1: none-PCM
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_shell_get_audio_cbyte_status(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_power_down
+*  Description:     hdmi txphy module power down
+*  Entry:           [in]None
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/ 
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_power_down(VOID);
+
+MS933X_DRV_API VOID ms933xcdrv_hdmi_tx_core_power_down(VOID);
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_shell_timing_stable
+*  Description:     hdmi tx shell timing stable status
+*  Entry:           [in]None
+*               
+*  Returned value:  BOOL (if shell timing is stable return true)
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_shell_timing_stable(VOID);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_data_R200_enable
+*  Description:     hdmi txphy tmds data R200 ctrl 
+*  Entry:           [in]b_enable, if true enable tmds data R200. RG_HDMITX_R200_EN
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_data_R200_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_clk_drive_config
+*  Description:     hdmi txphy clk drive adjust
+*  Entry:           [in]u8_main_pre, 0~7.  RG_MAIN_PREC
+*                       u8_main_po,  0~15. RG_MAIN_POC
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_clk_drive_config(UINT8 u8_main_pre, UINT8 u8_main_po);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_data_drive_config
+*  Description:     hdmi txphy data drive adjust
+*  Entry:           [in]u8_main_pre, 0~7.  RG_MAIN_PRE
+*                       u8_main_po,  0~15. RG_MAIN_PO
+*                       u8_post_po,  0~15. RG_POST_PO
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_data_drive_config(UINT8 u8_main_pre, UINT8 u8_main_po, UINT8 u8_post_po);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_output_auto_ctrl
+*  Description:     hdmi txphy output auto ctrl by input timing or clk status
+*  Entry:           [in]u8_ctrl_mode: 0: by input clk change int, CLK_CHANGE_ISTS
+*                                     1: by input timng unstable, MDT_USTB_ISTS
+*                       b_auto: auto ctrl function enable
+*
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_output_auto_ctrl(UINT8 u8_ctrl_mode, BOOL b_auto);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_phy_data_drive_enhance
+*  Description:     hdmi txphy drive enhance
+*  Entry:           [in]b_enable, if true enhance output tmds data drive. RG_TX_IDRV_6M_EN
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_phy_data_drive_enhance(BOOL b_enable);
+
+
+//ms933x hdmi tx drive config API. integrate above APIs only.
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_drive_config(HDMI_TX_DRIVE_T *pt_tx_drive);
+
+
+//hdmi tx ddc APIs
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_ddc_is_busy
+*  Description:     hdmi tx module DDC sda/scl whether is busy.
+*  Entry:           [in]None
+*               
+*  Returned value:  BOOL (if sda or scl is low level, return TRUE)
+*  Remark:
+***************************************************************/ 
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_ddc_is_busy(VOID);
+
+//typical 50KHz clk, SCL 9 high level pulse
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_ddc_bus_clear(VOID);
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_ddc_enable
+*  Description:     hdmi tx module DDC enable
+*  Entry:           [in]b_enable, if true enable ddc, else disable
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/ 
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_ddc_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_hdcp_enable
+*  Description:     hdmi hdcp enable
+*  Entry:           [in]b_enable, if true enable hdcp, else disable
+*               
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_hdcp_enable(BOOL b_enable);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_hdcp_init
+*  Description:     hdmi hdcp init
+*  Entry:           [in]p_u8_key, 280 bytes hdmi tx key
+*                       p_u8_ksv, 5 bytes hdmi tx ksv
+*
+*  Returned value:  if hdcp init success return true, else return false
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_hdcp_init(UINT8 *p_u8_key, UINT8 *p_u8_ksv);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_hdcp_get_status
+*  Description:     hdmi hdcp get tx/rx Ri verify result, suggest 2s period polled
+*  Entry:           [out]pt, refer to HDMI_HDCP_RI
+*
+*  Returned value:  if verify sucess return 0x01, else return 0x00
+*  Remark:
+***************************************************************/
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_hdcp_get_status(HDMI_HDCP_RI *pt);
+
+
+/***************************************************************
+*  Function name:   ms933xdrv_hdmi_tx_parse_edid
+*  Description:     parse hdmi sink edid
+*  Entry:           [out]p_u8_edid_buf, buf for EDID, 256bytes
+*                        pt_edid, refer to HDMI_EDID_FLAG_T
+*
+*  Returned value:  if parse sucess return 0x01, else return 0x00
+*  Remark:
+***************************************************************/
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_parse_edid(UINT8 *p_u8_edid_buf, HDMI_EDID_FLAG_T *pt_edid);
+
+//p_u8_edid_buf, buf for EDID, 512bytes
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_parse_full_edid(UINT8 *p_u8_edid_buf, HDMI_EDID_FLAG_T *pt_edid);
+
+
+//helper
+//fifo_init -> delay_xx -> fifo_get.
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_core_packet_fifo_init(UINT8 u8_type);
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_rx_core_packet_fifo_get(UINT8 *p_u8_fifo_data);
+
+//hdmi tx set spd_code, fixed u8_len = 1
+//0x00:unknown; 0x01:Digital STB; 0x02:DVD player; 0x03:D-VHS; 0x04:HDD Videorecorder; 0x05:DVC; 0x06:DSC; 0x07:Video CD; 0x08:Game; 0x09:PC general; 0x0A:Blu-Ray Disc(BD); 0x0B:Super Audio CD; others for furture
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_shell_set_spd_infoframe(UINT8 *p_u8_spd_buf, UINT8 u8_len, BOOL b_enable);
+
+
+//for HDMI repeater APIs
+
+//hdmi rx
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_core_hdcp_bcaps_fast_ddc_support_enable(BOOL b_fast_support);
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_core_hdcp_bcaps_rpt_enable(BOOL b_enable);
+MS933X_DRV_API VOID ms933xdrv_hdmi_rx_core_hdcp_rpt_reset_enable(BOOL b_reset);
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_core_hdcp_rpt_ksv_init(UINT8 u8_dev_count, UINT8 u8_dev_depth, UINT8 *p_u8_ksv_buf);
+MS933X_DRV_API BOOL ms933xdrv_hdmi_rx_core_hdcp_rpt_ready_get(VOID);
+
+//hdmi tx
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_hdcp_get_bcaps_from_rx(UINT8 *p_data);
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_hdcp_get_bstatus_from_rx(UINT8 *p_u8_dev_count, UINT8 *p_u8_dev_depth);
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_hdcp_get_bksv_from_rx(UINT8 *p_data);
+MS933X_DRV_API VOID ms933xdrv_hdmi_tx_hdcp_rpt_enable(BOOL b_enable);
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_hdcp_repeat_init(UINT8 *p_u8_dev_count, UINT8 *p_u8_dev_depth, UINT8 *p_u8_ksv_list_buf);
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_hdcp_rpt_status_get(VOID);
+
+
+//hdmi tx hdcp key init for HW new function. only need init 280byte once.
+MS933X_DRV_API UINT8 ms933xdrv_hdmi_tx_hdcp_key_init(UINT8 *p_u8_key);
+
+//hdmi tx hdcp video encryption for HW new function
+MS933X_DRV_API BOOL ms933xdrv_hdmi_tx_hdcp_encryption_enable(BOOL b_enable);
+
+
+
+//ms933x_mpi extend APIs for register r/w.
+
+//
+MS933X_DRV_API UINT8  ms933x_HAL_ReadByte(UINT16 u16_index);
+MS933X_DRV_API VOID   ms933x_HAL_WriteByte(UINT16 u16_index, UINT8 u8_value);
+MS933X_DRV_API VOID   ms933x_HAL_ModBits(UINT16 u16_index, UINT8 u8_mask, UINT8 u8_value);
+MS933X_DRV_API VOID   ms933x_HAL_ToggleBits(UINT16 u16_index, UINT8 u8_mask, BOOL b_set);
+//
+MS933X_DRV_API UINT32 ms933x_HAL_ReadDWord_Ex(UINT16 u16_index);
+MS933X_DRV_API VOID   ms933x_HAL_WriteDWord_Ex(UINT16 u16_index, UINT32 u32_value);
+MS933X_DRV_API VOID   ms933x_HAL_ModBits_Ex(UINT16 u16_index, UINT32 u32_mask, UINT32 u32_value);
+MS933X_DRV_API VOID   ms933x_HAL_ToggleBits_Ex(UINT16 u16_index, UINT32 u32_mask, BOOL b_set);
+
+//
+
+/*****************************************************************************
+*  Function name:   ms933xcdrv_hdmi_tx_shell_hpd
+*  Description:     
+*  Entry:           
+*
+*  Returned value:  
+*  Remark:
+*****************************************************************************/
+MS933X_DRV_API BOOL ms933xcdrv_hdmi_tx_shell_hpd(VOID);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  //__MACROSILICON_MS933X_H__

+ 34 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_app.h

@@ -0,0 +1,34 @@
+/**
+******************************************************************************
+* @file    ms933x_app.h
+* @author  
+* @version V1.0.0
+* @date    24-Apr-2020
+* @brief   
+* @history 
+*
+* Copyright (c) 2009 - 2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_APP_H__
+#define __MACROSILICON_MS933X_APP_H__
+
+
+//
+void ms933x_init(void);
+
+//Real_time polling
+void ms933x_interrupt_service(void);
+
+//suggest polling period 50ms
+void ms933x_media_service(void);
+
+
+
+//ms933x status LED indicate. user realize
+//extern void mculib_ms933x_hdmi_rx_5v_led_light(BOOL b_on);
+//extern void mculib_ms933x_hdmi_rx_timing_valid_led_light(BOOL b_on);
+//extern void mculib_ms933x_hdmi_tx_hpd_led_light(UINT8 u8_tx_chn, BOOL b_on);
+
+
+#endif //__MACROSILICON_MS933X_APP_H__
+

+ 97 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_comm.h

@@ -0,0 +1,97 @@
+/**
+******************************************************************************
+* @file    ms933x_comm.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   This file contains all header files
+* @history
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_COMMON_H__
+#define __MACROSILICON_MS933X_COMMON_H__
+
+#define _PLATFORM_ARM_
+#if !defined (_PLATFORM_ARM_) && !defined (_PLATFORM_WINDOWS_) && !defined (__KEIL_C__) && !defined (__CSMC__) && !defined (_IAR_) && !defined (__STD_GCC__)
+#error "Unknown compiler!"
+#endif
+
+#if defined (_PLATFORM_WINDOWS_)
+#ifndef MS933X_DRV_EXTERN
+    #define MS933X_DRV_EXTERN extern
+#endif
+
+#ifndef MS933X_DRV_API
+    #define MS933X_DRV_API  __declspec(dllexport)
+#endif
+
+#ifndef MS933X_MW_EXTERN
+    #define MS933X_MW_EXTERN extern
+#endif
+
+#ifndef MS933X_MW_API
+    #define MS933X_MW_API  __declspec(dllexport)
+#endif
+
+#else //
+
+#ifndef MS933X_DRV_EXTERN
+    #define MS933X_DRV_EXTERN extern
+#endif
+
+#ifndef MS933X_DRV_API
+    #define MS933X_DRV_API  
+#endif
+
+#ifndef MS933X_MW_EXTERN
+    #define MS933X_MW_EXTERN extern
+#endif
+
+#ifndef MS933X_MW_API
+    #define MS933X_MW_API 
+#endif
+
+#endif //end
+
+//
+#if defined (_PLATFORM_ARM_)
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#elif defined (__STD_GCC__)
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#elif defined (_PLATFORM_WINDOWS_)
+#include <stdio.h>  
+#include <math.h>
+#include <string.h>
+#include <windows.h>
+
+#elif defined (__KEIL_C__)
+#include <intrins.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <absacc.h>
+
+#elif defined (__CSMC__)
+#include <string.h>
+#include <stdio.h>
+
+#elif defined (_IAR_)
+#include <string.h>
+#include <stdio.h>
+
+#endif
+
+
+//sdk common header file include
+#include "ms933x_typedef.h"
+#include "ms933x_mpi_dummy.h"
+
+
+#endif //__MACROSILICON_MS933X_COMMON_H__

+ 91 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_config.h

@@ -0,0 +1,91 @@
+/**
+******************************************************************************
+* @file    ms933x_config.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   header files
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_CONFIG_H__
+#define __MACROSILICON_MS933X_CONFIG_H__
+
+//#include "ms933x_app_config.h"
+
+
+#ifndef MS933X_EXT_XTAL
+#define MS933X_EXT_XTAL             (24000000UL) //uint Hz
+#endif
+
+#ifndef MS933X_USE_I2CBUS
+#define MS933X_USE_I2CBUS           (1)
+#endif
+
+#ifndef MS933X_I2C_ADDR
+#define MS933X_I2C_ADDR             (0xB2)
+#endif
+
+#ifndef MS933X_HDMI_RX_EDID_ENABLE
+#define MS933X_HDMI_RX_EDID_ENABLE  (1)
+#endif
+
+#ifndef MS933X_HDMI_HDCP_REPEATER
+#define MS933X_HDMI_HDCP_REPEATER   (1)
+#endif
+
+#ifndef MS933X_HDMI_TX_HDCP
+#define MS933X_HDMI_TX_HDCP         (1)
+#endif
+
+#ifndef MS933X_HDMI_TX_HDCP_METHOD
+#define MS933X_HDMI_TX_HDCP_METHOD  (0)
+#endif
+
+#ifndef MS933X_HDMI_TX_EDID
+#define MS933X_HDMI_TX_EDID         (1)
+#endif
+
+#ifndef MS933X_HDMI_RX_INT_ENABLE
+#define MS933X_HDMI_RX_INT_ENABLE   (1)
+#endif
+
+#ifndef MS933X_RXPLL_METHOD
+#define MS933X_RXPLL_METHOD     (0) //new method
+#endif
+
+
+//RC_25M config
+#ifndef MS933X_RC_CTRL1             
+#define MS933X_RC_CTRL1             (0x81) 
+#endif
+
+#ifndef MS933X_RC_CTRL2
+#define MS933X_RC_CTRL2             (0x3B)     //24M RC
+#endif
+
+
+#ifndef MS933X_HDMI_RX_TMDS_OVERLOAD_PROTECT_ENABLE
+#define MS933X_HDMI_RX_TMDS_OVERLOAD_PROTECT_ENABLE     (0) 
+#endif
+
+
+#ifndef MS933X_AUDIO_SAMPLE_PACKET_192BIT_BYPASS_ENABLE
+#define MS933X_AUDIO_SAMPLE_PACKET_192BIT_BYPASS_ENABLE     (1)
+#endif
+
+
+////////////////////////////////////////////////////////////////////
+#ifndef MS933X_FPGA_VERIFY
+#define MS933X_FPGA_VERIFY          (0)
+#endif
+
+#ifndef MS933X_EXT_APIS
+#define MS933X_EXT_APIS             (0)     //external drive
+#endif
+
+#ifndef MS933X_DEBUG_LOG
+#define MS933X_DEBUG_LOG            (0)      //use uart trace log
+#endif
+
+#endif  // __MACROSILICON_MS933X_CONFIG_H__

+ 45 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_edid.h

@@ -0,0 +1,45 @@
+#ifndef _MS933X_EDID_H_
+#define _MS933X_EDID_H_
+
+#include "ms933x_comm.h"
+
+// Data Block Tag Codes
+#define AUDIO_D_BLOCK                   (0x01)
+#define VIDEO_D_BLOCK                   (0x02)
+#define VENDOR_SPEC_D_BLOCK             (0x03)
+#define SPKR_ALLOC_D_BLOCK              (0x04)
+#define VESA_DTC_D_BLOCK                (0x05)
+#define USE_EXTENDED_TAG                (0x07)
+
+// Extended Data Block Tag Codes
+#define VIDEO_CAPABILITY_D_BLOCK        (0x00)
+#define VENDOR_SPEC_VIDEO_D_BLOCK       (0x01)
+#define COLORIMETRY_D_BLOCK             (0x05)
+#define YUV420_VIDEO_D_BLOCK            (0x0e)
+#define YUV420_CAPABILITY_D_BLOCK       (0x0f)
+#define CEA_MISC_AUDIO_FIELDS           (0x10)
+#define VENDOR_SPEC_AUDIO_D_BLOCK       (0x11)
+
+
+/***************************************************************
+*  Function name:   sys_edid_convert
+*  Description:     Convert edid data to MS933x chip stable
+*  Entry:           [in]pu8_buf:edid data,const 512byte
+                        st_hdmi_edid_flag, refer to HDMI_EDID_FLAG_T
+                        edid_convert_sel:
+                                          BIT0 for DVI 2HDMI;
+                                          BIT1 for audio 2ch;
+                                          BIT2 for audio 5ch,
+                                          BIT3 for audio 7ch
+                                          BIT4 for Deep color,
+                                          BIT5 for YUV420 covert;
+                                          BIT6 for HDMI 2 DVI
+*
+*  Returned value:  BOOL (valid is true)
+*  Remark: 
+***************************************************************/
+BOOL sys_edid_convert(UINT8 *pu8_buf, HDMI_EDID_FLAG_T st_hdmi_edid_flag,UINT16 edid_convert_sel);
+
+
+
+#endif

+ 338 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_mpi.h

@@ -0,0 +1,338 @@
+/******************************************************************************
+* @file    ms933x_mpi.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   MacroSilicon Programming Interface.
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_PROGRAMMING_INTERFACE_H__
+#define __MACROSILICON_MS933X_PROGRAMMING_INTERFACE_H__
+
+#include "ms933x_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/***************************************************************
+*  Function name: ms933x_HAL_SetChipAddr
+*  Description:   change I2C slave u8_address 
+*  Input parameters: UINT8 u8_address: chip slave u8_address
+*                    
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_SetChipAddr(UINT8 u8_address);
+
+/***************************************************************
+*  Function name: ms933x_HAL_ReadByte
+*  Description: read back 8 bits register value with 16 bits specified index
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*  Output parameters: None
+*  Returned value: UINT8 type register value
+***************************************************************/
+MS933X_DRV_API UINT8 ms933x_HAL_ReadByte(UINT16 u16_index);
+
+
+/***************************************************************
+*  Function name: ms933x_HAL_WriteByte
+*  Description: write 8 bits register value to 16 bits specified index
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8  u8_value: 8 bits rgister value
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteByte(UINT16 u16_index, UINT8 u8_value);
+
+
+/***************************************************************
+*  Function name: ms933x_HAL_ReadWord
+*  Description: equal to "ms933x_HAL_ReadByte(u16_index) + 
+*                        (UINT16)(ms933x_HAL_ReadByte(u16_index + 1) << 8)"
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*  Output parameters: None
+*  Returned value: UINT16 type register value
+***************************************************************/
+MS933X_DRV_API UINT16 ms933x_HAL_ReadWord(UINT16 u16_index);
+
+
+/***************************************************************
+*  Function name:  ms933x_HAL_WriteWord
+*  Description: equal to "ms933x_HAL_WriteByte(u16_index, (UINT8)u16_value);
+                          ms933x_HAL_WriteByte(u16_index + 1, (UINT8)(u16_value >> 8))"
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT16 u16_value: 16 bits rgister value
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteWord(UINT16 u16_index, UINT16 u16_value);
+
+
+/***************************************************************
+*  Function name: ms933x_HAL_ModBits
+*  Description: modify register value with bit mask (high active) for 16 bits index and 8 bits value
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_mask: 8 bits mask 
+*                                   can be set by bit mask macro or compsite of macros
+*                    UINT8 u8_value: 8 bits value, value with masked bits will be ignored
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ModBits(UINT16 u16_index, UINT8 u8_mask, UINT8 u8_value);
+
+
+/***************************************************************
+*  Function name: ms933x_HAL_SetBits
+*  Description: set bits with bit mask (high active) for 16 bits index and 8 bits value
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_mask: 8 bits mask 
+*                                      can be set by bit mask macro or compsite of macros
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_SetBits(UINT16 u16_index, UINT8 u8_mask);
+
+/***************************************************************
+*  Function name:  ms933x_HAL_ClrBits
+*  Description: clear bits with bit mask (high active) for 16 bits index and 8 bits value
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_mask: 8 bits mask 
+*                                      can be set by bit mask macro or compsite of macros
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ClrBits(UINT16 u16_index, UINT8 u8_mask);
+
+/***************************************************************
+*  Function name:  ms933x_HAL_ToggleBits
+*  Description: toggle bits with bit mask (high active) for 16 bits index and 8 bits value
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_mask: 8 bits mask 
+*                                      can be set by bit mask macro or compsite of macros
+*                            BOOL b_set, if true set to 1 else 0
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ToggleBits(UINT16 u16_index, UINT8 u8_mask, BOOL b_set);
+
+//
+/***************************************************************
+*  Function name:  ms933x_HAL_ReadDWord
+*  Description: read 32 bits value 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*  Output parameters: None
+*  Returned value: 32 bits value
+***************************************************************/
+MS933X_DRV_API UINT32 ms933x_HAL_ReadDWord(UINT16 u16_index);
+
+/***************************************************************
+*  Function name:  ms933x_HAL_WriteDWord
+*  Description: write 32 bits value 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT32 u32_value: 32 bits value
+*  Output parameters: None
+*  Returned value: 32 bits value
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteDWord(UINT16 u16_index, UINT32 u32_value);
+
+//I2C read/write with length
+/***************************************************************
+*  Function name:  ms933x_HAL_ReadBytes
+*  Description: burst mode read 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT16 u16_length: 16 bits length
+*                    UINT8 *p_u8_value: data buffer to read
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ReadBytes(UINT16 u16_index, UINT16 u16_length, UINT8 *p_u8_value);
+
+/***************************************************************
+*  Function name:  ms933x_HAL_WriteBytes
+*  Description: burst mode write 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT16 u16_length: 16 bits length
+*                    UINT8 *p_u8_value: data buffer to write
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteBytes(UINT16 u16_index, UINT16 u16_length, UINT8 *p_u8_value);
+
+/***************************************************************
+*  Function name: UINT32 ms933x_HAL_ReadRange(UINT16 u16_index, UINT8 u8_bitpos, UINT8 u8_length)
+*  Description:   read back 32 bits register value by specified index with start bit and length
+*                 in case of 16 bits index and 8 bits value
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_bitpos: start bit of fisrt index register, should be less than 8
+*                    UINT8 u8_length: register length , should less than 33
+*  Output parameters: None
+*  Returned value: UINT32 type register value
+***************************************************************/
+MS933X_DRV_API UINT32 ms933x_HAL_ReadRange(UINT16 u16_index, UINT8 u8_bitpos, UINT8 u8_length);
+
+/***************************************************************
+*  Function name: VOID ms933x_HAL_WriteRange(UINT16 u16_index, UINT8 u8_bitpos, UINT8 u8_length, UINT32 u32_value)
+*  Description:   write 32 bits register value to specified index with start bit and length
+*                 in case of 16 bits index and 8 bits value
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_bitpos: start bit of fisrt index register, should be less than 8
+*                    UINT8 u8_length: register length , should less than 33
+*                    UINT32 u32_value: 32 bits register value
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteRange(UINT16 u16_index, UINT8 u8_bitpos, UINT8 u8_length, UINT32 u32_value);
+
+
+
+//extend APIs is for HDMI RX register access only
+
+/***************************************************************
+*  Function name: ms933x_HAL_ModBits_Ex
+*  Description:   write 32 bits register value to specified index 
+*                 with mask
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT32 u32_mask: mask value
+*                    UINT32 u32_value: 32 bits register value
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ModBits_Ex(UINT16 u16_index, UINT32 u32_mask, UINT32 u32_value);
+
+/***************************************************************
+*  Function name: ms933x_HAL_ModBits_Ex
+*  Description:   set 32bit mask bits 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT32 u32_mask: mask value
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_SetBits_Ex(UINT16 u16_index, UINT32 u32_mask);
+
+/***************************************************************
+*  Function name: ms933x_HAL_ClrBits_Ex
+*  Description:   clear 32bit mask bits 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT32 u32_mask: mask value
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ClrBits_Ex(UINT16 u16_index, UINT32 u32_mask);
+
+/***************************************************************
+*  Function name: ms933x_HAL_ToggleBits_Ex
+*  Description:   toggle 32bit mask bits 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT32 u32_mask: mask value
+*                    BOOL b_set: if TRUE toggle to 1 else 0
+*  Output parameters: None
+*  Returned value: None
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_ToggleBits_Ex(UINT16 u16_index, UINT32 u32_mask, BOOL b_set);
+
+/***************************************************************
+*  Function name: ms933x_HAL_ReadDWord_Ex
+*  Description:   Read DWORD at once 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*  Output parameters: None
+*  Returned value: UINT32
+***************************************************************/
+MS933X_DRV_API UINT32 ms933x_HAL_ReadDWord_Ex(UINT16 u16_index);
+
+/***************************************************************
+*  Function name: ms933x_HAL_WriteDWord_Ex
+*  Description:   write DWORD at once 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT32 u32_value: value
+*  Output parameters: None
+*  Returned value: UINT32
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteDWord_Ex(UINT16 u16_index, UINT32 u32_value);
+
+/***************************************************************
+*  Function name: ms933x_HAL_ReadRange_Ex
+*  Description:   read register with start bits & length 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_bitpos: start bit of fisrt index register
+*                    UINT8 u8_length: register length
+*                    UINT32 u32_value: 32 bits register value
+*  Output parameters: None
+*  Returned value: UINT32
+***************************************************************/
+MS933X_DRV_API UINT32 ms933x_HAL_ReadRange_Ex(UINT16 u16_index, UINT8 u8_bitpos, UINT8 u8_length);
+
+/***************************************************************
+*  Function name: ms933x_HAL_WriteRange_Ex
+*  Description:   write register with start bits & length 
+*  Input parameters: UINT16 u16_index: 16 bits register index
+*                    UINT8 u8_bitpos: start bit of fisrt index register
+*                    UINT8 u8_length: register length
+*                    UINT32 u32_value: 32 bits register value
+*  Output parameters: None
+*  Returned value: UINT32
+***************************************************************/
+MS933X_DRV_API VOID ms933x_HAL_WriteRange_Ex(UINT16 u16_index, UINT8 u8_bitpos, UINT8 u8_length, UINT32 u32_value);
+
+
+
+//
+#define ms933x_chip_reset mculib_chip_reset
+
+//
+#define Delay_ms mculib_delay_ms
+#define Delay_us mculib_delay_us
+
+//
+#define HAL_SetChipAddr     ms933x_HAL_SetChipAddr
+#define HAL_GetChipAddr     ms933x_HAL_GetChipAddr
+#define HAL_ReadByte        ms933x_HAL_ReadByte
+#define HAL_WriteByte       ms933x_HAL_WriteByte
+#define HAL_ReadWord        ms933x_HAL_ReadWord
+#define HAL_WriteWord       ms933x_HAL_WriteWord
+#define HAL_ModBits         ms933x_HAL_ModBits
+#define HAL_SetBits         ms933x_HAL_SetBits
+#define HAL_ClrBits         ms933x_HAL_ClrBits
+#define HAL_ToggleBits      ms933x_HAL_ToggleBits
+#define HAL_ReadDWord       ms933x_HAL_ReadDWord
+#define HAL_WriteDWord      ms933x_HAL_WriteDWord
+#define HAL_ReadBytes       ms933x_HAL_ReadBytes
+#define HAL_WriteBytes      ms933x_HAL_WriteBytes
+#define HAL_ReadRange       ms933x_HAL_ReadRange
+#define HAL_WriteRange      ms933x_HAL_WriteRange
+#define HAL_ModBits_Ex      ms933x_HAL_ModBits_Ex
+#define HAL_SetBits_Ex      ms933x_HAL_SetBits_Ex
+#define HAL_ClrBits_Ex      ms933x_HAL_ClrBits_Ex
+#define HAL_ToggleBits_Ex   ms933x_HAL_ToggleBits_Ex
+#define HAL_ReadDWord_Ex    ms933x_HAL_ReadDWord_Ex
+#define HAL_WriteDWord_Ex   ms933x_HAL_WriteDWord_Ex
+#define HAL_ReadRange_Ex    ms933x_HAL_ReadRange_Ex
+#define HAL_WriteRange_Ex   ms933x_HAL_WriteRange_Ex
+
+
+//
+#if MS933X_DEBUG_LOG
+
+#ifndef _PLATFORM_WINDOWS_
+#define mculib_log printf
+#endif
+
+#define MS933X_PRINTF       mculib_log
+#define MS933X_LOG(X)       mculib_uart_log((UINT8*)X)
+#define MS933X_LOG1(X, Y)   mculib_uart_log1((UINT8*)X, Y)
+#define MS933X_LOG2(X, Y)   mculib_uart_log2((UINT8*)X, Y)
+
+#else
+#define MS933X_PRINTF
+#define MS933X_LOG(X)
+#define MS933X_LOG1(X, Y)
+#define MS933X_LOG2(X, Y)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __MACROSILICON_MS933X_PROGRAMMING_INTERFACE_H__

+ 173 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_mpi_dummy.h

@@ -0,0 +1,173 @@
+/******************************************************************************
+* @file    ms933x_mpi_dummy.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   mpi dummy implemented by user.
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_MPI_DUMMY_H__
+#define __MACROSILICON_MS933X_MPI_DUMMY_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************
+*  Function name:   mculib_chip_reset
+*  Description:     hardware short reset to chip
+*  Entry:           [in]None
+* 
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+extern VOID mculib_chip_reset(VOID);
+
+
+/***************************************************************
+*  Function name:   mculib_chip_read_interrupt_pin
+*  Description:     read chip interrupt pin status
+*  Entry:           [in]None
+* 
+*  Returned value:  BOOL (high level return TRUE, else return FALSE)
+*  Remark:
+***************************************************************/
+extern BOOL mculib_chip_read_interrupt_pin(VOID);
+
+
+/***************************************************************
+*  Function name:   mculib_delay_ms
+*  Description:     delay ms
+*  Entry:           [in]u8_ms, uint ms
+* 
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+extern VOID mculib_delay_ms(UINT8 u8_ms);
+
+
+/***************************************************************
+*  Function name:   mculib_delay_us
+*  Description:     delay us
+*  Entry:           [in]u8_us, uint us
+* 
+*  Returned value:  None
+*  Remark:
+***************************************************************/
+extern VOID mculib_delay_us(UINT8 u8_us);
+
+
+/***************************************************************
+*  Function name:   mculib_i2c_read_16bidx8bval
+*  Description:     read back 8 bits register value with 16 bits specified index
+*  Entry:           [in]u8_address: 8 bits I2C slave address
+*                   [in]u16_index:  16 bits register index
+*
+*  Returned value: UINT8 type register value
+*  Remark:
+***************************************************************/
+extern UINT8 mculib_i2c_read_16bidx8bval(UINT8 u8_address, UINT16 u16_index);
+
+
+/***************************************************************
+*  Function name:   mculib_i2c_write_16bidx8bval
+*  Description:     write 8 bits register value to 16 bits specified index
+*  Entry:           [in]u8_address: 8 bits I2C slave address
+*                   [in]u16_index:  16 bits register index
+*                   [in]u8_value:   8 bits register value
+*
+*  Returned value: if write success return TRUE, else return FALSE
+*  Remark:
+***************************************************************/
+extern BOOL mculib_i2c_write_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT8 u8_value);
+
+//I2C burst read/write mode 
+/***************************************************************
+*  Function name:   mculib_i2c_burstread_16bidx8bval
+*  Description:     8 bits i2c burst read for 16 bits specified index
+*  Entry:           [in]u8_address: 8 bits I2C slave address
+*                   [in]u16_index:  16 bits register index
+*                   [in]u16_length: 16 bits length to read
+*                   [in]pu8_value:  read buffer
+*
+*  Returned value: if write success return TRUE, else return FALSE
+*  Remark:
+***************************************************************/
+extern VOID  mculib_i2c_burstread_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value);
+
+/***************************************************************
+*  Function name:   mculib_i2c_burstwrite_16bidx8bval
+*  Description:     8 bits i2c burst write for 16 bits specified index
+*  Entry:           [in]u8_address: 8 bits I2C slave address
+*                   [in]u16_index:  16 bits register index
+*                   [in]u16_length: 16 bits length to write
+*                   [in]pu8_value:  data buffer to write
+*
+*  Returned value: if write success return TRUE, else return FALSE
+*  Remark:
+***************************************************************/
+extern VOID  mculib_i2c_burstwrite_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value);
+
+//8bits I2C slaver address for HDMI DDC
+extern VOID  mculib_i2c_set_speed(UINT8 u8_i2c_speed);
+extern UINT8 mculib_i2c_read_8bidx8bval(UINT8 u8_address, UINT8 u8_index);
+extern BOOL  mculib_i2c_write_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_value);
+extern VOID  mculib_i2c_burstread_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length, UINT8 *pu8_value);
+
+//8-bit index for HDMI EDID block 2-3 read
+extern BOOL mculib_i2c_write_blank(UINT8 u8_address, UINT8 u8_index);
+extern VOID mculib_i2c_burstread_8bidx8bval_ext(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length);
+
+
+/***************************************************************
+*  Function name:   mculib_uart_log
+*  Description:     printf log thru uart
+*  Entry:           [in]u8_string:  string to printf
+*
+*  Returned value: if write success return TRUE, else return FALSE
+*  Remark:
+***************************************************************/
+extern VOID mculib_uart_log(UINT8 *u8_string);
+
+/***************************************************************
+*  Function name:   mculib_uart_log1
+*  Description:     printf log thru uart with string & hex value
+*  Entry:           [in]u8_string:  string to printf
+*                   [in]u16_hex:  hex value to printf
+*
+*  Returned value: if write success return TRUE, else return FALSE
+*  Remark:
+***************************************************************/
+extern VOID mculib_uart_log1(UINT8 *u8_string, UINT16 u16_hex);
+
+/***************************************************************
+*  Function name:   mculib_uart_log2
+*  Description:     printf log thru uart with string & decimal value
+*  Entry:           [in]u8_string:  string to printf
+*                   [in]u16_dec:  decimal value to printf
+*
+*  Returned value: if write success return TRUE, else return FALSE
+*  Remark:
+***************************************************************/
+extern VOID mculib_uart_log2(UINT8 *u8_string, UINT16 u16_dec);
+
+
+#ifndef LOG
+#define LOG(X)      printf("%s\n", X)//mculib_uart_log((UINT8*)X)
+#endif
+
+#ifndef LOG1
+#define LOG1(X, Y)  printf("%s %x\n", X, Y)//mculib_uart_log1((UINT8*)X, Y)
+#endif
+
+#ifndef LOG2
+#define LOG2(X, Y)  printf("%s %d\n", X, Y)//mculib_uart_log2((UINT8*)X, Y)
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __MACROSILICON_MS933X_MPI_DUMMY_H__

+ 218 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_timing_table.h

@@ -0,0 +1,218 @@
+/**
+******************************************************************************
+* @file    ms933x_timing_table.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   input/output timing define declare
+* @history     
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_TIMING_TABLE_H__
+#define __MACROSILICON_MS933X_TIMING_TABLE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+//
+
+typedef enum _E_SYNC_POLARITY_
+{
+    ProgrVNegHNeg = 0x01,
+    ProgrVNegHPos = 0x03,
+    ProgrVPosHNeg = 0x05,
+    ProgrVPosHPos = 0x07,
+
+    InterVNegHNeg = 0x00,
+    InterVNegHPos = 0x02,
+    InterVPosHNeg = 0x04,
+    InterVPosHPos = 0x06
+}SYNCPOLARITY_E;
+
+typedef struct _T_MS933X_MISC_TIMING_
+{
+    UINT8           u8_vic;
+    VIDEOTIMING_T   st_timing;
+}MISCTIMING_T;
+
+typedef enum _E_MS933X_VIDEO_FORMAT_
+{
+    VFMT_CEA_NULL                        = 0,   
+    VFMT_CEA_01_640x480P_60HZ            = 1,   
+    VFMT_CEA_02_720x480P_60HZ            = 2,  //has been include in timing table
+    VFMT_CEA_03_720x480P_60HZ            = 3,   
+    VFMT_CEA_04_1280x720P_60HZ           = 4,  //include 
+    VFMT_CEA_05_1920x1080I_60HZ          = 5,  //include 
+    VFMT_CEA_06_720x480I_60HZ            = 6,  //include 
+    VFMT_CEA_07_720x480I_60HZ            = 7,   
+    VFMT_CEA_08_720x240P_60HZ            = 8,   
+    VFMT_CEA_09_720x240P_60HZ            = 9,   
+    VFMT_CEA_10_720x480I_60HZ            = 10,  
+    VFMT_CEA_11_720x480I_60HZ            = 11,  
+    VFMT_CEA_12_720x240P_60HZ            = 12,  
+    VFMT_CEA_13_720x240P_60HZ            = 13,  
+    VFMT_CEA_14_1440x480P_60HZ           = 14,  
+    VFMT_CEA_15_1440x480P_60HZ           = 15,  
+    VFMT_CEA_16_1920x1080P_60HZ          = 16,  //include
+    VFMT_CEA_17_720x576P_50HZ            = 17,  //include
+    VFMT_CEA_18_720x576P_50HZ            = 18,  
+    VFMT_CEA_19_1280x720P_50HZ           = 19,  //include
+    VFMT_CEA_20_1920x1080I_50HZ          = 20,  //include
+    VFMT_CEA_21_720x576I_50HZ            = 21,  //include
+    VFMT_CEA_22_720x576I_50HZ            = 22,  
+    VFMT_CEA_23_720x288P_50HZ            = 23,  
+    VFMT_CEA_24_720x288P_50HZ            = 24,  
+    VFMT_CEA_25_720x576I_50HZ            = 25,  
+    VFMT_CEA_26_720x576I_50HZ            = 26,  
+    VFMT_CEA_27_720x288P_50HZ            = 27,  
+    VFMT_CEA_28_720x288P_50HZ            = 28,  
+    VFMT_CEA_29_1440x576P_50HZ           = 29,  
+    VFMT_CEA_30_1440x576P_50HZ           = 30,  
+    VFMT_CEA_31_1920x1080P_50HZ          = 31, //include 
+    VFMT_CEA_32_1920x1080P_24HZ          = 32, //include 
+    VFMT_CEA_33_1920x1080P_25HZ          = 33, //include 
+    VFMT_CEA_34_1920x1080P_30HZ          = 34, //include 
+    VFMT_CEA_35_2880x480P_60HZ           = 35,  
+    VFMT_CEA_36_2880x480P_60HZ           = 36,  
+    VFMT_CEA_37_2880x576P_50HZ           = 37,  
+    VFMT_CEA_38_2880x576P_50HZ           = 38,  
+    VFMT_CEA_39_1920x1080I_50HZ          = 39, //include
+    VFMT_CEA_60_1280x720P_24HZ           = 60,  
+    VFMT_CEA_61_1280x720P_25HZ           = 61,  
+    VFMT_CEA_62_1280x720P_30HZ           = 62,
+
+    //                                    
+    VFMT_VESA_64_640X480_60              = 64,
+    VFMT_VESA_65_640X480_75              = 65,  
+    VFMT_VESA_66_800X600_60              = 66,  
+    VFMT_VESA_67_800X600_72              = 67,  
+    VFMT_VESA_68_800X600_75              = 68,  
+    VFMT_VESA_69_800X600_85              = 69,  
+    VFMT_VESA_70_800X600_120_RB          = 70,  
+    VFMT_VESA_71_1024X768_60             = 71,  
+    VFMT_VESA_72_1024X768_70             = 72,  
+    VFMT_VESA_73_1024X768_75             = 73,  
+    VFMT_VESA_74_1024X768_85             = 74,  
+    VFMT_VESA_75_1024X768_120_RB         = 75,  
+    VFMT_VESA_76_1152X864_60             = 76,  
+    VFMT_VESA_77_1152X864_75             = 77,  
+    VFMT_VESA_78_1280X600_60             = 78,  
+    VFMT_VESA_79_1280X720_60_DMT         = 79,             
+    VFMT_VESA_80_1280X720_60_CVT         = 80,  
+    VFMT_VESA_81_1280X720_60_CVT_RB      = 81,  
+    VFMT_VESA_82_1280X720_75_CVT         = 82,  
+    VFMT_VESA_83_1280X720_85_CVT         = 83,  
+    VFMT_VESA_84_1280X768_60             = 84,  
+    VFMT_VESA_85_1280X768_60_RB          = 85,  
+    VFMT_VESA_86_1280X768_75             = 86,  
+    VFMT_VESA_87_1280X800_60             = 87,  
+    VFMT_VESA_88_1280X800_75             = 88,  
+    VFMT_VESA_89_1280X800_85             = 89,  
+    VFMT_VESA_90_1280X800_120_RB         = 90,  
+    VFMT_VESA_91_1280X960_60_DMT         = 91,  
+    VFMT_VESA_92_1280X960_60_CVT         = 92,  
+    VFMT_VESA_93_1280X960_75_CVT         = 93,  
+    VFMT_VESA_94_1280X960_85             = 94,  
+    VFMT_VESA_95_1280X960_120_RB         = 95,  
+    VFMT_VESA_96_1280X1024_60            = 96,  
+    VFMT_VESA_97_1280X1024_75            = 97,  
+    VFMT_VESA_98_1280X1024_85            = 98,  
+    VFMT_VESA_99_1280X1024_120_RB        = 99,  
+    VFMT_VESA_100_1360X768_60            = 100,   
+    VFMT_VESA_101_1360X768_120_RB        = 101,   
+    VFMT_VESA_102_1366X768_60            = 102,   
+    VFMT_VESA_103_1400X1050_60           = 103,   
+    VFMT_VESA_104_1400X1050_75           = 104,   
+    VFMT_VESA_105_1400X1050_85           = 105,   
+    VFMT_VESA_106_1400X1050_120_RB       = 106,   
+    VFMT_VESA_107_1440X900_60_DMT        = 107,   
+    VFMT_VESA_108_1440X900_75            = 108,   
+    VFMT_VESA_109_1440X900_85            = 109,   
+    VFMT_VESA_110_1440X900_120_RB        = 110,   
+    VFMT_VESA_111_1600X900_60_CVT        = 111,   
+    VFMT_VESA_112_1600X900_60_DMT_RB     = 112,   
+    VFMT_VESA_113_1600X900_75_CVT        = 113,   
+    VFMT_VESA_114_1600X900_85_CVT        = 114,                                                                                                        
+    VFMT_VESA_115_1600X1200_60           = 115,                                                                                                    
+    VFMT_VESA_116_1600X1200_70           = 116,                                                                                                    
+    VFMT_VESA_117_1600X1200_75           = 117,                                                                                                    
+    VFMT_VESA_118_1600X1200_85           = 118,                                                                                                   
+    VFMT_VESA_119_1600X1200_120_RB       = 119,                                                                                                       
+    VFMT_VESA_120_1680X1050_60           = 120,                                                                                                     
+    VFMT_VESA_121_1680X1050_60_RB        = 121,                                                                                                         
+    VFMT_VESA_122_1680X1050_75           = 122,                                                                                                   
+    VFMT_VESA_123_1680X1050_85           = 123,                                                                                                   
+    VFMT_VESA_124_1680X1050_120_RB       = 124,                                                                                                        
+    VFMT_VESA_125_1792X1344_60           = 125,                                                                                                      
+    VFMT_VESA_126_1792X1344_75           = 126,                                                                                                   
+    VFMT_VESA_127_1856X1392_60           = 127,                                                                                                   
+    VFMT_VESA_128_1856X1392_75           = 128,                                                                                                  
+    VFMT_VESA_129_1920X1080_60_DMT       = 129,                                                                                                  
+    VFMT_VESA_130_1920X1080_60_CVT       = 130,                                                                                                  
+    VFMT_VESA_131_1920X1080_60_CVT_RB    = 131,                                                                                                       
+    VFMT_VESA_132_1920X1200_60_CVT       = 132,                                                                                                     
+    VFMT_VESA_133_1920X1200_60_DMT_RB    = 133,                                                                                                      
+    VFMT_VESA_134_1920X1200_75           = 134,                                                                                               
+    VFMT_VESA_135_1920X1200_85           = 135,                                                                                               
+    VFMT_VESA_136_1920X1440_60           = 136,                                                                                              
+    VFMT_VESA_137_1920X1440_75           = 137,                                                                                               
+    VFMT_VESA_138_1920X1440_85_CVT       = 138,                                                                                                  
+    VFMT_VESA_139_2048X1536_60_CVT       = 139,                                                                                               
+    VFMT_VESA_140_2048X1536_75_CVT       = 140,                                                                                                                                    
+    VFMT_VESA_141_2048X1536_85_CVT       = 141,                                                                                                 
+    VFMT_VESA_142_2560X1600_60           = 142,  
+
+    VFMT_INVALID                         = 0xFF
+}MS933X_VIDEOFORMAT_E;
+
+
+/***************************************************************
+*  Function name:   ms933x_get_std_timing
+*  Description:     get CEA/VESA video timing information
+*  Entry:           [in]u8_vic, enum to MS933X_VIDEOFORMAT_E
+*                   [out]ptTiming, point to VIDEOTIMING_T
+* 
+*  Returned value:  if input u8_vic valid return true,else return false
+*  Remark:
+***************************************************************/
+BOOL ms933x_get_std_timing(UINT8 u8_vic, VIDEOTIMING_T * ptTiming);
+
+
+/***************************************************************
+*  Function name:   ms933x_match_std_timing
+*  Description:     ms933x match input timing from CEA/VESA
+*  Entry:           [in]ptTiming
+*                        u8_polarity, enum to MDTSYNCPOLARITY_E
+*                        u16_htotal, sample by fosc clk 27M
+*                        u16_vtotal, uint line
+*                        u16_hsyncwidth, sample by fosc clk 27M
+*                        u16_vsyncwidth, uint 1 line
+*                        u16_pixclk, uint 10000Hz, mdt sample clk,const is fosc clk 27M 
+*                        u16_vfreq, uint 0.01Hz
+*                        others para, reserve
+*
+*                   [out]ptTiming
+*                        u8_polarity, same to in para
+*                        u16_htotal, sample by std pixel clk
+*                        u16_vtotal, uint line, same to in para
+*                        u16_hsyncwidth, sample by std pixel clk
+*                        u16_vsyncwidth, uint 1 line, same to in para
+*                        u16_pixclk, uint 10000Hz, std pixel clk
+*                        u16_vfreq, uint 0.01Hz, same to in para
+*                        u16_hactive, sample by std pixel clk
+*                        u16_vactive, uint 1 line, from std table
+*                        u16_hoffset, smaple by std pixel clk
+*                        u16_voffset, uint 1 line, from std table
+*
+*  Returned value:  if match success return mode vic, else return VFMT_INVALID
+*  Remark:
+***************************************************************/
+UINT8 ms933x_match_std_timing(VIDEOTIMING_T * ptTiming);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __MACROSILICON_MS933X_TIMING_TABLE_H__

+ 767 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/ms933x_typedef.h

@@ -0,0 +1,767 @@
+/**
+******************************************************************************
+* @file    ms933x_typedef.h
+* @author  
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   Definitions for typedefs.
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#ifndef __MACROSILICON_MS933X_COMMON_TYPEDEF_H__
+#define __MACROSILICON_MS933X_COMMON_TYPEDEF_H__
+
+/*
+** Global typedefs.
+*/
+
+#ifndef NULL
+#define NULL ((void*)0)
+#endif
+
+// For ARM platform
+#if defined (_PLATFORM_ARM_)
+#define  __CODE const
+#define  __XDATA
+#define  __DATA
+#define __IDATA
+#define  __NEAR
+#define  __IO volatile
+
+
+typedef _Bool BOOL;
+
+#elif defined (__STD_GCC__)
+#define  __CODE const
+#define  __XDATA
+#define  __DATA
+#define __IDATA
+#define  __NEAR
+#define  __IO volatile
+
+
+typedef _Bool BOOL;
+
+#elif defined (_PLATFORM_WINDOWS_)
+#define  __CODE
+#define  __XDATA
+#define  __DATA
+#define __IDATA
+#define  __NEAR
+#define  __IO
+
+#elif defined (__KEIL_C__)
+#define __CODE code
+#define __XDATA xdata
+#define __DATA data
+#define __IDATA idata
+#define __NEAR
+#define __IO volatile
+
+//bool bype
+typedef bit BOOL;
+
+#elif defined (__CSMC__)
+#define __CODE const
+#define __XDATA
+#define __DATA 
+#define __IDATA 
+#define __NEAR @near
+#define __IO volatile
+
+//bool bype
+typedef _Bool BOOL;
+#elif defined (_IAR_)
+#define __CODE const
+#define __XDATA
+#define __DATA 
+#define __IDATA 
+#define __NEAR @near
+#define __IO volatile
+
+//bool bype
+typedef _Bool BOOL;
+#endif // end of compiler platform define 
+
+
+//unsigned integer type
+typedef unsigned char UINT8;
+typedef char          CHAR;
+typedef unsigned short UINT16;
+
+//signed integer type
+typedef signed char INT8;
+typedef signed short INT16;
+
+//32bit type
+#if defined (_PLATFORM_ARM_) || defined (_PLATFORM_WINDOWS_)
+typedef unsigned int UINT32;
+typedef signed int INT32;
+#else
+typedef unsigned long int UINT32;
+typedef signed long int INT32;
+#endif
+
+#define VOID void
+
+#define FALSE 0
+#define TRUE  1
+
+#define DISABLE 0
+#define ENABLE  1
+
+#define LOW     0
+#define HIGH    1
+
+#define OFF     0
+#define ON      1
+
+
+// Helper macros.
+#define _UNUSED_(arg)     ((arg) = (arg))
+
+#ifndef _countof
+#define _countof(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0]))
+#endif
+
+#ifndef max
+#define max(a, b)   (((a)>(b))?(a):(b)) 
+#endif
+
+#ifndef min
+#define min(a, b)   (((a)<(b))?(a):(b))
+#endif
+
+#ifndef xabs
+#define xabs(a, b)   ((a>b)?(a-b):(b-a))
+#endif
+
+
+
+/*
+* generic mask macro definitions
+*/
+#define MSRT_BIT0                   (0x01)
+#define MSRT_BIT1                   (0x02)
+#define MSRT_BIT2                   (0x04)
+#define MSRT_BIT3                   (0x08)
+#define MSRT_BIT4                   (0x10)
+#define MSRT_BIT5                   (0x20)
+#define MSRT_BIT6                   (0x40)
+#define MSRT_BIT7                   (0x80)
+    
+#define MSRT_MSB8BITS               MSRT_BIT7
+#define MSRT_LSB                    MSRT_BIT0
+    
+// Bit7 ~ Bit0
+#define MSRT_BITS7_6                (0xC0)
+#define MSRT_BITS7_5                (0xE0)
+#define MSRT_BITS7_4                (0xF0)
+#define MSRT_BITS7_3                (0xF8)
+#define MSRT_BITS7_2                (0xFC)
+#define MSRT_BITS7_1                (0xFE)
+#define MSRT_BITS7_0                (0xff)
+
+#define MSRT_BITS6_5                (0x60)
+#define MSRT_BITS6_4                (0x70)
+#define MSRT_BITS6_2                (0x7c)
+#define MSRT_BITS6_1                (0x7e)
+#define MSRT_BITS6_0                (0x7f)
+
+#define MSRT_BITS5_4                (0x30)
+#define MSRT_BITS5_3                (0x38)
+#define MSRT_BITS5_2                (0x3c)
+#define MSRT_BITS5_0                (0x3f)
+
+#define MSRT_BITS4_3                (0x18)
+#define MSRT_BITS4_2                (0x1c)
+#define MSRT_BITS4_1                (0x1e)
+#define MSRT_BITS4_0                (0x1f)
+
+#define MSRT_BITS3_2                (0x0C)
+#define MSRT_BITS3_1                (0x0E)
+#define MSRT_BITS3_0                (0x0F)
+
+#define MSRT_BITS2_1                (0x06)
+#define MSRT_BITS2_0                (0x07)
+
+#define MSRT_BITS1_0                (0x03)
+
+
+// 20121207, for video data type 
+typedef struct _T_MS_VIDEO_SIZE_
+{
+    UINT16 u16_h;
+    UINT16 u16_v;
+} VIDEOSIZE_T;
+
+typedef struct _T_MS933X_VIDEO_TIMING_
+{
+    UINT8           u8_polarity;
+    UINT16          u16_htotal;
+    UINT16          u16_vtotal;
+    UINT16          u16_hactive;
+    UINT16          u16_vactive;
+    UINT16          u16_pixclk;     /*10000hz*/
+    UINT16          u16_vfreq;      /*0.01hz*/
+    UINT16          u16_hoffset;    /* h sync start to h active*/
+    UINT16          u16_voffset;    /* v sync start to v active*/
+    UINT16          u16_hsyncwidth;
+    UINT16          u16_vsyncwidth;
+} VIDEOTIMING_T;
+
+
+typedef struct _T_WIN_BORDER_
+{
+    INT16 top;
+    INT16 bottom;
+    INT16 left;
+    INT16 right;
+} WINBORDER_T;
+
+
+//
+//HDMI video
+typedef enum _E_HDMI_VIDEO_CLK_REPEAT_
+{
+    HDMI_X1CLK      = 0x00,
+    HDMI_X2CLK      = 0x01,
+    HDMI_X3CLK      = 0x02,
+    HDMI_X4CLK      = 0x03,
+    HDMI_X5CLK      = 0x04,
+    HDMI_X6CLK      = 0x05,
+    HDMI_X7CLK      = 0x06,
+    HDMI_X8CLK      = 0x07,
+    HDMI_X9CLK      = 0x08,
+    HDMI_X10CLK     = 0x09
+}HDMI_CLK_RPT_E;
+
+//u8_aspect_ratio, bit3
+#define HDMI_ACTIVE_ASPECT_RATIO_PRESENT    (0x08) //active Format(R0...R3) information valid
+
+//u8_aspect_ratio, bits1_0
+typedef enum _E_HDMI_PIC_ASPECT_RATIO_
+{
+    HDMI_PIC_ASPECT_RATIO_UNKONWN   = 0x00,
+    HDMI_4X3                        = 0x01,
+    HDMI_16X9                       = 0x02,
+    HDMI_PIC_ASPECT_RATIO_FUTURE    = 0x03
+}HDMI_ASPECT_RATIO_E;
+
+//u8_aspect_ratio, bits7_4, active format aspect ratio R3 R2 R1 R0
+typedef enum _E_HDMI_ACTIVE_FORMAT_ASPECT_RATIO_
+{
+    HDMI_ACT_ASP_SAME_AS_PIC = 0x80,
+    HDMI_ACT_ASP_4X3_C       = 0x90,
+    HDMI_ACT_ASP_16X9_C      = 0xA0,
+    HDMI_PIC_ACT_ASP_14X9_C  = 0xB0
+    //others unknown
+}HDMI_ACTIVE_FORMAT_ASPECT_RATIO_E;
+
+typedef enum _E_HDMI_VIDEO_SCAN_INFO_
+{
+    HDMI_UNKNOWN_SCAN  = 0x00,    //unknown scan info
+    HDMI_OVERSCAN      = 0x01,    //television type
+    HDMI_UNDERSCAN     = 0x02     //computer type
+}HDMI_SCAN_INFO_E;
+
+typedef enum _E_HDMI_COLOR_SPACE_
+{
+    HDMI_RGB        = 0x00,
+    HDMI_YCBCR422   = 0x01,
+    HDMI_YCBCR444   = 0x02,
+    HDMI_YUV420     = 0x03
+}HDMI_CS_E;
+
+typedef enum _E_HDMI_COLOR_DEPTH_
+{
+    HDMI_COLOR_DEPTH_8BIT    = 0x00,
+    HDMI_COLOR_DEPTH_10BIT   = 0x01,
+    HDMI_COLOR_DEPTH_12BIT   = 0x02,
+    HDMI_COLOR_DEPTH_16BIT   = 0x03
+}HDMI_COLOR_DEPTH_E;
+
+typedef enum _E_HDMI_COLORIMETRY_
+{
+    HDMI_COLORIMETRY_UNKNOWN                = 0x00,
+    //
+    HDMI_COLORIMETRY_601                    = 0x01, //IT601 = 480i/576i/480p/576p or VESA timing
+    HDMI_COLORIMETRY_709                    = 0x02, //YCbCr
+
+    //COLORIMETRY extented:
+    HDMI_COLORIMETRY_XVYCC601               = 0x03, //xvYCC601
+    HDMI_COLORIMETRY_XVYCC709               = 0x04, //xvYCC709
+    HDMI_COLORIMETRY_SYCC601                = 0x05, //sYCC601
+    HDMI_COLORIMETRY_ADOBEYCC601            = 0x06, //opYCC
+    HDMI_COLORIMETRY_ADOBERGB               = 0x07, //opRGB
+    HDMI_COLORIMETRY_ITU_R_BT2020YcCbcCrc   = 0x08, //BT2020_cYCC
+    HDMI_COLORIMETRY_ITU_R_BT2020RGBORYCbCr = 0x09, //BT2020_YCC or BT2020_RGB
+    HDMI_COLORIMETRY_RESERVED               = 0x0A
+}HDMI_COLORIMETRY_E;
+
+//u8_quant_range, bits1_0
+typedef enum _E_HDMI_RRG_QUANT_RANGE_
+{
+    HDMI_RGB_QUANT_DEFAULT       = 0x00, 
+    HDMI_RGB_QUANT_LIMITED       = 0x01, 
+    HDMI_RGB_QUANT_FULL          = 0x02, 
+    HDMI_RGB_QUANT_RESERVED      = 0x03 
+}HDMI_RGB_QUANT_RANGE_E;
+
+//u8_quant_range, bits5_4
+typedef enum _E_HDMI_YCC_QUANT_RANGE_
+{
+    HDMI_YCC_QUANT_LIMITED       = 0x00, 
+    HDMI_YCC_QUANT_FULL          = 0x10, 
+    HDMI_YCC_QUANT_RESERVED      = 0x20, 
+    HDMI_YCC_QUANT_RESERVED1     = 0x30 
+}HDMI_YCC_QUANT_RANGE_E;
+
+//u8_it_content, bits3_0
+typedef enum _E_HDMI_IT_CONTENT_
+{
+    HDMI_IT_CONTENT_INVALID      = 0x00,
+    //
+    HDMI_IT_CONTENT_GRAPHICS     = 0x01, //Graphics
+    HDMI_IT_CONTENT_PHOTO        = 0x02, //Photo
+    HDMI_IT_CONTENT_CINEMA       = 0x03, //Cinema
+    HDMI_IT_CONTENT_GAME         = 0x04  //Game
+}HDMI_IT_CONTENT_E;
+
+//HDMI vendor specific
+typedef enum _E_HDMI_VIDEO_FORMAT_
+{
+    HDMI_NO_ADD_FORMAT,
+    HDMI_4Kx2K_FORMAT,
+    HDMI_3D_FORMAT
+}HDMI_VIDEO_FORMAT_E;
+
+typedef enum _E_HDMI_4Kx2K_VIC_
+{
+    HDMI_4Kx2K_30HZ = 0x01,
+    HDMI_4Kx2K_25HZ,
+    HDMI_4Kx2K_24HZ,
+    HDMI_4Kx2K_24HZ_SMPTE
+}HDMI_4Kx2K_VIC_E;
+
+//use u8_4Kx2K_vic bits7_4 store u8_3D_structure
+typedef enum _E_HDMI_3D_STRUCTURE_
+{
+    HDMI_FRAME_PACKING      = 0x00,
+    HDMI_FIELD_ALTERNATIVE  = 0x10,
+    HDMI_LINE_ALTERNATIVE   = 0x20,
+    HDMI_SIDE_BY_SIDE_FULL  = 0x30,
+    HDMI_L_DEPTH            = 0x40,
+    HDMI_L_DEPTH_GRAPHICS   = 0x50,
+    HDMI_SIDE_BY_SIDE_HALF  = 0x80
+}HDMI_3D_STRUCTURE_E;
+
+//u8_3D_ext_data, bits7_4
+typedef enum _E_HDMI_3D_EXT_DATA_
+{
+    HDMI_HORIZONTAL_O_O    = 0x00,
+    HDMI_HORIZONTAL_O_E    = 0x10,
+    HDMI_HORIZONTAL_E_O    = 0x20,
+    HDMI_HORIZONTAL_E_E    = 0x30,
+
+    HDMI_QUINCUNX_O_O      = 0x40,
+    HDMI_QUINCUNX_O_E      = 0x50,
+    HDMI_QUINCUNX_E_O      = 0x60,
+    HDMI_QUINCUNX_E_E      = 0x70 
+}HDMI_3D_EXT_DATA_E;
+
+
+//u8_audio_mode BIT6
+#define HDMI_AUDIO_SPDIF_PATH_ENABLE        (0x40)
+
+//HDMI audio, u8_audio_mode: BITS5_4
+typedef enum _E_HDMI_AUDIO_MODE_
+{
+    HDMI_AUD_MODE_AUDIO_SAMPLE  = 0x00,
+    HDMI_AUD_MODE_HBR           = 0x10, //unsupport
+    HDMI_AUD_MODE_DSD           = 0x20,
+    HDMI_AUD_MODE_DST           = 0x30  //unsupport
+}HDMI_AUDIO_MODE_E;
+
+//audio coding type from audio inforframe, u8_audio_mode BITS3_0
+typedef enum _E_HDMI_AUDIO_CODING_TYPE_
+{
+    HDMI_AUD_CT_REFER_HEADER  = 0x00, //audio inforframe audio type refer to audio packet header
+    HDMI_AUD_CT_PCM           = 0x01,
+    HDMI_AUD_CT_AC_3          = 0x02,
+    HDMI_AUD_CT_MPEG1         = 0x03,
+    HDMI_AUD_CT_MP3           = 0x04,
+    HDMI_AUD_CT_MPEG2         = 0x05,
+    HDMI_AUD_CT_AAC           = 0x06,
+    HDMI_AUD_CT_DTS           = 0x07,
+    HDMI_AUD_CT_ATRAC         = 0x08,
+    HDMI_AUD_CT_OBA           = 0x09,
+    HDMI_AUD_CT_DOLBY_PLUS    = 0x0A,
+    HDMI_AUD_CT_DTS_HD        = 0x0B,
+    HDMI_AUD_CT_MAT           = 0x0C,
+    HDMI_AUD_CT_DST           = 0x0D,
+    HDMI_AUD_CT_WMA           = 0x0E,
+    HDMI_AUD_CT_WMA_PRO       = 0x0F
+}HDMI_AUDIO_CT_E;
+
+//if audio infoframe audio rate no refer to audio packet header, u8_audio_rate BIT7 = 1
+#define HDMI_AUD_RATE_NO_REFER_HEADER       (0x80)
+
+//u8_audio_rate, BITS6_4
+typedef enum _E_HDMI_AUDIO_RATE_
+{
+    HDMI_AUD_RATE_44K1  = 0x20,
+    HDMI_AUD_RATE_48K   = 0x30,
+    HDMI_AUD_RATE_32K   = 0x10,
+    HDMI_AUD_RATE_88K2  = 0x40,
+    HDMI_AUD_RATE_96K   = 0x50,
+    HDMI_AUD_RATE_176K4 = 0x60,
+    HDMI_AUD_RATE_192K  = 0x70
+}HDMI_AUDIO_RATE_E;
+
+//u8_audio_rate, BITS3_0
+//refer to SPEC "IEC-60958-3-Digital-Audio"
+typedef enum _E_HDMI_AUDIO_HEADER_RATE_
+{
+    HDMI_AUD_HEADER_RATE_44K1  = 0x00,
+    HDMI_AUD_HEADER_RATE_48K   = 0x02,
+    HDMI_AUD_HEADER_RATE_32K   = 0x03,
+    HDMI_AUD_HEADER_RATE_88K2  = 0x08,
+    HDMI_AUD_HEADER_RATE_96K   = 0x0A,
+    HDMI_AUD_HEADER_RATE_176K4 = 0x0C,
+    HDMI_AUD_HEADER_RATE_192K  = 0x0E,
+    //
+    HDMI_AUD_HEADER_RATE_22K01 = 0x04,  //
+    HDMI_AUD_HEADER_RATE_24K   = 0x06,  //
+    HDMI_AUD_HEADER_RATE_768K  = 0x09   //
+}HDMI_AUDIO_HEADER_RATE_E;
+
+//if audio infoframe audio bits no refer to audio packet header, u8_audio_bits BIT7 = 1
+#define HDMI_AUD_LENGTH_NO_REFER_HEADER     (0x80)
+
+//u8_audio_bits, BITS5_4
+typedef enum _E_HDMI_AUDIO_LENGTH_
+{
+    HDMI_AUD_LENGTH_16BITS    = 0x10,
+    HDMI_AUD_LENGTH_20BITS    = 0x20,
+    HDMI_AUD_LENGTH_24BITS    = 0x30
+}HDMI_AUDIO_LENGTH_E;
+
+//u8_audio_bits, BITS3_0
+//refer to SPEC "IEC-60958-3-Digital-Audio"
+typedef enum _E_HDMI_AUDIO_HEADER_LENGTH_
+{
+    HDMI_AUD_HEADER0_LENGTH_16BITS    = 0x02,
+    HDMI_AUD_HEADER0_LENGTH_18BITS    = 0x04,
+    HDMI_AUD_HEADER0_LENGTH_19BITS    = 0x08,
+    HDMI_AUD_HEADER0_LENGTH_20BITS    = 0x0A,
+    HDMI_AUD_HEADER0_LENGTH_17BITS    = 0x0C,
+    //
+    HDMI_AUD_HEADER1_LENGTH_20BITS    = 0x03,
+    HDMI_AUD_HEADER1_LENGTH_22BITS    = 0x05,
+    HDMI_AUD_HEADER1_LENGTH_23BITS    = 0x09,
+    HDMI_AUD_HEADER1_LENGTH_24BITS    = 0x0B,
+    HDMI_AUD_HEADER1_LENGTH_21BITS    = 0x0D
+}HDMI_AUDIO_HEADER_LENGTH_E;
+
+//if audio inforframe audio channel refer to audio packet header, u8_audio_channels BIT7 = 1
+#define HDMI_AUDIO_CHN_REFER_HEADER         (0x80)
+
+//if audio channel layout1, u8_audio_channels BIT6 = 1
+#define HDMI_AUDIO_CHN_LAYOUT1_ENABLE       (0x40)
+
+//u8_audio_channels, BITS3_0
+typedef enum _E_HDMI_AUDIO_CHANNEL_
+{
+    HDMI_AUD_2CH    = 0x01,
+    HDMI_AUD_3CH    = 0x02,
+    HDMI_AUD_4CH    = 0x03,
+    HDMI_AUD_5CH    = 0x04,
+    HDMI_AUD_6CH    = 0x05,
+    HDMI_AUD_7CH    = 0x06,
+    HDMI_AUD_8CH    = 0x07
+}HDMI_AUDIO_CHN_E;
+
+
+
+typedef struct _T_HDMI_CONFIG_PARA_
+{   
+    UINT8  u8_hdmi_flag;          // FALSE = dvi out;  TRUE = hdmi out
+    UINT8  u8_vic;                // reference to CEA-861 VIC
+    UINT16 u16_video_clk;         // TMDS video clk, uint 10000Hz
+    UINT8  u8_clk_rpt;            // enum refer to HDMI_CLK_RPT_E. X2CLK = 480i/576i, others = X1CLK
+    UINT8  u8_scan_info;          // enum refer to HDMI_SCAN_INFO_E
+    
+    UINT8  u8_aspect_ratio;       // bits1_0 enum refer to HDMI_ASPECT_RATIO_E 
+                                  // bit3(HDMI_ACTIVE_ASPECT_RATIO_PRESENT) 
+                                  // bits7_4 enum refer to HDMI_ACTIVE_FORMAT_ASPECT_RATIO_E
+                                  
+    UINT8  u8_color_space;        // enum refer to HDMI_CS_E
+    UINT8  u8_color_depth;        // enum refer to HDMI_COLOR_DEPTH_E
+    UINT8  u8_colorimetry;        // enum refer to HDMI_COLORIMETRY_E. IT601 = 480i/576i/480p/576p, ohters = IT709
+
+    UINT8  u8_quant_range;        // bits1_0 enum refer to HDMI_RGB_QUANT_RANGE_E
+                                  // bits5_4 enum refer to HDMI_YCC_QUANT_RANGE_E
+
+    UINT8  u8_it_content;         // bits3_0 enum refer to HDMI_IT_CONTENT_E
+
+    //
+    UINT8  u8_video_format;       // enum refer to HDMI_VIDEO_FORMAT_E
+    UINT8  u8_4Kx2K_vic;          // enum refer to HDMI1.4 extented resolution transmission
+    UINT8  u8_3D_structure;       // enum refer to HDMI_3D_EXT_DATA_E
+
+    //
+    UINT8  u8_audio_mode;         // BITS5_4 enum refer to HDMI_AUDIO_MODE_E
+                                  // BITS3_0 enum refer to HDMI_AUDIO_CT_E
+                                  // BIT6 reserve for test. enum refer to HDMI_AUDIO_SPDIF_PATH_ENABLE
+                                  
+    UINT8  u8_audio_rate;         // BITS6_4 enum refer to HDMI_AUDIO_RATE_E 
+                                  // BITS3_0 enum refer to HDMI_AUDIO_HEADER_RATE_E
+                                  // BIT7 is HDMI_AUD_RATE_NO_REFER_HEADER
+
+    UINT8  u8_audio_bits;         // BITS5_4 enum refer to HDMI_AUDIO_LENGTH_E
+                                  // BITS3_0 enum refer to HDMI_AUDIO_HEADER_LENGTH_E
+                                  // BIT7 is HDMI_AUD_LENGTH_NO_REFER_HEADER
+                                     
+    UINT8  u8_audio_channels;     // BITS3_0 enum refer to HDMI_AUDIO_CHN_E 
+                                  // BIT7 is HDMI_AUDIO_CHN_REFER_HEADER
+                                  // BIT6 is HDMI_AUDIO_CHN_LAYOUT1_ENABLE
+    UINT8  u8_audio_speaker_locations;  // 0~255, refer to CEA-861 audio infoframe, BYTE4
+}HDMI_CONFIG_T;
+
+
+
+//HDMI RX module define
+typedef enum
+{
+    HDMI_RX_CH0,
+    HDMI_RX_CH1,
+    HDMI_RX_CH2
+}e_RxChannel;
+
+typedef enum
+{
+    OVERSAMPLE_DESIGNED,
+    OVERSAMPLE_NETLIST,
+    PI
+}e_RxPhy;
+
+typedef enum
+{
+    AUTO_MODE,
+    MANUAL_MODE
+}e_RxPhyMode;
+
+typedef struct
+{
+    UINT8  u8OffsetP;
+    UINT8  u8OffsetN;
+}OFFSET_T;
+
+//ms933xdrv_hdmi_rx_audio_config
+//u8_audio_clk_mode,bit7. if set to 1, pad_i2s_out mclk base is 256fs.
+//no suuport when RX_AUDIO_DLL_MODE case.
+#define RX_AUDIO_MCLK_BASE_256FS_ENABLE     (0x80) 
+
+//u8_audio_clk_mode, bit3_0
+typedef enum
+{
+    RX_AUDIO_DLL_MODE          = 0x00, //user use
+    RX_AUDIO_DLL_TO_PLL_MODE   = 0x01, //user use
+    RX_AUDIO_DLL_TO_2XPLL_MODE = 0x02,
+    RX_AUDIO_PLL_MODE          = 0x03,
+    RX_AUDIO_PLL_FREERUN_MODE  = 0x04
+}e_RxAudioClkMode;
+
+typedef enum
+{
+    MDT_ProgrVNegHNeg = 0x01,
+    MDT_ProgrVNegHPos = 0x03,
+    MDT_ProgrVPosHNeg = 0x05,
+    MDT_ProgrVPosHPos = 0x07,
+
+    MDT_InterVNegHNeg = 0x00,
+    MDT_InterVNegHPos = 0x02,
+    MDT_InterVPosHNeg = 0x04,
+    MDT_InterVPosHPos = 0x06
+}e_RxMdtPol;
+
+typedef struct TERRORCOUNTER
+{
+//    BOOL b;
+    UINT16 u16Count;
+}ERRORCOUNTER;
+
+//hdmi_rx_reset_ctrl
+#define HDMI_RX_CTRL_MAIN  (0x00001UL)
+#define HDMI_RX_CTRL_MODET (0x00002UL)
+#define HDMI_RX_CTRL_HDMI  (0x00004UL)
+#define HDMI_RX_CTRL_BUS   (0x00008UL)
+#define HDMI_RX_CTRL_AUD   (0x00010UL)
+#define HDMI_RX_CTRL_PDEC  (0x00020UL) //20180607, PACKET DECODER reset
+#define HDMI_RX_CTRL_PIXEL (0x00040UL)
+#define HDMI_RX_CTRL_VID   (0x00080UL) //hdcp reset
+#define HDMI_RX_CTRL_HDCP  (0x00100UL) //video reset
+#define HDMI_RX_CTRL_TMDS  (0x10000UL)
+
+typedef enum _E_MDT_INTRRUPT_STATUS_
+{
+    MDT_HS_ACT_ISTS         = 0x001, //used
+    MDT_VS_ACT_ISTS         = 0x002, //
+    MDT_DE_ACTIVITY_ISTS    = 0x004, //used
+    MDT_ILACE_ISTS          = 0x008, //
+    MDT_HTOT32_CLK_ISTS     = 0x010,
+    MDT_HS_CLK_ISTS         = 0x020, //20220512, unused
+    MDT_HACT_PIX_ISTS       = 0x040, //used
+    MDT_VTOT_CLK_ISTS       = 0x080, 
+    MDT_VS_CLK_ISTS         = 0x100,
+    MDT_VACT_LIN_ISTS       = 0x200,  //20220512, unused
+    MDT_VTOT_LIN_ISTS       = 0x400,  //20220512, unused
+    MDT_VOFS_LIN_ISTS       = 0x800,  //20220512, unused
+    MDT_STB_ISTS            = 0x1000, 
+    MDT_USTB_ISTS           = 0x2000  //used
+
+    //
+    //MDT_ALL_ISTS            = 0xffff  //20220512, unused
+}MDTISTS_E;
+
+#define MDT_USED_ISTS      (0x2045)
+
+typedef enum _E_AUDIO_FIFO_STATUS_
+{
+    AFIF_TH_MIN_STS         = 0x001,
+    AFIF_TH_MAX_STS         = 0x002,
+    AFIF_THS_PASS_STS       = 0x004,
+    AFIF_UNDERFL_STS        = 0x008,
+    AFIF_OVERFL_STS         = 0x010
+}AUDIO_FIFO_STATUS_E;
+
+//hdmi_rx_packet_ists
+#define PD_FIFO_TH_MIN_PASS_ISTS   (1UL << 0)
+#define PD_FIFO_TH_MAX_PASS_ISTS   (1UL << 1)
+#define PD_FIFO_TH_START_PASS_ISTS (1UL << 2)
+#define PD_FIFO_UNDERFL_ISTS       (1UL << 3)
+#define PD_FIFO_OVERFL_ISTS        (1UL << 4)
+#define PD_FIFO_NEW_ENTRY_ISTS     (1UL << 8)
+#define NTSCVBI_RCV_ISTS           (1UL << 11)
+#define NTSCVBI_CKS_CHG_ISTS       (1UL << 12)
+#define AMP_CHG_ISTS               (1UL << 13)
+#define AMP_RCV_ISTS               (1UL << 14)
+#define VSI_RCV_ISTS               (1UL << 15)
+#define GCP_RCV_ISTS               (1UL << 16)
+#define ACR_RCV_ISTS               (1UL << 17)
+#define AVI_RCV_ISTS               (1UL << 18)
+#define AIF_RCV_ISTS               (1UL << 19)
+#define GMD_RCV_ISTS               (1UL << 20)
+#define GCP_AV_MUTE_CHG_ISTS       (1UL << 21)
+#define ACR_CTS_CHG_ISTS           (1UL << 22)
+#define ACR_N_CHG_ISTS             (1UL << 23)
+#define AVI_CKS_CHG_ISTS           (1UL << 24)
+#define AIF_CKS_CHG_ISTS           (1UL << 25)
+#define GMD_CKS_CHG_ISTS           (1UL << 26)
+#define VSI_CKS_CHG_ISTS           (1UL << 27)
+#define DVIDET_ISTS                (1UL << 28)
+#define AUD_TYPE_CHG_ISTS          (1UL << 29)
+#define DRM_RCV_ISTS               (1UL << 30)
+#define DRM_CKS_CHG_ISTS           (1UL << 31)
+//#define PDEC_ALL_ISTS              (0xffffffffUL)
+#define PEDC_USED_ISTS             (0xfffffE00UL) //mask never used int bit.
+
+//hdmi_rx_hdmi_ists
+#define STATE_REACHED_ISTS              (1UL << 0)
+#define ACT_CHANGE_ISTS                 (1UL << 1)
+#define RESCAL_DONE_ISTS                (1UL << 2)
+#define OFFSCAL_DONE_ISTS               (1UL << 3)
+#define EQGAIN_DONE_ISTS                (1UL << 4)
+#define PLL_LCK_CHG_ISTS                (1UL << 5)
+#define CLK_CHANGE_ISTS                 (1UL << 6)
+#define RES_OVERLOAD_ISTS               (1UL << 7)
+#define HS_POL_ADJ_ISTS                 (1UL << 8)
+#define VS_POL_ADJ_ISTS                 (1UL << 9)
+#define CTL0_CHANGE_ISTS                (1UL << 10)
+#define CTL1_CHANGE_ISTS                (1UL << 11)
+#define CTL2_CHANGE_ISTS                (1UL << 12)
+#define CTL3_CHANGE_ISTS                (1UL << 13)
+#define DCM_GCP_ZERO_FIELDS_PASS_ISTS   (1UL << 14)
+#define DCM_PH_DIFF_CNT_OVERFL_ISTS     (1UL << 15)
+#define DCM_CURRENT_MODE_CHG_ISTS       (1UL << 16)
+#define SCDCCFGCHANGE_ISTS              (1UL << 17)
+#define SCDCSCSTATUSCHANGE_ISTS         (1UL << 18)
+#define SCDCTMDSCFGCHANGE_ISTS          (1UL << 19)
+#define CEAVID_FULL_ISTS                (1UL << 20)
+#define CEAVID_EMPTY_ISTS               (1UL << 21)
+#define CDSENSE_CHG_ISTS                (1UL << 22)
+#define DESER_MISAL_ISTS                (1UL << 23)
+#define PLL_CLOCK_GATED_ISTS            (1UL << 24)
+#define AKSV_RCV_ISTS                   (1UL << 25)
+#define VSYNC_ACT_EDGE_ISTS             (1UL << 26)
+#define VS_THR_REACHED_ISTS             (1UL << 27)
+#define I2CMPDONE_ISTS                  (1UL << 28)
+#define I2CMPNACK_ISTS                  (1UL << 29)
+#define I2CMP_ARBLOST_ISTS              (1UL << 30)
+#define HDMI_ALL_ISTS                   (0xffffffffUL)
+
+
+
+//HDMI TX module define
+
+//HDMI TX channel
+typedef enum _E_HDMI_TX_CHANNEL_
+{
+    HDMI_TX_CHN0      = 0x00,
+    HDMI_TX_CHN1      = 0x01,
+    HDMI_TX_CHN2      = 0x02,
+    HDMI_TX_CHN3      = 0x03
+}HDMI_CHANNEL_E;
+
+typedef struct _T_HDMI_HDCP_RI_
+{   
+    UINT8 TX_Ri0;
+    UINT8 TX_Ri1;
+    UINT8 RX_Ri0;
+    UINT8 RX_Ri1;
+}HDMI_HDCP_RI;
+
+#define HDCP_KSV_BYTE_SIZE                 (5)
+
+#define HDCP_RPT_RPT_DEV_COUNT_MAX         (0x7F)
+#define HDCP_RPT_RPT_DEV_DEPTH_MAX         (0x07)
+
+#define MS933X_HDCP_RPT_KSV_FIFO_BYTE_MAX  (128)
+#define MS933X_HDCP_RPT_COUNT_MAX          (24) //24*5=120byte
+
+
+#define HDCP_REPEATER_FLAG_BIT_MASK        (0x40)
+#define HDCP_KSV_FIFO_READY_BIT_MASK       (0x20)
+#define HDCP_MAX_DEVS_EXCEEDED_BIT_MASK    (0x80)
+#define HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK (0x08)
+
+//HDMI EDID
+typedef struct _T_HDMI_EDID_FLAG_
+{   
+    UINT8    u8_hdmi_sink;              //1 = HDMI sink, 0 = dvi
+    UINT8    u8_color_space;            //color space support flag, flag 1 valid. BIT5: YCBCR444 flag; BIT4: YCBCR422 flag.(RGB must be support)
+    //
+    UINT8    u8_edid_total_blocks;      //block numbers, 128bytes in one block
+    UINT16   u16_preferred_pixel_clk;   //EDID Preferred pixel clock rate, u16_preferred_pixel_clk * 10000Hz, ERROR code is 0xFFFF
+    UINT32   u32_preferred_timing;      //EDID Preferred Timing (Hact*Vact)
+    UINT8    u8_max_tmds_clk;           //HDMI VSDB max tmds clock, u8_max_tmds_clk * 5 Mhz
+    UINT32   u32_max_video_block_timing;//EDID max video block timing (Hact*Vact)
+    UINT8    u8_hdmi_2_0_flag;          //1 = HDMI 2.0
+}HDMI_EDID_FLAG_T;
+
+//
+typedef struct _T_HDMI_TX_DRIVE_
+{   
+    UINT8 u8_tx_phy_reg0x20; //[6]:   RG_HDMITX_R200_EN; 
+    UINT8 u8_tx_phy_reg0x23; //[0]:   RG_POST_PRE0_EN;     [1]: RG_POST_PRE1_EN;   [2]: RG_POST_PRE2_EN;   [4]:RG_TX_IDRV_6M_EN;
+    UINT8 u8_tx_phy_reg0x24; //[2:0]: RG_MAIN_PRE0;      [6:4]: RG_MAIN_PRE1;
+    UINT8 u8_tx_phy_reg0x25; //[2:0]: RG_MAIN_PRE2;      [6:4]: RG_MAIN_PREC;
+    UINT8 u8_tx_phy_reg0x26; //[3:0]: RG_MAIN_PO0;       [7:4]: RG_MAIN_PO1;
+    UINT8 u8_tx_phy_reg0x27; //[3:0]: RG_MAIN_PO2;       [7:4]: RG_MAIN_POC;
+    UINT8 u8_tx_phy_reg0x28; //[3:0]: RG_POST_PO0;       [7:4]: RG_POST_PO1;
+    UINT8 u8_tx_phy_reg0x29; //[3:0]: RG_POST_PO2
+}HDMI_TX_DRIVE_T;
+
+
+#endif  // __MACROSILICON_MS933X_COMMON_TYPEDEF_H__

+ 31 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/pipe.h

@@ -0,0 +1,31 @@
+#ifndef _PIPE_H
+#define _PIPE_H
+#include "ch32x035_usbpd.h"
+
+#define BUF_MAX 256
+#define OFFSET_MASK  0x00FF
+typedef struct _Pipe_t {
+   UINT16 header;
+   UINT16 tail;
+   UINT8 buf[BUF_MAX];
+}  Pipe_t;
+#if DEBUG == Debug_USB
+extern Pipe_t debug_pipe;
+#endif
+extern Pipe_t sys_pipe;
+
+extern Pipe_t uart_cmd_pipe;
+
+extern Pipe_t coor_pipe;
+
+void pipe_init(Pipe_t *pipe);
+
+UINT8 pipe_read(Pipe_t *pipe, UINT8 * value, UINT8 len);
+
+void pipe_write_c(Pipe_t *pipe, UINT8 value);
+
+//void pipe_write_t(Pipe_t *pipe, UINT8* value, UINT8 len, COMMAND_TYPE cmd);
+
+void pipe_write(Pipe_t *pipe, UINT8* value, UINT8 len);
+#endif
+

+ 32 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/system_ch32v30x.h

@@ -0,0 +1,32 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : system_ch32v30x.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : CH32V30x 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_CH32V30x_H 
+#define __SYSTEM_CH32V30x_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 /*__CH32V30x_SYSTEM_H */
+
+
+

+ 29 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/tmos.h

@@ -0,0 +1,29 @@
+/*
+ * tmos.h
+ *
+ *  Created on: Feb 29, 2024
+ *      Author: Administrator
+ */
+
+#ifndef APP_INCLUDE_TMOS_H_
+#define APP_INCLUDE_TMOS_H_
+
+
+#define INVALID_TASK_ID                 0xFF      // Task ID isn't setup properly
+#define TASK_NO_TASK                    0xFF
+
+typedef unsigned char                   tmosTaskID;
+typedef unsigned short                  tmosEvents;
+typedef unsigned long                   tmosTimer;
+typedef unsigned char                   bStatus_t;
+typedef tmosEvents(*pTaskEventHandlerFn)( tmosTaskID taskID, tmosEvents event );
+
+extern bStatus_t tmos_init();
+extern bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event );
+extern bStatus_t tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time  );
+extern bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event );
+extern void TMOS_SystemProcess( void );
+extern tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb );
+
+
+#endif /* APP_INCLUDE_TMOS_H_ */

+ 18 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/inc/uart_ht7315.h

@@ -0,0 +1,18 @@
+#ifndef UART_U6710_H
+#define UART_U6710_H
+
+// 鍦ㄨ繖閲屾斁缃ご鏂囦欢鐨勫唴瀹�
+#include "ch32v30x.h"
+#include "ch32x035_usbpd.h"
+
+// 瀹氫箟鎺ュ彛鐨勬尝鐗圭巼
+#define UART_U6710_BAUDRATE    9600
+//#define UART_U6710_BAUDRATE    115200
+
+void Uart_u6710_GPIO_Init();
+//void DMA_INIT();
+//void Resv_Data_Process(void);
+void USART1_SendData(PUINT8 txbuf, UINT16 length);
+//void USART1_ReceData(void);
+
+#endif // UART_U6710_H

+ 126 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/BoardConfig.c

@@ -0,0 +1,126 @@
+#include "BoardConfig.h"
+
+void MS1826a_RST_GPIO_PP(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = MS1826_RST;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+}
+
+void MS1826a_RST_GPIO_IPU(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = MS1826_RST;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+}
+
+void MS933x_RST_GPIO_PP(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = MS933X_RST;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOC, &GPIO_InitStructure);
+}
+
+
+void MS933x_RST_GPIO_IPU(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = MS933X_RST;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+    GPIO_Init(GPIOC, &GPIO_InitStructure);
+}
+
+void LED_GPIO_Init(void)
+{
+    //HDMI1_LED
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = HDMI1_LED;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+    //HDMI2_LED
+    //GPIO_InitTypeDef GPIO_InitStructure = {0};
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = HDMI2_LED;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+    //HDMI3_LED
+    //GPIO_InitTypeDef GPIO_InitStructure = {0};
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = HDMI3_LED;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+    GPIO_WriteBit(GPIOA, HDMI1_LED,  Bit_SET);
+    GPIO_WriteBit(GPIOC, HDMI2_LED,  Bit_SET);
+    GPIO_WriteBit(GPIOC, HDMI3_LED,  Bit_SET);
+}
+
+void CH444G_GPIO_Init(void)
+{
+    //CH444G_A
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = CH444G_A;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    //CH444G_B
+    //GPIO_InitTypeDef GPIO_InitStructure = {0};
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = CH444G_B;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    GPIO_WriteBit(GPIOB, CH444G_A,  Bit_SET);
+    GPIO_WriteBit(GPIOB, CH444G_B,  Bit_SET);
+}
+
+// L L L X0, Y0 _XY_0
+// L L H X1, Y1 _XY_1
+// L H L X2, Y2 _XY_2
+// L H H X3, Y3 default
+void CH444G_XY_2(void)
+{
+    GPIO_WriteBit(GPIOB, CH444G_A,  Bit_RESET);
+    GPIO_WriteBit(GPIOB, CH444G_B,  Bit_RESET);
+}
+
+void CH444G_XY_1(void)
+{
+    GPIO_WriteBit(GPIOB, CH444G_A,  Bit_SET);
+    GPIO_WriteBit(GPIOB, CH444G_B,  Bit_RESET);
+}
+
+void CH444G_XY_0(void)
+{
+    GPIO_WriteBit(GPIOB, CH444G_A,  Bit_RESET);
+    GPIO_WriteBit(GPIOB, CH444G_B,  Bit_SET);
+}
+
+void CH444G_XY_NONE(void)
+{
+    GPIO_WriteBit(GPIOB, CH444G_A,  Bit_SET);
+    GPIO_WriteBit(GPIOB, CH444G_B,  Bit_SET);
+}
+

+ 335 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC2_Software.c

@@ -0,0 +1,335 @@
+#include "IIC2_Software.h"
+
+//#define _IIC2_MAX_FREQ_ //350Khz
+
+#ifdef _IIC2_MAX_FREQ_
+#define IIC2_SPEED 0
+#endif
+
+//{Freq}: 96Mhz
+//#define IIC2_SPEED   7    //800khz
+#define IIC2_SPEED   10    //600khz
+//#define IIC2_SPEED   13    //500khz
+//#define IIC2_SPEED   18    //400khz
+//#define IIC2_SPEED   25   //300kHz
+//#define IIC2_SPEED   43   //200khz
+//#define IIC2_SPEED   80   //110khz
+
+u8 iic2_speed_us = 0; //235kHz 默认
+//修改IIC speed
+void IIC2_Set_Speed(u8 i2c_speed)
+{
+    //修改IIC延时时间
+    iic2_speed_us = i2c_speed;
+}
+void IIC2_sf_Init(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure={0};
+    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+
+    GPIO_InitStructure.GPIO_Pin = MS1826_SDA | MS1826_SCL;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    IIC2_SCL(1);
+    IIC2_SDA(1);
+    IIC2_Set_Speed(IIC2_SPEED);
+    //PRINT("IIC2 Speed:%d\n", iic2_speed_us);
+    //PRINT("IIC Speed: %d Khz\n", 350); //fix
+    //test();
+}
+
+void IIC2_Delay(u8 time)
+{
+    u8 i;
+    for (i = 0; i < time; i++)
+    {__NOP();}
+}
+
+//产生IIC start 信号
+void IIC2_Start(void)
+{
+    SDA2_OUT();     //sda output
+    IIC2_SDA(1);
+    IIC2_SCL(1);
+    IIC2_Delay(iic2_speed_us);
+    IIC2_SDA(0);//START:when CLK is high,DATA change form high to low
+    IIC2_Delay(iic2_speed_us);
+    IIC2_SCL(0);//钳住IIC总线,准备发送或接收data
+}
+
+//产生IIC stop信号
+void IIC2_Stop(void)
+{
+    SDA2_OUT();//sda output
+    IIC2_SCL(0);
+    IIC2_SDA(0);//STOP:when CLK is high DATA change form low to high
+    IIC2_Delay(iic2_speed_us); //至少4us 表示空闲
+    IIC2_SCL(1);
+    IIC2_SDA(1);//send IIC 总线 stop 信号
+    IIC2_Delay(iic2_speed_us); //至少4us 表示空闲
+}
+
+//wait 应答信号到来
+//返回值:1,接收应答失败
+//       0,接收应答成功
+u8 IIC2_Wait_Ack(void)
+{
+    u8 ucErrTime=0;
+    SDA2_IN();      //SDA input
+    IIC2_SDA(1);IIC2_Delay(iic2_speed_us);
+    IIC2_SCL(1);IIC2_Delay(iic2_speed_us);
+    while(READ2_SDA)
+    {
+        ucErrTime++;
+        if(ucErrTime>250)
+        {
+            IIC2_Stop();//等待从机应答超时,send stop
+            return 1;
+        }
+    }
+    IIC2_SCL(0);//scl output 0
+    return 0;
+}
+
+//产生ACK应答
+void IIC2_Ack(void)
+{
+    IIC2_SCL(0);
+    SDA2_OUT();
+    IIC2_SDA(0);
+    IIC2_Delay(iic2_speed_us);
+    IIC2_SCL(1);
+    IIC2_Delay(iic2_speed_us);
+    IIC2_SCL(0);
+}
+
+//不产生ACK应答
+void IIC2_NAck(void)
+{
+    IIC2_SCL(0);
+    SDA2_OUT();
+    IIC2_SDA(1);
+    IIC2_Delay(iic2_speed_us);
+    IIC2_SCL(1);
+    IIC2_Delay(iic2_speed_us);
+    IIC2_SCL(0);
+}
+
+//IIC send one byte
+//返回从机有无应答:1,有应答 0,无应答
+#pragma GCC optimize(1)
+void IIC2_Send_Byte(u8 txd)
+{
+    u8 t;
+    SDA2_OUT();
+    IIC2_SCL(0);//拉低scl开始data传输
+    for(t=0;t<8;t++)
+    {
+        if((txd<<t)&0x80)
+            IIC2_SDA(1);
+        else
+            IIC2_SDA(0);
+        //IIC2_Delay(2);   //某些器件延时是必须的
+        #ifdef _IIC2_MAX_FREQ_
+            __NOP();
+        #else
+            IIC2_Delay(iic2_speed_us);
+        #endif
+        IIC2_SCL(1);
+        //IIC2_Delay(2);
+        #ifdef _IIC2_MAX_FREQ_
+            __NOP();
+        #else
+            IIC2_Delay(iic2_speed_us);
+        #endif
+        IIC2_SCL(0);
+        //IIC2_Delay(2);
+    }
+}
+
+//read one byte, ack = 1, send ACK, ack = 0, send NACK
+u8 IIC2_Read_Byte(unsigned char ack)
+{
+    unsigned char i,receive=0;
+    SDA2_IN();//set SDA input
+    for(i=0;i<8;i++ )
+    {
+        IIC2_SCL(0);
+        #ifdef _IIC2_MAX_FREQ_
+            __NOP();
+        #else
+            IIC2_Delay(iic2_speed_us);
+        #endif
+        IIC2_SCL(1);
+        receive<<=1;
+        if(READ2_SDA)receive++;
+        #ifdef _IIC2_MAX_FREQ_
+            __NOP();
+        #else
+            IIC2_Delay(iic2_speed_us);
+        #endif
+    }
+    if (!ack)
+        IIC2_NAck();//send NACK
+    else
+        IIC2_Ack(); //send ACK
+    return receive;
+}
+
+//check IIC address: 1, 成功 0, 失败
+u8 IIC2_Check_Address(u8 Address)
+{
+    IIC2_Start();
+    IIC2_Send_Byte(Address);
+    if(IIC2_Wait_Ack())
+    {
+        IIC2_Stop();
+        return (0);
+    }
+    IIC2_Stop();
+    return (1);
+}
+
+//send many bytes: 8bit address + 8bit register + n bytes data
+u8 IIC2_Send_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC2_Start();
+    IIC2_Send_Byte(address);
+    if(IIC2_Wait_Ack()) return (0);
+    IIC2_Send_Byte(reg);
+    if(IIC2_Wait_Ack()) return (0);
+
+    for(i=0; i<num; i++)
+    {
+        IIC2_Send_Byte(*str);
+        if(IIC2_Wait_Ack()) return (0);
+        str++;
+    }
+    IIC2_Stop();
+    return (1);
+}
+
+//read many bytes: 8bit address + 8bit register + n bytes data
+u8 IIC2_Read_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC2_Start();
+    IIC2_Send_Byte(address);
+    if(IIC2_Wait_Ack()) return (0);
+    IIC2_Send_Byte(reg);
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Start();
+    IIC2_Send_Byte(address+1);
+    if(IIC2_Wait_Ack()) return (0);
+    for(i=0; i<num; i++)
+    {
+        *str = IIC2_Read_Byte(i == (num-1) ? 0 : 1);
+        str++;
+    }
+
+    IIC2_Stop();
+    return (1);
+}
+
+//send many bytes(send low byte first): 8bit address + 16bit register + n bytes data
+u8 IIC2_Send_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u16 num)
+{
+    u16 i;
+    IIC2_Start();
+    IIC2_Send_Byte(address);
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+    IIC2_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+
+    for(i=0; i<num; i++)
+    {
+        IIC2_Send_Byte(*str);
+        if(IIC2_Wait_Ack()) return (0);
+        str++;
+    }
+    IIC2_Stop();
+    return (1);
+}
+
+//read many bytes(send low byte first): 8bit address + 16bit register + n bytes data
+u8 IIC2_Read_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC2_Start();
+    IIC2_Send_Byte(address);
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+    IIC2_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Start();
+    IIC2_Send_Byte(address+1);
+    if(IIC2_Wait_Ack()) return (0);
+    for(i=0; i<num; i++)
+    {
+        *str = IIC2_Read_Byte(i == (num-1) ? 0 : 1);
+        str++;
+    }
+
+    IIC2_Stop();
+    return (1);
+}
+
+//send many bytes(send high byte first): 8bit address + 16bit register + n bytes data
+u8 IIC2_Send_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC2_Start();
+    IIC2_Send_Byte(address);
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+    IIC2_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+
+    for(i=0; i<num; i++)
+    {
+        IIC2_Send_Byte(*str);
+        if(IIC2_Wait_Ack()) return (0);
+        str++;
+    }
+    IIC2_Stop();
+    return (1);
+}
+
+//read many bytes(send high byte first): 8bit address + 16bit register + n bytes data
+u8 IIC2_Read_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC2_Start();
+    IIC2_Send_Byte(address);
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+    IIC2_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC2_Wait_Ack()) return (0);
+
+    IIC2_Start();
+    IIC2_Send_Byte(address+1);
+    if(IIC2_Wait_Ack()) return (0);
+    for(i=0; i<num; i++)
+    {
+        *str = IIC2_Read_Byte(i == (num-1) ? 0 : 1);
+        str++;
+    }
+
+    IIC2_Stop();
+    return (1);
+}
+

+ 385 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC3_Software.c

@@ -0,0 +1,385 @@
+#include "IIC3_Software.h"
+
+//#define _IIC3_MAX_FREQ_ //2Mhz
+
+#ifdef _IIC3_MAX_FREQ_
+#define IIC3_SPEED 0
+#endif
+
+//{Freq}: 96Mhz
+//#define IIC3_SPEED   7    //800khz
+//#define IIC3_SPEED   10    //600khz
+//#define IIC3_SPEED   13    //500khz
+//#define IIC3_SPEED   18    //400khz
+#define IIC3_SPEED   25   //300kHz
+//#define IIC3_SPEED   43   //200khz
+//#define IIC3_SPEED   80   //110khz
+
+u8 iic3_speed_us = 0; //235kHz 默认
+
+//修改IIC速度:
+void IIC3_Set_Speed(u8 i2c_speed)
+{
+    //修改iic延时时间
+    iic3_speed_us = i2c_speed;
+}
+
+void IIC3_sf_Init(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure={0};
+    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+
+    GPIO_InitStructure.GPIO_Pin = SENSOR_SDA | SENSOR_SCL;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+    IIC3_SCL(1);
+    IIC3_SDA(1);
+    IIC3_Set_Speed(IIC3_SPEED);
+    //test();
+}
+
+#pragma GCC optimize(1)
+void IIC3_Delay(u8 time)
+{
+    u8 i;
+    for (i = 0; i < time; i++)
+    {__NOP();}
+}
+
+//产生IIC起始信号
+void IIC3_Start(void)
+{
+    SDA3_OUT();     //sda线输出
+    IIC3_SDA(1);
+    IIC3_SCL(1);
+    IIC3_Delay(iic3_speed_us);
+    IIC3_SDA(0);//START:when CLK is high,DATA change form high to low
+    IIC3_Delay(iic3_speed_us);
+    IIC3_SCL(0);//钳住I2C总线,准备发送或接收数据
+}
+
+//产生IIC停止信号
+void IIC3_Stop(void)
+{
+    SDA3_OUT();//sda线输出
+    IIC3_SCL(0);
+    IIC3_SDA(0);//STOP:when CLK is high DATA change form low to high
+    IIC3_Delay(iic3_speed_us); //至少4us 表示空闲
+    IIC3_SCL(1);
+    IIC3_SDA(1);//发送I2C总线结束信号
+    IIC3_Delay(iic3_speed_us); //至少4us 表示空闲
+}
+
+//等待应答信号到来
+//返回值:1,接收应答失败
+//        0,接收应答成功
+u8 IIC3_Wait_Ack(void)
+{
+    u8 ucErrTime=0;
+    SDA3_IN();      //SDA设置为输入
+    IIC3_SDA(1);IIC3_Delay(iic3_speed_us);
+    IIC3_SCL(1);IIC3_Delay(iic3_speed_us);
+    while(READ3_SDA)
+    {
+        ucErrTime++;
+        if(ucErrTime>250)
+        {
+            IIC3_Stop();//等待从机应答超时,发送stop
+            return 1;
+        }
+    }
+    IIC3_SCL(0);//时钟输出0
+    return 0;
+}
+
+//产生ACK应答
+void IIC3_Ack(void)
+{
+    IIC3_SCL(0);
+    SDA3_OUT();
+    IIC3_SDA(0);
+    IIC3_Delay(iic3_speed_us);
+    IIC3_SCL(1);
+    IIC3_Delay(iic3_speed_us);
+    IIC3_SCL(0);
+}
+
+//不产生ACK应答
+void IIC3_NAck(void)
+{
+    IIC3_SCL(0);
+    SDA3_OUT();
+    IIC3_SDA(1);
+    IIC3_Delay(iic3_speed_us);
+    IIC3_SCL(1);
+    IIC3_Delay(iic3_speed_us);
+    IIC3_SCL(0);
+}
+
+//IIC发送一个字节
+//返回从机有无应答: 1,有应答 0,无应答
+#pragma GCC optimize(1)
+void IIC3_Send_Byte(u8 txd)
+{
+    u8 t;
+    SDA3_OUT();
+    IIC3_SCL(0);//拉低时钟开始数据传输
+    for(t=0;t<8;t++)
+    {
+        if((txd<<t)&0x80)
+            IIC3_SDA(1);
+        else
+            IIC3_SDA(0);
+        //IIC3_Delay(2);   //某些器件延时是必须的
+        #ifdef _IIC3_MAX_FREQ_
+            __NOP();
+        #else
+            IIC3_Delay(iic3_speed_us);
+        #endif
+
+        IIC3_SCL(1);
+
+        #ifdef _IIC3_MAX_FREQ_
+            __NOP();
+        #else
+            IIC3_Delay(iic3_speed_us);
+        #endif
+        IIC3_SCL(0);
+        //IIC3_Delay(2);
+    }
+}
+
+//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
+u8 IIC3_Read_Byte(unsigned char ack)
+{
+    unsigned char i,receive=0;
+    SDA3_IN();//SDA设置为输入
+    for(i=0;i<8;i++ )
+    {
+        IIC3_SCL(0);
+        #ifdef _IIC3_MAX_FREQ_
+            __NOP();
+        #else
+            IIC3_Delay(iic3_speed_us);
+        #endif
+        IIC3_SCL(1);
+        receive<<=1;
+        if(READ3_SDA)receive++;
+        #ifdef _IIC3_MAX_FREQ_
+            __NOP();
+        #else
+            IIC3_Delay(iic3_speed_us);
+        #endif
+    }
+    if (!ack)
+        IIC3_NAck();//发送nACK 1
+    else
+        IIC3_Ack(); //发送ACK 0
+    return receive;
+}
+
+//测试IIC地址: 1,成功 0,失败
+u8 IIC3_Check_Address(u8 Address)
+{
+    IIC3_Start();
+    IIC3_Send_Byte(Address);
+    if(IIC3_Wait_Ack())
+    {
+        IIC3_Stop();
+        return (0);
+    }
+    IIC3_Stop();
+    return (1);
+}
+
+//发送多个字节: 8bit address + 8bit register + n bytes data
+u8 IIC3_Send_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC3_Start();
+    IIC3_Send_Byte(address);
+    if(IIC3_Wait_Ack()) return (0);
+    IIC3_Send_Byte(reg);
+    if(IIC3_Wait_Ack()) return (0);
+
+    for(i=0; i<num; i++)
+    {
+        IIC3_Send_Byte(*str);
+        if(IIC3_Wait_Ack()) return (0);
+        str++;
+    }
+    IIC3_Stop();
+    return (1);
+}
+
+//读取多个字节: 8bit address + 8bit register + n bytes data
+u8 IIC3_Read_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC3_Start();
+    IIC3_Send_Byte(address);
+    if(IIC3_Wait_Ack()) return (0);
+    IIC3_Send_Byte(reg);
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Start();
+    IIC3_Send_Byte(address+1);
+    if(IIC3_Wait_Ack()) return (0);
+    for(i=0; i<num; i++)
+    {
+        *str = IIC3_Read_Byte(i == (num-1) ? 0 : 1);
+        str++;
+    }
+
+    IIC3_Stop();
+    return (1);
+}
+
+//fix 读取多个字节: 8bit address + 8bit register + n bytes data
+u8 IIC3_Read_8bitMultiBytes_sgm832(u8 address, u8 reg, u16 *str, u8 num)
+{
+    IIC3_Start();
+    IIC3_Send_Byte(address);//8a
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Send_Byte(reg);//fe
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Delay(1);
+    IIC3_Start();
+    IIC3_Send_Byte(address+1);
+    if(IIC3_Wait_Ack()) return (0);
+
+    u8 bit0 = IIC3_Read_Byte(1);
+    IIC3_Delay(10);
+
+    u8 bit1 = IIC3_Read_Byte(0);
+
+    *str = (bit0 << 8) | bit1;
+
+    IIC3_Stop();
+    return (1);
+}
+// //fix 写取多个字节: 8bit address + 8bit register + n bytes data
+// u8 IIC3_Read_8bitMultiBytes_sgm832(u8 address, u8 reg, u16 *str, u8 num)
+// {
+//     u8 i;
+//     IIC3_Start();
+//     IIC3_Send_Byte(address);
+//     if(IIC3_Wait_Ack()) return (0);
+
+//     IIC3_Send_Byte(reg >> 8);   // Send the high byte of reg
+//     if(IIC3_Wait_Ack()) return (0);
+//     IIC3_Send_Byte(reg & 0xFF); // Send the low byte of reg
+//     if(IIC3_Wait_Ack()) return (0);
+
+//     for(i=0; i<num; i++)
+//     {
+//         IIC3_Send_Byte(*str);
+//         if(IIC3_Wait_Ack()) return (0);
+//         str++;
+//     }
+//     IIC3_Stop();
+//     return (1);
+// }
+
+//发送多个字节(先发送低字节): 8bit address + 16bit register + n bytes data
+u8 IIC3_Send_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u16 num)
+{
+    u8 i;
+    IIC3_Start();
+    IIC3_Send_Byte(address);
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+    IIC3_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+
+    for(i=0; i<num; i++)
+    {
+        IIC3_Send_Byte(*str);
+        if(IIC3_Wait_Ack()) return (0);
+        str++;
+    }
+    IIC3_Stop();
+    return (1);
+}
+
+//读取多个字节(先发送低字节): 8bit address + 16bit register + n bytes data
+u8 IIC3_Read_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC3_Start();
+    IIC3_Send_Byte(address);
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+    IIC3_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Start();
+    IIC3_Send_Byte(address+1);
+    if(IIC3_Wait_Ack()) return (0);
+    for(i=0; i<num; i++)
+    {
+        *str = IIC3_Read_Byte(i == (num-1) ? 0 : 1);
+        str++;
+    }
+
+    IIC3_Stop();
+    return (1);
+}
+
+//发送多个字节(先发送高字节): 8bit address + 16bit register + n bytes data
+u8 IIC3_Send_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC3_Start();
+    IIC3_Send_Byte(address);
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+    IIC3_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+
+    for(i=0; i<num; i++)
+    {
+        IIC3_Send_Byte(*str);
+        if(IIC3_Wait_Ack()) return (0);
+        str++;
+    }
+    IIC3_Stop();
+    return (1);
+}
+
+//读取多个字节(先发送高字节): 8bit address + 16bit register + n bytes data
+u8 IIC3_Read_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+{
+    u8 i;
+    IIC3_Start();
+    IIC3_Send_Byte(address);
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Send_Byte(reg >> 8);   // Send the high byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+    IIC3_Send_Byte(reg & 0xFF); // Send the low byte of reg
+    if(IIC3_Wait_Ack()) return (0);
+
+    IIC3_Start();
+    IIC3_Send_Byte(address+1);
+    if(IIC3_Wait_Ack()) return (0);
+    for(i=0; i<num; i++)
+    {
+        *str = IIC3_Read_Byte(i == (num-1) ? 0 : 1);
+        str++;
+    }
+
+    IIC3_Stop();
+    return (1);
+}
+

+ 347 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC_Hardware.c

@@ -0,0 +1,347 @@
+//#include "TouchCommon.h"
+#include "IIC_Hardware.h"
+#include "debug.h"
+
+/* DATA ADDRESS Length Definition */
+#define Address_8bit   0
+#define Address_16bit  1
+#define Address_32bit  2
+
+/* DATA ADDRESS Length Selection */
+#define Address_Lenth   Address_8bit
+//#define Address_Lenth   Address_32bit
+//#define Address_Lenth   Address_16bit
+
+#define CHECK_TIMES     (25)
+
+const u8 IIC_hd_AddrWR = 0x78;
+//const u8 IIC_hd_AddrWR = 0x78;
+
+void IIC_hd_Init(u32 bound, u16 address)
+{
+    GPIO_InitTypeDef GPIO_InitStructure={0};
+    I2C_InitTypeDef I2C_InitTSturcture={0};
+
+    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE );
+    RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );
+    //RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
+
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;  // SCL PA10 , // SDA PA11
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init( GPIOA, &GPIO_InitStructure );
+
+    I2C_InitTSturcture.I2C_ClockSpeed = bound;
+    I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;
+    I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_16_9;
+    I2C_InitTSturcture.I2C_OwnAddress1 = address;
+    I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;
+    I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
+    I2C_Init( I2C1, &I2C_InitTSturcture );
+
+    I2C_Cmd( I2C1, ENABLE );
+
+    I2C_AcknowledgeConfig( I2C1, ENABLE );
+}
+
+BOOL I2C_WaitForIdle(void)
+{
+    u8 nTryTimes = 50;
+
+    while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY) != RESET  && --nTryTimes);
+
+    if(nTryTimes==0)
+        return 0;
+    I2C_GenerateSTART( I2C1, ENABLE);
+        return 1;
+}
+
+BOOL Check_I2C_Address(u8 Address)
+{
+    BOOL temp = 0;
+    u8 i;
+
+    if(!I2C_WaitForIdle())
+        return 0;
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, Address, I2C_Direction_Transmitter );
+
+    i = CHECK_TIMES;
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) && (i != 0) )
+    {
+        i--;
+    }
+
+  I2C_GenerateSTOP( I2C1, ENABLE );
+
+  if (i==0)
+  {
+      temp = 0;
+  }
+  else
+  {
+      temp = 1;
+  }
+
+    return temp;
+}
+
+u8 IICReadOneByte(u32 ReadAddr)
+{
+    u8 temp=0;
+
+    if(!I2C_WaitForIdle())
+        return 0;
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, IIC_hd_AddrWR, I2C_Direction_Transmitter );
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );
+
+#if (Address_Lenth  == Address_8bit)
+    I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+#elif (Address_Lenth  == Address_16bit)
+    I2C_SendData( I2C1, (u8)(ReadAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#elif (Address_Lenth  == Address_32bit)
+    I2C_SendData( I2C1, (u8)(ReadAddr>>24) );
+      while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr>>16) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#endif
+
+    I2C_GenerateSTART( I2C1, ENABLE );
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, IIC_hd_AddrWR, I2C_Direction_Receiver );
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) );
+  while( I2C_GetFlagStatus( I2C1, I2C_FLAG_RXNE ) ==  RESET ){}
+    I2C_AcknowledgeConfig( I2C1, DISABLE );
+
+    temp = I2C_ReceiveData( I2C1 );
+    I2C_GenerateSTOP( I2C1, ENABLE );
+
+    return temp;
+}
+
+BOOL IICReadBytes(u32 ReadAddr, u8 *pBuffer, u16 Length)
+{
+    u8 cnt = 0;
+    u16 i=0;
+
+    if(!I2C_WaitForIdle())
+        return 0;
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, IIC_hd_AddrWR, I2C_Direction_Transmitter );
+
+    cnt = CHECK_TIMES;
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) && (cnt != 0) )
+    {
+        cnt--;
+    }
+
+    if (cnt == 0)
+    {
+        I2C_GenerateSTOP( I2C1, ENABLE );
+        return 0;
+    }
+
+
+    //while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );
+
+#if (Address_Lenth  == Address_8bit)
+    I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+#elif (Address_Lenth  == Address_16bit)
+    I2C_SendData( I2C1, (u8)(ReadAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#elif (Address_Lenth  == Address_32bit)
+    I2C_SendData( I2C1, (u8)(ReadAddr>>24) );
+      while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+      I2C_SendData( I2C1, (u8)(ReadAddr>>16) );
+        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#endif
+
+    I2C_GenerateSTART( I2C1, ENABLE );
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, IIC_hd_AddrWR, I2C_Direction_Receiver );
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) );
+
+    while( i < Length - 1 )
+    {
+        while( I2C_GetFlagStatus( I2C1, I2C_FLAG_RXNE ) ==  RESET ){}
+        I2C_AcknowledgeConfig( I2C1, ENABLE );
+        pBuffer[i] = I2C_ReceiveData( I2C1 );
+        i++;
+    }
+
+    while( I2C_GetFlagStatus( I2C1, I2C_FLAG_RXNE ) ==  RESET )
+    I2C_AcknowledgeConfig( I2C1, DISABLE );
+
+    pBuffer[i] = I2C_ReceiveData( I2C1 );
+    I2C_GenerateSTOP( I2C1, ENABLE );
+
+    return 1;
+}
+
+BOOL IICWriteOneByte(u32 WriteAddr, u8 DataToWrite)
+{
+    if(!I2C_WaitForIdle())
+        return 0;
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, IIC_hd_AddrWR, I2C_Direction_Transmitter );
+
+    //while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );
+
+#if (Address_Lenth  == Address_8bit)
+    I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+#elif (Address_Lenth  == Address_16bit)
+    I2C_SendData( I2C1, (u8)(WriteAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#elif (Address_Lenth  == Address_32bit)
+    I2C_SendData( I2C1, (u8)(WriteAddr>>24) );
+      while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+      I2C_SendData( I2C1, (u8)(WriteAddr>>16) );
+        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#endif
+
+    if( I2C_GetFlagStatus( I2C1, I2C_FLAG_TXE ) !=  RESET )
+    {
+        I2C_SendData( I2C1, DataToWrite );
+    }
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+    I2C_GenerateSTOP( I2C1, ENABLE );
+    return 1;
+}
+
+BOOL IICWriteBytes(u32 WriteAddr, u8 *pBuffer, u16 Length)
+{
+    u16 i=0;
+    u8 cnt = 0;
+
+    if(!I2C_WaitForIdle())
+        return 0;
+
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );
+    I2C_Send7bitAddress( I2C1, IIC_hd_AddrWR, I2C_Direction_Transmitter );
+
+    cnt = CHECK_TIMES;
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) && (cnt != 0) )
+    {
+        cnt--;
+    }
+
+    if (cnt==0)
+    {
+        I2C_GenerateSTOP( I2C1, ENABLE );
+        return 0;
+    }
+
+
+    //while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );
+
+#if (Address_Lenth  == Address_8bit)
+    I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+#elif (Address_Lenth  == Address_16bit)
+    I2C_SendData( I2C1, (u8)(WriteAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#elif (Address_Lenth  == Address_32bit)
+    I2C_SendData( I2C1, (u8)(WriteAddr>>24) );
+      while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr>>16) );
+       while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr>>8) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+    I2C_SendData( I2C1, (u8)(WriteAddr&0x00FF) );
+    while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+#endif
+
+    while (i < Length)
+    {
+        if( I2C_GetFlagStatus( I2C1, I2C_FLAG_TXE ) !=  RESET )
+        {
+            I2C_SendData( I2C1, pBuffer[i] );
+        }
+
+        while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
+
+        i++;
+    }
+    I2C_GenerateSTOP( I2C1, ENABLE );
+
+    return 1;
+}
+
+void IICRead(u16 ReadAddr, u8 *pBuffer, u16 NumToRead)
+{
+    while(NumToRead)
+    {
+        *pBuffer++=IICReadOneByte(ReadAddr++);
+        NumToRead--;
+    }
+}
+
+void IICWrite(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite)
+{
+    while(NumToWrite--)
+    {
+        IICWriteOneByte(WriteAddr,*pBuffer);
+        WriteAddr++;
+        pBuffer++;
+        Delay_Ms(2);
+    }
+}
+
+
+/*********************************************************************
+*********************************************************************/

+ 985 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/IIC_hal/IIC_Software.c

@@ -0,0 +1,985 @@
+#include "IIC_Software.h"
+#include "ms933x_mpi_dummy.h"
+
+//#define _IIC_MAX_FREQ_ //2Mhz
+
+#ifdef _IIC_MAX_FREQ_
+#define IIC_SPEED 0
+#endif
+
+////{Freq}: 96Mhz
+////#define IIC_SPEED   7    //800khz
+////#define IIC_SPEED   10    //600khz
+////#define IIC_SPEED   13    //500khz
+////#define IIC_SPEED   18    //400khz
+////#define IIC_SPEED   25   //300kHz
+////#define IIC_SPEED   43   //200khz
+//#define IIC_SPEED   80   //110khz
+//
+//u8 iic_speed_us = 0; //235kHz 默认
+//
+////修改IIC speed
+//void IIC_Set_Speed(u8 i2c_speed)
+//{
+//    //修改IIC延时时间
+//    iic_speed_us = i2c_speed;
+//}
+//
+//void IIC_sf_Init(void)
+//{
+//    GPIO_InitTypeDef GPIO_InitStructure={0};
+//    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
+//
+//    GPIO_InitStructure.GPIO_Pin = MS933X_SDA | MS933X_SCL;
+//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   //open drain output
+//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+//    GPIO_Init(GPIOC, &GPIO_InitStructure);
+//
+//    IIC_SCL(1);
+//    IIC_SDA(1);
+//    IIC_Set_Speed(IIC_SPEED);
+//    //test();
+//}
+//
+//#pragma GCC optimize(1)
+//void IIC_Delay(u8 time)
+//{
+//    u8 i;
+//    for (i = 0; i < time; i++)
+//    {__NOP();}
+//}
+//
+////产生IIC start 信号
+//void IIC_Start(void)
+//{
+//    SDA_OUT();     //sda output
+//    IIC_SDA(1);
+//    IIC_SCL(1);
+//    IIC_Delay(iic_speed_us);
+//    IIC_SDA(0);//START:when CLK is high,DATA change form high to low
+//    IIC_Delay(iic_speed_us);
+//    IIC_SCL(0);//钳住IIC总线,准备发送或接收data
+//}
+//
+////产生IIC stop信号
+//void IIC_Stop(void)
+//{
+//    SDA_OUT();//sda output
+//    IIC_SCL(0);
+//    IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
+//    IIC_Delay(iic_speed_us); //至少4us 表示空闲
+//    IIC_SCL(1);
+//    IIC_SDA(1);//send IIC 总线 stop 信号
+//    IIC_Delay(iic_speed_us); //至少4us 表示空闲
+//}
+//
+////wait 应答信号到来
+////返回值:1,接收应答失败
+////       0,接收应答成功
+//u8 IIC_Wait_Ack(void)
+//{
+//    u8 ucErrTime=0;
+//    SDA_IN();      //SDA input
+//    IIC_SDA(1);IIC_Delay(iic_speed_us);
+//    IIC_SCL(1);IIC_Delay(iic_speed_us);
+//    while(READ_SDA)
+//    {
+//        ucErrTime++;
+//        if(ucErrTime>250)
+//        {
+//            IIC_Stop();//等待从机应答超时,send stop
+//            return 1;
+//        }
+//    }
+//    IIC_SCL(0);//scl output 0
+//    return 0;
+//}
+//
+////产生ACK应答
+//void IIC_Ack(void)
+//{
+//    IIC_SCL(0);
+//    SDA_OUT();
+//    IIC_SDA(0);
+//    IIC_Delay(iic_speed_us);
+//    IIC_SCL(1);
+//    IIC_Delay(iic_speed_us);
+//    IIC_SCL(0);
+//}
+//
+////不产生ACK应答
+//void IIC_NAck(void)
+//{
+//    IIC_SCL(0);
+//    SDA_OUT();
+//    IIC_SDA(1);
+//    IIC_Delay(iic_speed_us);
+//    IIC_SCL(1);
+//    IIC_Delay(iic_speed_us);
+//    IIC_SCL(0);
+//}
+//
+////IIC send one byte
+////返回从机有无应答:1,有应答 0,无应答
+//#pragma GCC optimize(1)
+//void IIC_Send_Byte(u8 txd)
+//{
+//    u8 t;
+//    SDA_OUT();
+//    IIC_SCL(0);//拉低scl开始data传输
+//    for(t=0;t<8;t++)
+//    {
+//        if((txd<<t)&0x80)
+//            IIC_SDA(1);
+//        else
+//            IIC_SDA(0);
+//        //IIC_Delay(2);   //某些器件延时是必须的
+//        #ifdef _IIC_MAX_FREQ_
+//            __NOP();
+//        #else
+//            IIC_Delay(iic_speed_us);
+//        #endif
+//
+//        IIC_SCL(1);
+//
+//        #ifdef _IIC_MAX_FREQ_
+//            __NOP();
+//        #else
+//            IIC_Delay(iic_speed_us);
+//        #endif
+//        IIC_SCL(0);
+//        //IIC_Delay(2);
+//    }
+//}
+//
+////read one byte, ack = 1, send ACK, ack = 0, send NACK
+//u8 IIC_Read_Byte(unsigned char ack)
+//{
+//    unsigned char i,receive=0;
+//    SDA_IN();//set SDA input
+//    for(i=0;i<8;i++ )
+//    {
+//        IIC_SCL(0);
+//        #ifdef _IIC_MAX_FREQ_
+//            __NOP();
+//        #else
+//            IIC_Delay(iic_speed_us);
+//        #endif
+//        IIC_SCL(1);
+//        receive<<=1;
+//        if(READ_SDA)receive++;
+//        #ifdef _IIC_MAX_FREQ_
+//            __NOP();
+//        #else
+//            IIC_Delay(iic_speed_us);
+//        #endif
+//    }
+//    if (!ack)
+//        IIC_NAck();//send NACK
+//    else
+//        IIC_Ack(); //send ACK
+//    return receive;
+//}
+//
+////check IIC address: 1, 成功 0, 失败
+//u8 IIC_Check_Address(u8 Address)
+//{
+//    IIC_Start();
+//    IIC_Send_Byte(Address);
+//    if(IIC_Wait_Ack())
+//    {
+//        IIC_Stop();
+//        return (0);
+//    }
+//    IIC_Stop();
+//    return (1);
+//}
+//
+////send many bytes: 8bit address + 8bit register + n bytes data
+//u8 IIC_Send_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num)
+//{
+//    u8 i;
+//    IIC_Start();
+//    IIC_Send_Byte(address);
+//    if(IIC_Wait_Ack()) return (0);
+//    IIC_Send_Byte(reg);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    for(i=0; i<num; i++)
+//    {
+//        IIC_Send_Byte(*str);
+//        if(IIC_Wait_Ack()) return (0);
+//        str++;
+//    }
+//    IIC_Stop();
+//    return (1);
+//}
+//
+////read many bytes: 8bit address + 8bit register + n bytes data
+//u8 IIC_Read_8bitMultiBytes(u8 address, u8 reg, u8 *str, u8 num)
+//{
+//    u8 i;
+//    IIC_Start();
+//    IIC_Send_Byte(address);
+//    if(IIC_Wait_Ack()) return (0);
+//    IIC_Send_Byte(reg);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Start();
+//    IIC_Send_Byte(address+1);
+//    if(IIC_Wait_Ack()) return (0);
+//    for(i=0; i<num; i++)
+//    {
+//        *str = IIC_Read_Byte(i == (num-1) ? 0 : 1);
+//        str++;
+//    }
+//
+//    IIC_Stop();
+//    return (1);
+//}
+//
+////fix read many bytes: 8bit address + 8bit register + n bytes data
+//u8 IIC_Read_8bitMultiBytes_sgm832(u8 address, u8 reg, u16 *str, u8 num)
+//{
+//    IIC_Start();
+//    IIC_Send_Byte(address);//8a
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Send_Byte(reg);//fe
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Delay(1);
+//    IIC_Start();
+//    IIC_Send_Byte(address+1);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    u8 bit0 = IIC_Read_Byte(1);
+//    IIC_Delay(1);
+//
+//    u8 bit1 = IIC_Read_Byte(0);
+//
+//    *str = (bit0 << 8) | bit1;
+//
+//    IIC_Stop();
+//    return (1);
+//}
+//// //fix read many bytes: 8bit address + 8bit register + n bytes data
+//// u8 IIC_Read_8bitMultiBytes_sgm832(u8 address, u8 reg, u16 *str, u8 num)
+//// {
+////     u8 i;
+////     IIC_Start();
+////     IIC_Send_Byte(address);
+////     if(IIC_Wait_Ack()) return (0);
+//
+////     IIC_Send_Byte(reg >> 8);   // Send the high byte of reg
+////     if(IIC_Wait_Ack()) return (0);
+////     IIC_Send_Byte(reg & 0xFF); // Send the low byte of reg
+////     if(IIC_Wait_Ack()) return (0);
+//
+////     for(i=0; i<num; i++)
+////     {
+////         IIC_Send_Byte(*str);
+////         if(IIC_Wait_Ack()) return (0);
+////         str++;
+////     }
+////     IIC_Stop();
+////     return (1);
+//// }
+//
+////send many bytes(send low byte first): 8bit address + 16bit register + n bytes data
+//u8 IIC_Send_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+//{
+//    u8 i;
+//    IIC_Start();
+//    IIC_Send_Byte(address);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Send_Byte(reg & 0xFF); // Send the low byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//    IIC_Send_Byte(reg >> 8);   // Send the high byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    for(i=0; i<num; i++)
+//    {
+//        IIC_Send_Byte(*str);
+//        if(IIC_Wait_Ack()) return (0);
+//        str++;
+//    }
+//    IIC_Stop();
+//    return (1);
+//}
+//
+////read many bytes(send low byte first): 8bit address + 16bit register + n bytes data
+//u8 IIC_Read_16bit_LE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+//{
+//    u8 i;
+//    IIC_Start();
+//    IIC_Send_Byte(address);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Send_Byte(reg & 0xFF); // Send the low byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//    IIC_Send_Byte(reg >> 8);   // Send the high byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Start();
+//    IIC_Send_Byte(address+1);
+//    if(IIC_Wait_Ack()) return (0);
+//    for(i=0; i<num; i++)
+//    {
+//        *str = IIC_Read_Byte(i == (num-1) ? 0 : 1);
+//        str++;
+//    }
+//
+//    IIC_Stop();
+//    return (1);
+//}
+//
+////send many bytes(send high byte first): 8bit address + 16bit register + n bytes data
+//u8 IIC_Send_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+//{
+//    u8 i;
+//    IIC_Start();
+//    IIC_Send_Byte(address);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Send_Byte(reg >> 8);   // Send the high byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//    IIC_Send_Byte(reg & 0xFF); // Send the low byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    for(i=0; i<num; i++)
+//    {
+//        IIC_Send_Byte(*str);
+//        if(IIC_Wait_Ack()) return (0);
+//        str++;
+//    }
+//    IIC_Stop();
+//    return (1);
+//}
+//
+////read many bytes(send high byte first): 8bit address + 16bit register + n bytes data
+//u8 IIC_Read_16bit_BE_MultiBytes(u8 address, u16 reg, u8 *str, u8 num)
+//{
+//    u8 i;
+//    IIC_Start();
+//    IIC_Send_Byte(address);
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Send_Byte(reg >> 8);   // Send the high byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//    IIC_Send_Byte(reg & 0xFF); // Send the low byte of reg
+//    if(IIC_Wait_Ack()) return (0);
+//
+//    IIC_Start();
+//    IIC_Send_Byte(address+1);
+//    if(IIC_Wait_Ack()) return (0);
+//    for(i=0; i<num; i++)
+//    {
+//        *str = IIC_Read_Byte(i == (num-1) ? 0 : 1);
+//        str++;
+//    }
+//
+//    IIC_Stop();
+//    return (1);
+//}
+
+#pragma GCC optimize(1)
+void IIC_Delay(u8 time)
+{
+    u8 i;
+    for (i = 0; i < time; i++)
+    {__NOP();}
+}
+
+#define I2C_SDA_HIGH        IIC_SDA(1)
+#define I2C_SCL_HIGH        IIC_SCL(1)
+
+#define I2C_SDA_LOW         IIC_SDA(0)
+#define I2C_SCL_LOW         IIC_SCL(0)
+
+#define _i2c_read_sda()     GPIO_ReadInputDataBit(GPIOC,MS933X_SDA) //输入SDA
+
+
+
+#define _i2c_delay()        mculib_delay_us(g_u8_i2c_delay)
+
+static UINT8 g_u8_i2c_delay = 1;
+
+#define I2C_TIMEOUT         (0x1000) //define I2C wait ack signal time out = I2C_TIMEOUT * _i2c_delay()
+
+VOID _i2c_start(VOID)
+{
+    /* assume here all lines are HIGH */
+
+    I2C_SDA_HIGH;
+    I2C_SCL_HIGH;
+    _i2c_delay();
+
+    I2C_SDA_LOW;
+    _i2c_delay();
+
+    I2C_SCL_LOW;
+}
+
+VOID _i2c_stop(VOID)
+{
+    I2C_SDA_LOW;
+    _i2c_delay();
+
+    I2C_SCL_HIGH;
+    _i2c_delay();
+
+    I2C_SDA_HIGH;
+    _i2c_delay();
+}
+
+BOOL _i2c_write_byte(UINT8 value)
+{
+    UINT8  index;
+    BOOL   result = 0;
+    UINT16 u16Wait;
+
+    /* Send 8 bits to the I2C Bus - msb first */
+    for (index = 0; index < 8; index++)
+    {
+        if (value & 0x80)
+        {
+            I2C_SDA_HIGH;
+        }
+        else
+        {
+            I2C_SDA_LOW;
+        }
+        _i2c_delay();
+
+        I2C_SCL_HIGH;
+        _i2c_delay();
+
+        I2C_SCL_LOW;
+        _i2c_delay();
+
+        value <<= 1;
+    }
+
+    /* wait for ack =  readbit0 */
+    I2C_SDA_HIGH;       // avoid  SDA is always Low.
+    _i2c_delay();
+
+    I2C_SCL_HIGH;
+    _i2c_delay();
+
+    u16Wait = 0;
+    while (_i2c_read_sda() && (u16Wait < I2C_TIMEOUT))
+        u16Wait ++;
+
+    if (!_i2c_read_sda())
+        result = TRUE;
+
+    I2C_SCL_LOW;
+    I2C_SDA_HIGH;
+    _i2c_delay();
+
+    return result;
+}
+
+UINT8 _i2c_read_byte(BOOL lastByte)
+{
+    UINT8 index;
+    UINT8 value = 0x00;
+
+    I2C_SDA_HIGH;
+    for (index = 0; index < 8; index++)
+    {
+        value <<= 1;
+        I2C_SCL_HIGH;
+        _i2c_delay();
+        value |= _i2c_read_sda();
+        I2C_SCL_LOW;
+        _i2c_delay();
+    }
+
+    if (!lastByte)
+    {
+        I2C_SDA_LOW;
+    }
+    else
+    {
+        I2C_SDA_HIGH;
+    }
+    _i2c_delay();
+
+    I2C_SCL_HIGH;
+    _i2c_delay();
+
+    I2C_SCL_LOW;
+    I2C_SDA_HIGH;
+    _i2c_delay();
+
+    return value;
+}
+
+VOID mculib_i2c_init(VOID)
+{
+        GPIO_InitTypeDef GPIO_InitStructure={0};
+        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
+
+        GPIO_InitStructure.GPIO_Pin = MS933X_SDA | MS933X_SCL;
+        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   //open drain output
+        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+        GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+
+
+    _i2c_stop();
+}
+
+VOID mculib_i2c_set_speed(UINT8 u8_i2c_speed)
+{
+
+}
+
+// 16-bit index for macrosilicon chip
+UINT8 mculib_i2c_read_16bidx8bval(UINT8 u8_address, UINT16 u16_index)
+{
+    UINT8 u8_value = 0;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    u8_value = _i2c_read_byte(1);
+
+STOP:
+    _i2c_stop();
+    return u8_value;
+}
+
+BOOL mculib_i2c_write_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT8 u8_value)
+{
+    BOOL result = 0;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_value))
+        goto STOP;
+
+    result = TRUE;
+
+STOP:
+    _i2c_stop();
+    return result;
+}
+
+#if 1
+VOID mculib_i2c_burstread_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+{
+    UINT16 i;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    for (i = 0; i < (u16_length-1); i ++)
+    {
+        *pu8_value++ = _i2c_read_byte(0);
+    }
+
+    *pu8_value = _i2c_read_byte(1);
+
+STOP:
+    _i2c_stop();
+}
+
+VOID mculib_i2c_burstwrite_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+{
+    UINT16 i;
+
+   _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    for(i = 0; i< (u16_length-1); i ++)
+    {
+        if (!_i2c_write_byte(*pu8_value++))
+            goto STOP;
+    }
+
+    if (!_i2c_write_byte(*pu8_value))
+        goto STOP;
+
+STOP:
+    _i2c_stop();
+}
+#endif
+
+#if (USER_SAVE == USER_SAVE_EEPROM)
+// 8-bit index fro eeprom AT24C02..
+UINT8 mculib_i2c_read_8bidx8bval(UINT8 u8_address, UINT8 u8_index)
+{
+    UINT8 u8_value = 0;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_index))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    u8_value = _i2c_read_byte(1);
+
+STOP:
+    _i2c_stop();
+    return u8_value;
+}
+
+BOOL mculib_i2c_write_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_value)
+{
+    BOOL result =0;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_index))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_value))
+        goto STOP;
+
+    result = 1;
+
+STOP:
+    _i2c_stop();
+    return result;
+}
+
+VOID mculib_i2c_burstread_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length, UINT8 *pu8_value)
+{
+    UINT8 i;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_index))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    for (i = 0; i < (u8_length-1); i ++)
+    {
+        *pu8_value++ = _i2c_read_byte(0);
+    }
+
+    *pu8_value = _i2c_read_byte(1);
+
+STOP:
+    _i2c_stop();
+}
+
+VOID mculib_i2c_burstread_8bidx8bval_ext(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length)
+{
+    UINT8 i;
+    //UINT8 read_falg;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_index))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    for (i = 0; i < (u8_length-1); i ++)
+    {
+       //read_falg= _i2c_read_byte(0);
+      // if(i==0)
+       // mculib_uart_log1("read_falg=",read_falg);
+    }
+
+    _i2c_read_byte(1);
+
+STOP:
+    _i2c_stop();
+}
+
+BOOL mculib_i2c_write_blank(UINT8 u8_address, UINT8 u8_index)
+{
+    BOOL result = 0;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_index))
+        goto STOP;
+
+    result = 1;
+
+STOP:
+    ///_i2c_stop();
+    return result;
+}
+
+
+VOID mculib_i2c_burstwrite_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length, UINT8 *pu8_value)
+{
+    UINT8 i;
+
+   _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u8_index) ))
+        goto STOP;
+
+    for(i = 0; i< (u8_length-1); i ++)
+    {
+        if (!_i2c_write_byte(*pu8_value++))
+            goto STOP;
+    }
+
+    if (!_i2c_write_byte(*pu8_value))
+        goto STOP;
+
+STOP:
+    _i2c_stop();
+}
+#endif
+
+#if 0
+// 16-bit index for eeprom AT24C04..
+UINT8 mculib_i2c_read_eeprom_16bidx8bval(UINT8 u8_address, UINT16 u16_index)
+{
+    UINT8 u8_value = 0;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    u8_value = _i2c_read_byte(TRUE);
+
+STOP:
+    _i2c_stop();
+    return u8_value;
+}
+
+BOOL mculib_i2c_write_eeprom_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT8 u8_value)
+{
+    BOOL result = FALSE;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    if (!_i2c_write_byte(u8_value))
+        goto STOP;
+
+    result = TRUE;
+
+STOP:
+    _i2c_stop();
+    return result;
+}
+
+VOID mculib_i2c_burstread_eeprom_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+{
+    UINT16 i;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    _i2c_start();
+
+    if (!_i2c_write_byte(u8_address | 0x01))
+        goto STOP;
+
+    for (i = 0; i < (u16_length-1); i ++)
+    {
+        *pu8_value++ = _i2c_read_byte(FALSE);
+    }
+
+    *pu8_value = _i2c_read_byte(TRUE);
+
+STOP:
+    _i2c_stop();
+}
+
+VOID mculib_i2c_burstwrite_eeprom_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+{
+    UINT16 i;
+
+   _i2c_start();
+
+    if (!_i2c_write_byte(u8_address))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index >> 8) ))
+        goto STOP;
+
+    if (!_i2c_write_byte( (UINT8)(u16_index) ))
+        goto STOP;
+
+    for(i = 0; i< (u16_length-1); i ++)
+    {
+        if (!_i2c_write_byte(*pu8_value++))
+            goto STOP;
+    }
+
+    if (!_i2c_write_byte(*pu8_value))
+        goto STOP;
+
+STOP:
+    _i2c_stop();
+}
+#endif
+
+#if 0
+//general I2C interfalce
+VOID mculib_i2c_rw_register(MS_I2CX_RW_REGISTER_T *pst_i2cx_to_register)
+{
+    UINT16 u16_i = 0;
+
+    if (pst_i2cx_to_register == NULL || pst_i2cx_to_register->p_u8_addr_buffer == NULL)
+    {
+        return;
+    }
+
+    _i2c_start();
+
+    _i2c_write_byte(*(pst_i2cx_to_register->p_u8_addr_buffer) & 0xfe);
+
+    for (u16_i = 0; u16_i < pst_i2cx_to_register->u8_addr_num - 1; u16_i++)
+    {
+        _i2c_write_byte(*(pst_i2cx_to_register->p_u8_addr_buffer + u16_i + 1));
+    }
+
+    if (pst_i2cx_to_register->u16_i2c_write_bytes_num != 0)
+    {
+        if ((pst_i2cx_to_register->p_u8_i2c_write_buffer == NULL))
+        {
+            return;
+        }
+        for (u16_i = 0; u16_i < pst_i2cx_to_register->u16_i2c_write_bytes_num; u16_i++)
+        {
+            _i2c_write_byte(*(pst_i2cx_to_register->p_u8_i2c_write_buffer + u16_i));
+        }
+    }
+
+    if (pst_i2cx_to_register->u16_i2c_read_bytes_num == 0)
+    {
+        _i2c_stop();
+    }
+    else
+    {
+        if ((pst_i2cx_to_register->p_u8_i2c_read_buffer == NULL))
+        {
+            return;
+        }
+
+        _i2c_start();
+        _i2c_write_byte(*(pst_i2cx_to_register->p_u8_addr_buffer) | 0x01);
+
+        for (u16_i = 0; u16_i < pst_i2cx_to_register->u16_i2c_read_bytes_num; u16_i++)
+        {
+            if (u16_i < pst_i2cx_to_register->u16_i2c_read_bytes_num - 1)
+            {
+                *(pst_i2cx_to_register->p_u8_i2c_read_buffer + u16_i) = _i2c_read_byte(FALSE);
+            }
+            else
+            {
+                *(pst_i2cx_to_register->p_u8_i2c_read_buffer + u16_i) = _i2c_read_byte(TRUE);
+            }
+        }
+
+        _i2c_stop();
+    }
+}
+#endif
+

+ 395 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/TaskProcessCom.c

@@ -0,0 +1,395 @@
+#include "TaskProcessCom.h"
+#include "IIC_Hardware.h"
+#include "IIC_Software.h"
+#include "IIC2_Software.h"
+#include "ch32x035_usbpd.h"
+#include "tmos.h"
+//#include "sgm452.h"
+//#include "sgm832.h"
+
+
+
+#define KEY_ADC_DET                           0x0001
+#define CHECK_TOUCH_INT_EVT                   0x0002
+#define USB_HID_DEBUG_EVT                     0x0004
+#define RESET_TOUCH_CHIP_EVT                  0x0008
+#define CHECK_USB_CONNECT_EVT                 0x0010
+#define HDMI_RX_DET                           0x0020
+#define LED_DET                               0x0040
+#define TEMPTURE_DET                          0x0080
+#define POWER_DET                             0x0100
+
+static UINT16 Task_ProcessEvent( UINT8 task_id, UINT16 events );
+static UINT8 TaskID = INVALID_TASK_ID;
+
+UINT8 GT_CMD_WR;
+UINT8 GT_CMD_RD;
+
+CHIP_TYPE ChipType;
+BOOL enable_INT_irq;
+BOOL enable_ESD_check;
+//UINT8 HearBeatCheckTimer;
+//BOOL GioInterruptFlag;
+UINT8 ShareBuf[10];
+//UINT8 NoTouchTimer = 0;
+UINT8 DeviceMode  = DEVICE_MODE_MOUSE;
+//UINT8 BleDeviceMode  = DEVICE_MODE_MULTITOUCH;
+//UINT16 Press_Flag,Press_Flag_Bak0, Press_Flag_Bak1, Press_Flag_Bak2,Press_Flag_Bak3;
+UINT8 Uart1IdleTime = 0;
+//BOOL BleReportFirst = FALSE;
+BOOL ReleaseFlag = 0;
+
+
+//adc key
+//extern u32 timems;
+
+
+void (*TouchProc)(void);
+
+
+#ifdef UART_ENABLE
+UINT8 TxBuff[16];
+UINT8 RxBuff[10];
+BOOL UartReportPosEn = TRUE;
+volatile BOOL UsbReportPosEn = FALSE;
+BOOL BleReportPosEn = TRUE;
+#endif
+
+
+
+void TIM4_Init( uint16_t arr, uint16_t psc )
+{
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = { 0 };
+    NVIC_InitTypeDef NVIC_InitStructure = { 0 };
+
+    /* Enable Timer4 Clock */
+    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
+
+    /* Initialize Timer4 */
+    TIM_TimeBaseStructure.TIM_Period = arr;
+    TIM_TimeBaseStructure.TIM_Prescaler = psc;
+    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+    TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure );
+
+    TIM_ITConfig( TIM4, TIM_IT_Update, ENABLE );
+
+    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init( &NVIC_InitStructure );
+
+    TIM_Cmd( TIM4, ENABLE );
+}
+
+/* Interrupt Function Declaration */
+void TIM4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+void TIM4_IRQHandler( void )
+{
+    if( TIM_GetITStatus( TIM4, TIM_IT_Update ) != RESET )
+    {
+        //g_u16_timer_out++;
+        //video_process();
+        TIM_ClearITPendingBit( TIM4, TIM_IT_Update );
+    }
+}
+
+
+//TIM3_Init(1, SystemCoreClock / 10000 - 1 );
+void TIM3_Init( uint16_t arr, uint16_t psc )
+{
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = { 0 };
+    NVIC_InitTypeDef NVIC_InitStructure = { 0 };
+
+    /* Enable Timer3 Clock */
+    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
+
+    /* Initialize Timer3 */
+    TIM_TimeBaseStructure.TIM_Period = arr;
+    TIM_TimeBaseStructure.TIM_Prescaler = psc;
+    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure );
+
+    TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE );
+
+    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init( &NVIC_InitStructure );
+
+    /* Enable Timer3 */
+    TIM_Cmd( TIM3, ENABLE );
+}
+
+/* Interrupt Function Declaration */
+void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+void TIM3_IRQHandler( void )
+{
+    if( TIM_GetITStatus( TIM3, TIM_IT_Update ) != RESET )
+    {
+        //timems++;
+        //video_process(); //sea debug
+        ms933x_media_service();
+        //key_service();
+        //AdcKeyScanAndProcess();
+        //osd_service();
+        //printf("timems= %d\n",timems);
+        //g_u16_timer_out++; //sea
+        TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
+    }
+}
+
+
+void IICTouchInit()
+{
+  //娉ㄥ唽浜嬩欢澶勭悊鍑芥暟
+  TaskID = TMOS_ProcessEventRegister(Task_ProcessEvent);
+  //澶嶄綅鑺墖
+  InitChipStartTask();
+  //GioInterruptFlag = FALSE;
+  //TIM3_Init( 100-1, 9600-1 ); //10ms
+
+  //TIM3_Init( 500-1, 9600-1 ); //50ms
+
+//  TIM3_Init( 40, SystemCoreClock / 1018 - 1 );
+}
+
+static UINT16 Task_ProcessEvent( UINT8 task_id, UINT16 events )
+{
+    if(events & HDMI_RX_DET)
+    {
+      //USART1_ReceData();
+      //printf("[EVENT]: HDMI_RX_DET\n");
+      //video_process();
+      //ms933x_media_service();
+      events ^= HDMI_RX_DET;
+      tmos_start_task(task_id, HDMI_RX_DET, PERIO_10ms ); //sea
+      //fill_picture(0xFF);
+      goto OUT_FUMC;
+    }
+
+    //TEMPTURE_DET task
+    if(events & TEMPTURE_DET)
+    {
+      //printf("[EVENT]: TEMPTURE_DET\n");
+      //sgm452_T6710_Proc();
+      //sgm452_T1826_Proc();
+      events ^= TEMPTURE_DET;
+      tmos_start_task(task_id, TEMPTURE_DET, PERIO_500ms );
+      goto OUT_FUMC;
+    }
+
+    //POWER_DET task
+    if(events & POWER_DET)
+    {
+      //printf("[EVENT]: POWER_DET\n");
+      //sgm832_Power_detect_Proc_Bl();
+      //sgm832_Power_detect_Proc_Sys();
+      events ^= POWER_DET;
+      tmos_start_task(task_id, POWER_DET, PERIO_800ms );
+      goto OUT_FUMC;
+    }
+
+    if(events & RESET_TOUCH_CHIP_EVT)
+    {
+      printf("[EVENT]: RESET_TOUCH_CHIP_EVT\n");
+      //InitChipStartTask();
+      events ^= RESET_TOUCH_CHIP_EVT;
+      //tmos_set_event(task_id, RESET_TOUCH_CHIP_EVT);
+      goto OUT_FUMC;
+    }
+
+    return 0;
+
+OUT_FUMC:
+
+    return  events;
+}
+
+
+void InitChipStartTask()
+{
+  enable_INT_irq = FALSE;
+  enable_ESD_check = FALSE;
+  //tmos_stop_task(TaskID, CHECK_TOUCH_INT_EVT);
+
+//ms1826a chip setting
+  //MS1826A_IIC_Init();
+  //printf("[task]: MS1826A iic start.\n");
+
+//ms933x chip setting
+  //libs auto write iic address 0xB2, no need set it
+  ms933x_init();
+  //tmos_start_task(TaskID, HDMI_RX_DET, PERIO_10ms );
+  //printf("[task]: ms933x start.\n");
+
+//sgm452 chip setting
+  //sgm452_GPIO_I2cChannel_Init();
+  //tmos_start_task(TaskID, TEMPTURE_DET, PERIO_500ms );
+  //printf("[task]: SGM452 start.\n");
+
+//sgm832 chip setting
+  //sgm832_GPIO_I2cChannel_Init();
+  //tmos_start_task(TaskID, POWER_DET, PERIO_800ms );
+  //printf("[task]: SGM832 start.\n");
+
+//keyADC setting
+  //KeyADC_GPIO_Init();
+  //tmos_start_task(TaskID, KEY_ADC_DET, PERIO_50ms );
+  //printf("[GPIO]: KeyADC start.\n");
+
+//Led setting
+  //LED_GPIO_Init();
+//CH444G setting
+  //CH444G_GPIO_Init();
+  //printf("[GPIO]: LED & CH444G start.\n");
+
+  Delay_Ms(80);
+
+  //(200);
+  {
+    ChipType = CHIP_TYPE_MS1826A;
+    //sea fix ms1826A_TaskStart();
+    //printf("[task]: Ms1826a start.\n");
+    //printf("[IICADDR]: IIC Address:%x\n", GT_CMD_WR);
+    //tmos_start_task(TaskID, CHECK_TOUCH_INT_EVT, 2 );
+  }
+
+  //EXTI_InitTypeDef EXTI_InitStructure = { 0 };
+
+  /* Enable GPIOB clock */
+  //RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
+  //GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource1 );
+  //EXTI_InitStructure.EXTI_Line = EXTI_Line1;
+  //EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
+  //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
+  //EXTI_InitStructure.EXTI_LineCmd = ENABLE;
+  //EXTI_Init( &EXTI_InitStructure );
+
+  //EXTI->INTENR |= EXTI_INTENR_MR1;
+
+   //enable_INT_irq = TRUE;
+   //enable_ESD_check = TRUE;
+}
+
+//fix todo list:鏌ヨ鎵�鏈夌殑iic 璁惧鍦板潃
+BOOL SearchAddress( UINT8 num )
+{
+  u8 ret1=0;
+  u8 ret2=0;
+  while(--num)
+  {
+    //#define
+    u8 GT_CMD_WR = 0x78;
+    //if(Check_I2C_Address(GT_CMD_WR)) //fix
+    ret1 = IIC_Check_Address(GT_CMD_WR);
+    ret2 = IIC2_Check_Address(GT_CMD_WR);
+    if(ret1 && ret2)
+    {
+        //printf("[IICADDR]: IIC Address Success:%x\n", GT_CMD_WR);
+        return TRUE;
+    }
+    else
+    {
+      if(!ret1)
+      {
+        //printf("[IICADDR]: IIC Address fail !!!");
+      }
+      if(!ret2)
+      {
+        //printf("[IICADDR]: IIC2 Address fail !!!");
+      }
+      return FALSE;
+
+    }
+    // if(IIC2_Check_Address(GT_CMD_WR))
+    // {
+    //     printf("[IICADDR]: IIC2 Address Success:%x\n", GT_CMD_WR);
+    //     return TRUE;
+    // }
+  }
+  return FALSE;
+}
+
+// static void SetTouchEvent()
+// {
+//   if(ChipType == CHIP_TYPE_MS1826A)
+//   {
+//      ms1826A_SetIntEvent();
+//   }
+// }
+
+//void CheckTouchInt()
+//{
+//    if( (EXTI_GetFlagStatus( EXTI_Line1 ) != RESET) && (!DisableDigiterInterface))
+//    {
+//        if(enable_INT_irq)
+//        {
+//          // if(!IsUsbBusy())
+//          // {
+//          //   SetTouchEvent();
+//          // }
+//        }
+//
+//        EXTI_ClearFlag( EXTI_Line1 );
+//
+//        return;
+//    }
+//}
+
+#if 1//UART_ENABLE
+// void USART4_SendData(PUINT8 txbuf, UINT16 length)
+// {
+//     UINT8 TxCnt = 0;
+
+//     while(TxCnt < length)
+//     {
+//         //printf("TxCnt:%d\r\n", TxCnt);
+//         USART_SendData(USART2, txbuf[TxCnt++]);
+//         while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
+//         {
+//             /* waiting for sending finish */
+//         }
+//     //        while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
+//     //        {
+//     //            /* waiting for receiving finish */
+//     //        }
+//     //        RxBuffer[RxCnt++] = (USART_ReceiveData(USART2));
+
+//         //printf("TxCnt:%d\r\n", TxCnt);
+//     }
+// }
+
+void CheckUsbStatus()
+{
+  // if(DeviceMode == DEVICE_MODE_MULTITOUCH)
+  // {
+  //     USBFS_EP1_Buf[0] = 0;
+  //     USBFSD->UEP1_TX_LEN  = 0;
+  //     USBFSD->UEP1_CTRL_H = (USBFSD->UEP1_CTRL_H & ~ USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_ACK;
+  // }
+  // else
+  // {
+  //     USBFSD->UEP3_TX_LEN  = 0;
+  //     USBFSD->UEP3_CTRL_H = (USBFSD->UEP3_CTRL_H & ~ USBFS_UEP_T_RES_MASK) | USBFS_UEP_T_RES_ACK;
+  // }
+  // fill_picture(0x0F);
+}
+
+__attribute__((section(".highcode")))
+UINT16 PosReverse(UINT16 pos, UINT16 res)
+{
+  if(pos < res)
+    pos = res - pos;
+  else
+    pos  = 0;
+
+  return pos;
+}
+
+
+
+#endif

+ 46 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/ch32v30x_it.c

@@ -0,0 +1,46 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : ch32v30x_it.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/03/05
+* 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 "ch32v30x_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)
+  {
+  }
+}
+
+

+ 148 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/main.c

@@ -0,0 +1,148 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name          : main.c
+ * Author             : Wingcool
+ * Version            : V1.0.0
+ * Date               : 2024/01/05
+ * Description        : Main program body.
+ *********************************************************************************/
+
+#include "TaskProcessCom.h"
+//#include <ch32x035_usbfs_device.h>
+#include "debug.h"
+#include "tmos.h"
+
+//#include "sgm452.h"
+//#include "sgm832.h"
+#include "uart_ht7315.h"
+
+// void GPIOInit()
+// {
+//     GPIO_InitTypeDef GPIO_InitStructure = {0};
+//     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+//     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
+//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+//     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+//     GPIO_Init(GPIOB, &GPIO_InitStructure);
+// }
+
+/*********************************************************************
+ * @fn      IWDG_Init
+ *
+ * @brief   Initializes IWDG.
+ *
+ * @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.
+ *          Reload: specifies the IWDG Reload value.
+ *            This parameter must be a number between 0 and 0x0FFF.
+ *
+ * @return  none
+ */
+void IWDG_Feed_Init(u16 prer, u16 rlr)
+{
+    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
+    IWDG_SetPrescaler(prer);
+    IWDG_SetReload(rlr);
+    IWDG_ReloadCounter();
+    IWDG_Enable();
+}
+
+void GPIO_Toggle_INIT(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+}
+
+int main(void)
+{
+    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
+    SystemCoreClockUpdate();
+    //tmos_init();
+
+    Delay_Init();
+    //USART_Printf_Init(115200);
+    USART_Printf_Init(9600);
+
+    printf("\n[Start]: ====================>\n");
+    printf("[SystemClk]: %lu\r\n", SystemCoreClock);  //defalut 96Mhz
+    printf( "[ChipID]: %08x\r\n", (unsigned int)DBGMCU_GetCHIPID() );
+
+
+#ifdef USBCONFIG
+    //ConfigInit();
+#endif
+    //CheckFlag();
+
+//**--[Uart2 Init]--//
+    //Uart2_Rs232_GPIO_Init();
+    //printf("1.[Uart2 Init]: Ok! \n");
+
+//**--[Uart6710 Init]--//
+    //Uart_u6710_GPIO_Init();
+    //DMA_INIT();
+
+//**--[Usb Init]--//
+    //USBFS_RCC_Init( );
+    //USBFS_Device_Init( ENABLE , PWR_VDD_SupplyVoltage());
+    //USB_Sleep_Wakeup_CFG( );
+    //printf("2.[Usb Init]: Ok! \n");
+
+//**--[IIC Init]--//
+    IICTouchInit();
+    printf("3.[IIC Init]: Ok! \n");
+
+//**--[Display Init]--//
+    //OLED_Init();
+    //OLED_DisplayTest();
+    //printf("4.[Display Init]: Null! \n");
+
+//**--[SGM452 Init]--//
+    //sgm452_GPIO_I2cChannel_Init();
+    //sgm452_T6710_Proc();
+    //sgm452_T1826_Proc();
+    //printf("5.[SGM452 Init]: Ok! \n");
+
+//**--[sgm832 Init]--//
+    //sgm832_GPIO_I2cChannel_Init();
+    //printf("6.[SGM832 Init]: Ok! \n");
+
+//**--[Key Init]--//
+    //KeyADC_GPIO_Init();
+    //KeyLed_GPIO_Init();
+    //printf("7.[Key Init]: Ok! \n");
+
+    //IWDG_Feed_Init( IWDG_Prescaler_16, 3000 );
+
+    //UINT8 InitFlag = 0xAA;
+    //USART4_SendData(&InitFlag, 1);
+//**--[GG]--//
+
+    //printf("8.[IIC_Slave Init]: Ok! \n");
+    //IIC_Slave_Init( 400000, I2C1Adderss);
+    //printf("[End]: <========== \n");
+
+    while(1)
+    {
+        //IWDG_ReloadCounter();   //Feed dog
+        //TMOS_SystemProcess();
+        ms933x_media_service();
+        Delay_Ms(20);
+    }
+}

+ 118 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/mculib_common.c

@@ -0,0 +1,118 @@
+#include "mculib_common.h"
+#include "ch32v30x.h"
+#include "IIC_Software.h"
+#include "IIC2_Software.h"
+
+void mculib_chip_reset(void)
+{
+    MS933x_RST_GPIO_PP();
+    GPIO_WriteBit(GPIOC, MS933X_RST,  Bit_RESET);
+    Delay_Ms(2);
+    GPIO_WriteBit(GPIOC, MS933X_RST,  Bit_SET);
+    MS933x_RST_GPIO_IPU();
+    Delay_Ms(2);
+}
+
+void mculib_delay_ms(UINT8 u8_ms)
+{
+    Delay_Ms(u8_ms);
+}
+
+void mculib_delay_us(UINT8 u8_us)
+{
+    Delay_Us(u8_us);
+}
+
+
+// 16-bit index for macrosilicon chip
+//UINT8 mculib_i2c_read_16bidx8bval(UINT8 u8_address, UINT16 u16_index)
+//{
+//    UINT8 rBuf = 0;
+//
+//    IIC_Read_16bit_LE_MultiBytes(u8_address, u16_index, &rBuf, 1);
+//
+//    return rBuf;
+//}
+
+//BOOL mculib_i2c_write_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT8 u8_value)
+//{
+//  return IIC_Send_16bit_LE_MultiBytes(u8_address, u16_index, &u8_value, 1);
+//}
+
+//VOID mculib_i2c_burstread_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+//{
+//  IIC_Read_16bit_LE_MultiBytes(u8_address, u16_index, pu8_value, u16_length);
+//}
+
+//VOID mculib_i2c_burstwrite_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+//{
+//    if(u8_address == IIC_ADDR_MS1826)
+//        IIC2_Send_16bit_LE_MultiBytes(u8_address, u16_index, pu8_value, u16_length);
+//    else
+//        {
+//            IIC_Send_16bit_LE_MultiBytes(u8_address, u16_index, pu8_value, u16_length);
+//        }
+//}
+
+BOOL mculib_i2c_write_8bidx16bval(UINT8 u8_address, UINT8 u8_index, UINT16 u16_value)
+{
+    UINT8 rBuf = 0;
+    if(u8_address == IIC_ADDR_MS1826)
+        IIC2_Read_16bit_LE_MultiBytes(u8_address, u8_index, &rBuf, 1);
+    else
+        IIC_Read_16bit_LE_MultiBytes(u8_address, u8_index, &rBuf, 1);
+    return rBuf;
+}
+
+
+//********************************************************************************************
+//ms93xxx common function
+//********************************************************************************************
+// Set I2C Read/Write speed, it is best to set speed of HD DDC at about 20KHz, 否则可能会影响通信质量
+// u8_i2c_speed: I2C_SPEED_20K(0), I2C_SPEED_100K(1)
+//fix todo: need fix to set i2c speed
+//void  mculib_i2c_set_speed(UINT8 u8_i2c_speed)
+//{
+//  //need to set i2c speed
+//  if(u8_i2c_speed == 0)
+//  {
+//    u8_i2c_speed=0;
+//  }
+//  else if (u8_i2c_speed == 1)
+//  {
+//    u8_i2c_speed=1;
+//  }
+//}
+//8-bit index for HD EDID block 2-3 读取接口
+//如果用户无需过 HD CTS 认证,此函数实现可为空
+//BOOL mculib_i2c_write_blank(UINT8 u8_address, UINT8 u8_index)
+//{
+//  return 0;
+//}
+
+//void mculib_i2c_burstread_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length, UINT8 *pu8_value)
+//{
+//    if(u8_address == IIC_ADDR_MS1826)
+//        IIC2_Read_8bitMultiBytes(u8_address, u8_index, pu8_value, u8_length);
+//    else
+//        IIC_Read_8bitMultiBytes(u8_address, u8_index, pu8_value, u8_length);
+//}
+
+//标准字节读写接口
+//UINT8 mculib_i2c_read_8bidx8bval(UINT8 u8_address, UINT8 u8_index)
+//{
+//  UINT8 rBuf = 0;
+//  if(u8_address == IIC_ADDR_MS1826)
+//    IIC2_Read_8bitMultiBytes(u8_address, u8_index, &rBuf, 1);
+//  else
+//    IIC_Read_8bitMultiBytes(u8_address, u8_index, &rBuf, 1);
+//  return rBuf;
+//}
+
+//BOOL  mculib_i2c_write_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_value)
+//{
+//  if(u8_address == IIC_ADDR_MS1826)
+//    return IIC2_Send_8bitMultiBytes(u8_address, u8_index, &u8_value, 1);
+//  else
+//    return IIC_Send_8bitMultiBytes(u8_address, u8_index, &u8_value, 1);
+//}

+ 4336 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/ms933x/ms933x_app.c

@@ -0,0 +1,4336 @@
+#include "ms933x_comm.h"
+#include "ms933x.h"
+#include "ms933x_app.h"
+#include "ms933x_edid.h"
+extern void mculib_i2c_init(void);
+
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+//user function define
+
+//#define MS933X_DRV_API
+#define MS933X_CHIP                 (MS9332_CHIP)
+
+#define RX_HDCP_SUPPORT_ENABLE      (1) //suggest enable
+#define TX_HDCP_SUPPORT_ENABLE      (1) //
+
+//if need support hdcp repeater function, pls set to 1
+#define HDCP_RPT_SUPPORT_ENABLE     (0)
+
+
+//ms933x hdmi network cable board config
+//source->net_hdmi_tx_board->long_network_cable->net_hdmi_rx_board->sink
+#define MS933X_HDMI_NET_CABLE_TX_ENABLE     (0) //net_hdmi_tx_board
+#define MS933X_HDMI_NET_CALBE_RX_ENABLE     (0) //net_hdmi_rx_board, normal use ms9331 chip on the board.
+
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+
+#define MS933X_SDK_VERSION  "MS933XC_1TO2&4_DEMO_MS8006_V2.3.3_250409"
+
+#define g_u16Timer          (50)  //unit ms, g_u16Timer must >= 20.
+
+//auto judge source color space(YUV444/YUV422) and sink capability. if sink not support, fixed convert to RGB.
+//net_hdmi_tx_board do not needed.
+#define HDMI_VIDEO_CSC_AUTO_ENABLE              (!MS933X_HDMI_NET_CABLE_TX_ENABLE)
+
+//if support hdcp_repeater, must disable. else suggest enable this function.
+#define HDMI_RX_HPD_DELAY_OFF_ENABLE            (!HDCP_RPT_SUPPORT_ENABLE)
+
+#define HDMI_RX_TMDS_ERROR_SERVICE_ENABLE       (1) //when rx tmds data error, reconfig rx_phy
+
+#define HDMI_RX_TIMING_ERROR_SERVICE_ENABLE     (0) //when rx timing unstable timeout, toggle rx_hpd
+
+//0: process cts change immediately; 1: process cts change when audio fifo over/under flow.
+#define HDMI_RX_AUDIO_CTS_CHNAGE_HANDEL_MODE    (0)
+
+//when tx hdcp failed, whether need to retry. if support hdcp_repeater, must enable
+#define HDMI_TX_HDCP_RETRY_ENABLE               (HDCP_RPT_SUPPORT_ENABLE)
+
+//
+#define HDMI_SPD_INFO_CTRL_ENABLE               (0) //spd infoframe support
+
+//
+#define HDMI_RX_CLK_INT_ENABLE                  (1) //used
+
+#define HDMI_RX_MDT_INT_ENABLE                  (0) //unsupport
+
+#define HDMI_RX_PKT_INT_ENABLE                  (0) //unsupport
+
+//
+#define HDMI_TX_TMDS_AUTO_CTRL_ENABLE           (1) //when rx_tmds_clk change, chip auto disable hdmi_tx tmds.
+
+//if not net_hdmi_rx_board. must set to 0
+#define HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE    (MS933X_HDMI_NET_CALBE_RX_ENABLE)
+
+//if not net_hdmi_rx_board. must set to 0
+#define HDMI_RX_ERROR_COUNTER_DEBUG_ENABLE      (MS933X_HDMI_NET_CALBE_RX_ENABLE)
+
+#define HDMI_RX_TIMING_PARSE_ENABLE             (0)
+//
+#define MS933X_SLAVER_I2C_ERROR_SERVICE_ENABLE  (0) //mculib_i2c accress MS933X NACK error service. when occur, Hardware PIN_reset to MS933X.
+//
+#define MS933X_TX_DDC_ERROR_SERVICE_ENABLE      (1) //when occur tx ddc error, Hardware PIN_reset to MS933X
+
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+
+#define MS9331_CHIP         (0x81)
+#define MS9332_CHIP         (0x09)
+#define MS9333_CHIP         (0x89)
+#define MS9334_CHIP         (0x0F)
+#define MS9330_CHIP         (0x8F) //for test_chip only
+
+#define SYS_HDMI_TX_CHN_EN              (MS933X_CHIP & 0x0F)
+
+#define SYS_AUDIO_PAD_OUTPUT_ENABLE     (MS933X_CHIP & 0x80) //i2s and spdif pad output function enable
+
+#define HDMI_TX_CHN_NUM     (4)
+#define HDMI_TX_SH_CHN_NUM  (4)
+
+#define DEBUG_EDID_FILE_SAVE    (0)
+
+//
+static VIDEOTIMING_T g_st_hdmi_in_timing;
+
+#define TMDS_CLK_VALID(clk)           (clk >= 500)  //5MHz
+#define TMDS_CLK_MARGIN(clk, clk_tmp) (xabs(clk, clk_tmp) > (clk / (100 / 5))) //5%
+
+static UINT16 g_u16_input_tmds_clk = 0;
+
+BOOL g_b_hdmi_input_valid = FALSE;
+
+UINT8 g_u8_source_5v_connect;
+UINT8 g_u8_sink_hpd_connect[HDMI_TX_CHN_NUM];
+
+static HDMI_CONFIG_T g_st_hdmi_timing;
+
+#if RX_HDCP_SUPPORT_ENABLE
+static UINT8 g_u8_rx_hdcp_support = TRUE;       //user_define must enable this function
+static UINT8 g_u8_tx_hdcp_support = TRUE;       //user_define must enable this function
+#endif
+
+#if HDCP_RPT_SUPPORT_ENABLE
+static UINT8 g_u8_hdcp_repeater_support = TRUE; //user_define must enable this function
+#endif
+
+//for debug mode
+static UINT8 g_u8_tx_chn_enable_flag = SYS_HDMI_TX_CHN_EN;//bit0: chn0 enable, bit1: chn1 enable...
+static UINT8 g_u8_tx_hpd_test_flag = 0x00;//bit0: chn0 force output, bit1: chn1 force output...
+static UINT8 g_u8_rx_hpd_test_flag = TRUE;//FALSE; //fixed set RX HPD true and rx edid use default edid
+//static UINT8 g_u8_hdmi_rxpll_error_counter_test_flag = FALSE; //enable hdmi rxpll error counter serivce
+//static UINT8 g_u8_hdmi_tx_shell_timing_stable_test_flag = FALSE; //enable hdmi tx shell timing stable service
+
+#define MS933X_APP_LOG1_ENABLE              (1) //app detailed log printf enable
+
+static UINT8 g_u8_hdmi_in_timing_log_enable = MS933X_APP_LOG1_ENABLE; //enable hdmi input timing log printf.
+
+
+#define RXPLL_ERROR_MAX (0x20)
+#define RXPLL_ERROR_MID (0x10)
+#define RXPLL_ERROR_MIN (0x02)
+
+
+#define SYSTEM_ERROR_TIMEOUT_1S (1000 / g_u16Timer) //1000ms
+#define SYSTEM_ERROR_TIMEOUT_10S (3000 / g_u16Timer) //3s
+static UINT8 g_u8_system_error_service_flag = FALSE;
+static UINT8 g_u8_system_error_timer_count_1s = 0;
+static UINT8 g_u8_system_error_timer_count_10s = 0;
+static UINT8 g_u8_system_error_flag = 0; //bit0: rxpll unlock; bit1: rxpll error; bit2: hdmi shell unstable
+static UINT8 g_u8_system_error_action_flag = 0; //record system error, count hpd toggle times
+
+
+#define CHIP_VALID_CHECK_TIMEOUT (3000 / g_u16Timer) //3000ms
+static UINT8 g_u8_chip_valid_check_timer_count = 0;
+
+#define HDMI_SHELL_ERROR_TIMEOUT (500 / g_u16Timer) //500ms
+static UINT8 g_u8_hdmi_shell_error_timer_count = 0;
+
+#define HDMI_TX_HPD_DET_TIMEOUT (100 / g_u16Timer) //100ms
+#define HDMI_RX_HPD_OFF_TIMEOUT (14) //1400ms
+static UINT8 g_u8_hdmi_tx_hpd_detect_count = 0;
+static UINT8 g_u8_hdmi_rx_hpd_off_count = HDMI_RX_HPD_OFF_TIMEOUT;
+
+static UINT8 g_u8_tx_ddc_error_flag = 0x00;//bit0: tx0 error, bit1: tx1 error error...
+
+#define RX_HDCP_TIMEOUT (200 / g_u16Timer) //200ms
+static UINT8 g_u8_rx_hdcp_timer_count = 0;
+static UINT8 g_u8_rx_hdcp_woking_flag = FALSE;
+static UINT8 g_u8_rx_hdcp_aksv_be_writed_flag = 0;
+
+
+#define TX_HDCP_TIMEOUT (3000 / g_u16Timer) //3000ms
+
+#if HDCP_RPT_SUPPORT_ENABLE
+#define TX_HDCP_START_TIME ((3000 - 100)  / g_u16Timer) //100ms
+#define TX_HDCP_R0_START_TIME ((3000 - 150)  / g_u16Timer) //150ms
+#else
+#define TX_HDCP_START_TIME ((3000 - 800)  / g_u16Timer) //800ms
+#define TX_HDCP_R0_START_TIME ((3000 - 200)  / g_u16Timer) //200ms
+#endif
+
+static UINT8 g_u8_tx_hdcp_timer_count_buf[HDMI_TX_CHN_NUM];
+static UINT8 g_u8_tx_hdcp_process_flag_buf[HDMI_TX_CHN_NUM];
+static UINT8 g_u8_tx_hdcp_init_flag_buf[HDMI_TX_CHN_NUM];
+static UINT8 g_u8_tx_hdcp_enable_flag_buf[HDMI_TX_CHN_NUM];
+static UINT8  g_u8_tx_hdcp_verify_first_R0_flag_buf[HDMI_TX_CHN_NUM];
+
+
+#define TX_HDCP_RETRY_START_TIME    ((3000 - 2000)  / g_u16Timer) //2000ms
+
+
+#define TX_HDCP_PORT_SRC_TIMEOUT (200 / g_u16Timer) //200ms
+static UINT8 g_u8_tx_hdcp_port_service_timer_count = 0;
+
+#define HDCP_REPEATER_SRC_TIMEOUT (100 / g_u16Timer) //100ms
+static UINT8 g_u8_hdcp_rpt_service_timer_count = 0;
+
+#define HDCP_REPEATER_READY_TIMEOUT (40) //4000ms
+static UINT8 g_u8_hdcp_rpt_ready_timer_count = 0;
+
+static UINT8 g_u8_rxpll_configed_status = 0;
+
+#define MDT_CHANGE_TIMEOUT (2 + (50 / g_u16Timer)) //150ms. at leset polling 2times
+static UINT8 g_u8_mdt_change_timer_count = 0;
+
+
+static BOOL g_b_hdmi_rx_audio_cts_change_flag = FALSE;
+
+
+#define RX_PACKET_TIMEOUT (100 / g_u16Timer) //100ms
+static UINT8  g_u8_rx_packet_timer_count = 0;
+
+static BOOL   g_b_rx_gcp_avmute_flag = FALSE;
+
+//static UINT8  g_u8_rx_hpd_flag = 0;
+static UINT8  g_u8_sys_edid_flag = 0xff;  //none edid value
+static HDMI_EDID_FLAG_T g_st_hdmi_edid_flag[HDMI_TX_CHN_NUM + 1];
+static UINT8  g_u8_sys_edid_used_buf[512];
+static UINT8  g_u8_sys_edid_buf[512];
+static UINT8  g_u8_sys_edid_buf_last_id = 0xff;
+static UINT32 g_u32_hdmi_sink_min_timing = 0xFFFFFFFFUL;
+static UINT32 g_u32_dvi_sink_min_timing = 0xFFFFFFFFUL;
+
+#define HDMI_TX_DEFAULT_EDID_ID HDMI_TX_CHN_NUM
+
+
+//
+UINT8 g_u8_hdmi_tx_drive_mode = 2;
+//
+#define INPUT_INVALID_TIMEOUT_1S    (1000 / g_u16Timer)     //1000ms
+#define INPUT_INVALID_TIMEOUT       (2000 / g_u16Timer)     //2000ms
+static UINT8 g_u8_input_invalid_timer_count = 0;
+
+#define RXPHY_ERROR_TIMEOUT         (3000 / g_u16Timer)     //3000ms
+static UINT8 g_u8_rxphy_error_timer_count = 0;
+
+static UINT8 g_u8_ms933xc_version_flag = 0;
+
+
+/* 4K EDID
+static UINT8 __CODE u8_sys_edid_default_buf[256] =
+{
+    // Explore Semiconductor, Inc. EDID Editor V2
+    0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,   // address 0x00
+    0x4C, 0x2D, 0xFF, 0x0D, 0x58, 0x4D, 0x51, 0x30,   //
+    0x1C, 0x1C, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,   // address 0x10
+    0x2A, 0x5F, 0xB1, 0xA2, 0x57, 0x4F, 0xA2, 0x28,   //
+    0x0F, 0x50, 0x54, 0xBF, 0xEF, 0x80, 0x71, 0x4F,   // address 0x20
+    0x81, 0x00, 0x81, 0xC0, 0x81, 0x80, 0x95, 0x00,   //
+    0xA9, 0xC0, 0xB3, 0x00, 0x01, 0x01, 0x04, 0x74,   // address 0x30
+    0x00, 0x30, 0xF2, 0x70, 0x5A, 0x80, 0xB0, 0x58,   //
+    0x8A, 0x00, 0x60, 0x59, 0x21, 0x00, 0x00, 0x1E,   // address 0x40
+    0x00, 0x00, 0x00, 0xFD, 0x00, 0x18, 0x4B, 0x1E,   //
+    0x5A, 0x1E, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20,   // address 0x50
+    0x20, 0x20, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x55,   //
+    0x32, 0x38, 0x48, 0x37, 0x35, 0x78, 0x0A, 0x20,   // address 0x60
+    0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xFF,   //
+    0x00, 0x48, 0x54, 0x50, 0x4B, 0x37, 0x30, 0x30,   // address 0x70
+    0x30, 0x35, 0x31, 0x0A, 0x20, 0x20, 0x01, 0x57,   //
+    0x02, 0x03, 0x26, 0xF0, 0x4B, 0x5F, 0x10, 0x04,   // address 0x80
+    0x1F, 0x13, 0x03, 0x12, 0x20, 0x22, 0x5E, 0x5D,   //
+    0x23, 0x09, 0x07, 0x07, 0x83, 0x01, 0x00, 0x00,   // address 0x90
+    0x6D, 0x03, 0x0C, 0x00, 0x10, 0x00, 0x80, 0x3C,   //
+    0x20, 0x10, 0x60, 0x01, 0x02, 0x03, 0x02, 0x3A,   // address 0xA0
+    0x80, 0x18, 0x71, 0x38, 0x2D, 0x40, 0x58, 0x2C,   //
+    0x45, 0x00, 0x60, 0x59, 0x21, 0x00, 0x00, 0x1E,   // address 0xB0
+    0x02, 0x3A, 0x80, 0xD0, 0x72, 0x38, 0x2D, 0x40,   //
+    0x10, 0x2C, 0x45, 0x80, 0x60, 0x59, 0x21, 0x00,   // address 0xC0
+    0x00, 0x1E, 0x01, 0x1D, 0x00, 0x72, 0x51, 0xD0,   //
+    0x1E, 0x20, 0x6E, 0x28, 0x55, 0x00, 0x60, 0x59,   // address 0xD0
+    0x21, 0x00, 0x00, 0x1E, 0x56, 0x5E, 0x00, 0xA0,   //
+    0xA0, 0xA0, 0x29, 0x50, 0x30, 0x20, 0x35, 0x00,   // address 0xE0
+    0x60, 0x59, 0x21, 0x00, 0x00, 0x1A, 0x00, 0x00,   //
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // address 0xF0
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8,   //
+};*/
+
+static UINT8 __CODE u8_sys_edid_default_buf[256] =
+{
+    // Explore Semiconductor, Inc. EDID Editor V2
+    0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,   // address 0x00
+    0x34, 0x23, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04,   //
+    0x01, 0x18, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,   // address 0x10
+    0xEF, 0xEE, 0x91, 0xA3, 0x54, 0x4C, 0x99, 0x26,   //
+    0x0F, 0x50, 0x54, 0x2D, 0xCF, 0x00, 0x81, 0x00,   // address 0x20
+    0x81, 0xC0, 0x81, 0x80, 0xD1, 0xC0, 0x01, 0x01,   //
+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1D,   // address 0x30
+    0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20, 0x6E, 0x28,   //
+    0x55, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00, 0x1E,   // address 0x40
+    0xF3, 0x39, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,   //
+    0x58, 0x2C, 0x45, 0x00, 0xC4, 0x8E, 0x21, 0x00,   // address 0x50
+    0x00, 0x1E, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x32,   //
+    0x55, 0x1E, 0x51, 0x11, 0x00, 0x0A, 0x20, 0x20,   // address 0x60
+    0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xFC,   //
+    0x00, 0x4D, 0x41, 0x43, 0x52, 0x4F, 0x53, 0x49,   // address 0x70
+    0x4C, 0x49, 0x43, 0x4F, 0x4E, 0x0A, 0x01, 0x1C,   //
+    0x02, 0x03, 0x1D, 0x41, 0x4A, 0x04, 0x1F, 0x02,   // address 0x80
+    0x90, 0x06, 0x11, 0x15, 0x14, 0x05, 0x13, 0x23,   //
+    0x09, 0x07, 0x07, 0x83, 0x01, 0x00, 0x00, 0x65,   // address 0x90
+    0x03, 0x0C, 0x00, 0x10, 0x00, 0x02, 0x3A, 0x80,   //
+    0x18, 0x71, 0x38, 0x2D, 0x40, 0x58, 0x2C, 0x45,   // address 0xA0
+    0x00, 0xDD, 0x0C, 0x11, 0x00, 0x00, 0x1E, 0x01,   //
+    0x1D, 0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20, 0x6E,   // address 0xB0
+    0x28, 0x55, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00,   //
+    0x1E, 0x8C, 0x0A, 0xD0, 0x8A, 0x20, 0xE0, 0x2D,   // address 0xC0
+    0x10, 0x10, 0x3E, 0x96, 0x00, 0x10, 0x09, 0x00,   //
+    0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,   // address 0xD0
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   //
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // address 0xE0
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   //
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // address 0xF0
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6,   //
+};
+
+//
+static UINT8 g_u8_rx_hdcp_rpt_ready = 0;
+#if HDCP_RPT_SUPPORT_ENABLE
+static UINT8 g_u8_rx_hdcp_rpt_dev_count = 0;
+static UINT8 g_u8_rx_hdcp_rpt_dev_depth = 0;
+static UINT8 g_u8_hdcp_rpt_ksv_buf[MS933X_HDCP_RPT_KSV_FIFO_BYTE_MAX];
+#endif
+
+static UINT8 g_u8_tx_hdcp_repeater_flag_buf[HDMI_TX_CHN_NUM];
+
+//user define, if use for HDMI CTS hdcp repeater test, pls set to 1
+#define HDMI_CTS_HDCP_RPT_ENABLE        (0)
+#define HDMI_CTS_HDCP_DEV_COUNT_MAX     (2)
+
+//resolve tx hdcp rpt result status error when input tmds clk large than 200MHz
+#define TX_HDCP_RPT_BUG0_FIXED_ENABLE   (1)
+
+#if RX_HDCP_SUPPORT_ENABLE
+//Warining: user must use yourself rx and tx hdcp_key on product. below hdcp_key is only for test.
+static UINT8 __CODE u8_rx_ksv_buf[5] =
+{
+    //5 byte ksv
+    0xE5,
+    0xAA,
+    0x2C,
+    0x72,
+    0x36,
+};
+
+static UINT8 __CODE u8_rx_key_buf[280] =
+{
+    // 280 byte key
+    //user need flip license key data byte0~7, byte8~15, byte16~23, ...
+    0x89, 0x48, 0xa6, 0x5e, 0xd0, 0x80, 0xac,
+    0x87, 0xbc, 0xb9, 0x51, 0xf9, 0x05, 0x1b,
+    0xfd, 0x2f, 0xf3, 0x57, 0x44, 0x39, 0x44,
+    0x26, 0x1b, 0xb5, 0x9d, 0xeb, 0xa5, 0x3c,
+    0xd1, 0x4e, 0x83, 0xef, 0xfc, 0xc3, 0x69,
+    0xd4, 0xcf, 0xa1, 0x0a, 0x1d, 0x2d, 0xf0,
+    0x38, 0x79, 0x8a, 0x68, 0x2c, 0x5d, 0xfb,
+    0x37, 0xf2, 0x7d, 0x26, 0xb5, 0x57, 0xcc,
+    0x9e, 0x61, 0x8d, 0x3a, 0x69, 0x14, 0x01,
+    0xe5, 0x9a, 0x27, 0xa6, 0x02, 0x8b, 0x0b,
+    0xe7, 0xea, 0x30, 0xf0, 0x1a, 0x87, 0x65,
+    0x4e, 0x84, 0x8d, 0x60, 0xb9, 0x48, 0x88,
+    0x5f, 0xe4, 0xd6, 0x03, 0x85, 0x62, 0x0d,
+    0x65, 0x7a, 0xa3, 0x04, 0xec, 0x41, 0xe7,
+    0xc3, 0x64, 0xa6, 0x54, 0x2b, 0x34, 0x1b,
+    0xa8, 0xc2, 0xf6, 0xeb, 0xe3, 0x41, 0x28,
+    0xd0, 0x0c, 0xa1, 0x39, 0x78, 0xd6, 0x7f,
+    0x17, 0xae, 0x43, 0x34, 0x4b, 0x7b, 0x6f,
+    0xec, 0x4d, 0x42, 0x51, 0xe7, 0x6a, 0x41,
+    0x37, 0x21, 0xb7, 0x0b, 0x3d, 0xe3, 0xe7,
+    0x56, 0x6b, 0xfc, 0xa4, 0x53, 0x77, 0x0e,
+    0x97, 0x6f, 0x21, 0x1f, 0x94, 0x42, 0x83,
+    0x81, 0xf4, 0xb3, 0x6e, 0x40, 0x45, 0x45,
+    0x93, 0x96, 0x98, 0x3e, 0x75, 0x1a, 0xbb,
+    0xec, 0x26, 0x94, 0x50, 0x3a, 0x6c, 0xf5,
+    0xaf, 0x08, 0x3c, 0xce, 0x8f, 0xb7, 0x6a,
+    0x3a, 0xbd, 0x4f, 0x55, 0x50, 0xcd, 0xd8,
+    0x74, 0x80, 0xf6, 0x89, 0xe0, 0xc2, 0x3a,
+    0xa5, 0xdb, 0x57, 0x82, 0x3d, 0x25, 0xee,
+    0x2f, 0x90, 0x5a, 0x50, 0x2d, 0x56, 0xb2,
+    0xee, 0x79, 0xd6, 0x2c, 0x69, 0x66, 0xbf,
+    0xab, 0xad, 0x2b, 0x12, 0xb4, 0x9f, 0xbb,
+    0xab, 0x0a, 0xdc, 0xb8, 0x0b, 0x8c, 0x03,
+    0xbd, 0xb9, 0x8f, 0x5a, 0x41, 0x4b, 0x22,
+    0xa8, 0x1a, 0xad, 0x31, 0x24, 0x09, 0x14,
+    0x1e, 0x0c, 0x6c, 0x50, 0x59, 0xb8, 0x06,
+    0x5d, 0xe6, 0x2f, 0x53, 0xda, 0xf8, 0x41,
+    0x50, 0x44, 0x4e, 0x97, 0xe4, 0x8a, 0x0c,
+    0x5c, 0x20, 0xeb, 0x4e, 0xaa, 0x85, 0x20,
+    0x25, 0xcc, 0x59, 0x99, 0x68, 0x91, 0xf1,
+};
+#endif
+static UINT8 __CODE u8_tx_ksv_buf[5] =
+{
+    //5 byte ksv
+    0x75,
+    0xbd,
+    0x4e,
+    0xc0,
+    0x32,
+};
+
+static UINT8 __CODE u8_tx_key_buf[280] =
+{
+    //280 byte key
+    0xda, 0x8e, 0x0b, 0x36, 0xd8, 0x9f, 0x1a,
+    0x48, 0x6d, 0x69, 0x4b, 0x13, 0x3b, 0x99,
+    0x7b, 0xd0, 0xc7, 0x2f, 0x3b, 0xc0, 0xd6,
+    0x47, 0xe4, 0xd8, 0x17, 0x57, 0xc8, 0x9c,
+    0x7b, 0xaf, 0x3d, 0xb6, 0xc1, 0xfc, 0x6b,
+    0xab, 0xa2, 0x06, 0x38, 0x11, 0x6c, 0xcd,
+    0x53, 0xf7, 0x0b, 0x45, 0xcc, 0x49, 0xa8,
+    0xf4, 0x3a, 0x78, 0xcc, 0xea, 0x96, 0x24,
+    0x95, 0x5b, 0xf4, 0xa3, 0xe4, 0x4c, 0xce,
+    0x67, 0xa2, 0xac, 0xf8, 0x5d, 0x12, 0xc4,
+    0x55, 0x4a, 0xab, 0x66, 0x85, 0x94, 0x29,
+    0x47, 0x1f, 0xba, 0x5b, 0x39, 0x6f, 0x64,
+    0xf6, 0x81, 0xbb, 0xf4, 0x6e, 0x79, 0x22,
+    0xd7, 0xcb, 0xb5, 0xca, 0x67, 0x52, 0xce,
+    0xe0, 0x04, 0x30, 0x7c, 0xcc, 0x82, 0xfb,
+    0xaf, 0xb1, 0x5a, 0x94, 0x7f, 0xd5, 0x17,
+    0x2d, 0xe3, 0xf6, 0xa4, 0x2a, 0x4f, 0xc8,
+    0x6c, 0x92, 0xbb, 0xa5, 0x1b, 0x6a, 0x6f,
+    0x5a, 0xb3, 0x87, 0xef, 0xc8, 0x45, 0xe9,
+    0xd2, 0x8a, 0x2a, 0x32, 0x58, 0xda, 0x2d,
+    0x86, 0xd1, 0x36, 0xe0, 0x6a, 0xe6, 0x8b,
+    0x00, 0x64, 0x38, 0xf2, 0x68, 0x6a, 0xc9,
+    0x8d, 0x55, 0xdb, 0x75, 0xe6, 0x52, 0x47,
+    0x71, 0x77, 0xe7, 0x3e, 0xbb, 0xaf, 0x69,
+    0x21, 0x4e, 0xff, 0x14, 0xc6, 0x78, 0x17,
+    0xf3, 0xcd, 0xb4, 0xa2, 0x5e, 0xb5, 0xa3,
+    0x16, 0x65, 0x41, 0xfa, 0xed, 0xae, 0xb1,
+    0x77, 0x56, 0xf0, 0x84, 0x05, 0x54, 0x03,
+    0x60, 0x58, 0x06, 0x46, 0xd1, 0x69, 0x22,
+    0x36, 0x36, 0x1e, 0xb9, 0x57, 0x47, 0x74,
+    0x13, 0x93, 0x3e, 0x7a, 0xca, 0x12, 0x75,
+    0xe9, 0x3a, 0x8f, 0x78, 0xbd, 0xac, 0x32,
+    0x12, 0x57, 0xa5, 0x45, 0xdc, 0x1b, 0x8c,
+    0x2d, 0x16, 0x38, 0x4e, 0x7a, 0xf4, 0x88,
+    0x1b, 0x07, 0x38, 0xf6, 0xb5, 0x5d, 0x8e,
+    0xa9, 0x48, 0xf4, 0x0e, 0x11, 0xd1, 0x62,
+    0xff, 0xe7, 0x77, 0x9c, 0x7b, 0xe8, 0x18,
+    0x3b, 0x13, 0x16, 0xb2, 0x42, 0xf4, 0x78,
+    0xca, 0x0e, 0x09, 0x78, 0xdc, 0x05, 0xca,
+    0x2f, 0x78, 0xbf, 0xab, 0x2b, 0x5f, 0x85,
+};
+
+
+typedef enum _E_HDMI_TX_CONFIG_ITEM_
+{
+    HDMI_TX_CONFIG_AV       = 0x00, //video and audio
+    HDMI_TX_CONFIG_AUD      = 0x01, //audio
+    HDMI_TX_CONFIG_AUD_FS   = 0x02, //audio fs
+    HDMI_TX_CONFIG_AVMUTE   = 0x03  //avmute packet
+}HDMI_TX_CONFIG_ITEM_E;
+
+//
+BOOL _rx_edid_update(UINT8 *p_u8_edid_buf, BOOL b_rx_hpd_low_delay);
+BOOL _rx_hpd_toggle(VOID);
+UINT8 _sink_hpd_low_process(UINT8 u8_chn, UINT8 u8_hpd);
+void sys_hotplug_init(void);
+void _hdmi_tx_gcp_avmute_param_default(void);
+void _shutdown_output(UINT8 u8_output_chn);
+void sys_shutdown_output(void);
+void _config_output(UINT8 u8_output_chn);
+void sys_config_output(UINT8 u8_config_item, UINT8 u8_value); //refer to HDMI_TX_CONFIG_ITEM_E
+//
+static BOOL _tx_sink_exist_unsupport_yuv_check(VOID);
+
+//
+void _hdmi_tx_edid_param_default(UINT8 u8_output_chn);
+void _hdmi_tx_hdcp_param_default(UINT8 u8_output_chn);
+void _hdmi_tx_hdcp_start(UINT8 u8_output_chn);
+//
+
+
+//
+VOID _tx_hdcp_rpt_param_repeater_flag_default(UINT8 u8_tx_chn);
+VOID _rx_hdcp_rpt_param_ready_reset(VOID);
+BOOL _rx_hdcp_rpt_ready_reset(VOID);
+BOOL _tx_hdcp_bcaps_repeater_flag_get(VOID);
+VOID _tx_hdcp_rpt_param_repeater_flag_set(BOOL b_set);
+void _tx_hdcp_rpt_init(UINT8 u8_tx_chn);
+
+//
+void sys_ms933x_chip_valid_check(void);
+BOOL _tx_ddc_error_get(UINT8 u8_tx_chn);
+void _tx_ddc_error_check(UINT8 u8_tx_chn, BOOL b_tx_hpd_lost);
+//
+
+//
+VOID sys_hdmi_rx_timing_manual_enable(BOOL b_enable);
+
+
+//
+//rx_5v status light
+#define RX_LED_light(on)
+//tx_hpd status light
+#define TX_LED_light(tx_chn, on)    //mculib_led_control((GPIO_PIN_1 << (4 - tx_chn)), on)
+//rx timing stable light
+#define RX_STB_LED_light(on)       // mculib_led_control(GPIO_PIN_1, on)
+
+//
+
+
+
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+void ms933x_app_check_chip_version(void)
+{
+    if(ms933xdrv_misc_chip_C_version_get())
+    {
+        g_u8_ms933xc_version_flag = 1;
+        LOG("ms933xc chip.");
+    }
+    else
+    {
+        g_u8_ms933xc_version_flag = 0;
+    }
+}
+
+void _param_default(void)
+{
+    UINT8 i;
+
+    g_u16_input_tmds_clk = 0;
+    g_u8_rx_hdcp_timer_count = 0;
+    g_u8_rx_hdcp_woking_flag = 0;
+    g_u8_rx_hdcp_aksv_be_writed_flag = 0;
+    g_b_hdmi_input_valid = 0;
+    g_u8_sys_edid_flag = 0xff;
+    g_u8_sys_edid_buf_last_id = 0xff;
+    g_u32_hdmi_sink_min_timing = 0xFFFFFFFFUL;
+    g_u32_dvi_sink_min_timing = 0xFFFFFFFFUL;
+    g_u8_source_5v_connect = 0;
+    g_u8_hdmi_rx_hpd_off_count = HDMI_RX_HPD_OFF_TIMEOUT;
+    g_u8_hdcp_rpt_service_timer_count = 0;
+    g_u8_hdcp_rpt_ready_timer_count = 0;
+    //
+    g_u8_chip_valid_check_timer_count = 0;
+    //
+    g_u8_hdmi_tx_hpd_detect_count = 0;
+    //
+    g_u8_system_error_service_flag = FALSE;
+    g_u8_system_error_timer_count_1s = 0;
+    g_u8_system_error_timer_count_10s = 0;
+    g_u8_system_error_flag = 0;
+    g_u8_system_error_action_flag = 0;
+    //
+    g_u8_input_invalid_timer_count = 0;
+    g_u8_rxphy_error_timer_count = 0;
+    g_u8_hdmi_shell_error_timer_count = 0;
+    //
+    g_u8_rxpll_configed_status = 0;
+    g_u8_mdt_change_timer_count = 0;
+    g_u8_rx_packet_timer_count = 0;
+    //
+    _hdmi_tx_gcp_avmute_param_default();
+    //
+    #if HDCP_RPT_SUPPORT_ENABLE
+    _rx_hdcp_rpt_param_ready_reset();
+    #endif
+    //
+    memset(g_u8_sys_edid_used_buf, 0, 512);
+
+    //buf init
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        g_u8_sink_hpd_connect[i] = ((g_u8_tx_hpd_test_flag & g_u8_tx_chn_enable_flag) >> i) & 0x01;
+
+        _hdmi_tx_edid_param_default(i);
+        _hdmi_tx_hdcp_param_default(i);
+        #if HDCP_RPT_SUPPORT_ENABLE
+        _tx_hdcp_rpt_param_repeater_flag_default(i);
+        #endif
+    }
+}
+
+void _tx_common_init(void)
+{
+    UINT8 i;
+
+    ms933xdrv_hdmi_tx_init();
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if ((g_u8_tx_chn_enable_flag >> i) & 0x01)
+        {
+            ms933xdrv_hdmi_tx_set_channel(i);
+
+            #if HDMI_TX_TMDS_AUTO_CTRL_ENABLE
+            ms933xdrv_hdmi_tx_phy_output_auto_ctrl(0, TRUE);
+            #endif
+
+            #if TX_HDCP_SUPPORT_ENABLE
+            if (g_u8_tx_hdcp_support)
+            {
+                ms933xdrv_hdmi_tx_hdcp_key_init((UINT8 *)u8_tx_key_buf);
+            }
+            #endif
+        }
+    }
+}
+
+void ms933x_init(void)
+{
+    //IIC_sf_Init();
+
+    mculib_i2c_init();
+
+    //reset chip
+    mculib_chip_reset();
+    LOG("mculib_chip_reset");
+
+    //param default.
+    _param_default();
+
+    if (ms933xdrv_misc_chipisvalid())
+    {
+        LOG("ms933x chip connect.");
+    }
+    else
+    {
+        LOG("ms933x chip disconnect.");
+    }
+
+    ms933x_app_check_chip_version();
+
+    ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_MAIN);
+    ms933xdrv_hdmi_rx_init();
+
+    #if MS933X_HDMI_NET_CABLE_TX_ENABLE
+    //internal fosc to 24M, HW 5.1K res. for
+    ms933x_HAL_WriteByte(0x61, 0x15);
+    #endif
+
+    #if HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE
+    //20190328, MDT stable,
+    ms933x_HAL_ModBits_Ex(0x2174, 0xFF000000UL, (0x7FUL) << 24);
+    #endif
+
+    //
+    ms933xdrv_hdmi_rx_pi_phy_init();
+
+    #if RX_HDCP_SUPPORT_ENABLE
+    if (g_u8_rx_hdcp_support)
+    {
+        ms933xdrv_hdmi_rx_controller_hdcp_encryption_enable(TRUE);
+        ms933xdrv_hdmi_rx_controller_hdcp_init((UINT8 *)u8_rx_ksv_buf, (UINT8 *)u8_rx_key_buf);
+    }
+    else
+    {
+        ms933xdrv_hdmi_rx_controller_hdcp_encryption_enable(FALSE);
+    }
+    #endif
+
+    #if HDCP_RPT_SUPPORT_ENABLE
+    // rx hdcp rpt init
+    if (g_u8_hdcp_repeater_support)
+    {
+        if (!ms933xdrv_hdmi_rx_core_hdcp_bcaps_rpt_enable(TRUE))
+        {
+            LOG("hdcp_rpt_enable_failed.");
+        }
+    }
+    else
+    {
+        ms933xdrv_hdmi_rx_core_hdcp_bcaps_rpt_enable(FALSE);
+    }
+    ms933xdrv_hdmi_rx_core_hdcp_rpt_reset_enable(TRUE);
+    #endif
+
+    _tx_common_init();
+
+    sys_hotplug_init();
+
+    LOG(MS933X_SDK_VERSION);
+}
+
+VOID sys_hdmi_rx_tmds_overload_service(VOID)
+{
+#if 0 //unused
+    UINT8 u8Overload;
+    u8Overload = ms933xdrv_hdmi_rx_get_tmds_overload();
+    if (u8Overload)
+    {
+        LOG1("input tmds_overload = ", u8Overload);
+        ms933xdrv_hdmi_rx_tmds_overload_protect_disable(TRUE);
+        //delay for disable efftct.
+        mculib_delay_ms(1);
+        ms933xdrv_hdmi_rx_tmds_overload_protect_disable(FALSE);
+    }
+#endif
+}
+
+#if HDMI_RX_ERROR_COUNTER_DEBUG_ENABLE
+VOID _rxphy_error_service(VOID)
+{
+    UINT16 u16_error_buf[3];
+
+    ms933xdrv_hdmi_rx_tmds_error_detect(u16_error_buf);
+
+    if (u16_error_buf[0] != 0 || u16_error_buf[1] != 0 || u16_error_buf[2] != 0)
+    {
+        LOG("");
+        LOG1("u16_chn0_error = ", u16_error_buf[0]);
+        LOG1("u16_chn1_error = ", u16_error_buf[1]);
+        LOG1("u16_chn2_error = ", u16_error_buf[2]);
+    }
+}
+#endif
+
+VOID sys_error_service_reset(VOID)
+{
+    g_u8_system_error_flag = 0;
+    g_u8_system_error_timer_count_10s = 0;
+}
+
+VOID _hdmi_tx_shell_error_service(VOID)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            //only check one shell stable
+            ms933xdrv_hdmi_tx_set_channel(g_u8_ms933xc_version_flag ? 0 : i);
+            if (!ms933xdrv_hdmi_tx_shell_timing_stable())
+            {
+                LOG("hdmi_tx_error.");
+            }
+            break;
+        }
+    }
+}
+
+VOID sys_error_service(VOID)
+{
+#if MS933X_SLAVER_I2C_ERROR_SERVICE_ENABLE
+    UINT8 u8_value;
+
+    u8_value = mculib_ms993x_i2c_slaver_error_get();
+    if (u8_value)
+    {
+        LOG2("ms933x_slaver_i2c_error = ", u8_value);
+        ms933x_init();
+        return;
+    }
+#endif
+
+    sys_ms933x_chip_valid_check();
+
+    if (!TMDS_CLK_VALID(g_u16_input_tmds_clk))
+    {
+        return;
+    }
+
+    #if HDMI_RX_ERROR_COUNTER_DEBUG_ENABLE
+    g_u8_rxphy_error_timer_count ++;
+    if (g_u8_rxphy_error_timer_count >= RXPHY_ERROR_TIMEOUT)
+    {
+        g_u8_rxphy_error_timer_count = 0;
+        _rxphy_error_service();
+    }
+    #endif
+
+    if (g_b_hdmi_input_valid)
+    {
+        g_u8_hdmi_shell_error_timer_count ++;
+        if (g_u8_hdmi_shell_error_timer_count >= HDMI_SHELL_ERROR_TIMEOUT)
+        {
+            g_u8_hdmi_shell_error_timer_count = 0;
+            _hdmi_tx_shell_error_service();
+        }
+
+        //
+        g_u8_system_error_timer_count_10s = 0;
+    }
+    else
+    {
+        g_u8_system_error_timer_count_10s ++;
+    }
+
+    #if HDMI_RX_TIMING_ERROR_SERVICE_ENABLE
+    if (g_u8_system_error_timer_count_10s >= SYSTEM_ERROR_TIMEOUT_10S)
+    {
+        g_u8_system_error_timer_count_10s = 0;
+        //do action
+        LOG("sys_error_reset.");
+        _rx_hpd_toggle();
+    }
+    #endif
+}
+
+UINT8 _rxpll_errdet_wrong_status(UINT16 u16_error_val)
+{
+#if 1
+    UINT8 u8_flag = 0x00;
+
+    if (!ms933xdrv_rxpll_lock_status())
+    {
+        //clr error only
+        ms933xdrv_errdet_wrong_status(1);
+        mculib_delay_ms(2);
+
+        if (!ms933xdrv_rxpll_lock_status())
+        {
+            u8_flag = 0x01;
+        }
+        else
+        {
+            if (ms933xdrv_errdet_wrong_status(RXPLL_ERROR_MIN))
+            {
+                u8_flag = 0x04;
+            }
+            else
+            {
+                //report unlock
+                g_u8_system_error_flag |= 0x01;
+            }
+        }
+    }
+    else if (ms933xdrv_errdet_wrong_status(u16_error_val))
+    {
+        //20210302
+        //when not in rxpll configed time but input timing still invalid, can goto this error counter process
+        if ((g_u8_rxpll_configed_status == 0) && (!g_b_hdmi_input_valid))
+        {
+            mculib_delay_ms(2);
+            if (ms933xdrv_errdet_wrong_status(RXPLL_ERROR_MID))
+            {
+                u8_flag = 0x02;
+            }
+            else
+            {
+                //report error
+                g_u8_system_error_flag |= 0x02;
+            }
+        }
+        else
+        {
+            //report error
+            g_u8_system_error_flag |= 0x02;
+        }
+    }
+
+    return u8_flag;
+#else
+
+    UINT8 u8_flag = 0x00;
+
+    #if 1
+    if (!ms933xdrv_rxpll_lock_status())
+    {
+        mculib_delay_ms(2);
+
+        if (!ms933xdrv_rxpll_lock_status())
+        {
+            u8_flag = 0x01;
+        }
+        else
+        {
+            u8_flag = 0x08;
+        }
+    }
+    #else
+    if (!ms933xdrv_rxpll_lock_status())
+    {
+        u8_flag = 0x01;
+    }
+    #endif
+    else if (ms933xdrv_errdet_wrong_status(u16_error_val))
+    {
+        //report error
+        g_u8_system_error_flag |= 0x02;
+    }
+
+    return u8_flag;
+#endif
+}
+
+//b_config_phy_all, TRUE: config rxpll and rxphy EQ; FALSE: config rxpll
+UINT8 _hdmi_rx_phy_config(UINT16 *p_u16_tmds_clk, BOOL b_config_phy_all)
+{
+    UINT8 u8_times;
+    UINT8 u8_flag = 0;
+    UINT16 u16_clk1;
+    UINT16 u16_clk2;
+
+    u16_clk2 = (*p_u16_tmds_clk);
+
+    //if rxpll unlock when rx config, do again
+    for (u8_times = 0; u8_times < 3; u8_times ++)
+    {
+        u8_flag &= 0xFC;
+        u8_flag |= ms933xdrv_hdmi_rx_pi_phy_config(u16_clk2, b_config_phy_all ? 0xFF : 0xFE);
+
+        u16_clk1 = ms933xdrv_hdmi_rx_get_tmds_clk();
+        b_config_phy_all = TRUE;
+
+        //20200520, if detect input clk invalid, return
+        if (!TMDS_CLK_VALID(u16_clk1))
+        {
+            u8_flag |= 0x08;
+            (*p_u16_tmds_clk) = u16_clk1;
+            break;
+        }
+
+        if (TMDS_CLK_VALID(u16_clk1) && xabs(u16_clk1, u16_clk2) >= 200)
+        {
+            u16_clk2 = u16_clk1;
+            (*p_u16_tmds_clk) = u16_clk1;
+
+            u8_flag |= 0x04;
+        }
+        else
+        {
+            if (u8_flag & 0x01)
+            {
+                break;
+            }
+        }
+    }
+
+    return u8_flag | (u8_times << 4);
+}
+
+BOOL _hdmi_rx_phy_errdet(VOID)
+{
+#if (!HDMI_RX_ERROR_COUNTER_DEBUG_ENABLE)
+    UINT16 u16_error_val;
+
+    u16_error_val = (g_u8_system_error_flag & 0x02) ? RXPLL_ERROR_MID : RXPLL_ERROR_MIN;
+
+    if (ms933xdrv_errdet_wrong_status(u16_error_val))
+    {
+        if (g_u8_system_error_flag & 0x02)
+        {
+            return TRUE;
+        }
+
+        LOG("rx_tmds_error.");
+        g_u8_system_error_flag |= 0x02;
+    }
+    else
+    {
+        g_u8_system_error_flag &= (~0x02);
+    }
+#endif
+
+#if MS933X_HDMI_NET_CALBE_RX_ENABLE
+    if (g_b_hdmi_input_valid)
+    {
+        g_u8_input_invalid_timer_count = 0;
+    }
+    else
+    {
+        g_u8_input_invalid_timer_count ++;
+        if (g_u8_input_invalid_timer_count >= INPUT_INVALID_TIMEOUT)
+        {
+            return TRUE;
+        }
+    }
+#endif
+
+    return FALSE;
+}
+
+VOID sys_hdmi_rx_pll_service(UINT8 u8_hdmi_int)
+{
+    UINT16 u16_rx_clk;
+    UINT16 u16_tmp;
+    UINT8  u8_rxphy_error = 0;
+    UINT8  u8_rxphy_flag = 0;
+    UINT32 u32_int;
+
+    u32_int = ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status(CLK_CHANGE_ISTS | PLL_LCK_CHG_ISTS);
+
+    //rx_tmds_clk change int get
+    if (u32_int & CLK_CHANGE_ISTS)
+    {
+        u8_hdmi_int = TRUE;
+    }
+
+    //if rx_tmds_clk no change and pre rx_tmds_clk valid, notice rxpll_lock and tmds_error_counter status
+    if (!u8_hdmi_int && TMDS_CLK_VALID(g_u16_input_tmds_clk))
+    {
+        u8_rxphy_error |= (u32_int & PLL_LCK_CHG_ISTS) ? 0x10 : 0x00;
+        #if HDMI_RX_TMDS_ERROR_SERVICE_ENABLE
+        if (!u8_rxphy_error)
+        {
+            u8_rxphy_error |= _hdmi_rx_phy_errdet() ? 0x20 : 0x00;
+        }
+        #endif
+    }
+
+    if (u8_hdmi_int || u8_rxphy_error)
+    {
+        u16_tmp = ms933xdrv_hdmi_rx_get_tmds_clk();
+        //if use I2C_bus, don't need to delay.
+        //mculib_delay_us(200);
+        //double check tmds_clk value. enhance for rx_tmds_clk detection, prevention of accidents
+        u16_rx_clk = ms933xdrv_hdmi_rx_get_tmds_clk();
+
+        if (TMDS_CLK_VALID(u16_tmp) || TMDS_CLK_VALID(u16_rx_clk))
+        {
+            if (TMDS_CLK_MARGIN(u16_rx_clk, u16_tmp))
+            {
+                if (ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status_ext(CLK_CHANGE_ISTS))
+                {
+                    u16_rx_clk = 1; //magic valid is only for debug
+                }
+                else
+                {
+                    u16_rx_clk = 2; //magic valid is only for debug
+                    ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_MODET);
+                }
+            }
+        }
+
+        //when input timing change or lost, first should shutdown output.
+        if (g_b_hdmi_input_valid)
+        {
+            sys_shutdown_output();
+            RX_STB_LED_light(FALSE);
+        }
+
+        g_u8_rxpll_configed_status = 0;
+
+        if (TMDS_CLK_VALID(u16_rx_clk))
+        {
+            #if (!MS933X_HDMI_NET_CALBE_RX_ENABLE)
+            u8_rxphy_flag = ms933xdrv_hdmi_rx_pi_phy_config(u16_rx_clk, 0xFF);
+            #else
+            u8_rxphy_flag = ms933xdrv_hdmi_rx_pi_phy_config_with_28eq(u16_rx_clk, 0xFF);
+            #endif
+
+            if ((u8_rxphy_flag & 0x05) == 0x05) //rxpll_lock & rx_clk_stable
+            {
+                g_u8_rxpll_configed_status = 1; //rxpll_sucess
+            }
+            else
+            {
+                if (u8_rxphy_flag & 0x04) //rxpll_ulock & rx_clk_stable
+                {
+                    ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_MODET);
+                }
+
+                g_u8_rxpll_configed_status = 2; //rxpll_error
+            }
+        }
+        else
+        {
+            if (TMDS_CLK_VALID(g_u16_input_tmds_clk)) //pre rx_tmds_clk is valid, but now change to invaid
+            {
+                //20190116, enhace, reset HDMI before rxpll clk disable.
+                ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_HDMI);
+                ms933xdrv_hdmi_rx_phy_power_down();
+                ms933xdrv_hdmi_rx_pi_pll_release(FALSE);
+            }
+        }
+
+        g_u16_input_tmds_clk = u16_rx_clk;
+        LOG2("u16_clk = ", u16_rx_clk);
+
+        if (TMDS_CLK_VALID(u16_rx_clk))
+        {
+            LOG1("u8_rxphy_flag = ", u8_rxphy_error | u8_rxphy_flag);
+        }
+
+        #if HDMI_RX_MDT_INT_ENABLE
+        ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl(1, user_mdt_int, (g_u8_rxpll_configed_status == 1) ? TRUE : FALSE);
+        #endif
+
+        if (g_b_hdmi_input_valid)
+        {
+            #if HDMI_RX_PKT_INT_ENABLE
+            ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl(0, user_pkt_int, FALSE);
+            #endif
+
+            #if HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE
+            //20220527, first disable timing_manual when rx_phy config, then enable in mdt_service.
+            sys_hdmi_rx_timing_manual_enable(FALSE);
+            #endif
+        }
+
+        //reset MDT
+        g_b_hdmi_input_valid = 0;
+        //enhance, reset service timer
+        g_u8_mdt_change_timer_count = 0;
+        g_u8_rx_hdcp_timer_count = 0;
+        g_u8_rx_hdcp_woking_flag = 0;
+        //
+        if (u8_hdmi_int)
+        {
+            sys_error_service_reset();
+        }
+        //
+        g_u8_input_invalid_timer_count = 0;
+        g_u8_rxphy_error_timer_count = 0;
+    }
+}
+
+#define AUDIO_RATE_192K_MIN ((176400UL / 100) + ( (192000UL / 100) - (176400UL / 100) ) / 2)
+#define AUDIO_RATE_176K_MIN ((96000UL  / 100) + ( (176400UL / 100) - (96000UL  / 100) ) / 2)
+#define AUDIO_RATE_96K_MIN  ((88200UL  / 100) + ( (96000UL  / 100) - (88200UL  / 100) ) / 2)
+#define AUDIO_RATE_88K2_MIN ((48000UL  / 100) + ( (88200UL  / 100) - (48000UL  / 100) ) / 2)
+#define AUDIO_RATE_48K_MIN  ((44100UL  / 100) + ( (48000UL  / 100) - (44100UL  / 100) ) / 2)
+#define AUDIO_RATE_44K1_MIN ((32000UL  / 100) + ( (44100UL  / 100) - (32000UL  / 100) ) / 2)
+#define AUDIO_RATE_32K_MIN  ((32000UL  / 100) / 2)
+
+UINT8 _hdmi_rx_audio_fs_type_get(UINT16 u16_fs)
+{
+    UINT8 u8_audio_sample_rate = HDMI_AUD_RATE_48K;
+
+    if (u16_fs > AUDIO_RATE_192K_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_192K;
+    }
+    else if (u16_fs > AUDIO_RATE_176K_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_176K4;
+    }
+    else if (u16_fs > AUDIO_RATE_96K_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_96K;
+    }
+    else if (u16_fs > AUDIO_RATE_88K2_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_88K2;
+    }
+    else if (u16_fs > AUDIO_RATE_48K_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_48K;
+    }
+    else if (u16_fs > AUDIO_RATE_44K1_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_44K1;
+    }
+    else if (u16_fs > AUDIO_RATE_32K_MIN)
+    {
+        u8_audio_sample_rate = HDMI_AUD_RATE_32K;
+    }
+
+    return u8_audio_sample_rate;
+}
+
+void sys_hdmi_rx_audio_cts_change_param_set(BOOL b_change)
+{
+    g_b_hdmi_rx_audio_cts_change_flag = b_change;
+}
+
+BOOL sys_hdmi_rx_audio_cts_change_param_get(void)
+{
+    return g_b_hdmi_rx_audio_cts_change_flag;
+}
+
+//pad_audio I2S & SPDIF output control
+void sys_pad_audio_ctrl_service(BOOL b_auto)
+{
+    BOOL b_flag;
+    static BOOL s_b_audio_sample = FALSE; //PCM_flag
+    static BOOL s_b_pad_audio_en = FALSE;
+    UINT8 u8_audio_mode;
+
+    if (!b_auto)
+    {
+        s_b_pad_audio_en = FALSE;
+        s_b_audio_sample = FALSE;
+        ms933xdrv_misc_audio_i2s_mclk_pad_enable(FALSE);
+        ms933xdrv_misc_audio_out_pad_enable(FALSE);
+        return;
+    }
+
+    u8_audio_mode = g_st_hdmi_timing.u8_audio_mode & 0x3f;
+
+    if (u8_audio_mode == HDMI_AUD_CT_REFER_HEADER)
+    {
+        b_flag = ms933xdrv_hdmi_tx_shell_get_audio_cbyte_status() ? FALSE : TRUE;
+    }
+    else if (u8_audio_mode == HDMI_AUD_CT_PCM)
+    {
+        b_flag = TRUE;
+    }
+    else
+    {
+        b_flag = FALSE;
+    }
+
+    if (s_b_audio_sample != b_flag)
+    {
+        s_b_audio_sample = b_flag;
+        //disable i2s mclk output
+        ms933xdrv_misc_audio_i2s_mclk_pad_enable(b_flag);
+        LOG2("pad_i2s_en = ", b_flag);
+    }
+
+    if (!s_b_pad_audio_en)
+    {
+        s_b_pad_audio_en = TRUE;
+        ms933xdrv_misc_audio_out_pad_enable(TRUE);
+        LOG2("pad_spdif_en = ", 1);
+    }
+}
+
+void sys_hdmi_rx_audio_config(BOOL b_config_all)
+{
+    UINT16 u16_fs;
+    BOOL b_audio_chn_auto_config;
+
+    //20191123, resolve sanxing DVD, speaker_locations is 0x0A, but chn number is 8 chn issue.
+    b_audio_chn_auto_config = ms933xdrv_hdmi_rx_controller_audio_channel_config(g_st_hdmi_timing.u8_audio_channels, g_st_hdmi_timing.u8_audio_speaker_locations);
+
+    if (g_u8_hdmi_in_timing_log_enable)
+    {
+        if (!b_audio_chn_auto_config)
+        {
+            LOG("hdmi_rx_aud_chn_manual.");
+        }
+    }
+
+    ms933xdrv_hdmi_rx_audio_fifo_reset(TRUE);
+
+    if (b_config_all)
+    {
+        u16_fs = ms933xdrv_hdmi_rx_audio_config(RX_AUDIO_DLL_TO_PLL_MODE, g_u16_input_tmds_clk);
+
+        sys_hdmi_rx_audio_cts_change_param_set(FALSE);
+
+        #if 0
+        g_st_hdmi_timing.u8_audio_rate = _hdmi_rx_audio_fs_type_get(u16_fs);
+        #endif
+        LOG2("u16_audio_fs = ", u16_fs);
+
+        #if SYS_AUDIO_PAD_OUTPUT_ENABLE
+        //if (u16_fs > 0)
+        {
+            //176.4K, 192K, use 64fs
+            ms933xdrv_misc_audio_i2s_mclk_div((u16_fs > 1360) ? 1 : 0);
+
+            //fixed enable mclk pad.
+            sys_pad_audio_ctrl_service(FALSE);
+
+        }
+        #endif
+    }
+
+    mculib_delay_ms(1);
+    ms933xdrv_hdmi_rx_audio_fifo_reset(FALSE);
+}
+
+UINT8 sys_hdmi_rx_audio_service(UINT8 u8_int_sts)
+{
+    UINT8 u8_audio_fifo_status;
+    UINT8 u8_audio_status = 0;
+    //BOOL b_acr_rcv_flag;
+    BOOL b_acr_change_flag;
+
+    //1. acr status process
+    //b_acr_rcv_flag = (u8_int_sts & 0x08) ? TRUE : FALSE;
+    b_acr_change_flag = (u8_int_sts & 0x10) ? TRUE : FALSE;
+
+    if (b_acr_change_flag)
+    {
+        sys_hdmi_rx_audio_config(TRUE);
+        return 1;
+    }
+
+    //2. audio fifo status process
+    u8_audio_fifo_status = ms933xdrv_hdmi_rx_get_audio_fifo_status();
+
+    if (u8_audio_fifo_status & AFIF_THS_PASS_STS)
+    {
+        u8_audio_status = (u8_audio_fifo_status & AFIF_UNDERFL_STS) ? 0x01 : 0x00;
+        u8_audio_status |= (u8_audio_fifo_status & AFIF_OVERFL_STS) ? 0x02 : 0x00;
+
+        if (u8_audio_status)
+        {
+            #if HDMI_RX_AUDIO_CTS_CHNAGE_HANDEL_MODE
+            if (sys_hdmi_rx_audio_cts_change_param_get())
+            {
+                sys_hdmi_rx_audio_config(TRUE);
+                return 3;
+            }
+            else
+            #endif
+            {
+                LOG("audio_fifo_reset.");
+                sys_hdmi_rx_audio_config(FALSE);
+                return 2;
+            }
+        }
+        return 0;
+    }
+    else
+    {
+        return 4;
+    }
+}
+
+VOID sys_hdmi_rx_video_fifo_reset(VOID)
+{
+    ms933xdrv_hdmi_rx_video_fifo_reset(TRUE);
+    mculib_delay_us(100);
+    ms933xdrv_hdmi_rx_video_fifo_reset(FALSE);
+}
+
+#if MS933X_APP_LOG1_ENABLE
+void printf_input_timing(void)
+{
+#if 1
+    UINT16 u16detHFreq;
+
+    if (!g_u8_hdmi_in_timing_log_enable)
+    {
+        return;
+    }
+
+    #if (!HDMI_RX_TIMING_PARSE_ENABLE)
+    if (!ms933xdrv_hdmi_rx_get_input_timing(&g_st_hdmi_in_timing))
+    {
+        LOG("input_timing_invalid.");
+        return;
+    }
+    #endif
+
+    LOG(" ");
+
+    LOG2("Is Progr      = ", (g_st_hdmi_in_timing.u8_polarity & MSRT_BIT0) ? 1 : 0);
+    LOG2("Hsync Pol     = ", (g_st_hdmi_in_timing.u8_polarity & MSRT_BIT1) ? 1 : 0);
+    LOG2("Vsync Pol     = ", (g_st_hdmi_in_timing.u8_polarity & MSRT_BIT2) ? 1 : 0);
+    LOG2("u16detHTotal  = ", g_st_hdmi_in_timing.u16_htotal);
+    LOG2("u16detVTotal  = ", g_st_hdmi_in_timing.u16_vtotal);
+    LOG2("u16detHActive = ", g_st_hdmi_in_timing.u16_hactive);
+    LOG2("u16detVActive = ", g_st_hdmi_in_timing.u16_vactive);
+    LOG2("u16detHst     = ", g_st_hdmi_in_timing.u16_hoffset);
+    LOG2("u16detVst     = ", g_st_hdmi_in_timing.u16_voffset);
+    LOG2("u16detHW      = ", g_st_hdmi_in_timing.u16_hsyncwidth);
+    LOG2("u16detVW      = ", g_st_hdmi_in_timing.u16_vsyncwidth);
+
+    LOG2("u16detPclk    = ", g_st_hdmi_in_timing.u16_pixclk);
+    //HSyncFreq / 10
+    u16detHFreq = (UINT32)g_st_hdmi_in_timing.u16_vfreq * g_st_hdmi_in_timing.u16_vtotal / 100 / 10;
+    if ((g_st_hdmi_in_timing.u8_polarity & MSRT_BIT0) == 0) u16detHFreq >>= 1;
+    LOG2("u16detHFreq   = ", u16detHFreq);
+    LOG2("u16detVFreq   = ", g_st_hdmi_in_timing.u16_vfreq);
+#endif
+}
+
+void printf_input_video_config(void)
+{
+#if 1
+    LOG(" ");
+    //LOG2("u8_hdmi_flag      = ", g_st_hdmi_timing.u8_hdmi_flag);
+    LOG2("u8_vic            = ", g_st_hdmi_timing.u8_vic);
+    LOG2("u16_video_clk     = ", g_st_hdmi_timing.u16_video_clk);
+    LOG2("u8_clk_rpt        = ", g_st_hdmi_timing.u8_clk_rpt);
+    LOG1("u8_scan_info      = ", g_st_hdmi_timing.u8_scan_info);
+    LOG1("u8_aspect_ratio   = ", g_st_hdmi_timing.u8_aspect_ratio);
+    LOG1("u8_color_space    = ", g_st_hdmi_timing.u8_color_space);
+    LOG1("u8_color_depth    = ", g_st_hdmi_timing.u8_color_depth);
+    LOG1("u8_colorimetry    = ", g_st_hdmi_timing.u8_colorimetry);
+    LOG1("u8_quant_range    = ", g_st_hdmi_timing.u8_quant_range);
+    LOG1("u8_it_content     = ", g_st_hdmi_timing.u8_it_content);
+    LOG(" ");
+#endif
+}
+
+void printf_input_vendor_specific_config(void)
+{
+#if 1
+    LOG(" ");
+    LOG1("u8_video_format   = ", g_st_hdmi_timing.u8_video_format);
+    if (g_st_hdmi_timing.u8_video_format == HDMI_4Kx2K_FORMAT)
+    {
+        LOG1("u8_4Kx2K_vic      = ", g_st_hdmi_timing.u8_4Kx2K_vic);
+    }
+    else if (g_st_hdmi_timing.u8_video_format == HDMI_3D_FORMAT)
+    {
+        LOG1("u8_3D_structure   = ", g_st_hdmi_timing.u8_4Kx2K_vic);
+        LOG1("u8_3D_ext_data    = ", g_st_hdmi_timing.u8_3D_structure);
+    }
+    LOG(" ");
+#endif
+}
+
+void printf_input_audio_config(void)
+{
+#if 1
+    LOG(" ");
+    LOG1("u8_audio_mode     = ", g_st_hdmi_timing.u8_audio_mode);
+    LOG1("u8_audio_rate     = ", g_st_hdmi_timing.u8_audio_rate);
+    LOG1("u8_audio_bits     = ", g_st_hdmi_timing.u8_audio_bits);
+    LOG1("u8_audio_channels = ", g_st_hdmi_timing.u8_audio_channels);
+    LOG1("u8_spea_locations = ", g_st_hdmi_timing.u8_audio_speaker_locations);
+    LOG(" ");
+#endif
+}
+
+void printf_input_av_config(UINT8 u8_int_sts)
+{
+    if (!g_u8_hdmi_in_timing_log_enable)
+    {
+        return;
+    }
+
+    LOG(" ");
+    LOG2("u8_hdmi_flag      = ", g_st_hdmi_timing.u8_hdmi_flag);
+
+    if((u8_int_sts & 0x01) == 0x01)
+    {
+        printf_input_video_config();
+    }
+
+    if ((u8_int_sts & 0x04) == 0x04)
+    {
+        printf_input_vendor_specific_config();
+    }
+
+    if((u8_int_sts & 0x02) == 0x02)
+    {
+        printf_input_audio_config();
+    }
+}
+#endif //MS933X_APP_LOG1_ENABLE
+
+
+void sys_default_hdmi_video_config(void)
+{
+    //g_st_hdmi_timing.u8_hdmi_flag = TRUE;
+    g_st_hdmi_timing.u8_vic = 0;
+    //g_st_hdmi_timing.u16_video_clk = 7425;
+    g_st_hdmi_timing.u8_clk_rpt = HDMI_X1CLK;
+    g_st_hdmi_timing.u8_scan_info = 0;
+    g_st_hdmi_timing.u8_aspect_ratio = 0;
+    g_st_hdmi_timing.u8_color_space = HDMI_RGB;
+    g_st_hdmi_timing.u8_color_depth = HDMI_COLOR_DEPTH_8BIT;
+    g_st_hdmi_timing.u8_colorimetry = 0;
+    g_st_hdmi_timing.u8_quant_range = 0;
+    g_st_hdmi_timing.u8_it_content = 0;
+}
+
+void sys_default_hdmi_vendor_specific_config(void)
+{
+    g_st_hdmi_timing.u8_video_format = HDMI_NO_ADD_FORMAT;
+    g_st_hdmi_timing.u8_4Kx2K_vic = 0;
+    g_st_hdmi_timing.u8_3D_structure = 0;
+}
+
+void sys_default_hdmi_audio_config(void)
+{
+    g_st_hdmi_timing.u8_audio_mode = HDMI_AUD_MODE_AUDIO_SAMPLE;
+    g_st_hdmi_timing.u8_audio_rate = HDMI_AUD_RATE_48K;
+    g_st_hdmi_timing.u8_audio_bits = HDMI_AUD_LENGTH_16BITS;
+    g_st_hdmi_timing.u8_audio_channels = HDMI_AUD_2CH;
+    g_st_hdmi_timing.u8_audio_speaker_locations = 0;
+}
+
+BOOL ms933x_app_hdmi_tx_hpd_det(VOID)
+{
+    if(g_u8_ms933xc_version_flag)
+    {
+        return ms933xcdrv_hdmi_tx_shell_hpd();
+    }
+    else
+    {
+        return ms933xdrv_hdmi_tx_shell_hpd();
+    }
+}
+
+//BIT7: change flag, BIT0: valid flag
+UINT8 _hotplug_process(UINT8 u8_output_chn)
+{
+    UINT8 u8_edid_parse_flag = 0;
+    UINT8 u8_flag = 0;
+    UINT8 u8_sink_hpd_connect;
+    UINT16 u16_pixel_clk;
+    UINT8 u8_edid_read_retry;
+
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+    u8_sink_hpd_connect = ms933x_app_hdmi_tx_hpd_det() ? 0x01 : 0x00;
+
+    u8_sink_hpd_connect |= (g_u8_tx_hpd_test_flag >> u8_output_chn) & 0x01;
+    u8_sink_hpd_connect &= (g_u8_tx_chn_enable_flag >> u8_output_chn);
+
+    TX_LED_light(u8_output_chn, u8_sink_hpd_connect);
+
+    if (g_u8_sink_hpd_connect[u8_output_chn] != u8_sink_hpd_connect)
+    {
+        u8_flag |= 0x80;
+        g_u8_sink_hpd_connect[u8_output_chn] = u8_sink_hpd_connect;
+
+        if (u8_sink_hpd_connect)
+        {
+            LOG2("sink_hpd_connect_chn = ", u8_output_chn);
+            if (!_tx_ddc_error_get(u8_output_chn))
+            {
+                //20190725, double check for EDID read.
+                for (u8_edid_read_retry = 0; u8_edid_read_retry < 3; u8_edid_read_retry ++)
+                {
+                    if (u8_edid_read_retry != 0)
+                    {
+                        mculib_delay_ms(u8_edid_read_retry ? 100 : 50);
+                        LOG("tx_EDID read again.");
+                    }
+
+                    u8_edid_parse_flag = ms933xdrv_hdmi_tx_parse_full_edid(g_u8_sys_edid_buf, &g_st_hdmi_edid_flag[u8_output_chn]);
+                    if (u8_edid_parse_flag)
+                    {
+                        break;
+                    }
+                    else
+                    {
+                        _tx_ddc_error_check(u8_output_chn, FALSE);
+
+                        if (!ms933x_app_hdmi_tx_hpd_det())
+                        {
+                            g_u8_sink_hpd_connect[u8_output_chn] = 0;
+                            LOG("tx_hpd_suddendly_lost.");
+                            return 0;
+                        }
+                    }
+                }
+
+                g_u8_sys_edid_buf_last_id = u8_output_chn;
+            }
+            
+            if (u8_edid_parse_flag) 
+            {
+                //if u32_preferred_timing is 4K30, judge Compliance with standards
+                if (g_st_hdmi_edid_flag[u8_output_chn].u32_preferred_timing == (3840UL * 2160) && g_st_hdmi_edid_flag[u8_output_chn].u16_preferred_pixel_clk < 45000)
+                {
+                    u16_pixel_clk = g_st_hdmi_edid_flag[u8_output_chn].u16_preferred_pixel_clk / 100;
+                    if (xabs(297, u16_pixel_clk) >= 10)
+                    {
+                        g_st_hdmi_edid_flag[u8_output_chn].u32_preferred_timing = g_st_hdmi_edid_flag[u8_output_chn].u32_preferred_timing + 297 - u16_pixel_clk;
+                        //LOG("4K non-standard.");
+                    }
+                }
+
+                //20181129, video block timing and HDMI VSDB timing 4K. compare to preferred_timing
+                if (g_st_hdmi_edid_flag[u8_output_chn].u32_max_video_block_timing != 0)
+                {
+                    if (g_st_hdmi_edid_flag[u8_output_chn].u32_preferred_timing < g_st_hdmi_edid_flag[u8_output_chn].u32_max_video_block_timing)
+                    {
+                        //LOG("fixed to video_block_timing.");
+                        g_st_hdmi_edid_flag[u8_output_chn].u32_preferred_timing = g_st_hdmi_edid_flag[u8_output_chn].u32_max_video_block_timing;
+                    }
+                }
+            }
+            else
+            {
+                LOG("tx_EDID read failed.");
+            }
+
+            if(g_st_hdmi_edid_flag[u8_output_chn].u8_edid_total_blocks > 2)
+            {
+                LOG("512 bytes EDID.");
+                //_hdmi_tx_edid_param_default(u8_output_chn);
+            }
+
+
+            #if HDMI_CTS_HDCP_RPT_ENABLE
+            //sink bcaps hdcp repeater flag
+            if (_tx_hdcp_bcaps_repeater_flag_get())
+            {
+                //LOG("sink_bcaps_rpt_support.");
+                //_tx_hdcp_rpt_param_repeater_flag_set(TRUE);
+            }
+            else
+            {
+                //_tx_hdcp_rpt_param_repeater_flag_set(FALSE);
+            }
+            #endif
+            
+            //if (g_b_hdmi_input_valid)
+            //{
+            //    _config_output(u8_output_chn);
+            //}
+        }
+        else
+        {
+            LOG2("sink_hpd_disconnect_chn = ", u8_output_chn);
+            //clear edid data
+            _hdmi_tx_edid_param_default(u8_output_chn);
+            //
+            _shutdown_output(u8_output_chn);
+
+            _tx_ddc_error_check(u8_output_chn, TRUE);
+        }
+    }
+
+    if (u8_sink_hpd_connect)
+    {
+        u8_flag |= 0x01;
+    }
+
+    return u8_flag;
+}
+
+
+
+
+
+void _hdmi_tx_edid_param_default(UINT8 u8_output_chn)
+{
+    g_st_hdmi_edid_flag[u8_output_chn].u8_hdmi_sink = TRUE; //default HDMI sink
+    g_st_hdmi_edid_flag[u8_output_chn].u8_color_space = 0; // only support RGB
+    g_st_hdmi_edid_flag[u8_output_chn].u8_edid_total_blocks = 0;
+    //
+    g_st_hdmi_edid_flag[u8_output_chn].u16_preferred_pixel_clk = 0xFFFF;
+    g_st_hdmi_edid_flag[u8_output_chn].u32_preferred_timing = 0xFFFFFFFFUL;
+    g_st_hdmi_edid_flag[u8_output_chn].u8_max_tmds_clk = 0;
+    g_st_hdmi_edid_flag[u8_output_chn].u32_max_video_block_timing = 0;
+    g_st_hdmi_edid_flag[u8_output_chn].u8_hdmi_2_0_flag = 0;
+}
+
+UINT8 _mask_hpd_status(UINT8 u8_id)
+{
+    if (u8_id == 0)
+    {
+        return 0x08;
+    }
+    else if (u8_id == 1)
+    {
+        return 0x04;
+    }
+    else if (u8_id == 2)
+    {
+        return 0x02;
+    }
+    else if (u8_id == 3)
+    {
+        return 0x01;
+    }
+    else
+    {
+        return 0x00;
+    }
+}
+
+VOID _edid_file_save(BOOL b_source)
+{
+#if DEBUG_EDID_FILE_SAVE
+    // TODO: Add your control notification handler code here
+    CString filename;
+    FILE* fp = NULL;
+
+    filename = b_source ? "source.bin" : "target.bin";
+    size_t origsize = wcslen(filename) + 1;
+    size_t convertedChars = 0;
+    const size_t newsize = origsize * 2;
+    char *nstring = new char[newsize];
+    wcstombs_s(&convertedChars, nstring, newsize, filename, _TRUNCATE);
+    fopen_s(&fp, nstring, "wb+");
+
+    if (fp)
+    {
+        fwrite(&g_u8_sys_edid_buf, 1, 512, fp);
+        fclose(fp);
+    }
+#endif
+}
+
+BOOL _check_hdmi_sink_exist(VOID)
+{
+    UINT8 i;
+    UINT8 u8_mask;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i ++)
+    {
+        u8_mask = (g_u8_tx_chn_enable_flag >> i) & 0x01;
+        if (u8_mask && g_u8_sink_hpd_connect[i])
+        {
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+BOOL _check_hdmi_sink(UINT8 u8_valid_flag)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i ++)
+    {
+        if (u8_valid_flag & 0x01)
+        {
+            if (g_st_hdmi_edid_flag[i].u8_hdmi_sink)
+            {
+                return TRUE;
+            }
+        }
+
+        u8_valid_flag >>= 1;
+    }
+
+    return FALSE;
+}
+
+UINT8 _tx_edid_read_again(UINT8 u8_id)
+{
+    LOG1("tx EDID read again, channel = ", u8_id);
+    ms933xdrv_hdmi_tx_set_channel(u8_id);
+    if (!ms933xdrv_hdmi_tx_parse_full_edid(g_u8_sys_edid_buf, &g_st_hdmi_edid_flag[HDMI_TX_DEFAULT_EDID_ID]))
+    {
+        LOG("tx EDID read unstable.");
+        u8_id = HDMI_TX_DEFAULT_EDID_ID;
+        memcpy(g_u8_sys_edid_buf, u8_sys_edid_default_buf, 256);
+    }
+
+    return u8_id;
+}
+
+BOOL _check_tx_hpd_plug_in(UINT8 u8_change_flag, UINT8 u8_valid_flag)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if ((u8_change_flag & 0x01) && (u8_valid_flag & 0x01))
+        {
+            return TRUE;
+        }
+
+        u8_change_flag >>= 1;
+        u8_valid_flag >>= 1;
+    }
+
+    return FALSE;
+}
+
+//suggest user update rx_edid follow below flow.
+BOOL _rx_edid_update(UINT8 *p_u8_edid_buf, BOOL b_rx_hpd_low_delay)
+{
+    BOOL b_rx_hpd_status = ms933xdrv_hdmi_rx_controller_hpd_get();
+
+    //ms933xc av reset
+    if (g_b_hdmi_input_valid)
+    {
+        g_b_hdmi_input_valid = 0;
+        sys_shutdown_output();
+    }
+
+    if (TMDS_CLK_VALID(g_u16_input_tmds_clk))
+    {
+        ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_HDMI | HDMI_RX_CTRL_MODET);
+    }
+
+    //
+    ms933xdrv_hdmi_rx_controller_hpd_set(FALSE);
+
+    //config rx_edid
+    ms933xdrv_hdmi_rx_full_edid_config(p_u8_edid_buf);
+
+    if (b_rx_hpd_status)
+    {
+        if (b_rx_hpd_low_delay)
+        {
+            mculib_delay_ms(200);
+        }
+        ms933xdrv_hdmi_rx_controller_hpd_set(TRUE);
+    }
+
+    return b_rx_hpd_status;
+}
+
+//suggest user toggle rx_hpd follow below flow.
+//rx hpd high->low->high
+BOOL _rx_hpd_toggle(VOID)
+{
+    BOOL b_rx_hpd_status = ms933xdrv_hdmi_rx_controller_hpd_get();
+
+    //ms933xc av reset
+    if (g_b_hdmi_input_valid)
+    {
+        g_b_hdmi_input_valid = 0;
+        sys_shutdown_output();
+    }
+
+    if (TMDS_CLK_VALID(g_u16_input_tmds_clk))
+    {
+        ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_HDMI | HDMI_RX_CTRL_MODET);
+    }
+
+    if (b_rx_hpd_status)
+    {
+        ms933xdrv_hdmi_rx_controller_hpd_set(FALSE);
+        mculib_delay_ms(200);
+        ms933xdrv_hdmi_rx_controller_hpd_set(TRUE);
+    }
+
+    return b_rx_hpd_status;
+}
+
+#define EDID_CONVERT_DVI_TO_HDMI        (0x01)
+#define EDID_CONVERT_AUDIO_2CH          (0x02)
+#define EDID_CONVERT_AUDIO_5CH          (0x04)
+#define EDID_CONVERT_AUDIO_7CH          (0x08)
+#define EDID_CONVERT_DEEP_COLOR_ENABLE  (0x10)
+#define EDID_CONVERT_YUV420_CONVERT     (0x20)
+#define EDID_CONVERT_HDMI_TO_DVI        (0x40)
+
+VOID edid_block_x_convert1(UINT8 *pu8_buf, HDMI_EDID_FLAG_T st_hdmi_edid_flag, UINT16 u16BlockStart,UINT16 block_covert_sel)
+{
+    UINT16 i, j;
+    UINT16 u16DetailedOffset;
+    UINT8 u8TotNum;
+    UINT16 u16TPixClk;
+    UINT16 u16BlockOffset;
+    UINT16 u16ChangeOffset;
+    UINT8 u8BlockTag;
+    UINT8 u8BlockLength;
+    BOOL bHdmi2_0Block;
+    UINT8 u8Hdmi2_0Timing[6][3] = {
+        { 96, 94, FALSE }, { 97, 95, FALSE }, { 101, 99, FALSE }, { 102, 100, FALSE }, { 106, 104, FALSE }, { 107, 105, FALSE } };
+    UINT8 u8Yuv420TimingNum = 0;
+        
+        
+    u16DetailedOffset = u16BlockStart + pu8_buf[u16BlockStart + 0x02];
+    u16BlockOffset = u16BlockStart + 0x04;
+    u16ChangeOffset = u16BlockOffset;
+
+    while (u16BlockOffset < u16DetailedOffset)
+    {
+        u8BlockTag = (pu8_buf[u16BlockOffset] & MSRT_BITS7_5) >> 5;
+        u8BlockLength = pu8_buf[u16BlockOffset] & MSRT_BITS4_0;
+
+        switch (u8BlockTag)
+        {
+        case AUDIO_D_BLOCK:
+//            i = u16BlockOffset + 1;
+//            while(i <= (u16BlockOffset + u8BlockLength))
+//            {
+//                if (((pu8_buf[i] & 0x78) == 0x58) || ((pu8_buf[i] & 0x78) == 0x60) || ((pu8_buf[i] & 0x78) == 0x78))
+//                {
+//                    pu8_buf[i] = pu8_buf[i] & 0x78;
+//                    pu8_buf[i+1] = 0;
+//                    pu8_buf[i+2] = 0;
+//                }               
+//                i += 3;
+//            }
+            bHdmi2_0Block = FALSE;
+            if((block_covert_sel&EDID_CONVERT_AUDIO_2CH)==EDID_CONVERT_AUDIO_2CH)// 2ch 
+            {
+                pu8_buf[u16BlockOffset+1]&=(~MSRT_BITS2_0);
+                pu8_buf[u16BlockOffset+1]|=0x01;
+            }
+            if((block_covert_sel&EDID_CONVERT_AUDIO_5CH)==EDID_CONVERT_AUDIO_5CH)//5ch
+            {
+                pu8_buf[u16BlockOffset+1]&=(~MSRT_BITS2_0);
+                pu8_buf[u16BlockOffset+1]|=0x05;
+            }
+            if((block_covert_sel&EDID_CONVERT_AUDIO_7CH)==EDID_CONVERT_AUDIO_7CH)//7ch
+            {
+                pu8_buf[u16BlockOffset+1]&=(~MSRT_BITS2_0);
+                pu8_buf[u16BlockOffset+1]|=0x07;
+            }
+            break;
+        case VIDEO_D_BLOCK:
+            bHdmi2_0Block = FALSE;
+            if (!st_hdmi_edid_flag.u8_hdmi_2_0_flag)
+            {
+                break;
+            }
+            for (i = u16BlockOffset + 1; i <= u16BlockOffset + u8BlockLength; i++)
+            {
+                if (((pu8_buf[i] & MSRT_BITS6_0) > 64) && (pu8_buf[i] > 95))
+                {
+                    for (j = 0; j < sizeof(u8Hdmi2_0Timing) / sizeof(u8Hdmi2_0Timing[0]); j++)
+                    {
+                        if (pu8_buf[i] == u8Hdmi2_0Timing[j][0])
+                        {
+                            #ifdef EDID_4K60_TO_4K30_ENABLE
+                            pu8_buf[i] = u8Hdmi2_0Timing[j][1];
+                            #else
+                            bHdmi2_0Block = TRUE;
+                            pu8_buf[i] = 0;
+                            #endif
+
+                            if (!u8Hdmi2_0Timing[j][2]) u8Yuv420TimingNum++;
+                        
+                            u8Hdmi2_0Timing[j][2] = TRUE;
+                            break;
+                        }
+                    }
+                }
+            }
+            if (bHdmi2_0Block)
+            {
+                j = u16ChangeOffset;
+                for (i = u16BlockOffset; i <= u16BlockOffset + u8BlockLength; i++)
+                {
+                    if (pu8_buf[i] != 0)
+                    {
+                        pu8_buf[u16ChangeOffset++] = pu8_buf[i];
+                    }
+                }
+                pu8_buf[j] = (pu8_buf[j] & MSRT_BITS7_5) | (u16ChangeOffset - j - 1);
+            }
+            break;
+        case SPKR_ALLOC_D_BLOCK:
+            bHdmi2_0Block = FALSE;
+            break;
+        case VENDOR_SPEC_D_BLOCK:
+            if ((pu8_buf[u16BlockOffset + 1] == 0x03) && (pu8_buf[u16BlockOffset + 2] == 0x0C) && (pu8_buf[u16BlockOffset + 3] == 0x00))
+            {
+               // #ifdef EDID_UNSUPPORT_DEEP_COLOR
+                if((block_covert_sel&EDID_CONVERT_DEEP_COLOR_ENABLE)==EDID_CONVERT_DEEP_COLOR_ENABLE)
+                {
+//                    
+                    if (u8BlockLength >= 6)
+                    {
+                        pu8_buf[u16BlockOffset + 6] |= 0x87; //deep color fixed un-support: bit6: 48bit; bit5: 36bit; bit4: 30bit; bit3: yuv444;
+                        LOG("DEEP COLOCR OPEN");
+                    }
+                    
+                }
+              //  #endif
+
+                //20210811, if sink EDID is HDMI2_0, check hdmi1_4 VSBD max tmds clk whether large than 340M
+                //if true, change to 300M.
+                if (st_hdmi_edid_flag.u8_hdmi_2_0_flag && u8BlockLength >= 7)
+                {
+                    if (pu8_buf[u16BlockOffset + 7] >= (340 / 5))
+                    {
+                        pu8_buf[u16BlockOffset + 7] = (300 / 5);
+                    }
+                }
+                bHdmi2_0Block = FALSE;
+            }
+            else
+            {
+                bHdmi2_0Block = TRUE;
+            }
+            break;
+        case VESA_DTC_D_BLOCK:
+            bHdmi2_0Block = FALSE;
+            break;
+        case USE_EXTENDED_TAG:
+            switch (pu8_buf[u16BlockOffset + 1])
+            {
+                case VIDEO_CAPABILITY_D_BLOCK:
+                case VENDOR_SPEC_VIDEO_D_BLOCK:
+                case COLORIMETRY_D_BLOCK:
+                #ifdef EDID_4K60_YUV420_SUPPORT
+                case YUV420_VIDEO_D_BLOCK:
+                #endif
+                //case YUV420_CAPABILITY_D_BLOCK:
+                case CEA_MISC_AUDIO_FIELDS:
+                case VENDOR_SPEC_AUDIO_D_BLOCK:
+                    bHdmi2_0Block = FALSE;
+                    break;
+                default:
+                    bHdmi2_0Block = TRUE;
+            }
+            break;
+        default:
+            bHdmi2_0Block = TRUE;
+        }
+    
+        if (st_hdmi_edid_flag.u8_hdmi_2_0_flag && !bHdmi2_0Block)
+        {
+            if (u16BlockOffset != u16ChangeOffset)
+            {
+                memcpy(&pu8_buf[u16ChangeOffset], &pu8_buf[u16BlockOffset], u8BlockLength + 1);
+            }
+            u16ChangeOffset += u8BlockLength + 1;
+        }
+        u16BlockOffset += u8BlockLength + 1;
+    }
+
+    if (st_hdmi_edid_flag.u8_hdmi_2_0_flag)
+    {
+      //  #ifdef EDID_4K60_YUV420_SUPPORT
+        if((block_covert_sel&EDID_CONVERT_YUV420_CONVERT)==EDID_CONVERT_YUV420_CONVERT)
+        {
+            if (u8Yuv420TimingNum)
+            {
+                u8BlockTag = USE_EXTENDED_TAG;
+                u8BlockLength = u8Yuv420TimingNum + 1;
+                pu8_buf[u16ChangeOffset++] = (u8BlockTag << 5) | u8BlockLength;
+                pu8_buf[u16ChangeOffset++] = YUV420_VIDEO_D_BLOCK;
+
+                for (i = 0; i < sizeof(u8Hdmi2_0Timing) / sizeof(u8Hdmi2_0Timing[0]); i++)
+                {
+                    if (u8Hdmi2_0Timing[i][2])
+                    {
+                        pu8_buf[u16ChangeOffset++] = u8Hdmi2_0Timing[i][0];
+                    }
+                }
+            }
+       }
+       // #endif
+    
+        if (u16DetailedOffset != 0x80)
+        {
+            u8TotNum = 6;
+            u8BlockLength = 18;
+            for (i = 0; i < u8TotNum; i++)
+            {
+                if ((pu8_buf[u16DetailedOffset] == 0) || (u16DetailedOffset == 0x1ff))
+                {
+                    break;
+                }
+                u16TPixClk = pu8_buf[u16DetailedOffset] + 256 * pu8_buf[u16DetailedOffset + 1];
+                if (u16TPixClk >= 34000)
+                {
+                    u16TPixClk /= 2;
+                    pu8_buf[u16DetailedOffset] = u16TPixClk & 0x1ff;
+                    pu8_buf[u16DetailedOffset + 1] = u16TPixClk >> 8;
+                }
+                u16DetailedOffset += u8BlockLength;
+            }
+            u16DetailedOffset = u16BlockStart + pu8_buf[u16BlockStart + 0x02];
+            if (u16ChangeOffset != u16DetailedOffset)
+            {
+                pu8_buf[u16BlockStart + 0x02] = u16ChangeOffset - u16BlockStart;
+                memcpy(&pu8_buf[u16ChangeOffset], &pu8_buf[u16DetailedOffset], i * u8BlockLength);
+            }
+            u16ChangeOffset += i * u8BlockLength;
+        }
+    
+        memset(&pu8_buf[u16ChangeOffset], 0, (u16BlockStart + 0x80) - u16ChangeOffset);
+    }
+
+        //change EDID support color sapce
+        if ((pu8_buf[u16BlockStart + 0x03] & MSRT_BITS5_4) != st_hdmi_edid_flag.u8_color_space)
+        {
+            pu8_buf[u16BlockStart + 0x03] &= ~MSRT_BITS5_4;
+            pu8_buf[u16BlockStart + 0x03] |= st_hdmi_edid_flag.u8_color_space & MSRT_BITS5_4;
+        }
+
+        pu8_buf[u16BlockStart + 0x7f] = 0;
+        for (i = u16BlockStart; i < (u16BlockStart + 0x7f); i++)
+        {
+            pu8_buf[u16BlockStart + 0x7f] -= pu8_buf[i];
+        }       
+}
+
+BOOL sys_edid_convert1(UINT8 *pu8_buf, HDMI_EDID_FLAG_T st_hdmi_edid_flag,UINT16 edid_convert_sel)
+{
+    UINT16 i;
+    UINT16 u16DetailedOffset;
+    UINT8  u8TotNum;
+    UINT16 u16TPixClk;
+    UINT8  u8BlockLength;
+    UINT8 u8BlockTag;
+
+    //UINT8 u8Hdmi2_0Timing[6][3] = {
+    //    { 96, 94, FALSE }, { 97, 95, FALSE }, { 101, 99, FALSE }, { 102, 100, FALSE }, { 106, 104, FALSE }, { 107, 105, FALSE } };
+    //UINT8 u8Yuv420TimingNum = 0;
+
+            
+        
+    //if DVI sink, return
+    if (!st_hdmi_edid_flag.u8_hdmi_sink)
+    {
+       if((edid_convert_sel&EDID_CONVERT_DVI_TO_HDMI)==EDID_CONVERT_DVI_TO_HDMI)
+       {
+      //  #ifdef EDID_DVI2HDMI
+        //change DVI EDID to HDMI EDID
+        pu8_buf[0x7e] = 0x01;
+        pu8_buf[0x7f] = 0;
+        for (i = 0x00; i < 0x7f; i++)
+        {
+            pu8_buf[0x7f] -= pu8_buf[i];
+        }
+
+        memset(&pu8_buf[0x80], 0x00, 0x80);
+        pu8_buf[0x80] = 0x02;
+        pu8_buf[0x81] = 0x03;
+        pu8_buf[0x82] = 0x04;
+        pu8_buf[0x83] = 0x40;   //basic audio support
+        u8BlockTag = VENDOR_SPEC_D_BLOCK;
+        u8BlockLength = 5;
+        pu8_buf[0x82] += u8BlockLength + 1;
+        pu8_buf[0x84] = (u8BlockTag << 5) | u8BlockLength;
+        pu8_buf[0x85] = 0x03;
+        pu8_buf[0x86] = 0x0c;
+        pu8_buf[0x87] = 0x00;
+        pu8_buf[0x88] = 0x00;
+        pu8_buf[0x89] = 0x00;
+
+        pu8_buf[0xff] = 0;
+        for (i = 0x80; i < 0xff; i++)
+        {
+            pu8_buf[0xff] -= pu8_buf[i];
+        }
+      }
+        //memcpy(&pu8_buf[0x80], &u8_sys_edid_default_buf[0x80], 128);
+     //   #endif
+
+        return TRUE;
+    }
+    if((edid_convert_sel&EDID_CONVERT_HDMI_TO_DVI)==EDID_CONVERT_HDMI_TO_DVI)
+    {
+        pu8_buf[0x7e] = 0x00;
+        pu8_buf[0x7f] = 0;
+        for (i = 0x00; i < 0x7f; i++)
+        {
+            pu8_buf[0x7f] -= pu8_buf[i];
+        }
+        return TRUE;
+    }
+    
+    //chenge HDMI2.0 EDID to HDMI1.4 EDID
+    if (st_hdmi_edid_flag.u8_hdmi_2_0_flag)
+    {
+        //block 0
+        u16DetailedOffset = 0x36;
+        u8TotNum = 4;
+        u8BlockLength = 18;
+        for (i = 0; i < u8TotNum; i++)
+        {
+            u16TPixClk = pu8_buf[u16DetailedOffset] + 256 * pu8_buf[u16DetailedOffset + 1];
+            if (u16TPixClk >= 34000)
+            {
+                u16TPixClk /= 2;
+                pu8_buf[u16DetailedOffset] = u16TPixClk & 0xff;
+                pu8_buf[u16DetailedOffset + 1] = u16TPixClk >> 8;
+            }
+            else if (pu8_buf[u16DetailedOffset + 0] == 0x00 && 
+                     pu8_buf[u16DetailedOffset + 1] == 0x00 && 
+                     pu8_buf[u16DetailedOffset + 2] == 0x00 &&
+                     pu8_buf[u16DetailedOffset + 3] == 0xFD)
+            {
+                if (pu8_buf[u16DetailedOffset + 9] >= 34) //340MHz
+                {
+                    //LOG("edid_block0_max_pclk_300MHz.");
+                    pu8_buf[u16DetailedOffset + 9] = 30;
+                }
+            }
+            u16DetailedOffset += u8BlockLength;
+        }
+
+        pu8_buf[0x7f] = 0;
+        for (i = 0x00; i < 0x7f; i++)
+        {
+            pu8_buf[0x7f] -= pu8_buf[i];
+        }
+    }
+
+    if(pu8_buf[0x80] != 0xf0)
+    {
+        edid_block_x_convert1(pu8_buf, st_hdmi_edid_flag, 0x80,edid_convert_sel);
+    }
+    else
+    {
+        if (pu8_buf[0x81] != 0x02 && pu8_buf[0x82] != 0x02) //block2 and block3 all is not CEA_BLOCK
+        {
+            pu8_buf[0x7e] = 0;
+            pu8_buf[0x7f] = 0;
+            for (i = 0x00; i < 0x7f; i++)
+            {
+                pu8_buf[0x7f] -= pu8_buf[i];
+            }
+
+            memset(&pu8_buf[0x80], 0, 0x180);
+        }
+        else if (pu8_buf[0x81] == 0x02 && pu8_buf[0x82] != 0x02) //only block2 is CEA_BLOCK
+        {
+            pu8_buf[0x7e] = 1;
+            pu8_buf[0x7f] = 0;
+            for (i = 0x00; i < 0x7f; i++)
+            {
+                pu8_buf[0x7f] -= pu8_buf[i];
+            }
+
+            memcpy(&pu8_buf[0x80], &pu8_buf[0x100], 0x80);
+            memset(&pu8_buf[0x100], 0, 0x100);
+            edid_block_x_convert1(pu8_buf, st_hdmi_edid_flag, 0x80, edid_convert_sel);
+        }
+        else if (pu8_buf[0x81] != 0x02 && pu8_buf[0x82] == 0x02) //only block3 is CEA_BLOCK
+        {
+            pu8_buf[0x7e] = 1;
+            pu8_buf[0x7f] = 0;
+            for (i = 0x00; i < 0x7f; i++)
+            {
+                pu8_buf[0x7f] -= pu8_buf[i];
+            }
+
+            memcpy(&pu8_buf[0x80], &pu8_buf[0x180], 0x80);
+            memset(&pu8_buf[0x100], 0, 0x100);
+            edid_block_x_convert1(pu8_buf, st_hdmi_edid_flag, 0x80, edid_convert_sel);
+        }
+        else //block2 and block3 all is CEA_BLOCK
+        {
+            edid_block_x_convert1(pu8_buf, st_hdmi_edid_flag, 0x100, edid_convert_sel);
+            edid_block_x_convert1(pu8_buf, st_hdmi_edid_flag, 0x180, edid_convert_sel);
+        }
+    }
+           
+    return TRUE;
+}
+
+UINT8 _hotplug_service(BOOL b_sys_init_flag)
+{
+    UINT8 u8_edid_change = 0; //bit7: rx HPD toggle flag; bit0: EDID update flag
+    UINT8 u8_change_flag = 0;
+    UINT8 u8_valid_flag = 0;
+    UINT8 u8_data;
+    UINT8 u8_id = 0;
+    UINT8 b_check = FALSE;
+    UINT32 u32_temp;
+    UINT32 u32_min_per_timing = 0xFFFFFFFFUL;
+    #if 0
+    UINT8 u8_used_color_space = 0x30;
+    #endif
+    UINT8 i;
+    UINT8 u8_source_5v_connect;
+    UINT8 u8_tx_plug_in_flag = 0;
+    UINT8 u8_dvi_mode=0;
+    u8_source_5v_connect = ms933xdrv_hdmi_rx_5v_det();
+    if (g_u8_source_5v_connect != u8_source_5v_connect)
+    {
+        LOG1("u8_source_5v_connect = ", u8_source_5v_connect);
+        RX_LED_light(u8_source_5v_connect);
+        g_u8_source_5v_connect = u8_source_5v_connect;
+        if (!g_u8_rx_hpd_test_flag)
+        {
+            ms933xdrv_hdmi_rx_controller_hpd_set(u8_source_5v_connect && _check_hdmi_sink_exist());
+
+            //if rx 5v lost, clear rx hdcp aksv writed flag
+            if (!u8_source_5v_connect)
+            {
+                g_u8_rx_hdcp_aksv_be_writed_flag = 0;
+            }
+        }
+    }
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        u8_data = _hotplug_process(i);
+        if (u8_data & 0x01)
+        {
+            u8_valid_flag |= (1 << i);
+        }
+
+        if (u8_data & 0x80)
+        {
+            u8_change_flag |= (1 << i);
+        }
+
+        u32_temp = g_st_hdmi_edid_flag[i].u32_preferred_timing;
+        if (u32_temp < u32_min_per_timing)
+        {
+            u8_id = i;
+            u32_min_per_timing = u32_temp;
+        }
+        #if 0
+        if (u8_data & 0x01)
+        {
+            u8_used_color_space &= g_st_hdmi_edid_flag[i].u8_color_space;
+        }
+        #endif
+
+        u8_tx_plug_in_flag = u8_change_flag & u8_valid_flag;
+    }
+
+    if (g_u8_rx_hpd_test_flag)
+    {
+        goto _JUMP_EDID_DEFALUT;
+    }
+
+    if (u8_change_flag)
+    {
+        if (u8_valid_flag)
+        {
+            //if pre hpd false
+            if (g_u8_sys_edid_flag == 0xff)
+            {
+                u8_edid_change = 0x80;
+            }
+
+            //invalid edid or no edid, fixed use default EDID
+            if (u32_min_per_timing == 0xFFFFFFFFUL)
+            {
+                g_u32_hdmi_sink_min_timing = 0xFFFFFFFFUL;
+                g_u32_dvi_sink_min_timing = 0xFFFFFFFFUL;
+                b_check = TRUE;
+                u8_id = HDMI_TX_DEFAULT_EDID_ID;
+                memcpy(g_u8_sys_edid_buf, u8_sys_edid_default_buf, 256);
+            }
+            else if (!_check_hdmi_sink(u8_valid_flag)) //all sink is dvi.
+            {
+                g_u32_hdmi_sink_min_timing = 0xFFFFFFFFUL;
+
+                if (u32_min_per_timing < g_u32_dvi_sink_min_timing)
+                {
+                    g_u32_dvi_sink_min_timing = u32_min_per_timing;
+                    b_check = TRUE;
+
+                    //if selected EDID(g_u8_sys_edid_buf) is not the last be readed
+                    if (g_u8_sys_edid_buf_last_id != u8_id)
+                    {
+                        u8_id = _tx_edid_read_again(u8_id);
+                    }
+                }
+            }
+            else if (u32_min_per_timing < g_u32_hdmi_sink_min_timing)
+            {
+                g_u32_dvi_sink_min_timing = 0xFFFFFFFFUL;
+                g_u32_hdmi_sink_min_timing = u32_min_per_timing;
+                b_check = TRUE;
+
+                //if min_timing is dvi sink and hdmi sink exist, fixed use default EDID
+                if (!g_st_hdmi_edid_flag[u8_id].u8_hdmi_sink)
+                {
+                    u8_id = HDMI_TX_DEFAULT_EDID_ID;
+                    memcpy(g_u8_sys_edid_buf, u8_sys_edid_default_buf, 256);
+                }
+                //if selected EDID(g_u8_sys_edid_buf) is not the last be readed
+                else if (g_u8_sys_edid_buf_last_id != u8_id)
+                {
+                    u8_id = _tx_edid_read_again(u8_id);
+                }
+            }
+
+            if (b_check)
+            {
+                g_u8_sys_edid_buf_last_id = u8_id;
+                g_u8_sys_edid_flag = u8_id;
+
+                if (memcmp(g_u8_sys_edid_used_buf, g_u8_sys_edid_buf, 512) != 0)
+                {
+                    u8_edid_change = 0x81;
+                    memcpy(g_u8_sys_edid_used_buf, g_u8_sys_edid_buf, 512);
+                }
+            }
+            
+            if (u8_edid_change)
+            {
+                LOG1("u8_edid_change = ", u8_edid_change);
+
+                if (u8_edid_change & 0x01)
+                {
+                    LOG1("hdmi_rx_edid_id = ", u8_id);
+
+                    g_u8_rx_hdcp_aksv_be_writed_flag = 0;
+
+                    _edid_file_save(1);
+
+                    g_st_hdmi_edid_flag[HDMI_TX_DEFAULT_EDID_ID] = g_st_hdmi_edid_flag[u8_id];
+                    //20220620, chip new version support CSC function
+                    if (ms933xdrv_misc_chip_new_version_get())
+                    {
+                        g_st_hdmi_edid_flag[HDMI_TX_DEFAULT_EDID_ID].u8_color_space = MSRT_BITS5_4; //support YUV444/YUV422
+                    }
+                    else
+                    {
+                        g_st_hdmi_edid_flag[HDMI_TX_DEFAULT_EDID_ID].u8_color_space = 0; //only support RGB
+                    }
+                    if (u8_id != HDMI_TX_DEFAULT_EDID_ID && _check_hdmi_sink(u8_valid_flag)) //if not the default EDID and have hdmi sink
+                    {
+
+//                        for(int i =0;i<255;i++)
+//                        {
+//                           LOG1("i = ",i);
+//                            LOG1("g_u8_sys_edid_buf[I]=  ",g_u8_sys_edid_buf[i]);
+//                        }
+                        if(u8_dvi_mode==1)
+                        {
+                             sys_edid_convert1(g_u8_sys_edid_buf, g_st_hdmi_edid_flag[HDMI_TX_DEFAULT_EDID_ID],0x31);
+                        }
+                        else
+                        {
+                            sys_edid_convert1(g_u8_sys_edid_buf, g_st_hdmi_edid_flag[HDMI_TX_DEFAULT_EDID_ID],0x30);
+                        }
+//                           for(int i =0;i<255;i++)
+//                        {
+//                           LOG1("i = ",i);
+//                            LOG1("g_u8_sys_edid_buf[I]=  ",g_u8_sys_edid_buf[i]);
+//                        }
+                    }
+
+                    //when system init, rx_hpd low delay not needed
+                    _rx_edid_update(g_u8_sys_edid_buf, !b_sys_init_flag);
+
+                    _edid_file_save(0);
+                    memcpy(g_u8_sys_edid_buf, g_u8_sys_edid_used_buf, 512);
+                }
+
+                //rx_5v valid but rx_hpd not be set
+                if (g_u8_source_5v_connect && !ms933xdrv_hdmi_rx_controller_hpd_get())
+                {
+                    ms933xdrv_hdmi_rx_controller_hpd_set(TRUE);
+                }
+            }
+        }
+        else
+        {
+            #if HDMI_RX_HPD_DELAY_OFF_ENABLE
+            LOG("hdmi tx sink lost.");
+            #endif
+            g_u8_sys_edid_flag = 0xff;
+            g_u32_hdmi_sink_min_timing = 0xFFFFFFFFUL;
+            g_u32_dvi_sink_min_timing = 0xFFFFFFFFUL;
+
+            #if (HDMI_RX_HPD_DELAY_OFF_ENABLE)
+            g_u8_hdmi_rx_hpd_off_count = 0;
+            #else
+            g_u8_hdmi_rx_hpd_off_count = HDMI_RX_HPD_OFF_TIMEOUT - 1;
+            #endif
+        }
+    }
+
+    #if HDCP_RPT_SUPPORT_ENABLE
+    if (g_u8_hdcp_repeater_support)
+    {
+        if (u8_tx_plug_in_flag && g_u8_source_5v_connect && g_b_hdmi_input_valid && (g_u8_rx_hdcp_woking_flag | g_u8_rx_hdcp_aksv_be_writed_flag))
+        {
+            g_u8_rx_hdcp_aksv_be_writed_flag = 0;
+            LOG("hdmi_rx_hpd toggle.");
+            _rx_hpd_toggle();
+        }
+    }
+    #endif
+
+    if (g_b_hdmi_input_valid && g_u8_ms933xc_version_flag && u8_tx_plug_in_flag)
+    {
+        if ((_tx_sink_exist_unsupport_yuv_check() && !ms933xcdrv_hdmi_tx_csc_setting_get()) ||
+            (!_tx_sink_exist_unsupport_yuv_check() && ms933xcdrv_hdmi_tx_csc_setting_get()))
+        {
+            LOG("hdmi_rx_hpd toggle.");
+            _rx_hpd_toggle();
+        }
+    }
+
+_JUMP_EDID_DEFALUT:
+    
+    if (g_b_hdmi_input_valid)
+    {
+        //config each plug in tx_channel
+        for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+        {
+            //check tx plug in channel
+            if ((u8_tx_plug_in_flag >> i) & 0x01)
+            {
+                _config_output(i);
+            }
+        }
+    }
+          
+    return u8_edid_change;
+}
+
+VOID sys_hotplug_service(void)
+{
+    g_u8_hdmi_tx_hpd_detect_count ++;
+    if (g_u8_hdmi_tx_hpd_detect_count < HDMI_TX_HPD_DET_TIMEOUT)
+    {
+        return;
+    }
+    g_u8_hdmi_tx_hpd_detect_count = 0;
+
+    _hotplug_service(FALSE);
+
+    //rx hpd off service
+    if (g_u8_sys_edid_flag == 0xff)
+    {
+        if (g_u8_hdmi_rx_hpd_off_count < HDMI_RX_HPD_OFF_TIMEOUT)
+        {
+            g_u8_hdmi_rx_hpd_off_count ++;
+            if (g_u8_hdmi_rx_hpd_off_count == HDMI_RX_HPD_OFF_TIMEOUT)
+            {
+                //rx hpd already be false, dont't need do next.
+                if (ms933xdrv_hdmi_rx_controller_hpd_get())
+                {
+                    ms933xdrv_hdmi_rx_controller_hpd_set(FALSE);
+                    LOG("hdmi rx hpd off.");
+                }
+            }
+        }
+    }
+}
+
+
+void sys_hotplug_init(void)
+{
+    //remove, chip_default
+    //ms933xdrv_hdmi_rx_controller_hpd_set(FALSE);
+
+    _hotplug_service(TRUE);
+
+    if (g_u8_rx_hpd_test_flag)
+    {
+        LOG("rx_hpd force on.");
+        //delay for hpd, not necessary
+        //mculib_delay_ms(200);
+        ms933xdrv_hdmi_rx_full_edid_config((UINT8 *)u8_sys_edid_default_buf);
+        ms933xdrv_hdmi_rx_controller_hpd_set(TRUE);
+    }
+}
+
+//csc yuv to rgb
+
+static BOOL _tx_sink_unsupport_yuv_check(UINT8 u8_output_chn)
+{
+    //UINT8 i;
+    UINT8 u8_mask;
+    UINT8 u8_in_color;
+
+    u8_in_color = g_st_hdmi_timing.u8_color_space;
+
+    if (u8_in_color == HDMI_RGB || u8_in_color == HDMI_YUV420)
+    {
+        return FALSE;
+    }
+
+    u8_mask = (u8_in_color == HDMI_YCBCR444) ? MSRT_BIT5 : MSRT_BIT4;
+
+    //unsupport judge
+    if (!(g_st_hdmi_edid_flag[u8_output_chn].u8_color_space & u8_mask))
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static BOOL _tx_sink_exist_unsupport_yuv_check(VOID)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            //unsupport judge
+            if (_tx_sink_unsupport_yuv_check(i))
+            {
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+//judge whether input yuv444 or yuv222 need to convert rgb
+static BOOL _csc_process(UINT8 u8_output_chn)
+{
+    if (!ms933xdrv_misc_chip_new_version_get())
+    {
+        return FALSE;
+    }
+
+    if (_tx_sink_unsupport_yuv_check(u8_output_chn) || (g_u8_ms933xc_version_flag && _tx_sink_exist_unsupport_yuv_check()))
+    {
+        ms933xdrv_hdmi_tx_csc((g_st_hdmi_timing.u8_colorimetry << 4) | g_st_hdmi_timing.u8_color_space, HDMI_RGB);
+        return TRUE;
+    }
+    else
+    {
+        //bypass
+        ms933xdrv_hdmi_tx_csc(0, 0);
+        return FALSE;
+    }
+}
+
+
+static UINT8 g_u8_rx_spd_code = 0xff;
+
+void _packet_fifo_init(VOID)
+{
+#if HDMI_SPD_INFO_CTRL_ENABLE
+    g_u8_rx_spd_code = 0xff;
+
+    ms933xdrv_hdmi_rx_core_packet_fifo_init(8);
+#endif
+}
+
+void _get_packet_fifo_data(VOID)
+{
+#if HDMI_SPD_INFO_CTRL_ENABLE
+    UINT8 u8_data;
+
+    g_u8_rx_spd_code = 0xff;
+    if (ms933xdrv_hdmi_rx_core_packet_fifo_get(&u8_data))
+    {
+        g_u8_rx_spd_code = u8_data;
+    }
+
+    LOG1("u8_rx_spd_code = ", g_u8_rx_spd_code);
+#endif
+}
+
+UINT8 _get_packet_fifo_spd_code(VOID)
+{
+    return g_u8_rx_spd_code;
+}
+
+void _config_output_spd_info(UINT8 u8_output_chn)
+{
+#if HDMI_SPD_INFO_CTRL_ENABLE
+    UINT8 u8_spd_code = _get_packet_fifo_spd_code();
+
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+
+    ms933xdrv_hdmi_tx_shell_set_spd_infoframe(&u8_spd_code, 1, (u8_spd_code == 0xff) ? FALSE : TRUE);
+#endif
+}
+
+#if MS933X_HDMI_NET_CABLE_TX_ENABLE
+void sys_hdmi_tx_drive_mode_config(UINT8 u8_mode)
+{
+    switch (u8_mode)
+    {
+    //关闭6mA
+    //drive 适中
+    //打开去加重
+    case 0:
+        ms933x_HAL_WriteByte(0x920, 0x1e);
+        ms933x_HAL_WriteByte(0x921, 0xe0);
+        ms933x_HAL_WriteByte(0x922, 0x03);
+        ms933x_HAL_WriteByte(0x923, 0x07);
+        ms933x_HAL_WriteByte(0x924, 0x44);
+        ms933x_HAL_WriteByte(0x925, 0x07);
+        ms933x_HAL_WriteByte(0x926, 0x1d);
+        ms933x_HAL_WriteByte(0x927, 0x0d);
+        ms933x_HAL_WriteByte(0x928, 0xc8);
+        ms933x_HAL_WriteByte(0x929, 0x08);
+        break;
+
+    //打开6mA
+    //drive 最大
+    //关闭去加重
+    case 1:
+        ms933x_HAL_WriteByte(0x920, 0x1e);
+        ms933x_HAL_WriteByte(0x921, 0xe0);
+        ms933x_HAL_WriteByte(0x922, 0x03);
+        ms933x_HAL_WriteByte(0x923, 0x17);
+        ms933x_HAL_WriteByte(0x924, 0x77);
+        ms933x_HAL_WriteByte(0x925, 0x07);
+        ms933x_HAL_WriteByte(0x926, 0xff);
+        ms933x_HAL_WriteByte(0x927, 0x0f);
+        ms933x_HAL_WriteByte(0x928, 0x00);
+        ms933x_HAL_WriteByte(0x929, 0x00);
+        break;
+
+    //打开6mA
+    //drive 最大
+    //打开去加重
+    case 2:
+        ms933x_HAL_WriteByte(0x920, 0x1e);
+        ms933x_HAL_WriteByte(0x921, 0xe0);
+        ms933x_HAL_WriteByte(0x922, 0x03);
+        ms933x_HAL_WriteByte(0x923, 0x17);
+        ms933x_HAL_WriteByte(0x924, 0x77);
+        ms933x_HAL_WriteByte(0x925, 0x07);
+        ms933x_HAL_WriteByte(0x926, 0xff);
+        ms933x_HAL_WriteByte(0x927, 0x0f);
+        ms933x_HAL_WriteByte(0x928, 0xff);
+        ms933x_HAL_WriteByte(0x929, 0x0f);
+        break;
+
+    //关闭6mA
+    //drive 最大
+    //关闭去加重
+    case 3:
+        ms933x_HAL_WriteByte(0x920, 0x1e);
+        ms933x_HAL_WriteByte(0x921, 0xe0);
+        ms933x_HAL_WriteByte(0x922, 0x03);
+        ms933x_HAL_WriteByte(0x923, 0x07);
+        ms933x_HAL_WriteByte(0x924, 0x77);
+        ms933x_HAL_WriteByte(0x925, 0x07);
+        ms933x_HAL_WriteByte(0x926, 0xff);
+        ms933x_HAL_WriteByte(0x927, 0x0f);
+        ms933x_HAL_WriteByte(0x928, 0x00);
+        ms933x_HAL_WriteByte(0x929, 0x00);
+        break;
+    }
+}
+#endif //MS933X_HDMI_NET_CABLE_TX_ENABLE
+
+void _tx_drive_for_short_cable(UINT8 u8_output_chn)
+{
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+    //
+    ms933xdrv_hdmi_tx_phy_clk_drive_config(0, 0);
+    ms933xdrv_hdmi_tx_phy_data_drive_config(0, 0, 0);
+}
+
+void _tx_drive_for_long_cable(UINT8 u8_output_chn)
+{
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+    //
+    //20191219, hdmi tx drive update for 60m HDMI cable.
+    ms933xdrv_hdmi_tx_phy_data_drive_enhance(TRUE);
+    ms933xdrv_hdmi_tx_phy_data_R200_enable(FALSE);
+    ms933xdrv_hdmi_tx_phy_clk_drive_config(4, 15);
+    ms933xdrv_hdmi_tx_phy_data_drive_config(4, 15, 0);
+}
+
+void _config_output(UINT8 u8_output_chn)
+{
+    HDMI_CONFIG_T st_hdmi_tx_config;
+
+    st_hdmi_tx_config = g_st_hdmi_timing;
+
+    st_hdmi_tx_config.u8_hdmi_flag &=g_st_hdmi_edid_flag[u8_output_chn].u8_hdmi_sink;
+    LOG1("st_hdmi_tx_config.u8_hdmi_flag  = ",st_hdmi_tx_config.u8_hdmi_flag);
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+    ms933xdrv_hdmi_tx_phy_output_enable(FALSE);
+    ms933xdrv_hdmi_tx_hdcp_enable(FALSE);
+    ms933xdrv_hdmi_tx_shell_set_gcp_packet_avmute(FALSE);
+
+    #if HDMI_VIDEO_CSC_AUTO_ENABLE
+    if (_csc_process(u8_output_chn))
+    {
+        st_hdmi_tx_config.u8_color_space = HDMI_RGB;
+        st_hdmi_tx_config.u8_colorimetry = 0;
+        st_hdmi_tx_config.u8_quant_range = 0;
+    }
+    #endif
+
+    ms933xdrv_hdmi_tx_config(&st_hdmi_tx_config);
+
+    _config_output_spd_info(u8_output_chn);
+
+    ms933xdrv_hdmi_tx_shell_video_mute_enable(FALSE);
+    ms933xdrv_hdmi_tx_shell_audio_mute_enable(FALSE);
+
+    #if MS933X_HDMI_NET_CABLE_TX_ENABLE
+    //_tx_drive_for_long_cable(u8_output_chn);
+    g_u8_hdmi_tx_drive_mode = 2;
+    sys_hdmi_tx_drive_mode_config(g_u8_hdmi_tx_drive_mode);
+    #endif
+    ms933xdrv_hdmi_tx_phy_output_enable(TRUE);
+    //
+    if (!g_u8_ms933xc_version_flag)
+    {
+        _hdmi_tx_hdcp_start(u8_output_chn);
+    }
+    _hdmi_tx_gcp_avmute_param_default();
+}
+
+void _config_output_audio(UINT8 u8_output_chn)
+{
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+
+    ms933xdrv_hdmi_tx_audio_config(&g_st_hdmi_timing);
+}
+
+void _config_output_audio_fs(UINT8 u8_output_chn)
+{
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+
+    ms933xdrv_hdmi_tx_audio_fs_update(g_st_hdmi_timing.u8_audio_rate);
+}
+
+void _config_output_avmute(UINT8 u8_output_chn, BOOL b_avmute)
+{
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+
+    ms933xdrv_hdmi_tx_shell_set_gcp_packet_avmute(b_avmute);
+}
+
+void sys_config_output(UINT8 u8_config_item, UINT8 u8_value)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            if (u8_config_item == HDMI_TX_CONFIG_AV)
+            {
+                _config_output(i);
+            }
+            else if (u8_config_item == HDMI_TX_CONFIG_AUD)
+            {
+                if (g_u8_ms933xc_version_flag)
+                {
+                    _config_output_audio(0);
+                    break;
+                }
+                else
+                {
+                    _config_output_audio(i);
+                }
+            }
+            else if (u8_config_item == HDMI_TX_CONFIG_AUD_FS)
+            {
+                #if 0 //20190805, do update cts value. because input detect value maybe 不准确
+                if (g_u8_ms933xc_version_flag)
+                {
+                    _config_output_audio_fs(0);
+                    break;
+                }
+                else
+                {
+                    _config_output_audio_fs(i);
+                }
+                #endif
+            }
+            else if (u8_config_item == HDMI_TX_CONFIG_AVMUTE)
+            {
+                if (g_u8_ms933xc_version_flag)
+                {
+                    _config_output_avmute(0, u8_value);
+                    break;
+                }
+                else
+                {
+                    _config_output_avmute(i, u8_value);
+                }
+            }
+            
+        }
+    }
+}
+
+void _shutdown_output(UINT8 u8_output_chn)
+{
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+    ms933xdrv_hdmi_tx_phy_output_enable(FALSE);
+    ms933xdrv_hdmi_tx_phy_power_down();
+    //
+    ms933xdrv_hdmi_tx_hdcp_enable(FALSE);
+    _hdmi_tx_hdcp_param_default(u8_output_chn);
+}
+
+void sys_shutdown_output(void)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            _shutdown_output(i);
+        }
+    }
+
+    if (g_u8_ms933xc_version_flag)
+    {
+        ms933xcdrv_hdmi_tx_core_power_down();
+    }
+
+    #if HDCP_RPT_SUPPORT_ENABLE
+    _rx_hdcp_rpt_ready_reset();
+    #endif
+
+    #if SYS_AUDIO_PAD_OUTPUT_ENABLE
+    sys_pad_audio_ctrl_service(FALSE);
+    #endif
+}
+
+//BIT7: AVI change flag; BIT6: AIF change flag; BIT5: VSI change flag; BIT4: acr cts change flag;
+//BIT0, AVI inforframe receive flag; BIT1: Audio inforframe receive flag;
+//BIT2: VSI inforframe receive flag; BIT3: ACR packet receive flag;
+UINT8 _get_infoframe_status(VOID)
+{
+    UINT8 u8_int_sts = 0;
+    UINT32 u32_pdec_int_sts;
+
+    u32_pdec_int_sts = ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status(PEDC_USED_ISTS);
+    if (u32_pdec_int_sts & AVI_CKS_CHG_ISTS)
+    {
+        u8_int_sts |= 0x80;
+    }
+
+    if (u32_pdec_int_sts & (AIF_CKS_CHG_ISTS | AUD_TYPE_CHG_ISTS))
+    {
+        u8_int_sts |= 0x40;
+    }
+
+    if (u32_pdec_int_sts & VSI_CKS_CHG_ISTS)
+    {
+        u8_int_sts |= 0x20;
+    }
+
+    #if (!HDMI_RX_AUDIO_CTS_CHNAGE_HANDEL_MODE)
+    if (u32_pdec_int_sts & (ACR_CTS_CHG_ISTS | ACR_N_CHG_ISTS))
+    {
+        u8_int_sts |= 0x10;
+    }
+    #else
+    if (u32_pdec_int_sts & ACR_N_CHG_ISTS)
+    {
+        u8_int_sts |= 0x10;
+    }
+
+    if (u32_pdec_int_sts & ACR_CTS_CHG_ISTS)
+    {
+        sys_hdmi_rx_audio_cts_change_param_set(TRUE);
+    }
+    #endif
+    if (u32_pdec_int_sts & AVI_RCV_ISTS)
+    {
+        u8_int_sts |= 0x01;
+    }
+
+    if (u32_pdec_int_sts & AIF_RCV_ISTS)
+    {
+        u8_int_sts |= 0x02;
+    }
+
+    if (u32_pdec_int_sts & VSI_RCV_ISTS)
+    {
+        u8_int_sts |= 0x04;
+    }
+
+    if (u32_pdec_int_sts & ACR_RCV_ISTS)
+    {
+        u8_int_sts |= 0x08;
+    }
+
+    return u8_int_sts;
+}
+
+BOOL sys_hdmi_av_config(UINT8 u8_int_sts, BOOL b_config)
+{
+    HDMI_CONFIG_T st_hdmi_timing;
+    BOOL b_config_all;
+
+    ms933xdrv_hdmi_rx_controller_get_input_config(&st_hdmi_timing);
+
+    //20190704, enhance tmds clk fixed use common detect result. To prevent accidental
+    st_hdmi_timing.u16_video_clk = g_u16_input_tmds_clk;
+
+    //if (!b_config && memcmp(&st_hdmi_timing, &g_st_hdmi_timing, sizeof(HDMI_CONFIG_T)) == 0)
+    if(!b_config)
+    {
+        if((st_hdmi_timing.u8_clk_rpt==g_st_hdmi_timing.u8_clk_rpt)&&(st_hdmi_timing.u8_color_space==g_st_hdmi_timing.u8_color_space)&&\
+           (st_hdmi_timing.u8_quant_range==g_st_hdmi_timing.u8_quant_range)&&(st_hdmi_timing.u8_colorimetry==g_st_hdmi_timing.u8_colorimetry))
+        {
+            LOG("infoframe ignore.");
+            return FALSE;
+        }
+    }
+
+    g_st_hdmi_timing = st_hdmi_timing;
+
+    //20190723, fixed bug for design, if dvi input no packet info
+    if (!g_st_hdmi_timing.u8_hdmi_flag)
+    {
+        u8_int_sts = 0x00;
+    }
+
+    //do hdmi rx task
+    b_config_all = b_config;
+
+    if (u8_int_sts & 0xA0)
+    {
+        b_config_all = TRUE;
+    }
+
+    if((u8_int_sts & 0x01) == 0x00)
+    {
+        sys_default_hdmi_video_config();
+    }
+
+    if ((u8_int_sts & 0x04) == 0x00)
+    {
+        sys_default_hdmi_vendor_specific_config();
+    }
+
+    if((u8_int_sts & 0x02) == 0x00)
+    {
+        sys_default_hdmi_audio_config();
+    }
+
+    //if because packet updated and need update video and audio. first shutdown output.
+    //Also do not expect shutdown output agagin, because this action maybe done before here.
+    if (!b_config && b_config_all)
+    {
+        sys_shutdown_output();
+    }
+
+    if (b_config_all)
+    {
+        ms933xdrv_hdmi_rx_controller_pixel_clk_config(g_st_hdmi_timing.u8_color_depth, g_st_hdmi_timing.u8_clk_rpt);
+        //20181221, config rx auto avmute color.
+        ms933xdrv_hdmi_rx_controller_set_avmute_black_color(g_st_hdmi_timing.u8_color_space);
+
+        //20190515, reset video fifo after pixel config done.
+        sys_hdmi_rx_video_fifo_reset();
+    }
+
+    //audio config
+    sys_hdmi_rx_audio_config(TRUE);
+
+    //hdmi tx config
+    //do
+
+    if (b_config_all)
+    {
+        sys_config_output(HDMI_TX_CONFIG_AV, 0);
+    }
+    else
+    {
+        sys_config_output(HDMI_TX_CONFIG_AUD, 0);
+    }
+
+    return TRUE;
+}
+
+void _hdmi_tx_gcp_avmute_param_default(void)
+{
+    g_b_rx_gcp_avmute_flag = FALSE;
+}
+
+BOOL sys_hdmi_gcp_packet_avmute_service(void)
+{
+    BOOL b_avmute;
+
+    b_avmute = ms933xdrv_hdmi_rx_controller_get_gcp_avmute();
+
+    if (g_b_rx_gcp_avmute_flag != b_avmute)
+    {
+        g_b_rx_gcp_avmute_flag = b_avmute;
+        LOG1("b_avmute = ", b_avmute);
+        sys_config_output(HDMI_TX_CONFIG_AVMUTE, b_avmute);
+        return b_avmute;
+    }
+
+    return FALSE;
+}
+
+void sys_hdmi_rx_packet_service(void)
+{
+    BOOL b_config = FALSE;
+    UINT8 u8_int_sts = 0;
+
+    ////if DVI input, no packet
+    if (!g_b_hdmi_input_valid || !g_st_hdmi_timing.u8_hdmi_flag)
+    {
+        g_u8_rx_packet_timer_count = 0;
+        return;
+    }
+
+    g_u8_rx_packet_timer_count ++;
+    if (g_u8_rx_packet_timer_count < RX_PACKET_TIMEOUT)
+    {
+        return;
+    }
+    g_u8_rx_packet_timer_count = 0;
+
+    u8_int_sts = sys_hdmi_gcp_packet_avmute_service();
+
+    //20191115
+    //if get avmute status change to mute enable, this time do not process infoframe_status and hdmi_rx_audio_service
+    if (u8_int_sts)
+    {
+        return;
+    }
+
+    u8_int_sts = _get_infoframe_status();
+
+    if (u8_int_sts & 0xE0)
+    {
+        LOG1("packet_int_sts = ", u8_int_sts);
+
+        b_config = sys_hdmi_av_config(u8_int_sts, FALSE);
+        if (b_config)
+        {
+            #if MS933X_APP_LOG1_ENABLE
+            printf_input_av_config(u8_int_sts);
+            #endif
+            return;
+        }
+    }
+
+    u8_int_sts = sys_hdmi_rx_audio_service(u8_int_sts);
+
+    #if SYS_AUDIO_PAD_OUTPUT_ENABLE
+    sys_pad_audio_ctrl_service(u8_int_sts ? FALSE : TRUE);
+    #endif
+
+}
+
+void sys_hdmi_rx_hdcp_service(void)
+{
+    UINT8 u8_rx_woking_flag;
+
+    if (!TMDS_CLK_VALID(g_u16_input_tmds_clk))
+    {
+        g_u8_rx_hdcp_timer_count = 0;
+        return;
+    }
+
+    g_u8_rx_hdcp_timer_count++;
+    if (g_u8_rx_hdcp_timer_count < RX_HDCP_TIMEOUT)
+    {
+        return;
+    }
+    g_u8_rx_hdcp_timer_count = 0;
+
+    u8_rx_woking_flag = ms933xdrv_hdmi_rx_controller_hdcp_get_status();
+
+    #if HDCP_RPT_SUPPORT_ENABLE
+    //20210124, if support HDCP repeater, must use ksv be wirted flag
+    if (g_u8_hdcp_repeater_support)
+    {
+        if (ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status(AKSV_RCV_ISTS))
+        {
+            g_u8_rx_hdcp_aksv_be_writed_flag = 1;
+
+            if (!u8_rx_woking_flag) LOG("rx hdcp aksv be writed.");
+        }
+    }
+    #endif
+
+    if (g_u8_rx_hdcp_woking_flag != u8_rx_woking_flag)
+    {
+        g_u8_rx_hdcp_woking_flag = u8_rx_woking_flag;
+        if (g_u8_rx_hdcp_woking_flag)
+        {
+            LOG("rx hdcp woking.");
+        }
+        else
+        {
+            LOG("rx hdcp stop.");
+        }
+    }
+
+}
+
+void _hdmi_tx_hdcp_param_default(UINT8 u8_output_chn)
+{
+    g_u8_tx_hdcp_process_flag_buf[u8_output_chn] = 0;
+    g_u8_tx_hdcp_init_flag_buf[u8_output_chn] = 0;
+    g_u8_tx_hdcp_enable_flag_buf[u8_output_chn] = 0;
+    g_u8_tx_hdcp_timer_count_buf[u8_output_chn] = 0;
+    g_u8_tx_hdcp_verify_first_R0_flag_buf[u8_output_chn] = 0;
+}
+
+void _hdmi_tx_hdcp_start(UINT8 u8_output_chn)
+{
+    g_u8_tx_hdcp_process_flag_buf[u8_output_chn] = 1;
+    g_u8_tx_hdcp_init_flag_buf[u8_output_chn] = 1;
+    g_u8_tx_hdcp_enable_flag_buf[u8_output_chn] = 0;
+    g_u8_tx_hdcp_verify_first_R0_flag_buf[u8_output_chn] = 0;
+    //
+    g_u8_tx_hdcp_timer_count_buf[u8_output_chn] = TX_HDCP_START_TIME;
+}
+
+void _hdmi_tx_hdcp_restart(UINT8 u8_output_chn)
+{
+    g_u8_tx_hdcp_process_flag_buf[u8_output_chn] = 1;
+    g_u8_tx_hdcp_init_flag_buf[u8_output_chn] = 1;
+    g_u8_tx_hdcp_enable_flag_buf[u8_output_chn] = 0;
+    g_u8_tx_hdcp_verify_first_R0_flag_buf[u8_output_chn] = 0;
+    //
+    g_u8_tx_hdcp_timer_count_buf[u8_output_chn] = TX_HDCP_RETRY_START_TIME;
+}
+
+void _hdmi_tx_hdcp_service(UINT8 u8_output_chn)
+{
+    HDMI_HDCP_RI st_val;
+
+    ms933xdrv_hdmi_tx_set_channel(u8_output_chn);
+
+    if (g_u8_tx_hdcp_init_flag_buf[u8_output_chn])
+    {
+        g_u8_tx_hdcp_init_flag_buf[u8_output_chn] = FALSE;
+
+        _tx_hdcp_rpt_init(u8_output_chn);
+        if (ms933xdrv_hdmi_tx_hdcp_init((UINT8 *)u8_tx_key_buf, (UINT8 *)u8_tx_ksv_buf))
+        {
+            LOG2("tx_hdcp_init_ok_chn = ", u8_output_chn);
+
+            //20210128, delay unused now, hdcp first R0 verfiy in next polling
+            #if 0
+            //delay for R0 calc, spec 100ms.
+            //if use i2c bus, time cost on iic access. so here not delay.
+            mculib_delay_ms(100);
+            #endif
+
+            //
+            g_u8_tx_hdcp_verify_first_R0_flag_buf[u8_output_chn] = 1;
+            g_u8_tx_hdcp_timer_count_buf[u8_output_chn] = TX_HDCP_R0_START_TIME;
+
+            #if HDMI_CTS_HDCP_RPT_ENABLE
+            g_u8_hdmi_tx_hpd_detect_count = HDMI_TX_HPD_DET_TIMEOUT;
+            #endif
+        }
+        else
+        {
+            #if HDMI_TX_HDCP_RETRY_ENABLE
+            _hdmi_tx_hdcp_restart(u8_output_chn);
+            ms933xdrv_hdmi_tx_hdcp_enable(FALSE);
+            #endif
+
+            LOG2("tx_hdcp_init_falied_chn = ", u8_output_chn);
+        }
+
+        return;
+    }
+
+    if (g_u8_tx_hdcp_verify_first_R0_flag_buf[u8_output_chn])
+    {
+        g_u8_tx_hdcp_verify_first_R0_flag_buf[u8_output_chn] = 0;
+
+        if (ms933xdrv_hdmi_tx_hdcp_get_status(&st_val))
+        {
+            ms933xdrv_hdmi_tx_hdcp_enable(TRUE);
+            g_u8_tx_hdcp_enable_flag_buf[u8_output_chn] = TRUE;
+
+            //when hdcp init fisrt step done, I want to immediately goto repeater service
+            g_u8_hdcp_rpt_service_timer_count = HDCP_REPEATER_SRC_TIMEOUT;
+            g_u8_hdcp_rpt_ready_timer_count = 0;
+            //LOG1("TX_Ri0 = ", st_val.TX_Ri0);
+            //LOG1("TX_Ri1 = ", st_val.TX_Ri1);
+            //LOG1("RX_Ri0 = ", st_val.RX_Ri0);
+            //LOG1("RX_Ri1 = ", st_val.RX_Ri1);
+
+            #if HDMI_CTS_HDCP_RPT_ENABLE
+            g_u8_hdmi_tx_hpd_detect_count = HDMI_TX_HPD_DET_TIMEOUT;
+            #endif
+        }
+        else
+        {
+            #if HDMI_TX_HDCP_RETRY_ENABLE
+            _hdmi_tx_hdcp_restart(u8_output_chn);
+            #endif
+
+            ms933xdrv_hdmi_tx_hdcp_enable(FALSE);
+            LOG2("tx_hdcp_r0_failed_chn = ", u8_output_chn);
+        }
+
+        return;
+    }
+
+    if (!g_u8_tx_hdcp_enable_flag_buf[u8_output_chn])
+    {
+        return;
+    }
+
+    if (ms933xdrv_hdmi_tx_hdcp_get_status(&st_val))
+    {
+        //LOG2("tx_hdcp_link_ok_chn = ", u8_output_chn);
+    }
+    else
+    {
+        ms933xdrv_hdmi_tx_hdcp_enable(FALSE);
+
+        LOG2("tx_hdcp_link_error_chn = ", u8_output_chn);
+
+        #if HDMI_TX_HDCP_RETRY_ENABLE
+        _hdmi_tx_hdcp_restart(u8_output_chn);
+
+        _rx_hdcp_rpt_ready_reset();
+
+        #else
+        g_u8_tx_hdcp_enable_flag_buf[u8_output_chn] = FALSE;
+        #endif
+    }
+}
+
+void sys_hdmi_tx_hdcp_service(void)
+{
+    UINT8 i;
+    UINT8 u8_rx_hdcp_working;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        #if HDCP_RPT_SUPPORT_ENABLE
+        //if support hdmi hdcp repeater
+        if (g_u8_hdcp_repeater_support)
+        {
+            u8_rx_hdcp_working = (g_u8_rx_hdcp_woking_flag | g_u8_rx_hdcp_aksv_be_writed_flag) ? 0x01 : 0x00;
+        }
+        else
+        #endif
+        {
+            u8_rx_hdcp_working = g_u8_rx_hdcp_woking_flag;
+        }
+
+        //if rx hdcp no working and tx hdcp not be enable and tx hdcp not goto verify first R0, do not go tx hdcp process.
+        if (!u8_rx_hdcp_working && !g_u8_tx_hdcp_enable_flag_buf[i] && !g_u8_tx_hdcp_verify_first_R0_flag_buf[i])
+        {
+            g_u8_tx_hdcp_timer_count_buf[i] = TX_HDCP_START_TIME;
+            continue;
+        }
+
+        if (!g_u8_tx_hdcp_process_flag_buf[i])
+        {
+            continue;
+        }
+
+        g_u8_tx_hdcp_timer_count_buf[i] ++;
+
+        if (g_u8_tx_hdcp_timer_count_buf[i] < TX_HDCP_TIMEOUT)
+        {
+            continue;
+        }
+
+        g_u8_tx_hdcp_timer_count_buf[i] = 0;
+
+        if (_tx_ddc_error_get(i))
+        {
+            return;
+        }
+
+        _hdmi_tx_hdcp_service(i);
+
+        _tx_ddc_error_check(i, FALSE);
+    }
+}
+
+VOID _rx_hdcp_rpt_param_ready_reset(VOID)
+{
+    g_u8_rx_hdcp_rpt_ready = 0;
+}
+
+BOOL _rx_hdcp_rpt_ready_reset(VOID)
+{
+    #if HDCP_RPT_SUPPORT_ENABLE
+
+    if (g_u8_rx_hdcp_rpt_ready)
+    {
+        g_u8_rx_hdcp_rpt_ready = 0;
+        ms933xdrv_hdmi_rx_core_hdcp_rpt_reset_enable(TRUE);
+        return TRUE;
+    }
+    #endif
+
+    return FALSE;
+}
+
+BOOL _tx_hdcp_bcaps_repeater_flag_get(VOID)
+{
+    UINT8 u8_val;
+
+    if (!ms933xdrv_hdmi_tx_hdcp_get_bcaps_from_rx(&u8_val))
+    {
+        return FALSE;
+    }
+
+    if (u8_val & 0x40)
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+BOOL _tx_hdcp_bcaps_repeater_ready_get(BOOL b_time_out)
+{
+    UINT8 u8_val;
+    UINT8 u8_count;
+    UINT8 u8_depth;
+
+    if (!ms933xdrv_hdmi_tx_hdcp_get_bcaps_from_rx(&u8_val))
+    {
+        return FALSE;
+    }
+
+    if ((u8_val & 0x60) == 0x60)
+    {
+        return TRUE;
+    }
+
+    if (b_time_out)
+    {
+        //double check repeater flag, if invalid, it is a error.
+        if ((u8_val & 0x40) != 0x40)
+        {
+            return FALSE;
+        }
+
+        //if HDCP_MAX_DEVS_EXCEEDED or HDCP_MAX_CASCADE_EXCEEDED bit is 1, also means sink ready
+        ms933xdrv_hdmi_tx_hdcp_get_bstatus_from_rx(&u8_count, &u8_depth);
+
+        if ((u8_count & HDCP_MAX_DEVS_EXCEEDED_BIT_MASK) ||
+            (u8_depth & HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK))
+        {
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+VOID _tx_hdcp_rpt_param_repeater_flag_set(BOOL b_set)
+{
+    UINT8 u8_tx_chn;
+
+    u8_tx_chn = ms933xdrv_hdmi_tx_get_channel();
+
+    g_u8_tx_hdcp_repeater_flag_buf[u8_tx_chn] = b_set ? 1 : 0;
+}
+
+BOOL _tx_hdcp_rpt_param_repeater_flag_get(UINT8 u8_tx_chn)
+{
+    return g_u8_tx_hdcp_repeater_flag_buf[u8_tx_chn] ? TRUE : FALSE;
+}
+
+VOID _tx_hdcp_rpt_param_repeater_flag_default(UINT8 u8_tx_chn)
+{
+    g_u8_tx_hdcp_repeater_flag_buf[u8_tx_chn] = 0;
+}
+
+void _tx_hdcp_rpt_init(UINT8 u8_tx_chn)
+{
+    #if HDCP_RPT_SUPPORT_ENABLE
+
+    if (!g_u8_hdcp_repeater_support)
+    {
+        #if HDMI_CTS_HDCP_RPT_ENABLE
+        _tx_hdcp_bcaps_repeater_flag_get();
+        #endif
+        return;
+    }
+
+    //sink bcaps hdcp repeater flag
+    if (_tx_hdcp_bcaps_repeater_flag_get())
+    {
+        LOG("sink_bcaps_rpt_support.");
+        _tx_hdcp_rpt_param_repeater_flag_set(TRUE);
+        ms933xdrv_hdmi_tx_hdcp_rpt_enable(TRUE);
+    }
+    else
+    {
+        _tx_hdcp_rpt_param_repeater_flag_set(FALSE);
+    }
+
+    #else
+
+    #if HDMI_CTS_HDCP_RPT_ENABLE
+    //HDCP CTS SPEC, must read bcaps
+    _tx_hdcp_bcaps_repeater_flag_get();
+    #endif
+
+    #endif
+}
+
+BOOL _tx_hdcp_param_encoding_enable_flag_verify(VOID)
+{
+    UINT8 i;
+    BOOL b_exist_hpd = FALSE;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            if (!g_u8_tx_hdcp_enable_flag_buf[i])
+            {
+                return FALSE;
+            }
+
+            b_exist_hpd = TRUE;
+        }
+    }
+
+    return b_exist_hpd;
+}
+
+BOOL _tx_hdcp_ksv_collect(VOID)
+{
+    return FALSE;
+}
+
+BOOL _tx_hdcp_rpt_check_all_repeater_sink_ready(BOOL b_time_out)
+{
+    UINT8 i;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            if (_tx_hdcp_rpt_param_repeater_flag_get(i))
+            {
+                ms933xdrv_hdmi_tx_set_channel(i);
+                if (!_tx_hdcp_bcaps_repeater_ready_get(b_time_out))
+                {
+                    return FALSE;
+                }
+            }
+        }
+    }
+
+    return TRUE;
+}
+
+//return error code
+UINT8 _tx_hdcp_rpt_process(VOID)
+{
+#if HDCP_RPT_SUPPORT_ENABLE
+    UINT8 i;
+    UINT8 u8_rx_dev_count = 0;
+    UINT8 u8_rx_dev_depth = 0;
+    UINT8 u8_dev_count;
+    UINT8 u8_dev_depth;
+    UINT8 u8_tx_rpt_status;
+    UINT8 *p_u8_ksv = g_u8_hdcp_rpt_ksv_buf;
+
+    for (i = 0; i < HDMI_TX_CHN_NUM; i++)
+    {
+        if (g_u8_sink_hpd_connect[i])
+        {
+            ms933xdrv_hdmi_tx_set_channel(i);
+
+            if (_tx_hdcp_rpt_param_repeater_flag_get(i))
+            {
+                u8_tx_rpt_status = ms933xdrv_hdmi_tx_hdcp_repeat_init(&u8_dev_count, &u8_dev_depth, p_u8_ksv);
+
+                #if TX_HDCP_RPT_BUG0_FIXED_ENABLE
+                if ((u8_tx_rpt_status == 0x04) && (g_u16_input_tmds_clk > 20000))
+                {
+                    u8_tx_rpt_status = 0x00;
+                }
+                #endif
+
+                if (u8_tx_rpt_status)
+                {
+                    LOG1("u8_tx_hdcp_rpt_error = ", u8_tx_rpt_status);
+                    LOG1("sink_hdcp_bstatus = ", ((UINT16)u8_dev_depth << 8) | u8_dev_count);
+
+                    u8_dev_depth &= 0x0f;
+
+                    if ((u8_dev_count & HDCP_MAX_DEVS_EXCEEDED_BIT_MASK) ||
+                        (u8_dev_depth & HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK))
+                    {
+                        if (u8_dev_count & HDCP_MAX_DEVS_EXCEEDED_BIT_MASK)
+                        {
+                            u8_dev_count = HDCP_MAX_DEVS_EXCEEDED_BIT_MASK | 0x01;
+
+                            if ((u8_dev_depth & HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK) == 0x00)
+                            {
+                                u8_dev_depth = 0x01;
+                            }
+                        }
+
+                        if (u8_dev_depth & HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK)
+                        {
+                            u8_dev_depth = HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK | 0x01;
+
+                            if ((u8_dev_count & HDCP_MAX_DEVS_EXCEEDED_BIT_MASK) == 0x00)
+                            {
+                                u8_dev_count = 0x01;
+                            }
+                        }
+
+                        g_u8_rx_hdcp_rpt_dev_count = u8_dev_count;
+                        g_u8_rx_hdcp_rpt_dev_depth = u8_dev_depth;
+                        return 0;
+                    }
+                    else if (u8_dev_depth >= HDCP_RPT_RPT_DEV_DEPTH_MAX) //hdmi cts, depth is first judge than count
+                    {
+                        g_u8_rx_hdcp_rpt_dev_count = 0x01;
+                        g_u8_rx_hdcp_rpt_dev_depth = HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK | 0x01;
+                        return 0;
+                    }
+                    else if (u8_dev_count >= MS933X_HDCP_RPT_COUNT_MAX)
+                    {
+                        g_u8_rx_hdcp_rpt_dev_count = HDCP_MAX_DEVS_EXCEEDED_BIT_MASK | 0x01;
+                        g_u8_rx_hdcp_rpt_dev_depth = 0x01;
+                        return 0;
+                    }
+                    else
+                    {
+                        ms933xdrv_hdmi_tx_hdcp_enable(FALSE);
+                        _hdmi_tx_hdcp_restart(i);
+                        LOG1("tx_hdcp_restart_chn = ", i);
+                        return 0x01;
+                    }
+                }
+
+                #if HDMI_CTS_HDCP_RPT_ENABLE
+                if (u8_dev_count >= HDMI_CTS_HDCP_DEV_COUNT_MAX)
+                {
+                    LOG1("sink_hdcp_bstatus = ", ((UINT16)u8_dev_depth << 8) | u8_dev_count);
+                    g_u8_rx_hdcp_rpt_dev_count = HDCP_MAX_DEVS_EXCEEDED_BIT_MASK | 0x01;
+                    g_u8_rx_hdcp_rpt_dev_depth = 0x01;
+                    return 0;
+                }
+                #endif
+
+                if (!ms933xdrv_hdmi_tx_hdcp_get_bksv_from_rx(&p_u8_ksv[u8_dev_count * HDCP_KSV_BYTE_SIZE]))
+                {
+                    return 0x02;
+                }
+
+                u8_dev_count += 1;
+
+                u8_dev_depth &= 0x07;
+                u8_dev_depth += 1;
+            }
+            else
+            {
+                if (!ms933xdrv_hdmi_tx_hdcp_get_bksv_from_rx(p_u8_ksv))
+                {
+                    return 0x03;
+                }
+                u8_dev_count = 1;
+                u8_dev_depth = 1;
+            }
+
+            u8_rx_dev_count += u8_dev_count;
+            if (u8_rx_dev_count > MS933X_HDCP_RPT_COUNT_MAX)
+            {
+                LOG2("sink_hdcp_dev_count_too_large = ", u8_rx_dev_count);
+                g_u8_rx_hdcp_rpt_dev_count = HDCP_MAX_DEVS_EXCEEDED_BIT_MASK | 0x01;
+                g_u8_rx_hdcp_rpt_dev_depth = 0x01;
+                return 0;
+            }
+
+            p_u8_ksv += u8_rx_dev_count * HDCP_KSV_BYTE_SIZE;
+
+            if (u8_dev_depth > u8_rx_dev_depth)
+            {
+                u8_rx_dev_depth = u8_dev_depth;
+            }
+
+            #if 0 //this case impossible
+            if (u8_rx_dev_depth > HDCP_RPT_RPT_DEV_DEPTH_MAX)
+            {
+                LOG2("sink_hdcp_dev_depth_too_large = ", u8_rx_dev_depth);
+                g_u8_rx_hdcp_rpt_dev_count = 0x01;
+                g_u8_rx_hdcp_rpt_dev_depth = HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK | 0x01;
+                return 0x00;
+            }
+            #endif
+        }
+    }
+
+    g_u8_rx_hdcp_rpt_dev_count = u8_rx_dev_count;
+    g_u8_rx_hdcp_rpt_dev_depth = u8_rx_dev_depth;
+
+#endif //HDCP_RPT_SUPPORT_ENABLE
+
+    return 0;
+}
+
+BOOL _rx_hdcp_rpt_ksv_list_write(VOID)
+{
+#if HDCP_RPT_SUPPORT_ENABLE
+    UINT8 u8_i;
+
+    LOG1("rx_hdcp_rpt_dev_count = ", g_u8_rx_hdcp_rpt_dev_count);
+    LOG1("rx_hdcp_rpt_dev_depth = ", g_u8_rx_hdcp_rpt_dev_depth);
+
+    if ( ( (g_u8_rx_hdcp_rpt_dev_count & HDCP_MAX_DEVS_EXCEEDED_BIT_MASK   ) == 0x00 ) &&
+         ( (g_u8_rx_hdcp_rpt_dev_depth & HDCP_MAX_CASCADE_EXCEEDED_BIT_MASK) == 0x00 ) )
+    {
+        LOG("");
+        LOG("rx_ksv_list:");
+        for (u8_i = 0; u8_i < g_u8_rx_hdcp_rpt_dev_count; u8_i ++)
+        {
+            LOG("");
+            LOG1("rx_ksv_fifo = ", g_u8_hdcp_rpt_ksv_buf[u8_i * HDCP_KSV_BYTE_SIZE + 0]);
+            LOG1("rx_ksv_fifo = ", g_u8_hdcp_rpt_ksv_buf[u8_i * HDCP_KSV_BYTE_SIZE + 1]);
+            LOG1("rx_ksv_fifo = ", g_u8_hdcp_rpt_ksv_buf[u8_i * HDCP_KSV_BYTE_SIZE + 2]);
+            LOG1("rx_ksv_fifo = ", g_u8_hdcp_rpt_ksv_buf[u8_i * HDCP_KSV_BYTE_SIZE + 3]);
+            LOG1("rx_ksv_fifo = ", g_u8_hdcp_rpt_ksv_buf[u8_i * HDCP_KSV_BYTE_SIZE + 4]);
+            LOG("");
+        }
+    }
+
+    if (ms933xdrv_hdmi_rx_core_hdcp_rpt_ksv_init(g_u8_rx_hdcp_rpt_dev_count, g_u8_rx_hdcp_rpt_dev_depth, g_u8_hdcp_rpt_ksv_buf))
+    {
+        LOG("rx_hdcp_rpt_ready ok.");
+        return TRUE;
+    }
+    else
+    {
+        LOG("rx_hdcp_rpt_ready failed.");
+        return FALSE;
+    }
+
+#else //HDCP_RPT_SUPPORT_ENABLE
+
+    return FALSE;
+
+#endif
+
+}
+
+void sys_hdmi_hdcp_repeater_service(void)
+{
+    UINT8 u8_error_code;
+    UINT8 u8_ready_timeout = FALSE;
+
+    if (!g_b_hdmi_input_valid)
+    {
+        g_u8_hdcp_rpt_service_timer_count = 0;
+        return;
+    }
+
+    if (g_u8_rx_hdcp_rpt_ready)
+    {
+        return;
+    }
+
+    g_u8_hdcp_rpt_service_timer_count ++;
+    if (g_u8_hdcp_rpt_service_timer_count < HDCP_REPEATER_SRC_TIMEOUT)
+    {
+        return;
+    }
+    g_u8_hdcp_rpt_service_timer_count = 0;
+
+    if (!_tx_hdcp_param_encoding_enable_flag_verify())
+    {
+        return;
+    }
+
+    if (g_u8_hdcp_rpt_service_timer_count < HDCP_REPEATER_READY_TIMEOUT)
+    {
+        g_u8_hdcp_rpt_ready_timer_count ++;
+    }
+    else
+    {
+        u8_ready_timeout = TRUE;
+    }
+
+    if (!_tx_hdcp_rpt_check_all_repeater_sink_ready(u8_ready_timeout))
+    {
+        return;
+    }
+
+    u8_error_code = _tx_hdcp_rpt_process();
+    if (u8_error_code)
+    {
+        LOG1("tx_hdcp_rpt_proc_error = ", u8_error_code);
+        return;
+    }
+
+    LOG("sink_ksv_collect done.");
+    g_u8_rx_hdcp_rpt_ready = 1;
+
+    _rx_hdcp_rpt_ksv_list_write();
+}
+
+void sys_tx_hdcp_port_service(void)
+{
+    //UINT8 i;
+
+    if (!TMDS_CLK_VALID(g_u16_input_tmds_clk) && !g_u8_sink_hpd_connect[0])
+    {
+        g_u8_tx_hdcp_port_service_timer_count = 0;
+        return;
+    }
+
+    if (TMDS_CLK_VALID(g_u16_input_tmds_clk) && g_u8_sink_hpd_connect[0])
+    {
+        g_u8_tx_hdcp_port_service_timer_count = 0;
+        return;
+    }
+
+    g_u8_tx_hdcp_port_service_timer_count++;
+    if (g_u8_tx_hdcp_port_service_timer_count < TX_HDCP_PORT_SRC_TIMEOUT)
+    {
+        return;
+    }
+    g_u8_tx_hdcp_port_service_timer_count = 0;
+
+    ms933xdrv_hdmi_tx_set_channel(0);
+    _tx_hdcp_bcaps_repeater_flag_get();
+    LOG("tx_hdcp_port_accessed.");
+}
+
+void _tx_ddc_error_check(UINT8 u8_tx_chn, BOOL b_tx_hpd_lost)
+{
+    #if MS933X_TX_DDC_ERROR_SERVICE_ENABLE
+    if (b_tx_hpd_lost)
+    {
+        if ((g_u8_tx_ddc_error_flag & (1 << u8_tx_chn)) && ms933xdrv_misc_chipisvalid())
+        {
+            g_u8_tx_ddc_error_flag &= ~(1 << u8_tx_chn);
+        }
+    }
+    else
+    {
+        if (!ms933xdrv_misc_chipisvalid())
+        {
+            g_u8_tx_ddc_error_flag |= (1 << u8_tx_chn);
+            g_u8_chip_valid_check_timer_count = CHIP_VALID_CHECK_TIMEOUT;
+        }
+    }
+    #endif
+}
+
+BOOL _tx_ddc_error_get(UINT8 u8_tx_chn)
+{
+    #if MS933X_TX_DDC_ERROR_SERVICE_ENABLE
+    if (g_u8_tx_ddc_error_flag & (1 << u8_tx_chn))
+    {
+        return TRUE;
+    }
+
+    if (g_u8_tx_ddc_error_flag && !ms933xdrv_misc_chipisvalid())
+    {
+        return TRUE;
+    }
+    #endif
+
+    return FALSE;
+}
+
+void sys_ms933x_chip_valid_check(void)
+{
+    g_u8_chip_valid_check_timer_count ++;
+    if (g_u8_chip_valid_check_timer_count < CHIP_VALID_CHECK_TIMEOUT)
+    {
+        return;
+    }
+    g_u8_chip_valid_check_timer_count = 0;
+
+    if (!ms933xdrv_misc_chipisvalid())
+    {
+        LOG("ms933x chip invalid.");
+        ms933x_init();
+    }
+}
+
+#if MS933X_HDMI_NET_CALBE_RX_ENABLE
+
+typedef struct _T_MANUAL_TIMING_T_
+{
+    UINT8  u8_polarity;
+    UINT16 u16_h_active;
+    UINT16 u16_h_blank;
+    UINT16 u16_h_sw;
+    UINT16 u16_h_front;
+    UINT16 u16_v_active;
+    UINT16 u16_v_blank;
+    UINT16 u16_v_sw;
+    UINT16 u16_v_front;
+} MANUAL_TIMING_T;
+
+extern BOOL ms933xdrv_hdmi_rx_controller_mdt_syncvalid(VOID);
+extern e_RxMdtPol ms933xdrv_mdt_get_sync_polarity(VOID);
+
+extern UINT16 ms933xdrv_mdt_get_htotal(VOID);
+extern UINT16 ms933xdrv_mdt_get_vtotal(VOID);
+extern UINT16 ms933xdrv_mdt_get_hactive(VOID);
+extern UINT16 ms933xdrv_mdt_get_vactive(VOID);
+extern UINT32 ms933xdrv_mdt_get_hfreq(VOID);
+
+BOOL _hdmi_rx_get_input_timing(MANUAL_TIMING_T *ptTiming)
+{
+    BOOL bValid = FALSE;
+    UINT32 u32_val;
+    UINT16 u16_v_blank;
+    UINT16 u16_v_front;
+    UINT16 u16_mdt_int;
+    BOOL b_sync_valid;
+
+    UINT16 u16_h_hotal_ex;
+    UINT16 u16_v_total_ex;
+    UINT16 u16_h_active_ex;
+    UINT16 u16_v_vative_ex;
+    UINT16 u16_v_freq_ex;
+
+    if (g_u8_input_invalid_timer_count >= INPUT_INVALID_TIMEOUT_1S)
+    {
+        b_sync_valid = ((ms933x_HAL_ReadDWord_Ex(0x2180) & 0x07) == 0x07) ? TRUE : FALSE;
+    }
+    else
+    {
+        b_sync_valid = ((ms933x_HAL_ReadDWord_Ex(0x2180) & 0x7f07) == 0x7f07) ? TRUE : FALSE;
+    }
+
+    if (b_sync_valid)
+    {
+        ptTiming->u8_polarity = ms933xdrv_mdt_get_sync_polarity();
+
+        u32_val = ms933x_HAL_ReadDWord_Ex(0x2198);
+        ptTiming->u16_h_active = u32_val;
+        ptTiming->u16_h_blank = u32_val >> 16;
+
+        //
+        u32_val = ms933x_HAL_ReadDWord_Ex(0x219c);
+        ptTiming->u16_h_front = u32_val;
+        ptTiming->u16_h_sw = u32_val >> 16;
+
+        //
+        u32_val = ms933x_HAL_ReadDWord_Ex(0x218c);
+        ptTiming->u16_v_active = u32_val;
+        u16_v_blank = u32_val >> 16;
+
+        if (!(ptTiming->u8_polarity & 0x01) && (u16_v_blank % 2))
+        {
+            u16_v_blank -= 1;
+        }
+
+        ptTiming->u16_v_blank = u16_v_blank;
+
+        //
+        u32_val = ms933x_HAL_ReadDWord_Ex(0x2190);
+        u16_v_front = u32_val;
+        ptTiming->u16_v_sw = u32_val >> 16;
+
+        if (!(ptTiming->u8_polarity & 0x01) && (u16_v_front % 2))
+        {
+            u16_v_front -= 1;
+        }
+        ptTiming->u16_v_front = u16_v_front;
+
+        u16_h_hotal_ex = ms933xdrv_mdt_get_htotal();
+        u16_v_total_ex = ms933xdrv_mdt_get_vtotal();
+        u16_h_active_ex = ms933xdrv_mdt_get_hactive();
+        u16_v_vative_ex = ms933xdrv_mdt_get_vactive();
+
+        if (u16_v_total_ex > 0)
+        {
+            u16_v_freq_ex = 100 * ms933xdrv_mdt_get_hfreq() / u16_v_total_ex;
+        }
+        else
+        {
+            u16_v_freq_ex = 0;
+        }
+
+        if (g_u8_input_invalid_timer_count >= INPUT_INVALID_TIMEOUT_1S)
+        {
+            u16_mdt_int = 0;
+        }
+        else
+        {
+            //I think timing unstable
+            u16_mdt_int = ms933xdrv_hdmi_rx_get_mdt_interrupt_status_ext(MDT_USED_ISTS);
+        }
+
+        #if 0
+        LOG1("u16_h_hotal_ex  = ", u16_h_hotal_ex);
+        LOG1("u16_v_total_ex  = ", u16_v_total_ex);
+        LOG1("u16_h_active_ex = ", u16_h_active_ex);
+        LOG1("u16_v_vative_ex = ", u16_v_vative_ex);
+        LOG2("u16_v_freq_ex   = ", u16_v_freq_ex);
+        LOG2("u16_h_active   = ", ptTiming->u16_h_active);
+        LOG2("u16_v_active   = ", ptTiming->u16_v_active);
+        #endif
+
+        if ( u16_h_hotal_ex < 50 ||
+             u16_v_total_ex < 50 ||
+             u16_h_active_ex < 50 ||
+             u16_v_vative_ex < 50 ||
+             u16_h_hotal_ex < u16_h_active_ex ||
+             u16_v_total_ex < u16_v_vative_ex ||
+             u16_v_freq_ex < 500 ||
+             u16_v_freq_ex > 30000 ||
+             ptTiming->u16_h_active < 50 ||
+             ptTiming->u16_v_active < 50 ||
+             u16_mdt_int)
+        {
+            LOG("mdt error.");
+            return FALSE;
+        }
+
+        bValid = TRUE;
+    }
+
+    return bValid;
+}
+
+VOID sys_hdmi_rx_timing_config(MANUAL_TIMING_T *ptTiming)
+{
+    #if 0
+    UINT8  u8_polarity      = 0x03;
+    UINT16 u16_h_active     = 0x780;
+    UINT16 u16_h_blank      = 0x118;
+    UINT16 u16_h_sw         = 0x2c;
+    UINT16 u16_h_front      = 0x58;
+    UINT16 u16_v_active     = 0x438;
+    UINT16 u16_v_blank      = 0x2d;
+    UINT16 u16_v_sw         = 0x5;
+    UINT16 u16_v_front      = 0x4;
+    UINT16 u16_v_total      = 0x465;
+    #endif
+
+    BOOL b_ceavid_vbos = 0;
+
+    #if 0
+    LOG1("u8_polarity  = ", ptTiming->u8_polarity);
+    LOG1("u16_h_active = ", ptTiming->u16_h_active);
+    LOG1("u16_h_blank  = ", ptTiming->u16_h_blank);
+    LOG1("u16_h_sw     = ", ptTiming->u16_h_sw);
+    LOG1("u16_h_front  = ", ptTiming->u16_h_front);
+    LOG1("u16_v_active = ", ptTiming->u16_v_active);
+    LOG1("u16_v_blank  = ", ptTiming->u16_v_blank);
+    LOG1("u16_v_sw     = ", ptTiming->u16_v_sw);
+    LOG1("u16_v_front  = ", ptTiming->u16_v_front);
+    #endif
+
+    if (!(ptTiming->u8_polarity & 0x01))
+    {
+        b_ceavid_vbos = 1;
+        #if 0
+        if (ptTiming->u16_v_total % 2)
+        {
+            if (ptTiming->u16_v_total == 625)    //1920x1080i (1250 Total) @ 50 Hz (Format 39)
+            {
+                b_ceavid_vbos = 0;
+            }
+        }
+        #endif
+    }
+
+    ms933x_HAL_ToggleBits_Ex(0x2400, MSRT_BIT4, (ptTiming->u8_polarity & 0x01) ? 0 : 1);
+    ms933x_HAL_ToggleBits_Ex(0x2400, MSRT_BIT3, (ptTiming->u8_polarity & 0x04) ? 1 : 0);
+    ms933x_HAL_ToggleBits_Ex(0x2400, MSRT_BIT2, (ptTiming->u8_polarity & 0x02) ? 1 : 0);
+
+    ms933x_HAL_ToggleBits_Ex(0x2400, MSRT_BIT5, b_ceavid_vbos);
+
+    ms933x_HAL_WriteDWord_Ex(0x2408, ((UINT32)ptTiming->u16_h_blank << 16) + ptTiming->u16_h_active);
+    ms933x_HAL_WriteDWord_Ex(0x240c, ((UINT32)ptTiming->u16_h_front << 16) + ptTiming->u16_h_sw);
+
+    ms933x_HAL_WriteDWord_Ex(0x2410, ((UINT32)ptTiming->u16_v_blank << 16) + ptTiming->u16_v_active);
+    ms933x_HAL_WriteDWord_Ex(0x2414, ((UINT32)ptTiming->u16_v_front << 16) + ptTiming->u16_v_sw);
+}
+
+static BOOL _rx_timing_diff(MANUAL_TIMING_T *pt_timing, MANUAL_TIMING_T *pt_timing1)
+{
+    if (pt_timing->u8_polarity    != pt_timing1->u8_polarity   ||
+        pt_timing->u16_h_active   != pt_timing1->u16_h_active  ||
+        pt_timing->u16_h_blank    != pt_timing1->u16_h_blank   ||
+        pt_timing->u16_h_sw       != pt_timing1->u16_h_sw      ||
+        pt_timing->u16_h_front    != pt_timing1->u16_h_front   ||
+        pt_timing->u16_v_active   != pt_timing1->u16_v_active  ||
+        pt_timing->u16_v_blank    != pt_timing1->u16_v_blank   ||
+        pt_timing->u16_v_sw       != pt_timing1->u16_v_sw      ||
+        pt_timing->u16_v_front    != pt_timing1->u16_v_front)
+    {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+BOOL sys_hdmi_rx_timing_process(VOID)
+{
+    UINT8 i;
+
+    MANUAL_TIMING_T st_timing;
+    MANUAL_TIMING_T st_timing1;
+
+    if (!_hdmi_rx_get_input_timing(&st_timing))
+    {
+        return FALSE;
+    }
+    else
+    {
+        //if interlace mode use auto timing mode
+        if (!(st_timing.u8_polarity & 0x01))
+        {
+            sys_hdmi_rx_timing_manual_enable(FALSE);
+            mculib_delay_ms(50);
+            return TRUE;
+        }
+    }
+
+    if (!_hdmi_rx_get_input_timing(&st_timing1))
+    {
+        return FALSE;
+    }
+
+    if (_rx_timing_diff(&st_timing, &st_timing1))
+    {
+        LOG("mdt error1.");
+        return FALSE;
+    }
+
+    if (!_hdmi_rx_get_input_timing(&st_timing1))
+    {
+        return FALSE;
+    }
+
+    if (_rx_timing_diff(&st_timing, &st_timing1))
+    {
+        LOG("mdt error2.");
+        return FALSE;
+    }
+
+    sys_hdmi_rx_timing_manual_enable(FALSE);
+    sys_hdmi_rx_timing_config(&st_timing);
+    sys_hdmi_rx_timing_manual_enable(TRUE);
+
+    mculib_delay_ms(50);
+
+    return TRUE;
+}
+
+
+VOID sys_hdmi_rx_timing_manual_enable(BOOL b_enable)
+{
+    ms933x_HAL_ToggleBits_Ex(0x2400, MSRT_BIT1, b_enable);
+}
+#endif //MS933X_HDMI_NET_CALBE_RX_ENABLE
+
+
+void sys_mdt_service(void)
+{
+    UINT16 u16_mdt_ists;
+    UINT8 u8_int_sts = 0;
+
+    if (!TMDS_CLK_VALID(g_u16_input_tmds_clk))
+    {
+        return;
+    }
+
+    //rxpll_error, return
+    if (g_u8_rxpll_configed_status == 2)
+    {
+        g_u8_rxpll_configed_status = 0;
+        return;
+    }
+
+    u16_mdt_ists = ms933xdrv_hdmi_rx_get_mdt_interrupt_status(MDT_USED_ISTS);
+
+    #if HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE
+    if (g_b_hdmi_input_valid)
+    {
+        if (u16_mdt_ists)
+        {
+            LOG1("u16_mdt_ists = ", u16_mdt_ists);
+        }
+        return;
+    }
+
+    if (g_u8_input_invalid_timer_count >= INPUT_INVALID_TIMEOUT_1S)
+    {
+        u16_mdt_ists = 0;
+    }
+    #endif
+
+    //rxpll_sucess or mdt_int
+    if ((g_u8_rxpll_configed_status == 1) || u16_mdt_ists)
+    {
+        g_u8_rxpll_configed_status = 0;
+        g_u8_mdt_change_timer_count = 0;
+
+        if (g_b_hdmi_input_valid)
+        {
+            g_b_hdmi_input_valid = FALSE;
+            sys_shutdown_output();
+
+            #if HDMI_RX_PKT_INT_ENABLE
+            ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl(0, user_pkt_int, FALSE);
+            #endif
+
+            RX_STB_LED_light(FALSE);
+
+            LOG("g_b_input_valid = 0");
+        }
+
+        //LOG1("u16_mdt_ists = ", u16_mdt_ists);
+
+        //config audio pll for audio reset.
+        ms933xdrv_hdmi_rx_audio_fifo_reset(TRUE);
+        ms933xdrv_hdmi_rx_audio_config(RX_AUDIO_PLL_FREERUN_MODE, g_u16_input_tmds_clk);
+
+        //20180622, clr packet status.
+        //20200520, add reset audio
+        //20200520, reset audio must by audio clk and video vsync
+        ms933xdrv_hdmi_rx_controller_reset(HDMI_RX_CTRL_PDEC | HDMI_RX_CTRL_AUD);
+        //clr pdec interrupt status
+        ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status(PEDC_USED_ISTS);
+        _packet_fifo_init();
+
+        return;
+    }
+
+    if (!g_b_hdmi_input_valid)
+    {
+        #if (!HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE)
+        if (ms933xdrv_hdmi_rx_controller_mdt_syncvalid())
+        #endif
+        {
+            g_u8_mdt_change_timer_count ++;
+
+            if (g_u8_mdt_change_timer_count >= MDT_CHANGE_TIMEOUT)
+            {
+                g_u8_mdt_change_timer_count = 0;
+
+                #if HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE
+                g_b_hdmi_input_valid = sys_hdmi_rx_timing_process();
+                #else
+                //
+                #if HDMI_RX_TIMING_PARSE_ENABLE
+                g_b_hdmi_input_valid = ms933xdrv_hdmi_rx_get_input_timing(&g_st_hdmi_in_timing);
+                #else
+                g_b_hdmi_input_valid = 1; //normal use this case.
+                #endif
+                //
+                #endif
+
+                if (g_b_hdmi_input_valid)
+                {
+                    RX_STB_LED_light(TRUE);
+
+                    LOG("g_b_input_valid = 1");
+                    u8_int_sts = _get_infoframe_status();
+                    _get_packet_fifo_data();
+                    sys_hdmi_av_config(u8_int_sts, TRUE);
+                    //
+                    #if MS933X_APP_LOG1_ENABLE
+                    printf_input_timing();
+                    printf_input_av_config(u8_int_sts);
+                    #endif
+
+                    #if HDMI_RX_PKT_INT_ENABLE
+                    ms933xdrv_hdmi_rx_interrupt_to_pin_ctrl(0, user_pkt_int, TRUE);
+                    #endif
+                }
+            }
+        }
+        #if (!HDMI_RX_CEA_TIMING_USE_MANUAL_ENABLE)
+        else
+        {
+            g_u8_mdt_change_timer_count = 0;
+        }
+        #endif
+
+        //enhance, reset service timer
+        g_u8_rx_packet_timer_count = 0;
+        g_u8_hdmi_shell_error_timer_count = 0;
+    }
+}
+
+void ms933x_interrupt_service(void)
+{
+    if (!mculib_chip_read_interrupt_pin())
+    {
+        #if (HDMI_RX_CLK_INT_ENABLE && (!(HDMI_RX_MDT_INT_ENABLE || HDMI_RX_PKT_INT_ENABLE)))
+
+        sys_hdmi_rx_pll_service(0); //register_int get in service
+        //LOG("rx_clk_int.");
+
+        #else
+
+        #if HDMI_RX_CLK_INT_ENABLE
+        if (ms933xdrv_hdmi_rx_controller_hdmi_interrupt_get_status(CLK_CHANGE_ISTS))
+        {
+            sys_hdmi_rx_pll_service(1);
+            //LOG("rx_clk_int.");
+        }
+        #endif
+
+        #if HDMI_RX_MDT_INT_ENABLE
+        if (ms933xdrv_hdmi_rx_get_mdt_interrupt_status(user_mdt_int))
+        {
+            //user to do
+            //LOG("rx_mdt_int.");
+        }
+        #endif
+
+        #if HDMI_RX_PKT_INT_ENABLE
+        if (ms933xdrv_hdmi_rx_controller_pdec_interrupt_get_status(user_pkt_int))
+        {
+            //user to do
+            //LOG("rx_pkt_int.");
+        }
+        #endif
+
+        #endif
+    }
+}
+//void sys_led_process(void)
+//{
+//    if (g_b_hdmi_input_valid)
+//    {
+//        mculib_hdmi_rx_led_control(1);
+//
+//        mculib_hdmi_tx_led_control(0, g_u8_sink_hpd_connect[0]);
+//        mculib_hdmi_tx_led_control(1, g_u8_sink_hpd_connect[1]);
+//        mculib_hdmi_tx_led_control(2, g_u8_sink_hpd_connect[2]);
+//        mculib_hdmi_tx_led_control(3, g_u8_sink_hpd_connect[3]);
+//    }
+//    else
+//    {
+//         mculib_hdmi_rx_led_control(0);
+//        mculib_hdmi_tx_led_control(0, 0);
+//        mculib_hdmi_tx_led_control(1, 0);
+//        mculib_hdmi_tx_led_control(2, 0);
+//        mculib_hdmi_tx_led_control(3, 0);
+//    }
+//}
+
+void ms933x_media_service(void)
+{
+    sys_hotplug_service();
+
+    sys_hdmi_rx_pll_service(0);
+
+    sys_mdt_service();
+    //sys_led_process();
+
+    sys_hdmi_rx_packet_service();
+
+    #if RX_HDCP_SUPPORT_ENABLE
+    if (g_u8_rx_hdcp_support)
+    {
+        sys_hdmi_rx_hdcp_service();
+    }
+    #endif
+
+    #if TX_HDCP_SUPPORT_ENABLE
+    if (g_u8_tx_hdcp_support)
+    {
+        sys_hdmi_tx_hdcp_service();
+    }
+    #endif
+
+    #if HDCP_RPT_SUPPORT_ENABLE
+
+    if (g_u8_hdcp_repeater_support)
+    {
+        sys_hdmi_hdcp_repeater_service();
+    }
+
+    #if HDMI_CTS_HDCP_RPT_ENABLE
+    sys_tx_hdcp_port_service();
+    #endif
+
+    #endif
+
+    sys_error_service();
+
+    printf_input_timing();
+}
+
+#if MS933X_HDMI_NET_CABLE_TX_ENABLE
+VOID ms933x_hdmi_tx_drive_key_service(VOID)
+{
+    UINT8 u8key = 0xff; //mculib_key_detect();
+
+    switch (u8key)
+    {
+    case 1:
+        if (!g_b_hdmi_input_valid) return;
+
+        g_u8_hdmi_tx_drive_mode ++;
+        g_u8_hdmi_tx_drive_mode %= 4;
+        LOG2("g_u8_tx_mode = ", g_u8_hdmi_tx_drive_mode);
+
+        ms933xdrv_hdmi_tx_set_channel(0);
+        ms933xdrv_hdmi_tx_phy_output_enable(FALSE);
+        mculib_delay_ms(50);
+
+        sys_hdmi_tx_drive_mode_config(g_u8_hdmi_tx_drive_mode);
+        ms933xdrv_hdmi_tx_phy_output_enable(TRUE);
+        break;
+    }
+}
+#endif
+
+
+

+ 138 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/ms933x/ms933x_mpi_dummy.cx

@@ -0,0 +1,138 @@
+/**
+******************************************************************************
+* @file    ms933x_comm.c
+* @author
+* @version V1.0.0
+* @date    15-Nov-2014
+* @brief   This file contains all c files
+* @history
+*
+* Copyright (c) 2009-2014, MacroSilicon Technology Co.,Ltd.
+******************************************************************************/
+#include "BoardConfig.h"
+#include "ms933x_comm.h"
+#include "ms933x.h"
+#include "ms933x_app_config.h"
+#include "IIC_Software.h"
+//#include "IIC_Hardware.h"
+
+//无需非常精确, 误差不要大于 30%.
+void _mculib_delay_us_(UINT16 u8_us)
+{
+  Delay_Us(u8_us);
+}
+
+void _mculib_delay_ms_(UINT8 u8_ms)
+{
+  Delay_Ms(u8_ms);
+}
+
+#if 0
+
+//复位引脚至少有 1ms 时间的低电平,芯片才会复位。
+//拉高后,建议再 delay 1ms,让芯片 stable。
+void mculib_chip_reset()
+{
+  MS1826a_RST_GPIO_PP();
+
+  GPIO_WriteBit(GPIOA, MS1826_RST, Bit_RESET);
+  Delay_Ms(2);//RST
+  GPIO_WriteBit(GPIOA, MS1826_RST, Bit_SET);
+  //for test
+  Delay_Ms(2);//RST
+  GPIO_WriteBit(GPIOA, MS1826_RST, Bit_RESET);
+  Delay_Ms(2);//RST
+  GPIO_WriteBit(GPIOA, MS1826_RST, Bit_SET);
+
+  MS1826a_RST_GPIO_IPU();
+  Delay_Ms(2);
+}
+
+//MS933X 的寄存器索引为 16 位地址; I2C 在写入索引值时,先写入索引地址的低 8 位,然后写入索引地址的高 8 位。
+//I2C 的速度建议在: 100KHz~400KHz 之间,越大软件执行效率越高
+//GT_CMD_WR = 0xB2;
+//GT_CMD_RD = 0xB3;
+UINT8 mculib_i2c_read_16bidx8bval(UINT8 u8_address, UINT16 u16_index)
+{
+  UINT8 rBuf = 0;
+  IIC_Read_16bit_LE_MultiBytes(u8_address, u16_index, &rBuf, 1);
+  return rBuf;
+}
+
+BOOL mculib_i2c_write_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT8 u8_value)
+{
+  return IIC_Send_16bit_LE_MultiBytes(u8_address, u16_index, &u8_value, 1);
+}
+
+//读写多个地址
+void mculib_i2c_burstread_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+{
+  IIC_Read_16bit_LE_MultiBytes(u8_address, u16_index, pu8_value, u16_length);
+}
+
+void mculib_i2c_burstwrite_16bidx8bval(UINT8 u8_address, UINT16 u16_index, UINT16 u16_length, UINT8 *pu8_value)
+{
+  IIC_Send_16bit_LE_MultiBytes(u8_address, u16_index, pu8_value, u16_length);
+}
+
+
+// I2C 读写速度设置, HD DDC 最好工作在较低速度 20KHz 左右,否则可能会影响通信质量。
+// u8_i2c_speed: I2C_SPEED_20K(0), I2C_SPEED_100K(1)
+//fix todo: need fix to set i2c speed
+void  mculib_i2c_set_speed(UINT8 u8_i2c_speed)
+{
+  //need to set i2c speed
+  if(u8_i2c_speed == 0)
+  {
+    u8_i2c_speed=0;
+  }
+  else if (u8_i2c_speed == 1)
+  {
+    u8_i2c_speed=1;
+  }
+}
+
+//标准字节读写接口
+UINT8 mculib_i2c_read_8bidx8bval(UINT8 u8_address, UINT8 u8_index)
+{
+  UINT8 rBuf = 0;
+  IIC_Read_8bitMultiBytes(u8_address, u8_index, &rBuf, 1);
+  return rBuf;
+}
+
+BOOL mculib_i2c_write_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_value)
+{
+  return IIC_Send_8bitMultiBytes(u8_address, u8_index, &u8_value, 1);
+}
+
+//8-bit index for HD EDID block 2-3 读取接口
+//如果用户无需过 HD CTS 认证,此函数实现可为空。
+BOOL mculib_i2c_write_blank(UINT8 u8_address, UINT8 u8_index)
+{
+  return 0;
+}
+
+void mculib_i2c_burstread_8bidx8bval(UINT8 u8_address, UINT8 u8_index, UINT8 u8_length, UINT8 *pu8_value)
+{
+  IIC_Read_8bitMultiBytes(u8_address, u8_index, pu8_value, u8_length);
+}
+
+void _mculib_uart_log_(UINT8 *u8_string)
+{
+  if(_LOG_ENABLE_)
+    printf("%s\n",u8_string);
+}
+
+void _mculib_uart_log1_(UINT8 *u8_string, UINT16 u16_hex)
+{
+  if(_LOG_ENABLE_)
+    printf("%s: 0x%04X\n", u8_string, u16_hex);
+}
+
+void _mculib_uart_log2_(UINT8 *u8_string, UINT16 u16_dec)
+{
+  if(_LOG_ENABLE_)
+    printf("%s: %d\n", u8_string, u16_dec);
+}
+
+#endif

+ 101 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/pipe.c

@@ -0,0 +1,101 @@
+#include "pipe.h"
+
+#if DEBUG == Debug_USB
+Pipe_t debug_pipe;
+#endif
+
+Pipe_t sys_pipe;
+Pipe_t coor_pipe;
+Pipe_t uart_cmd_pipe;
+extern UINT8 print_log;
+void pipe_init(Pipe_t *pipe)
+{
+	pipe->tail = pipe->header = 0;
+}
+
+UINT8 pipe_read(Pipe_t *pipe, UINT8 * value, UINT8 len)
+{
+    //NVIC_DisableIRQ( USBFS_IRQn );
+	UINT8 cnt = 0;
+	do
+	{
+		if(pipe->tail==pipe->header)
+		{
+			break;
+		}
+		
+		value[cnt++] = pipe->buf[pipe->tail];
+		
+		pipe->tail = (pipe->tail+1)&OFFSET_MASK;//%BUF_MAX;
+	
+	}while(--len);
+	
+	//NVIC_EnableIRQ( USBFS_IRQn );
+	
+	return cnt;
+}
+
+void pipe_write_c(Pipe_t *pipe, UINT8 value) 
+{	
+    //NVIC_DisableIRQ( USBFS_IRQn );
+	pipe->buf[pipe->header] = value;
+	
+	pipe->header = (pipe->header+1)&OFFSET_MASK;//%BUF_MAX;
+	
+	if(pipe->tail==pipe->header)
+	{
+		pipe->tail = (pipe->tail+1)&OFFSET_MASK;//%BUF_MAX;
+	}
+	//NVIC_EnableIRQ( USBFS_IRQn );
+}
+
+void pipe_write(Pipe_t *pipe, UINT8* value, UINT8 len)
+{
+  UINT8 cnt = 0;
+
+  //NVIC_DisableIRQ( USBFS_IRQn );
+
+  UINT16 res = pipe->tail <= pipe->header ? pipe->tail + BUF_MAX - pipe->header : pipe->tail -  pipe->header;
+  if(res < len)
+  {
+      //NVIC_EnableIRQ( USBFS_IRQn );
+    return;
+  }
+
+  while(cnt < len)
+  {
+    pipe->buf[pipe->header] = value[cnt++];
+
+    pipe->header = (pipe->header+1)&OFFSET_MASK;//%BUF_MAX;
+  }
+  //NVIC_EnableIRQ( USBFS_IRQn );
+}
+
+
+//void pipe_write_t(Pipe_t *pipe, UINT8* value, UINT8 len, COMMAND_TYPE cmd)
+//{
+//    NVIC_DisableIRQ( USBFS_IRQn );
+//	UINT8 cnt = 0;
+//
+//	UINT16 res = pipe->tail <= pipe->header ? pipe->tail + BUF_MAX - pipe->header : pipe->tail -  pipe->header;
+//	if(res < len+2)
+//	{
+//	    NVIC_EnableIRQ( USBFS_IRQn );
+//		return;
+//	}
+//
+//	pipe_write_c(pipe, len);
+//
+//	pipe_write_c(pipe, cmd);
+//
+//	while(cnt < len)
+//	{
+//		pipe->buf[pipe->header] = value[cnt++];
+//
+//		pipe->header = (pipe->header+1)&OFFSET_MASK;//%BUF_MAX;
+//	}
+//	NVIC_EnableIRQ( USBFS_IRQn );
+//}
+
+
+

+ 1036 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/system_ch32v30x.c

@@ -0,0 +1,1036 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : system_ch32v30x.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/03/05
+* Description        : CH32V30x Device Peripheral Access Layer System Source File.
+*                      For HSE = 8Mhz
+*********************************************************************************
+* 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 "ch32v30x.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_120MHz_HSE  120000000
+//#define SYSCLK_FREQ_144MHz_HSE  144000000
+//#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_120MHz_HSI  120000000
+//#define SYSCLK_FREQ_144MHz_HSI  144000000
+
+/* 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_120MHz_HSE
+uint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz_HSE;        /* System Clock Frequency (Core Clock) */
+#elif defined SYSCLK_FREQ_144MHz_HSE
+uint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz_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_120MHz_HSI
+uint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz_HSI;        /* System Clock Frequency (Core Clock) */
+#elif defined SYSCLK_FREQ_144MHz_HSI
+uint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz_HSI;        /* System Clock Frequency (Core Clock) */
+#else
+uint32_t SystemCoreClock         = HSI_VALUE;                    /* System Clock Frequency (Core Clock) */
+
+#endif
+
+__I uint8_t AHBPrescTable[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_120MHz_HSE
+static void SetSysClockTo120_HSE( void );
+#elif defined SYSCLK_FREQ_144MHz_HSE
+static void SetSysClockTo144_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_120MHz_HSI
+static void SetSysClockTo120_HSI( void );
+#elif defined SYSCLK_FREQ_144MHz_HSI
+static void SetSysClockTo144_HSI( 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)0xF0FF0000;
+
+  RCC->CTLR &= (uint32_t)0xFEF6FFFF;
+  RCC->CTLR &= (uint32_t)0xFFFBFFFF;
+  RCC->CFGR0 &= (uint32_t)0xFF00FFFF;
+
+#ifdef CH32V30x_D8C
+  RCC->CTLR &= (uint32_t)0xEBFFFFFF;
+  RCC->INTR = 0x00FF0000;
+  RCC->CFGR2 = 0x00000000;
+#else
+  RCC->INTR = 0x009F0000;   
+#endif   
+  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;
+  uint8_t Pll_6_5 = 0;
+
+#ifdef CH32V30x_D8C
+  uint8_t Pll2mull = 0;
+
+#endif
+
+  tmp = RCC->CFGR0 & RCC_SWS;
+  
+  switch (tmp)
+  {
+    case 0x00:
+      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;
+
+#ifdef CH32V30x_D8
+      if(pllmull == 17) pllmull = 18;
+#else
+      if(pllmull == 2) pllmull = 18;
+      if(pllmull == 15){
+          pllmull = 13;  /* *6.5 */
+          Pll_6_5 = 1;
+      }
+      if(pllmull == 16) pllmull = 15;
+      if(pllmull == 17) pllmull = 16;
+#endif
+
+      if (pllsource == 0x00)
+      {
+          if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE) SystemCoreClock = HSI_VALUE * pllmull;
+          else SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
+      }
+      else
+      {
+
+#ifdef CH32V30x_D8
+          if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)
+          {
+            SystemCoreClock = (HSE_VALUE >> 1) * pllmull;
+          }
+          else
+          {
+            SystemCoreClock = HSE_VALUE * pllmull;
+          }
+
+#else
+          if(RCC->CFGR2 & (1<<16)){ /* PLL2 */
+              SystemCoreClock = HSE_VALUE/(((RCC->CFGR2 & 0xF0)>>4) + 1);  /* PREDIV2 */
+
+              Pll2mull = (uint8_t)((RCC->CFGR2 & 0xF00)>>8);
+
+              if(Pll2mull == 0) SystemCoreClock = (SystemCoreClock * 5)>>1;
+              else if(Pll2mull == 1) SystemCoreClock = (SystemCoreClock * 25)>>1;
+              else if(Pll2mull == 15) SystemCoreClock = SystemCoreClock * 20;
+              else  SystemCoreClock = SystemCoreClock * (Pll2mull + 2);
+
+              SystemCoreClock = SystemCoreClock/((RCC->CFGR2 & 0xF) + 1);  /* PREDIV1 */
+          }
+          else{/* HSE */
+              SystemCoreClock = HSE_VALUE/((RCC->CFGR2 & 0xF) + 1);  /* PREDIV1 */
+          }
+
+          SystemCoreClock = SystemCoreClock * pllmull;
+#endif
+      }
+
+
+      if(Pll_6_5 == 1) SystemCoreClock = (SystemCoreClock / 2);
+
+      break;
+    default:
+      SystemCoreClock = HSI_VALUE;
+      break;
+  }
+ 
+  tmp = AHBPrescTable[((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_120MHz_HSE
+    SetSysClockTo120_HSE();
+#elif defined SYSCLK_FREQ_144MHz_HSE
+    SetSysClockTo144_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_120MHz_HSI
+    SetSysClockTo120_HSI();
+#elif defined SYSCLK_FREQ_144MHz_HSI
+    SetSysClockTo144_HSI();
+
+#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;
+   
+  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
+  { 
+        /* 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;
+     
+   
+  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 */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6);
+#else
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6_EXTEN);
+#endif
+
+    /* 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
+  { 
+        /*
+         * 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;
+     
+  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 */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7);
+#else
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7_EXTEN);
+#endif
+
+    /* 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
+  { 
+        /*
+         * 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;
+     
+  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 */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
+                                        RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9);
+#else
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9_EXTEN);
+#endif
+
+    /* 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
+  { 
+        /*
+         * 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;
+
+  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 */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
+                                        RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12);
+#else
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12_EXTEN);
+#endif
+
+    /* 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
+  {
+        /*
+         * 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_120MHz_HSE
+
+/*********************************************************************
+ * @fn      SetSysClockTo120_HSE
+ *
+ * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
+ *
+ * @return  none
+ */
+static void SetSysClockTo120_HSE(void)
+{
+  __IO uint32_t StartUpCounter = 0, HSEStatus = 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_DIV2;
+
+    /*  PLL configuration: PLLCLK = HSE * 15 = 120 MHz */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
+                                        RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15);
+#else
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15_EXTEN);
+#endif
+
+    /* 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
+  {
+        /*
+         * 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_144MHz_HSE
+
+/*********************************************************************
+ * @fn      SetSysClockTo144_HSE
+ *
+ * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
+ *
+ * @return  none
+ */
+static void SetSysClockTo144_HSE(void)
+{
+  __IO uint32_t StartUpCounter = 0, HSEStatus = 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_DIV2;
+
+    /*  PLL configuration: PLLCLK = HSE * 18 = 144 MHz */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |
+                                        RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18);
+#else
+        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18_EXTEN);
+#endif
+
+    /* 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
+  {
+        /*
+         * 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)
+{
+    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));
+
+#ifdef CH32V30x_D8
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6);
+#else
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6_EXTEN);
+#endif
+
+    /* 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)
+{
+    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));
+
+#ifdef CH32V30x_D8
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7);
+#else
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7_EXTEN);
+#endif
+
+    /* 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)
+{
+    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));
+
+#ifdef CH32V30x_D8
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9);
+#else
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9_EXTEN);
+#endif
+
+    /* 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)
+{
+    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));
+
+#ifdef CH32V30x_D8
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12);
+#else
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12_EXTEN);
+#endif
+
+    /* 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_120MHz_HSI
+
+/*********************************************************************
+ * @fn      SetSysClockTo120_HSI
+ *
+ * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
+ *
+ * @return  none
+ */
+static void SetSysClockTo120_HSI(void)
+{
+    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 * 15 = 120 MHz */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15);
+#else
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15_EXTEN);
+#endif
+
+    /* 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_144MHz_HSI
+
+/*********************************************************************
+ * @fn      SetSysClockTo144_HSI
+ *
+ * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
+ *
+ * @return  none
+ */
+static void SetSysClockTo144_HSI(void)
+{
+    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 * 18 = 144 MHz */
+    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+
+#ifdef CH32V30x_D8
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18);
+#else
+    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18_EXTEN);
+#endif
+
+    /* 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)
+    {
+    }
+}
+
+#endif

+ 201 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/tmos.c

@@ -0,0 +1,201 @@
+/*
+ * tmos.c
+ *
+ *  Created on: Feb 29, 2024
+ *      Author: Administrator
+ */
+#include "ch32v30x.h"
+#include "tmos.h"
+#include "string.h"
+#define TASK_ID_MAX 10
+#define TASK_EVENT_MAX  16
+
+static uint8_t tmos_num = 0;
+
+typedef struct{
+    tmosEvents event;
+    tmosTimer timer[TASK_EVENT_MAX];
+    tmosTimer time_stamp[TASK_EVENT_MAX];
+    pTaskEventHandlerFn TaskEventHandlerFn;
+}ST_TASK;
+
+static ST_TASK tmosTask[TASK_ID_MAX];
+static tmosTimer time_stamp = 0;
+
+
+
+static tmosTimer toms_tick=0;
+
+/* Interrupt Function Declaration */
+void TIM1_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+
+/*********************************************************************
+ * @fn      TIM1_Init
+ *
+ * @brief   Initialize timer3 for keyboard and mouse scan.
+ *
+ * @param   arr - The specific period value
+ *          psc - The specifies prescaler value
+ *
+ * @return  none
+ */
+void TIM1_Init( uint16_t arr, uint16_t psc )
+{
+    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = { 0 };
+    NVIC_InitTypeDef NVIC_InitStructure = { 0 };
+
+    /* Enable Timer3 Clock */
+    RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
+
+    /* Initialize Timer3 */
+    TIM_TimeBaseStructure.TIM_Period = arr;
+    TIM_TimeBaseStructure.TIM_Prescaler = psc;
+    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseStructure );
+
+    TIM_ITConfig( TIM1, TIM_IT_Update, ENABLE );
+
+    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init( &NVIC_InitStructure );
+
+    /* Enable Timer3 */
+    TIM_Cmd( TIM1, ENABLE );
+}
+
+/*********************************************************************
+ * @fn      TIM1_IRQHandler
+ *
+ * @brief   This function handles TIM3 global interrupt request.
+ *
+ * @return  none
+ */
+//
+void TIM1_UP_IRQHandler( void )
+{
+    if( TIM_GetITStatus( TIM1, TIM_IT_Update ) != RESET )
+    {
+        /* Clear interrupt flag */
+        TIM_ClearITPendingBit( TIM1, TIM_IT_Update );
+
+        toms_tick++;
+    }
+}
+
+bStatus_t tmos_init()
+{
+    tmos_num = 0;
+
+    memset((void*)tmosTask, 0, sizeof(tmosTask));
+
+    toms_tick = 0;
+    time_stamp = 0;
+
+    TIM1_Init( 24, SystemCoreClock / 40000 -1 );
+
+    return 0;
+}
+
+bStatus_t tmos_set_event( tmosTaskID taskID, tmosEvents event )
+{
+    tmosTask[taskID].event |= event;
+    return 0;
+}
+
+bStatus_t tmos_start_task( tmosTaskID taskID, tmosEvents event, tmosTimer time  )
+{
+    uint8_t i;
+
+    tmosTask[taskID].event |= event;
+
+    for(i=0; i<TASK_EVENT_MAX; i++)
+    {
+       if((event >> i) & 0x01)
+       {
+           tmosTask[taskID].timer[i] = time ;
+           break;
+       }
+    }
+    return 0;
+}
+
+bStatus_t tmos_stop_task( tmosTaskID taskID, tmosEvents event )
+{
+    uint8_t i;
+
+    tmosTask[taskID].event &= ~event;
+
+    for(i=0; i<TASK_EVENT_MAX; i++)
+    {
+        if((event >> i) & 0x01)
+        {
+            tmosTask[taskID].timer[i] = 0;
+            break;
+        }
+    }
+    return 0;
+}
+
+void TMOS_SystemProcess( void )
+{
+    uint8_t i,j,tick = 0;
+    tmosEvents event;
+
+    if(toms_tick==time_stamp)
+        return;
+
+    tick = toms_tick - time_stamp;
+    time_stamp = toms_tick;
+
+    for(i = 0; i<tmos_num; i++)
+    {
+        if(tmosTask[i].event == 0)
+        {
+            continue;
+        }
+        else
+        {
+            //PRINT("task_id=%d\n", i);
+            for(j=0; j<TASK_EVENT_MAX; j++)
+            {
+                event = 1L<<j;
+
+                if(tmosTask[i].event & event)
+                {
+                    //PRINT("task_event=%d\n", j);
+                    if(tmosTask[i].timer[j] > tick)
+                    {
+                        //PRINT("timer=%d\n", tmosTask[i].timer[j]);
+                        tmosTask[i].timer[j]-=tick;
+                    }
+                    else if(tmosTask[i].timer[j] <= tick)
+                    {
+                        //PRINT("timer=%d\n", tmosTask[i].timer[j]);
+
+                        tmosTask[i].timer[j] = 0;
+
+                        tmosTask[i].event &= ~event;
+
+                        tmosTask[i].TaskEventHandlerFn((tmosTaskID)i, event);
+                    }
+                }
+            }
+        }
+    }
+}
+
+tmosTaskID TMOS_ProcessEventRegister( pTaskEventHandlerFn eventCb )
+{
+    if(tmos_num >= TASK_ID_MAX)
+    {
+        return INVALID_TASK_ID;
+    }
+    else
+    {
+        tmosTask[tmos_num++].TaskEventHandlerFn = eventCb;
+    }
+    return tmos_num - 1;
+}

+ 146 - 0
EVT/EXAM/CodePro/YJD-CH32V30X/src/src/uart_ht7315/uart_ht7315.c

@@ -0,0 +1,146 @@
+#include "uart_ht7315.h"
+#include "stdio.h"
+
+#define QUEUE_SIZE 8
+
+volatile char buffer[4];
+volatile int buffer_index = 0;
+
+typedef struct {
+    char buffer[QUEUE_SIZE];
+    int head;
+    int tail;
+    int size;
+} CircularQueue;
+
+// 閸忋劌鐪梼鐔峰灙
+CircularQueue rxQueue = {{0}, 0, 0, 0};
+
+void initQueue(CircularQueue *q) {
+    q->head = 0;
+    q->tail = 0;
+    q->size = 0;
+}
+
+int isQueueFull(CircularQueue *q) {
+    return q->size == QUEUE_SIZE;
+}
+
+int isQueueEmpty(CircularQueue *q) {
+    return q->size == 0;
+}
+
+void enqueue(CircularQueue *q, char data) {
+    if (!isQueueFull(q)) {
+        q->buffer[q->tail] = data;
+        q->tail = (q->tail + 1) % QUEUE_SIZE;
+        q->size++;
+    }
+}
+
+char dequeue(CircularQueue *q) {
+    char data = 0;
+    if (!isQueueEmpty(q)) {
+        data = q->buffer[q->head];
+        q->head = (q->head + 1) % QUEUE_SIZE;
+        q->size--;
+    }
+    return data;
+}
+
+void clearQueue(CircularQueue *q) {
+    q->head = 0;
+    q->tail = 0;
+    q->size = 0;
+}
+
+
+void Uart_u6710_GPIO_Init()
+{
+    GPIO_InitTypeDef GPIO_InitStructure = { 0 };
+    USART_InitTypeDef USART_InitStructure = { 0 };
+    NVIC_InitTypeDef NVIC_InitStructure = { 0 };
+
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_USART1, ENABLE);
+    //RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, 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 );
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+    GPIO_Init( GPIOA, &GPIO_InitStructure );
+
+    USART_InitStructure.USART_BaudRate = UART_U6710_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 | USART_Mode_Rx;
+
+    USART_Init( USART1, &USART_InitStructure );
+    USART_ITConfig( USART1, USART_IT_RXNE, ENABLE );
+
+    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+
+    NVIC_EnableIRQ(USART1_IRQn);
+    USART_Cmd( USART1, ENABLE );
+}
+
+void USART1_SendData(PUINT8 txbuf, UINT16 length)
+{
+    //printf("USART1_SendData\r\n");
+    UINT8 TxCnt = 0;
+    while(TxCnt < length) {
+        USART_SendData(USART1, txbuf[TxCnt++]);
+        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {
+            /* 缁涘绶熼崣鎴︼拷浣哥暚閹达拷 */
+            //printf("TxCnt:%d\r\n", TxCnt);
+        }
+    }
+}
+
+void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+void USART1_IRQHandler(void)
+{
+    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
+        char received_char = USART_ReceiveData(USART1);
+        //printf("buffer_index: %d\n", buffer_index);
+        switch (buffer_index) {
+            case 0:
+                if (received_char == 'P') {
+                    buffer[buffer_index++] = received_char;
+                }
+                break;
+            case 1:
+                if (received_char == 'O') {
+                    buffer[buffer_index++] = received_char;
+                } else {
+                    buffer_index = 0; // 闁插秶鐤嗙紓鎾冲暱閸栵拷
+                }
+                break;
+            case 2:
+                if (received_char == 'F') {
+                    buffer[buffer_index++] = received_char;
+                    // 閹垫挸宓冨☉鍫熶紖
+                    printf("[PowerOFF!] \n");
+                    buffer_index = 0; // 闁插秶鐤嗙紓鎾冲暱閸栵拷
+                    // 鐟欙箑褰傜化鑽ょ埠婢跺秳缍�
+                    NVIC_SystemReset();
+                } else {
+                    buffer_index = 0; // 闁插秶鐤嗙紓鎾冲暱閸栵拷
+                }
+                break;
+            default:
+                buffer_index = 0; // 闁插秶鐤嗙紓鎾冲暱閸栵拷
+                break;
+        }
+    }
+    // 濞撳懘娅庢稉顓熸焽閺嶅洤绻�
+    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
+}

+ 392 - 0
EVT/EXAM/SRC/Core/core_riscv.c

@@ -0,0 +1,392 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : core_riscv.c
+* Author             : WCH
+* Version            : V1.0.1
+* Date               : 2023/11/11
+* Description        : RISC-V V4 Core Peripheral Access Layer Source File for CH32V30x
+*********************************************************************************
+* 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_FFLAGS
+ *
+ * @brief   Return the Floating-Point Accrued Exceptions
+ *
+ * @return  fflags value
+ */
+uint32_t __get_FFLAGS(void)
+{
+  uint32_t result;
+
+  __ASM volatile ( "csrr %0," "fflags" : "=r" (result) );
+  return (result);
+}
+
+/*********************************************************************
+ * @fn      __set_FFLAGS
+ *
+ * @brief   Set the Floating-Point Accrued Exceptions
+ *
+ * @param   value  - set FFLAGS value
+ *
+ * @return  none
+ */
+void __set_FFLAGS(uint32_t value)
+{
+  __ASM volatile ("csrw fflags, %0" : : "r" (value) );
+}
+
+/*********************************************************************
+ * @fn      __get_FRM
+ *
+ * @brief   Return the Floating-Point Dynamic Rounding Mode
+ *
+ * @return  frm value
+ */
+uint32_t __get_FRM(void)
+{
+  uint32_t result;
+
+  __ASM volatile ( "csrr %0," "frm" : "=r" (result) );
+  return (result);
+}
+
+/*********************************************************************
+ * @fn      __set_FRM
+ *
+ * @brief   Set the Floating-Point Dynamic Rounding Mode
+ *
+ * @param   value  - set frm value
+ *
+ * @return  none
+ */
+void __set_FRM(uint32_t value)
+{
+  __ASM volatile ("csrw frm, %0" : : "r" (value) );
+}
+
+/*********************************************************************
+ * @fn      __get_FCSR
+ *
+ * @brief   Return the Floating-Point Control and Status Register
+ *
+ * @return  fcsr value
+ */
+uint32_t __get_FCSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ( "csrr %0," "fcsr" : "=r" (result) );
+  return (result);
+}
+
+/*********************************************************************
+ * @fn      __set_FCSR
+ *
+ * @brief   Set the Floating-Point Dynamic Rounding Mode
+ *
+ * @param   value  - set fcsr value
+ *
+ * @return  none
+ */
+void __set_FCSR(uint32_t value)
+{
+  __ASM volatile ("csrw fcsr, %0" : : "r" (value) );
+}
+
+/*********************************************************************
+ * @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);
+}
+

+ 599 - 0
EVT/EXAM/SRC/Core/core_riscv.h

@@ -0,0 +1,599 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : core_riscv.h
+* Author             : WCH
+* Version            : V1.0.2
+* Date               : 2025/03/06
+* Description        : RISC-V V4 Core Peripheral Access Layer Header File for CH32V30x
+*********************************************************************************
+* 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 */
+
+/* Standard Peripheral Library old types (maintained for legacy purpose) */
+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) );
+  __asm volatile ("fence.i");
+}
+
+/*********************************************************************
+ * @fn      __NOP
+ *
+ * @brief   nop
+ *
+ * @return  none
+ */
+__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __NOP()
+{
+  __asm volatile ("nop");
+}
+
+/*********************************************************************
+ * @fn      NVIC_EnableIRQ
+ *
+ * @brief   Enable 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));
+  __asm volatile ("fence.i");
+}
+
+/*********************************************************************
+ * @fn      NVIC_GetStatusIRQ
+ *
+ * @brief   Get Interrupt Enable State
+ *
+ * @param   IRQn - Interrupt Numbers
+ *
+ * @return  1 - Interrupt Enable
+ *          0 - Interrupt 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-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3)
+ *            priority - bit[7:5] - Preemption Priority
+ *                       bit[4:0] - Reserve
+ *          interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2)
+ *            priority - bit[7:6] - Preemption Priority
+ *                       bit[5] - Sub priority
+ *                       bit[4:0] - Reserve
+ *          interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 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   add - 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  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 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  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_FFLAGS(void);
+extern void __set_FFLAGS(uint32_t value);
+extern uint32_t __get_FRM(void);
+extern void __set_FRM(uint32_t value);
+extern uint32_t __get_FCSR(void);
+extern void __set_FCSR(uint32_t value);
+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
+
+
+
+
+

+ 269 - 0
EVT/EXAM/SRC/Debug/debug.c

@@ -0,0 +1,269 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : debug.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/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.
+*******************************************************************************/
+#include "debug.h"
+
+static uint8_t  p_us = 0;
+static uint16_t p_ms = 0;
+
+#define DEBUG_DATA0_ADDRESS  ((volatile uint32_t*)0xE0000380)
+#define DEBUG_DATA1_ADDRESS  ((volatile uint32_t*)0xE0000384)
+
+/*********************************************************************
+ * @fn      Delay_Init
+ *
+ * @brief   Initializes Delay Funcation.
+ *
+ * @return  none
+ */
+void Delay_Init(void)
+{
+    p_us = SystemCoreClock / 8000000;
+    p_ms = (uint16_t)p_us * 1000;
+}
+
+/*********************************************************************
+ * @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;
+
+    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_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_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_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_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_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_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);
+
+#elif(DEBUG == DEBUG_UART7)
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART7, ENABLE);
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, 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(GPIOC, &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);
+
+#elif(DEBUG == DEBUG_UART7)
+    USART_Init(UART7, &USART_InitStructure);
+    USART_Cmd(UART7, ENABLE);
+
+#endif
+}
+
+/*********************************************************************
+ * @fn      SDI_Printf_Enable
+ *
+ * @brief   Initializes the SDI printf Function.
+ *
+ * @param   None
+ *
+ * @return  None
+ */
+void SDI_Printf_Enable(void)
+{
+    *(DEBUG_DATA0_ADDRESS) = 0;
+    Delay_Init();
+    Delay_Ms(1);
+}
+
+/*********************************************************************
+ * @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 = 0;
+
+#if (SDI_PRINT == SDI_PR_OPEN)
+    int writeSize = size;
+
+    do
+    {
+
+        /**
+         * data0  data1 8 bytes
+         * data0 The lowest byte storage length, the maximum is 7
+         *
+         */
+
+        while( (*(DEBUG_DATA0_ADDRESS) != 0u))
+        {
+
+        }
+
+        if(writeSize>7)
+        {
+            *(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);
+            *(DEBUG_DATA0_ADDRESS) = (7u) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);
+
+            i += 7;
+            writeSize -= 7;
+        }
+        else
+        {
+            *(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);
+            *(DEBUG_DATA0_ADDRESS) = (writeSize) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);
+
+            writeSize = 0;
+        }
+
+    } while (writeSize);
+
+
+#else
+    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++);
+#elif(DEBUG == DEBUG_UART7)
+        while(USART_GetFlagStatus(UART7, USART_FLAG_TC) == RESET);
+        USART_SendData(UART7, *buf++);
+#endif
+    }
+#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;
+}
+
+
+

+ 56 - 0
EVT/EXAM/SRC/Debug/debug.h

@@ -0,0 +1,56 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : debug.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/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
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "stdio.h"
+#include "ch32v30x.h"
+
+/* UART Printf Definition */
+#define DEBUG_UART1    1
+#define DEBUG_UART2    2
+#define DEBUG_UART3    3
+#define DEBUG_UART7    7
+
+/* DEBUG UATR Definition */
+#ifndef DEBUG
+#define DEBUG   DEBUG_UART7
+#endif
+
+/* SDI Printf Definition */
+#define SDI_PR_CLOSE   0
+#define SDI_PR_OPEN    1
+
+#ifndef SDI_PRINT
+#define SDI_PRINT   SDI_PR_CLOSE
+#endif
+
+
+void Delay_Init(void);
+void Delay_Us (uint32_t n);
+void Delay_Ms (uint32_t n);
+void USART_Printf_Init(uint32_t baudrate);
+void SDI_Printf_Enable(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+

+ 185 - 0
EVT/EXAM/SRC/Ld/Link.ld

@@ -0,0 +1,185 @@
+ENTRY( _start )
+
+__stack_size = 2048;
+
+PROVIDE( _stack_size = __stack_size );
+
+
+MEMORY
+{
+/* CH32V30x_D8C - CH32V305RB-CH32V305FB
+   CH32V30x_D8 - CH32V303CB-CH32V303RB
+*/
+/*
+	FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
+	RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
+*/
+    
+/* CH32V30x_D8C - CH32V307VC-CH32V307WC-CH32V307RC-CH32V305CC
+   CH32V30x_D8 - CH32V303VC-CH32V303RC
+   FLASH + RAM supports the following configuration
+   For specific choices, please refer :CH32FV2x_V3xRM.PDF\Table 32-3
+   FLASH-192K + RAM-128K
+   FLASH-224K + RAM-96K
+   FLASH-256K + RAM-64K  
+   FLASH-288K + RAM-32K  
+   FLASH-128K + RAM-192K  
+*/
+	FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288K
+	RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
+}
+
+
+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 
+
+}
+
+
+

+ 266 - 0
EVT/EXAM/SRC/Peripheral/inc/PIOC_SFR.h

@@ -0,0 +1,266 @@
+/* Define for PIOC           */
+/* Website:  http://wch.cn   */
+/* Email:    tech@wch.cn     */
+/* Author:   W.ch 2022.08    */
+/* V1.0 SpecialFunctionRegister */
+
+// __PIOC_SFR_H__
+
+#ifndef __PIOC_SFR_H__
+#define __PIOC_SFR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Register Bit Attribute / Bit Access Type
+//   RO:    Read Only (internal change)
+//   RW:    Read / Write
+// Attribute: master/PIOC
+
+/* Register name rule:
+   R32_* for 32 bits register (UINT32,ULONG)
+   R16_* for 16 bits register (UINT16,USHORT)
+   R8_*  for  8 bits register (UINT8,UCHAR)
+   RB_*  for bit or bit mask of 8 bit register */
+
+/* ********************************************************************************************************************* */
+
+#define PIOC_SRAM_BASE      (SRAM_BASE+0x4000)        // PIOC code RAM base address
+
+#define PIOC_SFR_BASE       PIOC_BASE                 // PIOC SFR base address
+
+#define R32_PIOC_SFR        (*((volatile unsigned long *)(PIOC_SFR_BASE+0x04))) // RO/RW, PIOC SFR
+
+#define R8_INDIR_ADDR       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x04))) // RO/RW, PIOC indirect address
+
+#define R8_TMR0_COUNT       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x05))) // RO/RW, PIOC timer count
+
+#define R8_TMR0_CTRL        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x06))) // RO/RW, PIOC timer control and GP bit
+#define  RB_EN_LEVEL1       0x80                      // RO/RW, enable IO1 level change to wakeup & action interrupt flag
+#define  RB_EN_LEVEL0       0x40                      // RO/RW, enable IO0 level change to wakeup & action interrupt flag
+#define  RB_GP_BIT_Y        0x20                      // RO/RW, general-purpose bit 1, reset by power on, no effect if system reset or RB_MST_RESET reset
+#define  RB_GP_BIT_X        0x10                      // RO/RW, general-purpose bit 0, reset by power on, no effect if system reset or RB_MST_RESET reset
+#define  RB_TMR0_MODE       0x08                      // RO/RW, timer mode: 0-timer, 1-PWM
+#define  RB_TMR0_FREQ2      0x04                      // RO/RW, timer clock frequency selection 2
+#define  RB_TMR0_FREQ1      0x02                      // RO/RW, timer clock frequency selection 1
+#define  RB_TMR0_FREQ0      0x01                      // RO/RW, timer clock frequency selection 0
+
+#define R8_TMR0_INIT        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x07))) // RO/RW, PIOC timer initial value
+
+
+#define R32_PORT_CFG        (*((volatile unsigned long *)(PIOC_SFR_BASE+0x08))) // RO/RW, port status and config
+
+#define R8_BIT_CYCLE        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x08))) // RO/RW, encode bit cycle
+#define  RB_BIT_TX_O0       0x80                      // RO/RW, bit data for IO0 port encode output
+#define  RB_BIT_CYCLE       0x7F                      // RO/RW, IO0 port bit data cycle -1
+
+#define R8_INDIR_ADDR2      (*((volatile unsigned char *)(PIOC_SFR_BASE+0x09))) // RO/RW, PIOC indirect address 2
+
+#define R8_PORT_DIR         (*((volatile unsigned char *)(PIOC_SFR_BASE+0x0A))) // RO/RW, IO port direction and mode
+//#define  RB_PORT_MOD3       0x80                      // RO/RW, IO port mode 3
+//#define  RB_PORT_MOD2       0x40                      // RO/RW, IO port mode 2
+//#define  RB_PORT_MOD1       0x20                      // RO/RW, IO port mode 1
+//#define  RB_PORT_MOD0       0x10                      // RO/RW, IO port mode 0
+//#define  RB_PORT_PU1        0x08                      // RO/RW, IO1 port pullup enable
+//#define  RB_PORT_PU0        0x04                      // RO/RW, IO0 port pullup enable
+#define  RB_PORT_DIR1       0x02                      // RO/RW, IO1 port direction
+#define  RB_PORT_DIR0       0x01                      // RO/RW, IO0 port direction
+
+#define R8_PORT_IO          (*((volatile unsigned char *)(PIOC_SFR_BASE+0x0B))) // RO/RW, IO port input and output
+#define  RB_PORT_IN_XOR     0x80                      // RO/RO, IO0 XOR IO1 port input
+#define  RB_BIT_RX_I0       0x40                      // RO/RO, decoced bit data for IO0 port received
+#define  RB_PORT_IN1        0x20                      // RO/RO, IO1 port input
+#define  RB_PORT_IN0        0x10                      // RO/RO, IO0 port input
+#define  RB_PORT_XOR1       0x08                      // RO/RO, IO1 port output XOR input
+#define  RB_PORT_XOR0       0x04                      // RO/RO, IO0 port output XOR input
+#define  RB_PORT_OUT1       0x02                      // RO/RW, IO1 port output
+#define  RB_PORT_OUT0       0x01                      // RO/RW, IO0 port output
+
+
+#define R32_DATA_CTRL       (*((volatile unsigned long *)(PIOC_SFR_BASE+0x1C))) // RW/RW, data control
+
+#define R8_SYS_CFG          (*((volatile unsigned char *)(PIOC_SFR_BASE+0x1C))) // RW/RW, port config
+#define  RB_INT_REQ         0x80                      // RO/RW, PIOC interrupt request action, set 1/0 by PIOC, clear 0 by master write R8_CTRL_RD (no effect)
+#define  RB_DATA_SW_MR      0x40                      // RO/RO, R8_CTRL_RD wait for read status, set 1 by PIOC write R8_CTRL_RD, clear 0 by master read R8_CTRL_RD
+#define  RB_DATA_MW_SR      0x20                      // RO/RO, R8_CTRL_WR wait for read status, set 1 by master write R8_CTRL_WR, clear 0 by PIOC read R8_CTRL_WR
+#define  RB_MST_CFG_B4      0x10                      // RW/RO, config inform bit, default 0
+#define  RB_MST_IO_EN1      0x08                      // RW/RO, IO1 switch enable, default 0
+#define  RB_MST_IO_EN0      0x04                      // RW/RO, IO0 switch enable, default 0
+#define  RB_MST_RESET       0x02                      // RW/RO, force PIOC reset, high action, default 0
+#define  RB_MST_CLK_GATE    0x01                      // RW/RO, PIOC global clock enable, high action, default 0
+
+#define R8_CTRL_RD          (*((volatile unsigned char *)(PIOC_SFR_BASE+0x1D))) // RO/RW, data for master read only and PIOC write only
+
+#define R8_CTRL_WR          (*((volatile unsigned char *)(PIOC_SFR_BASE+0x1E))) // RW/RO, data for master write only and PIOC read only
+
+#define R8_DATA_EXCH        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x1F))) // RW/RW, data exchange
+
+
+#define R32_DATA_REG0_3     (*((volatile unsigned long *)(PIOC_SFR_BASE+0x20))) // RW/RW, data buffer 0~3
+#define R8_DATA_REG0        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x20))) // RW/RW, data buffer 0
+#define R8_DATA_REG1        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x21))) // RW/RW, data buffer 1
+#define R8_DATA_REG2        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x22))) // RW/RW, data buffer 2
+#define R8_DATA_REG3        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x23))) // RW/RW, data buffer 3
+
+#define R32_DATA_REG4_7     (*((volatile unsigned long *)(PIOC_SFR_BASE+0x24))) // RW/RW, data buffer 4~7
+#define R8_DATA_REG4        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x24))) // RW/RW, data buffer 4
+#define R8_DATA_REG5        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x25))) // RW/RW, data buffer 5
+#define R8_DATA_REG6        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x26))) // RW/RW, data buffer 6
+#define R8_DATA_REG7        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x27))) // RW/RW, data buffer 7
+
+#define R32_DATA_REG8_11    (*((volatile unsigned long *)(PIOC_SFR_BASE+0x28))) // RW/RW, data buffer 8~11
+#define R8_DATA_REG8        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x28))) // RW/RW, data buffer 8
+#define R8_DATA_REG9        (*((volatile unsigned char *)(PIOC_SFR_BASE+0x29))) // RW/RW, data buffer 9
+#define R8_DATA_REG10       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x2A))) // RW/RW, data buffer 10
+#define R8_DATA_REG11       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x2B))) // RW/RW, data buffer 11
+
+#define R32_DATA_REG12_15   (*((volatile unsigned long *)(PIOC_SFR_BASE+0x2C))) // RW/RW, data buffer 12~15
+#define R8_DATA_REG12       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x2C))) // RW/RW, data buffer 12
+#define R8_DATA_REG13       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x2D))) // RW/RW, data buffer 13
+#define R8_DATA_REG14       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x2E))) // RW/RW, data buffer 14
+#define R8_DATA_REG15       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x2F))) // RW/RW, data buffer 15
+
+#define R32_DATA_REG16_19   (*((volatile unsigned long *)(PIOC_SFR_BASE+0x30))) // RW/RW, data buffer 16~19
+#define R8_DATA_REG16       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x30))) // RW/RW, data buffer 16
+#define R8_DATA_REG17       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x31))) // RW/RW, data buffer 17
+#define R8_DATA_REG18       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x32))) // RW/RW, data buffer 18
+#define R8_DATA_REG19       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x33))) // RW/RW, data buffer 19
+
+#define R32_DATA_REG20_23   (*((volatile unsigned long *)(PIOC_SFR_BASE+0x34))) // RW/RW, data buffer 20~23
+#define R8_DATA_REG20       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x34))) // RW/RW, data buffer 20
+#define R8_DATA_REG21       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x35))) // RW/RW, data buffer 21
+#define R8_DATA_REG22       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x36))) // RW/RW, data buffer 22
+#define R8_DATA_REG23       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x37))) // RW/RW, data buffer 23
+
+#define R32_DATA_REG24_27   (*((volatile unsigned long *)(PIOC_SFR_BASE+0x38))) // RW/RW, data buffer 24~27
+#define R8_DATA_REG24       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x38))) // RW/RW, data buffer 24
+#define R8_DATA_REG25       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x39))) // RW/RW, data buffer 25
+#define R8_DATA_REG26       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x3A))) // RW/RW, data buffer 26
+#define R8_DATA_REG27       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x3B))) // RW/RW, data buffer 27
+
+#define R32_DATA_REG28_31   (*((volatile unsigned long *)(PIOC_SFR_BASE+0x3C))) // RW/RW, data buffer 28~31
+#define R8_DATA_REG28       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x3C))) // RW/RW, data buffer 28
+#define R8_DATA_REG29       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x3D))) // RW/RW, data buffer 29
+#define R8_DATA_REG30       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x3E))) // RW/RW, data buffer 30
+#define R8_DATA_REG31       (*((volatile unsigned char *)(PIOC_SFR_BASE+0x3F))) // RW/RW, data buffer 31
+
+/* ******************************************************************************************************* */
+
+/* PIOC Registers */
+typedef struct
+{
+    uint32_t          RESERVED00;
+    union {
+      __IO uint32_t   D32_PIOC_SFR ; // RO/RW, PIOC SFR
+      struct {
+        __IO uint8_t  D8_INDIR_ADDR; // RO/RW, PIOC indirect address
+        __IO uint8_t  D8_TMR0_COUNT; // RO/RW, PIOC timer count
+        __IO uint8_t  D8_TMR0_CTRL; // RO/RW, PIOC timer control and GP bit
+        __IO uint8_t  D8_TMR0_INIT; // RO/RW, PIOC timer initial value
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_PORT_CFG ; // RO/RW, port status and config
+      struct {
+        __IO uint8_t  D8_BIT_CYCLE; // RO/RW, encode bit cycle
+        __IO uint8_t  D8_INDIR_ADDR2; // RO/RW, PIOC indirect address 2
+        __IO uint8_t  D8_PORT_DIR; // RO/RW, IO port direction and mode
+        __IO uint8_t  D8_PORT_IO; // RO/RW, IO port input and output
+      } ;
+    } ;
+    uint32_t          RESERVED0C;
+    uint32_t          RESERVED10;
+    uint32_t          RESERVED14;
+    uint32_t          RESERVED18;
+    union {
+      __IO uint32_t   D32_DATA_CTRL ; // RW/RW, data control
+      struct {
+        __IO uint8_t  D8_SYS_CFG; // RW/RW, port config
+        __IO uint8_t  D8_CTRL_RD; // RO/RW, data for master read only and PIOC write only
+        __IO uint8_t  D8_CTRL_WR; // RW/RO, data for master write only and PIOC read only
+        __IO uint8_t  D8_DATA_EXCH; // RW/RW, data exchange
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG0_3 ; // RW/RW, data buffer 0~3
+      struct {
+        __IO uint8_t  D8_DATA_REG0; // RW/RW, data buffer 0
+        __IO uint8_t  D8_DATA_REG1; // RW/RW, data buffer 1
+        __IO uint8_t  D8_DATA_REG2; // RW/RW, data buffer 2
+        __IO uint8_t  D8_DATA_REG3; // RW/RW, data buffer 3
+      } ;
+      __IO uint16_t   D16_DATA_REG0_1 ; // RW/RW, data buffer 0~1
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG4_7 ; // RW/RW, data buffer 4~7
+      struct {
+        __IO uint8_t  D8_DATA_REG4; // RW/RW, data buffer 4
+        __IO uint8_t  D8_DATA_REG5; // RW/RW, data buffer 5
+        __IO uint8_t  D8_DATA_REG6; // RW/RW, data buffer 6
+        __IO uint8_t  D8_DATA_REG7; // RW/RW, data buffer 7
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG8_11 ; // RW/RW, data buffer 8~11
+      struct {
+        __IO uint8_t  D8_DATA_REG8; // RW/RW, data buffer 8
+        __IO uint8_t  D8_DATA_REG9; // RW/RW, data buffer 9
+        __IO uint8_t  D8_DATA_REG10; // RW/RW, data buffer 10
+        __IO uint8_t  D8_DATA_REG11; // RW/RW, data buffer 11
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG12_15 ; // RW/RW, data buffer 12~15
+      struct {
+        __IO uint8_t  D8_DATA_REG12; // RW/RW, data buffer 12
+        __IO uint8_t  D8_DATA_REG13; // RW/RW, data buffer 13
+        __IO uint8_t  D8_DATA_REG14; // RW/RW, data buffer 14
+        __IO uint8_t  D8_DATA_REG15; // RW/RW, data buffer 15
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG16_19 ; // RW/RW, data buffer 16~19
+      struct {
+        __IO uint8_t  D8_DATA_REG16; // RW/RW, data buffer 16
+        __IO uint8_t  D8_DATA_REG17; // RW/RW, data buffer 17
+        __IO uint8_t  D8_DATA_REG18; // RW/RW, data buffer 18
+        __IO uint8_t  D8_DATA_REG19; // RW/RW, data buffer 19
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG20_23 ; // RW/RW, data buffer 20~23
+      struct {
+        __IO uint8_t  D8_DATA_REG20; // RW/RW, data buffer 20
+        __IO uint8_t  D8_DATA_REG21; // RW/RW, data buffer 21
+        __IO uint8_t  D8_DATA_REG22; // RW/RW, data buffer 22
+        __IO uint8_t  D8_DATA_REG23; // RW/RW, data buffer 23
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG24_27 ; // RW/RW, data buffer 24~27
+      struct {
+        __IO uint8_t  D8_DATA_REG24; // RW/RW, data buffer 24
+        __IO uint8_t  D8_DATA_REG25; // RW/RW, data buffer 25
+        __IO uint8_t  D8_DATA_REG26; // RW/RW, data buffer 26
+        __IO uint8_t  D8_DATA_REG27; // RW/RW, data buffer 27
+      } ;
+    } ;
+    union {
+      __IO uint32_t   D32_DATA_REG28_31 ; // RW/RW, data buffer 28~31
+      struct {
+        __IO uint8_t  D8_DATA_REG28; // RW/RW, data buffer 28
+        __IO uint8_t  D8_DATA_REG29; // RW/RW, data buffer 29
+        __IO uint8_t  D8_DATA_REG30; // RW/RW, data buffer 30
+        __IO uint8_t  D8_DATA_REG31; // RW/RW, data buffer 31
+      } ;
+    } ;
+} PIOC_TypeDef;
+
+#define PIOC          ((PIOC_TypeDef *)PIOC_BASE)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __PIOC_SFR_H__

+ 6637 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x.h

@@ -0,0 +1,6637 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x.h
+* Author             : WCH
+* Version            : V1.0.1
+* Date               : 2025/04/09
+* Description        : CH32V30x Device Peripheral Access Layer 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 __CH32V30x_H
+#define __CH32V30x_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif 
+
+#if !defined(CH32V30x_D8) && !defined(CH32V30x_D8C)
+//#define CH32V30x_D8              /* CH32V303x */
+#define CH32V30x_D8C             /* CH32V307x-CH32V305x-CH32V317x */
+
+#endif
+  
+#define __MPU_PRESENT             0 /* Other CH32 devices does not provide an MPU */
+#define __Vendor_SysTickConfig    0 /* Set to 1 if different SysTick Config is used */	 
+	 
+#ifndef HSE_VALUE
+#define HSE_VALUE    ((uint32_t)8000000) /* Value of the External oscillator in Hz */
+#endif
+
+/* In the following line adjust the External High Speed oscillator (HSE) Startup Timeout value */
+#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x1000) /* Time out for HSE start up */
+
+#define HSI_VALUE    ((uint32_t)8000000) /* Value of the Internal oscillator in Hz */
+
+/* CH32V30x Standard Peripheral Library version number */
+#define __CH32V30x_STDPERIPH_VERSION_MAIN   (0x02) /* [15:8] main version */
+#define __CH32V30x_STDPERIPH_VERSION_SUB    (0x08) /* [7:0] sub version */
+#define __CH32V30x_STDPERIPH_VERSION        ( (__CH32V30x_STDPERIPH_VERSION_MAIN << 8)\
+                                             |(__CH32V30x_STDPERIPH_VERSION_SUB << 0))
+
+
+/* Interrupt Number Definition, according to the selected device */	 
+typedef enum IRQn
+{
+ /******  RISC-V Processor Exceptions Numbers *******************************************************/
+  NonMaskableInt_IRQn         = 2,       /* 2 Non Maskable Interrupt                             */
+  EXC_IRQn                    = 3,       /* 3 Exception Interrupt                                */
+  Ecall_M_Mode_IRQn           = 5,       /* 5 Ecall M Mode Interrupt                             */
+  Ecall_U_Mode_IRQn           = 8,       /* 8 Ecall U Mode Interrupt                             */
+  Break_Point_IRQn            = 9,       /* 9 Break Point Interrupt                              */
+  SysTick_IRQn                = 12,      /* 12 System timer Interrupt                            */
+  Software_IRQn               = 14,      /* 14 software Interrupt                                */
+
+ /******  RISC-V specific Interrupt Numbers *********************************************************/
+  WWDG_IRQn                   = 16,      /* Window WatchDog Interrupt                            */
+  PVD_IRQn                    = 17,      /* PVD through EXTI Line detection Interrupt            */
+  TAMPER_IRQn                 = 18,      /* Tamper Interrupt                                     */
+  RTC_IRQn                    = 19,      /* RTC global Interrupt                                 */
+  FLASH_IRQn                  = 20,      /* FLASH global Interrupt                               */
+  RCC_IRQn                    = 21,      /* RCC global Interrupt                                 */
+  EXTI0_IRQn                  = 22,      /* EXTI Line0 Interrupt                                 */
+  EXTI1_IRQn                  = 23,      /* EXTI Line1 Interrupt                                 */
+  EXTI2_IRQn                  = 24,      /* EXTI Line2 Interrupt                                 */
+  EXTI3_IRQn                  = 25,      /* EXTI Line3 Interrupt                                 */
+  EXTI4_IRQn                  = 26,      /* EXTI Line4 Interrupt                                 */
+  DMA1_Channel1_IRQn          = 27,      /* DMA1 Channel 1 global Interrupt                      */
+  DMA1_Channel2_IRQn          = 28,      /* DMA1 Channel 2 global Interrupt                      */
+  DMA1_Channel3_IRQn          = 29,      /* DMA1 Channel 3 global Interrupt                      */
+  DMA1_Channel4_IRQn          = 30,      /* DMA1 Channel 4 global Interrupt                      */
+  DMA1_Channel5_IRQn          = 31,      /* DMA1 Channel 5 global Interrupt                      */
+  DMA1_Channel6_IRQn          = 32,      /* DMA1 Channel 6 global Interrupt                      */
+  DMA1_Channel7_IRQn          = 33,      /* DMA1 Channel 7 global Interrupt                      */
+  ADC_IRQn                    = 34,      /* ADC1 and ADC2 global Interrupt                       */
+  USB_HP_CAN1_TX_IRQn         = 35,      /* USB Device High Priority or CAN1 TX Interrupts       */
+  USB_LP_CAN1_RX0_IRQn        = 36,      /* USB Device Low Priority or CAN1 RX0 Interrupts       */
+  CAN1_RX1_IRQn               = 37,      /* CAN1 RX1 Interrupt                                   */
+  CAN1_SCE_IRQn               = 38,      /* CAN1 SCE Interrupt                                   */
+  EXTI9_5_IRQn                = 39,      /* External Line[9:5] Interrupts                        */
+  TIM1_BRK_IRQn               = 40,      /* TIM1 Break Interrupt                                 */
+  TIM1_UP_IRQn                = 41,      /* TIM1 Update Interrupt                                */
+  TIM1_TRG_COM_IRQn           = 42,      /* TIM1 Trigger and Commutation Interrupt               */
+  TIM1_CC_IRQn                = 43,      /* TIM1 Capture Compare Interrupt                       */
+  TIM2_IRQn                   = 44,      /* TIM2 global Interrupt                                */
+  TIM3_IRQn                   = 45,      /* TIM3 global Interrupt                                */
+  TIM4_IRQn                   = 46,      /* TIM4 global Interrupt                                */
+  I2C1_EV_IRQn                = 47,      /* I2C1 Event Interrupt                                 */
+  I2C1_ER_IRQn                = 48,      /* I2C1 Error Interrupt                                 */
+  I2C2_EV_IRQn                = 49,      /* I2C2 Event Interrupt                                 */
+  I2C2_ER_IRQn                = 50,      /* I2C2 Error Interrupt                                 */
+  SPI1_IRQn                   = 51,      /* SPI1 global Interrupt                                */
+  SPI2_IRQn                   = 52,      /* SPI2 global Interrupt                                */
+  USART1_IRQn                 = 53,      /* USART1 global Interrupt                              */
+  USART2_IRQn                 = 54,      /* USART2 global Interrupt                              */
+  USART3_IRQn                 = 55,      /* USART3 global Interrupt                              */
+  EXTI15_10_IRQn              = 56,      /* External Line[15:10] Interrupts                      */
+  RTCAlarm_IRQn               = 57,      /* RTC Alarm through EXTI Line Interrupt                */
+
+#ifdef CH32V30x_D8
+  TIM8_BRK_IRQn               = 59,      /* TIM8 Break Interrupt                                 */
+  TIM8_UP_IRQn                = 60,      /* TIM8 Update Interrupt                                */
+  TIM8_TRG_COM_IRQn           = 61,      /* TIM8 Trigger and Commutation Interrupt               */
+  TIM8_CC_IRQn                = 62,      /* TIM8 Capture Compare Interrupt                       */
+  RNG_IRQn                    = 63,      /* RNG global Interrupt                                 */
+  SDIO_IRQn                   = 65,      /* SDIO global Interrupt                                */
+  TIM5_IRQn                   = 66,      /* TIM5 global Interrupt                                */
+  SPI3_IRQn                   = 67,      /* SPI3 global Interrupt                                */
+  UART4_IRQn                  = 68,      /* UART4 global Interrupt                               */
+  UART5_IRQn                  = 69,      /* UART5 global Interrupt                               */
+  TIM6_IRQn                   = 70,      /* TIM6 global Interrupt                                */
+  TIM7_IRQn                   = 71,      /* TIM7 global Interrupt                                */
+  DMA2_Channel1_IRQn          = 72,      /* DMA2 Channel 1 global Interrupt                      */
+  DMA2_Channel2_IRQn          = 73,      /* DMA2 Channel 2 global Interrupt                      */
+  DMA2_Channel3_IRQn          = 74,      /* DMA2 Channel 3 global Interrupt                      */
+  DMA2_Channel4_IRQn          = 75,      /* DMA2 Channel 4 global Interrupt                      */
+  DMA2_Channel5_IRQn          = 76,      /* DMA2 Channel 5 global Interrupt                      */
+  USBFS_IRQn                   = 83,      /* USBFS global Interrupt                               */
+  UART6_IRQn                  = 87,      /* UART6 global Interrupt                               */
+  UART7_IRQn                  = 88,      /* UART7 global Interrupt                               */
+  UART8_IRQn                  = 89,      /* UART8 global Interrupt                               */
+  TIM9_BRK_IRQn               = 90,      /* TIM9 Break Interrupt                                 */
+  TIM9_UP_IRQn                = 91,      /* TIM9 Update Interrupt                                */
+  TIM9_TRG_COM_IRQn           = 92,      /* TIM9 Trigger and Commutation Interrupt               */
+  TIM9_CC_IRQn                = 93,      /* TIM9 Capture Compare Interrupt                       */
+  TIM10_BRK_IRQn              = 94,      /* TIM10 Break Interrupt                                */
+  TIM10_UP_IRQn               = 95,      /* TIM10 Update Interrupt                               */
+  TIM10_TRG_COM_IRQn          = 96,      /* TIM10 Trigger and Commutation Interrupt              */
+  TIM10_CC_IRQn               = 97,      /* TIM10 Capture Compare Interrupt                      */
+  DMA2_Channel6_IRQn          = 98,      /* DMA2 Channel 6 global Interrupt                      */
+  DMA2_Channel7_IRQn          = 99,      /* DMA2 Channel 7 global Interrupt                      */
+  DMA2_Channel8_IRQn          = 100,     /* DMA2 Channel 8 global Interrupt                      */
+  DMA2_Channel9_IRQn          = 101,     /* DMA2 Channel 9 global Interrupt                      */
+  DMA2_Channel10_IRQn         = 102,     /* DMA2 Channel 10 global Interrupt                     */
+  DMA2_Channel11_IRQn         = 103,     /* DMA2 Channel 11 global Interrupt                     */
+
+#elif defined  (CH32V30x_D8C)
+  USBWakeUp_IRQn              = 58,      /* USB Device WakeUp from suspend through EXTI Line Interrupt */
+  TIM8_BRK_IRQn               = 59,      /* TIM8 Break Interrupt                                 */
+  TIM8_UP_IRQn                = 60,      /* TIM8 Update Interrupt                                */
+  TIM8_TRG_COM_IRQn           = 61,      /* TIM8 Trigger and Commutation Interrupt               */
+  TIM8_CC_IRQn                = 62,      /* TIM8 Capture Compare Interrupt                       */
+  RNG_IRQn                    = 63,      /* RNG global Interrupt                                 */
+  SDIO_IRQn                   = 65,      /* SDIO global Interrupt                                */
+  TIM5_IRQn                   = 66,      /* TIM5 global Interrupt                                */
+  SPI3_IRQn                   = 67,      /* SPI3 global Interrupt                                */
+  UART4_IRQn                  = 68,      /* UART4 global Interrupt                               */
+  UART5_IRQn                  = 69,      /* UART5 global Interrupt                               */
+  TIM6_IRQn                   = 70,      /* TIM6 global Interrupt                                */
+  TIM7_IRQn                   = 71,      /* TIM7 global Interrupt                                */
+  DMA2_Channel1_IRQn          = 72,      /* DMA2 Channel 1 global Interrupt                      */
+  DMA2_Channel2_IRQn          = 73,      /* DMA2 Channel 2 global Interrupt                      */
+  DMA2_Channel3_IRQn          = 74,      /* DMA2 Channel 3 global Interrupt                      */
+  DMA2_Channel4_IRQn          = 75,      /* DMA2 Channel 4 global Interrupt                      */
+  DMA2_Channel5_IRQn          = 76,      /* DMA2 Channel 5 global Interrupt                      */
+  ETH_IRQn                    = 77,      /* ETH global Interrupt                                 */
+  ETH_WKUP_IRQn               = 78,      /* ETH WakeUp Interrupt                                 */
+  CAN2_TX_IRQn                = 79,      /* CAN2 TX Interrupts                                   */
+  CAN2_RX0_IRQn               = 80,      /* CAN2 RX0 Interrupts                                  */
+  CAN2_RX1_IRQn               = 81,      /* CAN2 RX1 Interrupt                                   */
+  CAN2_SCE_IRQn               = 82,      /* CAN2 SCE Interrupt                                   */
+  USBFS_IRQn                  = 83,      /* USBFS global Interrupt                               */
+  USBHSWakeup_IRQn            = 84,      /* USBHS WakeUp Interrupt                               */
+  USBHS_IRQn                  = 85,      /* USBHS global Interrupt                               */
+  DVP_IRQn                    = 86,      /* DVP global Interrupt                                 */
+  UART6_IRQn                  = 87,      /* UART6 global Interrupt                               */
+  UART7_IRQn                  = 88,      /* UART7 global Interrupt                               */
+  UART8_IRQn                  = 89,      /* UART8 global Interrupt                               */
+  TIM9_BRK_IRQn               = 90,      /* TIM9 Break Interrupt                                 */
+  TIM9_UP_IRQn                = 91,      /* TIM9 Update Interrupt                                */
+  TIM9_TRG_COM_IRQn           = 92,      /* TIM9 Trigger and Commutation Interrupt               */
+  TIM9_CC_IRQn                = 93,      /* TIM9 Capture Compare Interrupt                       */
+  TIM10_BRK_IRQn              = 94,      /* TIM10 Break Interrupt                                */
+  TIM10_UP_IRQn               = 95,      /* TIM10 Update Interrupt                               */
+  TIM10_TRG_COM_IRQn          = 96,      /* TIM10 Trigger and Commutation Interrupt              */
+  TIM10_CC_IRQn               = 97,      /* TIM10 Capture Compare Interrupt                      */
+  DMA2_Channel6_IRQn          = 98,      /* DMA2 Channel 6 global Interrupt                      */
+  DMA2_Channel7_IRQn          = 99,      /* DMA2 Channel 7 global Interrupt                      */
+  DMA2_Channel8_IRQn          = 100,     /* DMA2 Channel 8 global Interrupt                      */
+  DMA2_Channel9_IRQn          = 101,     /* DMA2 Channel 9 global Interrupt                      */
+  DMA2_Channel10_IRQn         = 102,     /* DMA2 Channel 10 global Interrupt                     */
+  DMA2_Channel11_IRQn         = 103,     /* DMA2 Channel 11 global Interrupt                     */
+
+#endif
+} IRQn_Type;
+
+#define HardFault_IRQn      EXC_IRQn
+#define ADC1_2_IRQn         ADC_IRQn
+
+#define SysTicK_IRQn        SysTick_IRQn
+#define OTG_FS_IRQn         USBFS_IRQn
+#define OTG_FS_IRQHandler   USBFS_IRQHandler
+
+#define USBHD_IRQHandler    USBFS_IRQHandler 
+
+#define USBOTG_FS           USBFSD
+#define USBOTG_H_FS         USBFSH
+
+#include <stdint.h>
+#include "core_riscv.h"
+#include "system_ch32v30x.h"
+
+
+/* Standard Peripheral Library old definitions (maintained for legacy purpose) */
+#define HSI_Value            HSI_VALUE 
+#define HSE_Value            HSE_VALUE
+#define HSEStartUp_TimeOut   HSE_STARTUP_TIMEOUT
+
+/* Analog to Digital Converter */
+typedef struct
+{
+  __IO uint32_t STATR;
+  __IO uint32_t CTLR1;
+  __IO uint32_t CTLR2;
+  __IO uint32_t SAMPTR1;
+  __IO uint32_t SAMPTR2;
+  __IO uint32_t IOFR1;
+  __IO uint32_t IOFR2;
+  __IO uint32_t IOFR3;
+  __IO uint32_t IOFR4;
+  __IO uint32_t WDHTR;
+  __IO uint32_t WDLTR;
+  __IO uint32_t RSQR1;
+  __IO uint32_t RSQR2;
+  __IO uint32_t RSQR3;
+  __IO uint32_t ISQR;
+  __IO uint32_t IDATAR1;
+  __IO uint32_t IDATAR2;
+  __IO uint32_t IDATAR3;
+  __IO uint32_t IDATAR4;
+  __IO uint32_t RDATAR;
+  uint32_t  RESERVED0;
+  __IO uint32_t AUX;
+} ADC_TypeDef;
+
+/* Backup Registers */
+typedef struct
+{
+  uint32_t  RESERVED0;
+  __IO uint16_t DATAR1;
+  uint16_t  RESERVED1;
+  __IO uint16_t DATAR2;
+  uint16_t  RESERVED2;
+  __IO uint16_t DATAR3;
+  uint16_t  RESERVED3;
+  __IO uint16_t DATAR4;
+  uint16_t  RESERVED4;
+  __IO uint16_t DATAR5;
+  uint16_t  RESERVED5;
+  __IO uint16_t DATAR6;
+  uint16_t  RESERVED6;
+  __IO uint16_t DATAR7;
+  uint16_t  RESERVED7;
+  __IO uint16_t DATAR8;
+  uint16_t  RESERVED8;
+  __IO uint16_t DATAR9;
+  uint16_t  RESERVED9;
+  __IO uint16_t DATAR10;
+  uint16_t  RESERVED10; 
+  __IO uint16_t OCTLR;
+  uint16_t  RESERVED11;
+  __IO uint16_t TPCTLR;
+  uint16_t  RESERVED12;
+  __IO uint16_t TPCSR;
+  uint16_t  RESERVED13[5];
+  __IO uint16_t DATAR11;
+  uint16_t  RESERVED14;
+  __IO uint16_t DATAR12;
+  uint16_t  RESERVED15;
+  __IO uint16_t DATAR13;
+  uint16_t  RESERVED16;
+  __IO uint16_t DATAR14;
+  uint16_t  RESERVED17;
+  __IO uint16_t DATAR15;
+  uint16_t  RESERVED18;
+  __IO uint16_t DATAR16;
+  uint16_t  RESERVED19;
+  __IO uint16_t DATAR17;
+  uint16_t  RESERVED20;
+  __IO uint16_t DATAR18;
+  uint16_t  RESERVED21;
+  __IO uint16_t DATAR19;
+  uint16_t  RESERVED22;
+  __IO uint16_t DATAR20;
+  uint16_t  RESERVED23;
+  __IO uint16_t DATAR21;
+  uint16_t  RESERVED24;
+  __IO uint16_t DATAR22;
+  uint16_t  RESERVED25;
+  __IO uint16_t DATAR23;
+  uint16_t  RESERVED26;
+  __IO uint16_t DATAR24;
+  uint16_t  RESERVED27;
+  __IO uint16_t DATAR25;
+  uint16_t  RESERVED28;
+  __IO uint16_t DATAR26;
+  uint16_t  RESERVED29;
+  __IO uint16_t DATAR27;
+  uint16_t  RESERVED30;
+  __IO uint16_t DATAR28;
+  uint16_t  RESERVED31;
+  __IO uint16_t DATAR29;
+  uint16_t  RESERVED32;
+  __IO uint16_t DATAR30;
+  uint16_t  RESERVED33; 
+  __IO uint16_t DATAR31;
+  uint16_t  RESERVED34;
+  __IO uint16_t DATAR32;
+  uint16_t  RESERVED35;
+  __IO uint16_t DATAR33;
+  uint16_t  RESERVED36;
+  __IO uint16_t DATAR34;
+  uint16_t  RESERVED37;
+  __IO uint16_t DATAR35;
+  uint16_t  RESERVED38;
+  __IO uint16_t DATAR36;
+  uint16_t  RESERVED39;
+  __IO uint16_t DATAR37;
+  uint16_t  RESERVED40;
+  __IO uint16_t DATAR38;
+  uint16_t  RESERVED41;
+  __IO uint16_t DATAR39;
+  uint16_t  RESERVED42;
+  __IO uint16_t DATAR40;
+  uint16_t  RESERVED43;
+  __IO uint16_t DATAR41;
+  uint16_t  RESERVED44;
+  __IO uint16_t DATAR42;
+  uint16_t  RESERVED45;    
+} BKP_TypeDef;
+
+/* Controller Area Network TxMailBox */
+typedef struct
+{
+  __IO uint32_t TXMIR;
+  __IO uint32_t TXMDTR;
+  __IO uint32_t TXMDLR;
+  __IO uint32_t TXMDHR;
+} CAN_TxMailBox_TypeDef;
+
+/* Controller Area Network FIFOMailBox */ 
+typedef struct
+{
+  __IO uint32_t RXMIR;
+  __IO uint32_t RXMDTR;
+  __IO uint32_t RXMDLR;
+  __IO uint32_t RXMDHR;
+} CAN_FIFOMailBox_TypeDef;
+
+/* Controller Area Network FilterRegister */  
+typedef struct
+{
+  __IO uint32_t FR1;
+  __IO uint32_t FR2;
+} CAN_FilterRegister_TypeDef;
+
+/* Controller Area Network */  
+typedef struct
+{
+  __IO uint32_t CTLR;
+  __IO uint32_t STATR;
+  __IO uint32_t TSTATR;
+  __IO uint32_t RFIFO0;
+  __IO uint32_t RFIFO1;
+  __IO uint32_t INTENR;
+  __IO uint32_t ERRSR;
+  __IO uint32_t BTIMR;
+  uint32_t  RESERVED0[88];
+  CAN_TxMailBox_TypeDef sTxMailBox[3];
+  CAN_FIFOMailBox_TypeDef sFIFOMailBox[2];
+  uint32_t  RESERVED1[12];
+  __IO uint32_t FCTLR;
+  __IO uint32_t FMCFGR;
+  uint32_t  RESERVED2;
+  __IO uint32_t FSCFGR;
+  uint32_t  RESERVED3;
+  __IO uint32_t FAFIFOR;
+  uint32_t  RESERVED4;
+  __IO uint32_t FWR;
+  uint32_t  RESERVED5[8];
+  CAN_FilterRegister_TypeDef sFilterRegister[28];
+} CAN_TypeDef;
+
+/* CRC Calculation Unit */
+typedef struct
+{
+  __IO uint32_t DATAR;
+  __IO uint8_t  IDATAR;
+  uint8_t   RESERVED0;
+  uint16_t  RESERVED1;
+  __IO uint32_t CTLR;
+} CRC_TypeDef;
+
+/* Digital to Analog Converter */
+typedef struct
+{
+  __IO uint32_t CTLR;
+  __IO uint32_t SWTR;
+  __IO uint32_t R12BDHR1;
+  __IO uint32_t L12BDHR1;
+  __IO uint32_t R8BDHR1;
+  __IO uint32_t R12BDHR2;
+  __IO uint32_t L12BDHR2;
+  __IO uint32_t R8BDHR2;
+  __IO uint32_t RD12BDHR;
+  __IO uint32_t LD12BDHR;
+  __IO uint32_t RD8BDHR;
+  __IO uint32_t DOR1;
+  __IO uint32_t DOR2;
+} DAC_TypeDef;
+
+/* DMA Channel Controller */
+typedef struct
+{
+  __IO uint32_t CFGR;
+  __IO uint32_t CNTR;
+  __IO uint32_t PADDR;
+  __IO uint32_t MADDR;
+} DMA_Channel_TypeDef;
+
+/* DMA Controller */
+typedef struct
+{
+  __IO uint32_t INTFR;
+  __IO uint32_t INTFCR;
+} DMA_TypeDef;
+
+/* External Interrupt/Event Controller */
+typedef struct
+{
+  __IO uint32_t INTENR; 
+  __IO uint32_t EVENR;   
+  __IO uint32_t RTENR;   
+  __IO uint32_t FTENR;   
+  __IO uint32_t SWIEVR;  
+  __IO uint32_t INTFR;   
+} EXTI_TypeDef;
+
+/* FLASH Registers */
+typedef struct
+{
+  __IO uint32_t ACTLR;
+  __IO uint32_t KEYR;
+  __IO uint32_t OBKEYR;
+  __IO uint32_t STATR;
+  __IO uint32_t CTLR;
+  __IO uint32_t ADDR;
+  __IO uint32_t RESERVED;
+  __IO uint32_t OBR;
+  __IO uint32_t WPR;
+  __IO uint32_t MODEKEYR;
+} FLASH_TypeDef;
+
+/* Option Bytes Registers */  
+typedef struct
+{
+  __IO uint16_t RDPR;
+  __IO uint16_t USER;
+  __IO uint16_t Data0;
+  __IO uint16_t Data1;
+  __IO uint16_t WRPR0;
+  __IO uint16_t WRPR1;
+  __IO uint16_t WRPR2;
+  __IO uint16_t WRPR3;
+} OB_TypeDef;
+
+/* FSMC Bank1 Registers */ 
+typedef struct
+{
+  __IO uint32_t BTCR[8];
+} FSMC_Bank1_TypeDef;
+
+/* FSMC Bank1E Registers */ 
+typedef struct
+{
+  __IO uint32_t BWTR[7];
+} FSMC_Bank1E_TypeDef;
+
+/* FSMC Bank2 Registers */ 
+typedef struct
+{
+  __IO uint32_t PCR2;
+  __IO uint32_t SR2;
+  __IO uint32_t PMEM2;
+  __IO uint32_t PATT2;
+  uint32_t  RESERVED0;
+  __IO uint32_t ECCR2;
+} FSMC_Bank2_TypeDef;
+
+/* General Purpose I/O */
+typedef struct
+{
+  __IO uint32_t CFGLR;
+  __IO uint32_t CFGHR;
+  __IO uint32_t INDR;
+  __IO uint32_t OUTDR;
+  __IO uint32_t BSHR;
+  __IO uint32_t BCR;
+  __IO uint32_t LCKR;
+} GPIO_TypeDef;
+
+/* Alternate Function I/O */
+typedef struct
+{
+  __IO uint32_t ECR;
+  __IO uint32_t PCFR1;
+  __IO uint32_t EXTICR[4];
+  uint32_t RESERVED0;
+  __IO uint32_t PCFR2;  
+} AFIO_TypeDef;
+
+/* Inter Integrated Circuit Interface */
+typedef struct
+{
+  __IO uint16_t CTLR1;
+  uint16_t  RESERVED0;
+  __IO uint16_t CTLR2;
+  uint16_t  RESERVED1;
+  __IO uint16_t OADDR1;
+  uint16_t  RESERVED2;
+  __IO uint16_t OADDR2;
+  uint16_t  RESERVED3;
+  __IO uint16_t DATAR;
+  uint16_t  RESERVED4;
+  __IO uint16_t STAR1;
+  uint16_t  RESERVED5;
+  __IO uint16_t STAR2;
+  uint16_t  RESERVED6;
+  __IO uint16_t CKCFGR;
+  uint16_t  RESERVED7;
+  __IO uint16_t RTR;
+  uint16_t  RESERVED8;
+} I2C_TypeDef;
+
+/* Independent WatchDog */
+typedef struct
+{
+  __IO uint32_t CTLR;
+  __IO uint32_t PSCR;
+  __IO uint32_t RLDR;
+  __IO uint32_t STATR;
+} IWDG_TypeDef;
+
+/* Power Control */
+typedef struct
+{
+  __IO uint32_t CTLR;
+  __IO uint32_t CSR;
+} PWR_TypeDef;
+
+/* Reset and Clock Control */
+typedef struct
+{
+  __IO uint32_t CTLR;
+  __IO uint32_t CFGR0;
+  __IO uint32_t INTR;
+  __IO uint32_t APB2PRSTR;
+  __IO uint32_t APB1PRSTR;
+  __IO uint32_t AHBPCENR;
+  __IO uint32_t APB2PCENR;
+  __IO uint32_t APB1PCENR;
+  __IO uint32_t BDCTLR;
+  __IO uint32_t RSTSCKR;
+  __IO uint32_t AHBRSTR;
+  __IO uint32_t CFGR2;
+} RCC_TypeDef;
+
+/* Real-Time Clock */
+typedef struct
+{
+  __IO uint16_t CTLRH;
+  uint16_t  RESERVED0;
+  __IO uint16_t CTLRL;
+  uint16_t  RESERVED1;
+  __IO uint16_t PSCRH;
+  uint16_t  RESERVED2;
+  __IO uint16_t PSCRL;
+  uint16_t  RESERVED3;
+  __IO uint16_t DIVH;
+  uint16_t  RESERVED4;
+  __IO uint16_t DIVL;
+  uint16_t  RESERVED5;
+  __IO uint16_t CNTH;
+  uint16_t  RESERVED6;
+  __IO uint16_t CNTL;
+  uint16_t  RESERVED7;
+  __IO uint16_t ALRMH;
+  uint16_t  RESERVED8;
+  __IO uint16_t ALRML;
+  uint16_t  RESERVED9;
+} RTC_TypeDef;
+
+/* SDIO Registers */ 
+typedef struct
+{
+  __IO uint32_t POWER;
+  __IO uint32_t CLKCR;
+  __IO uint32_t ARG;
+  __IO uint32_t CMD;
+  __I uint32_t RESPCMD;
+  __I uint32_t RESP1;
+  __I uint32_t RESP2;
+  __I uint32_t RESP3;
+  __I uint32_t RESP4;
+  __IO uint32_t DTIMER;
+  __IO uint32_t DLEN;
+  __IO uint32_t DCTRL;
+  __I uint32_t DCOUNT;
+  __I uint32_t STA;
+  __IO uint32_t ICR;
+  __IO uint32_t MASK;
+  uint32_t  RESERVED0[2];
+  __I uint32_t FIFOCNT;
+  uint32_t  RESERVED1[5];
+  __IO uint32_t DCTRL2;
+  uint32_t  RESERVED2[7];
+  __IO uint32_t FIFO;
+} SDIO_TypeDef;
+
+/* Serial Peripheral Interface */
+typedef struct
+{
+  __IO uint16_t CTLR1;
+  uint16_t  RESERVED0;
+  __IO uint16_t CTLR2;
+  uint16_t  RESERVED1;
+  __IO uint16_t STATR;
+  uint16_t  RESERVED2;
+  __IO uint16_t DATAR;
+  uint16_t  RESERVED3;
+  __IO uint16_t CRCR;
+  uint16_t  RESERVED4;
+  __IO uint16_t RCRCR;
+  uint16_t  RESERVED5;
+  __IO uint16_t TCRCR;
+  uint16_t  RESERVED6;
+  __IO uint16_t I2SCFGR;
+  uint16_t  RESERVED7;
+  __IO uint16_t I2SPR;
+  uint16_t  RESERVED8;
+  __IO uint16_t HSCR;
+  uint16_t  RESERVED9;
+} SPI_TypeDef;
+
+/* TIM */
+typedef struct
+{
+  __IO uint16_t CTLR1;
+  uint16_t  RESERVED0;
+  __IO uint16_t CTLR2;
+  uint16_t  RESERVED1;
+  __IO uint16_t SMCFGR;
+  uint16_t  RESERVED2;
+  __IO uint16_t DMAINTENR;
+  uint16_t  RESERVED3;
+  __IO uint16_t INTFR;
+  uint16_t  RESERVED4;
+  __IO uint16_t SWEVGR;
+  uint16_t  RESERVED5;
+  __IO uint16_t CHCTLR1;
+  uint16_t  RESERVED6;
+  __IO uint16_t CHCTLR2;
+  uint16_t  RESERVED7;
+  __IO uint16_t CCER;
+  uint16_t  RESERVED8;
+  __IO uint16_t CNT;
+  uint16_t  RESERVED9;
+  __IO uint16_t PSC;
+  uint16_t  RESERVED10;
+  __IO uint16_t ATRLR;
+  uint16_t  RESERVED11;
+  __IO uint16_t RPTCR;
+  uint16_t  RESERVED12;
+  __IO uint16_t CH1CVR;
+  uint16_t  RESERVED13;
+  __IO uint16_t CH2CVR;
+  uint16_t  RESERVED14;
+  __IO uint16_t CH3CVR;
+  uint16_t  RESERVED15;
+  __IO uint16_t CH4CVR;
+  uint16_t  RESERVED16;
+  __IO uint16_t BDTR;
+  uint16_t  RESERVED17;
+  __IO uint16_t DMACFGR;
+  uint16_t  RESERVED18;
+  __IO uint16_t DMAADR;
+  uint16_t  RESERVED19;
+  __IO uint16_t AUX;
+  uint16_t  RESERVED20;
+} TIM_TypeDef;
+
+/* Universal Synchronous Asynchronous Receiver Transmitter */
+typedef struct
+{
+  __IO uint16_t STATR;
+  uint16_t  RESERVED0;
+  __IO uint16_t DATAR;
+  uint16_t  RESERVED1;
+  __IO uint16_t BRR;
+  uint16_t  RESERVED2;
+  __IO uint16_t CTLR1;
+  uint16_t  RESERVED3;
+  __IO uint16_t CTLR2;
+  uint16_t  RESERVED4;
+  __IO uint16_t CTLR3;
+  uint16_t  RESERVED5;
+  __IO uint16_t GPR;
+  uint16_t  RESERVED6;
+  __IO uint16_t CTLR4;
+  uint16_t  RESERVED7;
+} USART_TypeDef;
+
+/* Window WatchDog */
+typedef struct
+{
+  __IO uint32_t CTLR;
+  __IO uint32_t CFGR;
+  __IO uint32_t STATR;
+} WWDG_TypeDef;
+
+/* Enhanced Registers */
+typedef struct
+{
+  __IO uint32_t EXTEN_CTR;
+  uint32_t  RESERVED0;
+  __IO uint32_t EXTEN_CTR2;
+} EXTEN_TypeDef;
+
+/* OPA Registers */
+typedef struct
+{
+  __IO uint32_t CR;
+} OPA_TypeDef;
+
+/* RNG Registers */
+typedef struct
+{
+  __IO uint32_t CR;
+  __IO uint32_t SR;
+  __IO uint32_t DR;
+} RNG_TypeDef;
+
+/* DVP Registers */
+typedef struct
+{
+  __IO uint8_t CR0;
+  __IO uint8_t CR1;
+  __IO uint8_t IER;
+  __IO uint8_t Reserved0;        
+  __IO uint16_t ROW_NUM;
+  __IO uint16_t COL_NUM;
+  __IO uint32_t DMA_BUF0;
+  __IO uint32_t DMA_BUF1;
+  __IO uint8_t IFR;
+  __IO uint8_t STATUS;
+  __IO uint16_t Reserved1;            
+  __IO uint16_t ROW_CNT;
+  __IO uint16_t Reserved2;           
+  __IO uint16_t HOFFCNT;
+  __IO uint16_t VST;
+  __IO uint16_t CAPCNT;
+  __IO uint16_t VLINE;
+  __IO uint32_t DR;
+} DVP_TypeDef;
+
+/* USBHS Registers */
+typedef struct
+{
+  __IO uint8_t  CONTROL;
+  __IO uint8_t  HOST_CTRL;
+  __IO uint8_t  INT_EN;
+  __IO uint8_t  DEV_AD;
+  __IO uint16_t FRAME_NO;
+  __IO uint8_t  SUSPEND;
+  __IO uint8_t  RESERVED0;
+  __IO uint8_t  SPEED_TYPE;
+  __IO uint8_t  MIS_ST;
+  __IO uint8_t  INT_FG;
+  __IO uint8_t  INT_ST;
+  __IO uint16_t RX_LEN;
+  __IO uint16_t RESERVED1;
+  __IO uint32_t ENDP_CONFIG;
+  __IO uint32_t ENDP_TYPE;
+  __IO uint32_t BUF_MODE;
+  __IO uint32_t UEP0_DMA;               
+  __IO uint32_t UEP1_RX_DMA;       
+  __IO uint32_t UEP2_RX_DMA;       
+  __IO uint32_t UEP3_RX_DMA;       
+  __IO uint32_t UEP4_RX_DMA;       
+  __IO uint32_t UEP5_RX_DMA;       
+  __IO uint32_t UEP6_RX_DMA;       
+  __IO uint32_t UEP7_RX_DMA;       
+  __IO uint32_t UEP8_RX_DMA;      
+  __IO uint32_t UEP9_RX_DMA;       
+  __IO uint32_t UEP10_RX_DMA;      
+  __IO uint32_t UEP11_RX_DMA;      
+  __IO uint32_t UEP12_RX_DMA;      
+  __IO uint32_t UEP13_RX_DMA;      
+  __IO uint32_t UEP14_RX_DMA;      
+  __IO uint32_t UEP15_RX_DMA;      
+  __IO uint32_t UEP1_TX_DMA;       
+  __IO uint32_t UEP2_TX_DMA;       
+  __IO uint32_t UEP3_TX_DMA;       
+  __IO uint32_t UEP4_TX_DMA;       
+  __IO uint32_t UEP5_TX_DMA;      
+  __IO uint32_t UEP6_TX_DMA;      
+  __IO uint32_t UEP7_TX_DMA;       
+  __IO uint32_t UEP8_TX_DMA;      
+  __IO uint32_t UEP9_TX_DMA;       
+  __IO uint32_t UEP10_TX_DMA;      
+  __IO uint32_t UEP11_TX_DMA;      
+  __IO uint32_t UEP12_TX_DMA;    
+  __IO uint32_t UEP13_TX_DMA;      
+  __IO uint32_t UEP14_TX_DMA;     
+  __IO uint32_t UEP15_TX_DMA;      
+  __IO uint16_t UEP0_MAX_LEN;
+  __IO uint16_t RESERVED2;
+  __IO uint16_t UEP1_MAX_LEN;
+  __IO uint16_t RESERVED3;
+  __IO uint16_t UEP2_MAX_LEN;
+  __IO uint16_t RESERVED4;
+  __IO uint16_t UEP3_MAX_LEN;
+  __IO uint16_t RESERVED5;
+  __IO uint16_t UEP4_MAX_LEN;
+  __IO uint16_t RESERVED6;
+  __IO uint16_t UEP5_MAX_LEN;
+  __IO uint16_t RESERVED7;
+  __IO uint16_t UEP6_MAX_LEN;
+  __IO uint16_t RESERVED8;
+  __IO uint16_t UEP7_MAX_LEN;
+  __IO uint16_t RESERVED9;
+  __IO uint16_t UEP8_MAX_LEN;
+  __IO uint16_t RESERVED10;
+  __IO uint16_t UEP9_MAX_LEN;
+  __IO uint16_t RESERVED11;
+  __IO uint16_t UEP10_MAX_LEN;
+  __IO uint16_t RESERVED12;
+  __IO uint16_t UEP11_MAX_LEN;
+  __IO uint16_t RESERVED13;
+  __IO uint16_t UEP12_MAX_LEN;
+  __IO uint16_t RESERVED14;
+  __IO uint16_t UEP13_MAX_LEN;
+  __IO uint16_t RESERVED15;
+  __IO uint16_t UEP14_MAX_LEN;
+  __IO uint16_t RESERVED16;
+  __IO uint16_t UEP15_MAX_LEN;
+  __IO uint16_t RESERVED17;
+  __IO uint16_t UEP0_TX_LEN;
+  __IO uint8_t  UEP0_TX_CTRL;
+  __IO uint8_t  UEP0_RX_CTRL;
+  __IO uint16_t UEP1_TX_LEN;
+  __IO uint8_t  UEP1_TX_CTRL;
+  __IO uint8_t  UEP1_RX_CTRL;
+  __IO uint16_t UEP2_TX_LEN;
+  __IO uint8_t  UEP2_TX_CTRL;
+  __IO uint8_t  UEP2_RX_CTRL;
+  __IO uint16_t UEP3_TX_LEN;
+  __IO uint8_t  UEP3_TX_CTRL;
+  __IO uint8_t  UEP3_RX_CTRL;
+  __IO uint16_t UEP4_TX_LEN;
+  __IO uint8_t  UEP4_TX_CTRL;
+  __IO uint8_t  UEP4_RX_CTRL;
+  __IO uint16_t UEP5_TX_LEN;
+  __IO uint8_t  UEP5_TX_CTRL;
+  __IO uint8_t  UEP5_RX_CTRL;
+  __IO uint16_t UEP6_TX_LEN;
+  __IO uint8_t  UEP6_TX_CTRL;
+  __IO uint8_t  UEP6_RX_CTRL;
+  __IO uint16_t UEP7_TX_LEN;
+  __IO uint8_t  UEP7_TX_CTRL;
+  __IO uint8_t  UEP7_RX_CTRL;
+  __IO uint16_t UEP8_TX_LEN;
+  __IO uint8_t  UEP8_TX_CTRL;
+  __IO uint8_t  UEP8_RX_CTRL;
+  __IO uint16_t UEP9_TX_LEN;
+  __IO uint8_t  UEP9_TX_CTRL;
+  __IO uint8_t  UEP9_RX_CTRL;
+  __IO uint16_t UEP10_TX_LEN;
+  __IO uint8_t  UEP10_TX_CTRL;
+  __IO uint8_t  UEP10_RX_CTRL;
+  __IO uint16_t UEP11_TX_LEN;
+  __IO uint8_t  UEP11_TX_CTRL;
+  __IO uint8_t  UEP11_RX_CTRL;
+  __IO uint16_t UEP12_TX_LEN;
+  __IO uint8_t  UEP12_TX_CTRL;
+  __IO uint8_t  UEP12_RX_CTRL;
+  __IO uint16_t UEP13_TX_LEN;
+  __IO uint8_t  UEP13_TX_CTRL;
+  __IO uint8_t  UEP13_RX_CTRL;
+  __IO uint16_t UEP14_TX_LEN;
+  __IO uint8_t  UEP14_TX_CTRL;
+  __IO uint8_t  UEP14_RX_CTRL;
+  __IO uint16_t UEP15_TX_LEN;
+  __IO uint8_t  UEP15_TX_CTRL;
+  __IO uint8_t  UEP15_RX_CTRL;
+} USBHSD_TypeDef;
+
+typedef struct  __attribute__((packed))
+{
+    __IO uint8_t  CONTROL;
+    __IO uint8_t  HOST_CTRL;
+    __IO uint8_t  INT_EN;
+    __IO uint8_t  DEV_AD;
+    __IO uint16_t FRAME_NO;
+    __IO uint8_t  SUSPEND;
+    __IO uint8_t  RESERVED0;
+    __IO uint8_t  SPEED_TYPE;
+    __IO uint8_t  MIS_ST;
+    __IO uint8_t  INT_FG;
+    __IO uint8_t  INT_ST;
+    __IO uint16_t RX_LEN;
+    __IO uint16_t RESERVED1;
+    __IO uint32_t HOST_EP_CONFIG;
+    __IO uint32_t HOST_EP_TYPE;
+    __IO uint32_t RESERVED2;
+    __IO uint32_t RESERVED3;
+    __IO uint32_t RESERVED4;
+    __IO uint32_t HOST_RX_DMA;
+    __IO uint32_t RESERVED5;
+    __IO uint32_t RESERVED6;
+    __IO uint32_t RESERVED7;
+    __IO uint32_t RESERVED8;
+    __IO uint32_t RESERVED9;
+    __IO uint32_t RESERVED10;
+    __IO uint32_t RESERVED11;
+    __IO uint32_t RESERVED12;
+    __IO uint32_t RESERVED13;
+    __IO uint32_t RESERVED14;
+    __IO uint32_t RESERVED15;
+    __IO uint32_t RESERVED16;
+    __IO uint32_t RESERVED17;
+    __IO uint32_t RESERVED18;
+    __IO uint32_t RESERVED19;
+    __IO uint32_t HOST_TX_DMA;
+    __IO uint32_t RESERVED20;
+    __IO uint32_t RESERVED21;
+    __IO uint32_t RESERVED22;
+    __IO uint32_t RESERVED23;
+    __IO uint32_t RESERVED24;
+    __IO uint32_t RESERVED25;
+    __IO uint32_t RESERVED26;
+    __IO uint32_t RESERVED27;
+    __IO uint32_t RESERVED28;
+    __IO uint32_t RESERVED29;
+    __IO uint32_t RESERVED30;
+    __IO uint32_t RESERVED31;
+    __IO uint32_t RESERVED32;
+    __IO uint32_t RESERVED33;
+    __IO uint16_t HOST_RX_MAX_LEN;
+    __IO uint16_t RESERVED34;
+    __IO uint32_t RESERVED35;
+    __IO uint32_t RESERVED36;
+    __IO uint32_t RESERVED37;
+    __IO uint32_t RESERVED38;
+    __IO uint32_t RESERVED39;
+    __IO uint32_t RESERVED40;
+    __IO uint32_t RESERVED41;
+    __IO uint32_t RESERVED42;
+    __IO uint32_t RESERVED43;
+    __IO uint32_t RESERVED44;
+    __IO uint32_t RESERVED45;
+    __IO uint32_t RESERVED46;
+    __IO uint32_t RESERVED47;
+    __IO uint32_t RESERVED48;
+    __IO uint32_t RESERVED49;
+    __IO uint8_t  HOST_EP_PID;
+    __IO uint8_t  RESERVED50;
+    __IO uint8_t  RESERVED51;
+    __IO uint8_t  HOST_RX_CTRL;
+    __IO uint16_t HOST_TX_LEN;
+    __IO uint8_t  HOST_TX_CTRL;
+    __IO uint8_t  RESERVED52;
+    __IO uint16_t HOST_SPLIT_DATA;
+} USBHSH_TypeDef;
+
+
+/* USBOTG_FS Registers */
+typedef struct
+{
+   __IO uint8_t  BASE_CTRL;
+   __IO uint8_t  UDEV_CTRL;
+   __IO uint8_t  INT_EN;
+   __IO uint8_t  DEV_ADDR;
+   __IO uint8_t  Reserve0;
+   __IO uint8_t  MIS_ST;
+   __IO uint8_t  INT_FG;
+   __IO uint8_t  INT_ST;
+   __IO uint16_t RX_LEN;
+   __IO uint16_t Reserve1;
+   __IO uint8_t  UEP4_1_MOD;
+   __IO uint8_t  UEP2_3_MOD;
+   __IO uint8_t  UEP5_6_MOD;
+   __IO uint8_t  UEP7_MOD;
+   __IO uint32_t UEP0_DMA;
+   __IO uint32_t UEP1_DMA;
+   __IO uint32_t UEP2_DMA;
+   __IO uint32_t UEP3_DMA;
+   __IO uint32_t UEP4_DMA;
+   __IO uint32_t UEP5_DMA;
+   __IO uint32_t UEP6_DMA;
+   __IO uint32_t UEP7_DMA;
+   __IO uint16_t UEP0_TX_LEN;
+   __IO uint8_t  UEP0_TX_CTRL;
+   __IO uint8_t  UEP0_RX_CTRL;
+   __IO uint16_t UEP1_TX_LEN;
+   __IO uint8_t  UEP1_TX_CTRL;
+   __IO uint8_t  UEP1_RX_CTRL;
+   __IO uint16_t UEP2_TX_LEN;
+   __IO uint8_t  UEP2_TX_CTRL;
+   __IO uint8_t  UEP2_RX_CTRL;
+   __IO uint16_t UEP3_TX_LEN;
+   __IO uint8_t  UEP3_TX_CTRL;
+   __IO uint8_t  UEP3_RX_CTRL;
+   __IO uint16_t UEP4_TX_LEN;
+   __IO uint8_t  UEP4_TX_CTRL;
+   __IO uint8_t  UEP4_RX_CTRL;
+   __IO uint16_t UEP5_TX_LEN;
+   __IO uint8_t  UEP5_TX_CTRL;
+   __IO uint8_t  UEP5_RX_CTRL;
+   __IO uint16_t UEP6_TX_LEN;
+   __IO uint8_t  UEP6_TX_CTRL;
+   __IO uint8_t  UEP6_RX_CTRL;
+   __IO uint16_t UEP7_TX_LEN;
+   __IO uint8_t  UEP7_TX_CTRL;
+   __IO uint8_t  UEP7_RX_CTRL;
+   __IO uint32_t Reserve2;
+   __IO uint32_t OTG_CR;
+   __IO uint32_t OTG_SR;
+}USBFSD_TypeDef;
+
+typedef struct  __attribute__((packed))
+{
+   __IO uint8_t   BASE_CTRL;
+   __IO uint8_t   HOST_CTRL;
+   __IO uint8_t   INT_EN;
+   __IO uint8_t   DEV_ADDR;
+   __IO uint8_t   Reserve0;
+   __IO uint8_t   MIS_ST;
+   __IO uint8_t   INT_FG;
+   __IO uint8_t   INT_ST;
+   __IO uint16_t  RX_LEN;
+   __IO uint16_t  Reserve1;
+   __IO uint8_t   Reserve2;
+   __IO uint8_t   HOST_EP_MOD;
+   __IO uint16_t  Reserve3;
+   __IO uint32_t  Reserve4;
+   __IO uint32_t  Reserve5;
+   __IO uint32_t  HOST_RX_DMA;
+   __IO uint32_t  HOST_TX_DMA;
+   __IO uint32_t  Reserve6;
+   __IO uint32_t  Reserve7;
+   __IO uint32_t  Reserve8;
+   __IO uint32_t  Reserve9;
+   __IO uint32_t  Reserve10;
+   __IO uint16_t  Reserve11;
+   __IO uint16_t  HOST_SETUP;
+   __IO uint8_t   HOST_EP_PID;
+   __IO uint8_t   Reserve12;
+   __IO uint8_t   Reserve13;
+   __IO uint8_t   HOST_RX_CTRL;
+   __IO uint16_t  HOST_TX_LEN;
+   __IO uint8_t   HOST_TX_CTRL;
+   __IO uint8_t   Reserve14;
+   __IO uint32_t  Reserve15;
+   __IO uint32_t  Reserve16;
+   __IO uint32_t  Reserve17;
+   __IO uint32_t  Reserve18;
+   __IO uint32_t  Reserve19;
+   __IO uint32_t  OTG_CR;
+   __IO uint32_t  OTG_SR;
+}USBFSH_TypeDef;
+
+/* Ethernet MAC */
+typedef struct
+{
+  __IO uint32_t MACCR;
+  __IO uint32_t MACFFR;
+  __IO uint32_t MACHTHR;
+  __IO uint32_t MACHTLR;
+  __IO uint32_t MACMIIAR;
+  __IO uint32_t MACMIIDR;
+  __IO uint32_t MACFCR;
+  __IO uint32_t MACVLANTR;
+       uint32_t RESERVED0[2];
+  __IO uint32_t MACRWUFFR;
+  __IO uint32_t MACPMTCSR;
+       uint32_t RESERVED1[2];
+  __IO uint32_t MACSR;
+  __IO uint32_t MACIMR;
+  __IO uint32_t MACA0HR;
+  __IO uint32_t MACA0LR;
+  __IO uint32_t MACA1HR;
+  __IO uint32_t MACA1LR;
+  __IO uint32_t MACA2HR;
+  __IO uint32_t MACA2LR;
+  __IO uint32_t MACA3HR;
+  __IO uint32_t MACA3LR;
+       uint32_t RESERVED2[14];
+  __IO uint32_t MACCFG0;
+       uint32_t RESERVED10[25];
+  __IO uint32_t MMCCR;
+  __IO uint32_t MMCRIR;
+  __IO uint32_t MMCTIR;
+  __IO uint32_t MMCRIMR;
+  __IO uint32_t MMCTIMR;
+       uint32_t RESERVED3[14];
+  __IO uint32_t MMCTGFSCCR;
+  __IO uint32_t MMCTGFMSCCR;
+       uint32_t RESERVED4[5];
+  __IO uint32_t MMCTGFCR;
+       uint32_t RESERVED5[10];
+  __IO uint32_t MMCRFCECR;
+  __IO uint32_t MMCRFAECR;
+       uint32_t RESERVED6[10];
+  __IO uint32_t MMCRGUFCR;
+       uint32_t RESERVED7[334];
+  __IO uint32_t PTPTSCR;
+  __IO uint32_t PTPSSIR;
+  __IO uint32_t PTPTSHR;
+  __IO uint32_t PTPTSLR;
+  __IO uint32_t PTPTSHUR;
+  __IO uint32_t PTPTSLUR;
+  __IO uint32_t PTPTSAR;
+  __IO uint32_t PTPTTHR;
+  __IO uint32_t PTPTTLR;
+       uint32_t RESERVED8[567];
+  __IO uint32_t DMABMR;
+  __IO uint32_t DMATPDR;
+  __IO uint32_t DMARPDR;
+  __IO uint32_t DMARDLAR;
+  __IO uint32_t DMATDLAR;
+  __IO uint32_t DMASR;
+  __IO uint32_t DMAOMR;
+  __IO uint32_t DMAIER;
+  __IO uint32_t DMAMFBOCR;
+       uint32_t RESERVED9[9];
+  __IO uint32_t DMACHTDR;
+  __IO uint32_t DMACHRDR;
+  __IO uint32_t DMACHTBAR;
+  __IO uint32_t DMACHRBAR;
+} ETH_TypeDef;
+
+
+
+/* Peripheral memory map */
+#define FLASH_BASE            ((uint32_t)0x08000000) /* FLASH base address in the alias region */
+#define SRAM_BASE             ((uint32_t)0x20000000) /* SRAM base address in the alias region */
+#define PERIPH_BASE           ((uint32_t)0x40000000) /* Peripheral base address in the alias region */
+
+#define FSMC_R_BASE           ((uint32_t)0xA0000000) /* FSMC registers base address */
+
+
+#define APB1PERIPH_BASE       (PERIPH_BASE)
+#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
+#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
+
+#define TIM2_BASE             (APB1PERIPH_BASE + 0x0000)
+#define TIM3_BASE             (APB1PERIPH_BASE + 0x0400)
+#define TIM4_BASE             (APB1PERIPH_BASE + 0x0800)
+#define TIM5_BASE             (APB1PERIPH_BASE + 0x0C00)
+#define TIM6_BASE             (APB1PERIPH_BASE + 0x1000)
+#define TIM7_BASE             (APB1PERIPH_BASE + 0x1400)
+#define UART6_BASE            (APB1PERIPH_BASE + 0x1800)
+#define UART7_BASE            (APB1PERIPH_BASE + 0x1C00)
+#define UART8_BASE            (APB1PERIPH_BASE + 0x2000)
+#define RTC_BASE              (APB1PERIPH_BASE + 0x2800)
+#define WWDG_BASE             (APB1PERIPH_BASE + 0x2C00)
+#define IWDG_BASE             (APB1PERIPH_BASE + 0x3000)
+#define SPI2_BASE             (APB1PERIPH_BASE + 0x3800)
+#define SPI3_BASE             (APB1PERIPH_BASE + 0x3C00)
+#define USART2_BASE           (APB1PERIPH_BASE + 0x4400)
+#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)
+#define UART4_BASE            (APB1PERIPH_BASE + 0x4C00)
+#define UART5_BASE            (APB1PERIPH_BASE + 0x5000)
+#define I2C1_BASE             (APB1PERIPH_BASE + 0x5400)
+#define I2C2_BASE             (APB1PERIPH_BASE + 0x5800)
+#define CAN1_BASE             (APB1PERIPH_BASE + 0x6400)
+#define CAN2_BASE             (APB1PERIPH_BASE + 0x6800)
+#define BKP_BASE              (APB1PERIPH_BASE + 0x6C00)
+#define PWR_BASE              (APB1PERIPH_BASE + 0x7000)
+#define DAC_BASE              (APB1PERIPH_BASE + 0x7400)
+
+#define AFIO_BASE             (APB2PERIPH_BASE + 0x0000)
+#define EXTI_BASE             (APB2PERIPH_BASE + 0x0400)
+#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
+#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
+#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
+#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
+#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
+#define ADC1_BASE             (APB2PERIPH_BASE + 0x2400)
+#define ADC2_BASE             (APB2PERIPH_BASE + 0x2800)
+#define TIM1_BASE             (APB2PERIPH_BASE + 0x2C00)
+#define SPI1_BASE             (APB2PERIPH_BASE + 0x3000)
+#define TIM8_BASE             (APB2PERIPH_BASE + 0x3400)
+#define USART1_BASE           (APB2PERIPH_BASE + 0x3800)
+#define ADC3_BASE             (APB2PERIPH_BASE + 0x3C00)
+#define TIM9_BASE             (APB2PERIPH_BASE + 0x4C00)
+#define TIM10_BASE            (APB2PERIPH_BASE + 0x5000)
+#define SDIO_BASE             (APB2PERIPH_BASE + 0x8000)
+
+#define DMA1_BASE             (AHBPERIPH_BASE + 0x0000)
+#define DMA1_Channel1_BASE    (AHBPERIPH_BASE + 0x0008)
+#define DMA1_Channel2_BASE    (AHBPERIPH_BASE + 0x001C)
+#define DMA1_Channel3_BASE    (AHBPERIPH_BASE + 0x0030)
+#define DMA1_Channel4_BASE    (AHBPERIPH_BASE + 0x0044)
+#define DMA1_Channel5_BASE    (AHBPERIPH_BASE + 0x0058)
+#define DMA1_Channel6_BASE    (AHBPERIPH_BASE + 0x006C)
+#define DMA1_Channel7_BASE    (AHBPERIPH_BASE + 0x0080)
+#define DMA2_BASE             (AHBPERIPH_BASE + 0x0400)
+#define DMA2_Channel1_BASE    (AHBPERIPH_BASE + 0x0408)
+#define DMA2_Channel2_BASE    (AHBPERIPH_BASE + 0x041C)
+#define DMA2_Channel3_BASE    (AHBPERIPH_BASE + 0x0430)
+#define DMA2_Channel4_BASE    (AHBPERIPH_BASE + 0x0444)
+#define DMA2_Channel5_BASE    (AHBPERIPH_BASE + 0x0458)
+#define DMA2_Channel6_BASE    (AHBPERIPH_BASE + 0x046C)
+#define DMA2_Channel7_BASE    (AHBPERIPH_BASE + 0x0480)
+#define DMA2_Channel8_BASE    (AHBPERIPH_BASE + 0x0490)
+#define DMA2_Channel9_BASE    (AHBPERIPH_BASE + 0x04A0)
+#define DMA2_Channel10_BASE   (AHBPERIPH_BASE + 0x04B0)
+#define DMA2_Channel11_BASE   (AHBPERIPH_BASE + 0x04C0)
+#define DMA2_EXTEN_BASE       (AHBPERIPH_BASE + 0x04D0)
+#define RCC_BASE              (AHBPERIPH_BASE + 0x1000)
+#define FLASH_R_BASE          (AHBPERIPH_BASE + 0x2000)
+#define CRC_BASE              (AHBPERIPH_BASE + 0x3000)
+#define USBHS_BASE            (AHBPERIPH_BASE + 0x3400)
+#define EXTEN_BASE            (AHBPERIPH_BASE + 0x3800)
+#define OPA_BASE              (AHBPERIPH_BASE + 0x3804)
+#define RNG_BASE              (AHBPERIPH_BASE + 0x3C00)
+
+#define ETH_BASE              (AHBPERIPH_BASE + 0x8000)
+#define ETH_MAC_BASE          (ETH_BASE)
+#define ETH_MMC_BASE          (ETH_BASE + 0x0100)
+#define ETH_PTP_BASE          (ETH_BASE + 0x0700)
+#define ETH_DMA_BASE          (ETH_BASE + 0x1000)
+
+#define USBFS_BASE            ((uint32_t)0x50000000)
+#define DVP_BASE              ((uint32_t)0x50050000)
+
+#define FSMC_Bank1_R_BASE     (FSMC_R_BASE + 0x0000) 
+#define FSMC_Bank1E_R_BASE    (FSMC_R_BASE + 0x0104) 
+#define FSMC_Bank2_R_BASE     (FSMC_R_BASE + 0x0060) 
+
+#define OB_BASE               ((uint32_t)0x1FFFF800)
+#define FEATURE_SIGN          ((uint32_t)0x1FFFF7D0)
+
+/* Peripheral declaration */
+#define TIM2                ((TIM_TypeDef *) TIM2_BASE)
+#define TIM3                ((TIM_TypeDef *) TIM3_BASE)
+#define TIM4                ((TIM_TypeDef *) TIM4_BASE)
+#define TIM5                ((TIM_TypeDef *) TIM5_BASE)
+#define TIM6                ((TIM_TypeDef *) TIM6_BASE)
+#define TIM7                ((TIM_TypeDef *) TIM7_BASE)
+#define UART6               ((USART_TypeDef *) UART6_BASE)
+#define UART7               ((USART_TypeDef *) UART7_BASE)
+#define UART8               ((USART_TypeDef *) UART8_BASE)
+#define RTC                 ((RTC_TypeDef *) RTC_BASE)
+#define WWDG                ((WWDG_TypeDef *) WWDG_BASE)
+#define IWDG                ((IWDG_TypeDef *) IWDG_BASE)
+#define SPI2                ((SPI_TypeDef *) SPI2_BASE)
+#define SPI3                ((SPI_TypeDef *) SPI3_BASE)
+#define USART2              ((USART_TypeDef *) USART2_BASE)
+#define USART3              ((USART_TypeDef *) USART3_BASE)
+#define UART4               ((USART_TypeDef *) UART4_BASE)
+#define UART5               ((USART_TypeDef *) UART5_BASE)
+#define I2C1                ((I2C_TypeDef *) I2C1_BASE)
+#define I2C2                ((I2C_TypeDef *) I2C2_BASE)
+#define CAN1                ((CAN_TypeDef *) CAN1_BASE)
+#define CAN2                ((CAN_TypeDef *) CAN2_BASE)
+#define BKP                 ((BKP_TypeDef *) BKP_BASE)
+#define PWR                 ((PWR_TypeDef *) PWR_BASE)
+#define DAC                 ((DAC_TypeDef *) DAC_BASE)
+
+#define AFIO                ((AFIO_TypeDef *) AFIO_BASE)
+#define EXTI                ((EXTI_TypeDef *) EXTI_BASE)
+#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
+#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
+#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
+#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
+#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
+#define ADC1                ((ADC_TypeDef *) ADC1_BASE)
+#define ADC2                ((ADC_TypeDef *) ADC2_BASE)
+#define TKey1               ((ADC_TypeDef *) ADC1_BASE)
+#define TKey2               ((ADC_TypeDef *) ADC2_BASE)
+#define TIM1                ((TIM_TypeDef *) TIM1_BASE)
+#define SPI1                ((SPI_TypeDef *) SPI1_BASE)
+#define TIM8                ((TIM_TypeDef *) TIM8_BASE)
+#define USART1              ((USART_TypeDef *) USART1_BASE)
+#define ADC3                ((ADC_TypeDef *) ADC3_BASE)
+#define TIM9                ((TIM_TypeDef *) TIM9_BASE)
+#define TIM10               ((TIM_TypeDef *) TIM10_BASE)
+#define SDIO                ((SDIO_TypeDef *) SDIO_BASE)
+
+#define DMA1                ((DMA_TypeDef *) DMA1_BASE)
+#define DMA2                ((DMA_TypeDef *) DMA2_BASE)
+#define DMA2_EXTEN          ((DMA_TypeDef *) DMA2_EXTEN_BASE)
+#define DMA1_Channel1       ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE)
+#define DMA1_Channel2       ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE)
+#define DMA1_Channel3       ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE)
+#define DMA1_Channel4       ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE)
+#define DMA1_Channel5       ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE)
+#define DMA1_Channel6       ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE)
+#define DMA1_Channel7       ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE)
+#define DMA2_Channel1       ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE)
+#define DMA2_Channel2       ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE)
+#define DMA2_Channel3       ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE)
+#define DMA2_Channel4       ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE)
+#define DMA2_Channel5       ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE)
+#define DMA2_Channel6       ((DMA_Channel_TypeDef *) DMA2_Channel6_BASE)
+#define DMA2_Channel7       ((DMA_Channel_TypeDef *) DMA2_Channel7_BASE)
+#define DMA2_Channel8       ((DMA_Channel_TypeDef *) DMA2_Channel8_BASE)
+#define DMA2_Channel9       ((DMA_Channel_TypeDef *) DMA2_Channel9_BASE)
+#define DMA2_Channel10      ((DMA_Channel_TypeDef *) DMA2_Channel10_BASE)
+#define DMA2_Channel11      ((DMA_Channel_TypeDef *) DMA2_Channel11_BASE)
+#define RCC                 ((RCC_TypeDef *) RCC_BASE)
+#define FLASH               ((FLASH_TypeDef *) FLASH_R_BASE)
+#define CRC                 ((CRC_TypeDef *) CRC_BASE)
+#define USBHSD              ((USBHSD_TypeDef *) USBHS_BASE)
+#define USBHSH              ((USBHSH_TypeDef *) USBHS_BASE)
+#define USBFSD              ((USBFSD_TypeDef *)USBFS_BASE)
+#define USBFSH              ((USBFSH_TypeDef *)USBFS_BASE)
+#define EXTEN               ((EXTEN_TypeDef *) EXTEN_BASE)
+#define OPA                 ((OPA_TypeDef *) OPA_BASE)
+#define RNG                 ((RNG_TypeDef *) RNG_BASE)
+#define ETH                 ((ETH_TypeDef *) ETH_BASE)
+
+#define DVP                 ((DVP_TypeDef *) DVP_BASE)
+
+#define FSMC_Bank1          ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
+#define FSMC_Bank1E         ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)
+#define FSMC_Bank2          ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE)
+
+#define OB                  ((OB_TypeDef *) OB_BASE)
+
+/******************************************************************************/
+/*                         Peripheral Registers Bits Definition               */
+/******************************************************************************/
+
+/******************************************************************************/
+/*                        Analog to Digital Converter                         */
+/******************************************************************************/
+
+/********************  Bit definition for ADC_STATR register  ********************/
+#define  ADC_AWD                        ((uint8_t)0x01)               /* Analog watchdog flag */
+#define  ADC_EOC                        ((uint8_t)0x02)               /* End of conversion */
+#define  ADC_JEOC                       ((uint8_t)0x04)               /* Injected channel end of conversion */
+#define  ADC_JSTRT                      ((uint8_t)0x08)               /* Injected channel Start flag */
+#define  ADC_STRT                       ((uint8_t)0x10)               /* Regular channel Start flag */
+
+/*******************  Bit definition for ADC_CTLR1 register  ********************/
+#define  ADC_AWDCH                      ((uint32_t)0x0000001F)        /* AWDCH[4:0] bits (Analog watchdog channel select bits) */
+#define  ADC_AWDCH_0                    ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_AWDCH_1                    ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_AWDCH_2                    ((uint32_t)0x00000004)        /* Bit 2 */
+#define  ADC_AWDCH_3                    ((uint32_t)0x00000008)        /* Bit 3 */
+#define  ADC_AWDCH_4                    ((uint32_t)0x00000010)        /* Bit 4 */
+
+#define  ADC_EOCIE                      ((uint32_t)0x00000020)        /* Interrupt enable for EOC */
+#define  ADC_AWDIE                      ((uint32_t)0x00000040)        /* Analog Watchdog interrupt enable */
+#define  ADC_JEOCIE                     ((uint32_t)0x00000080)        /* Interrupt enable for injected channels */
+#define  ADC_SCAN                       ((uint32_t)0x00000100)        /* Scan mode */
+#define  ADC_AWDSGL                     ((uint32_t)0x00000200)        /* Enable the watchdog on a single channel in scan mode */
+#define  ADC_JAUTO                      ((uint32_t)0x00000400)        /* Automatic injected group conversion */
+#define  ADC_DISCEN                     ((uint32_t)0x00000800)        /* Discontinuous mode on regular channels */
+#define  ADC_JDISCEN                    ((uint32_t)0x00001000)        /* Discontinuous mode on injected channels */
+
+#define  ADC_DISCNUM                    ((uint32_t)0x0000E000)        /* DISCNUM[2:0] bits (Discontinuous mode channel count) */
+#define  ADC_DISCNUM_0                  ((uint32_t)0x00002000)        /* Bit 0 */
+#define  ADC_DISCNUM_1                  ((uint32_t)0x00004000)        /* Bit 1 */
+#define  ADC_DISCNUM_2                  ((uint32_t)0x00008000)        /* Bit 2 */
+
+#define  ADC_DUALMOD                    ((uint32_t)0x000F0000)        /* DUALMOD[3:0] bits (Dual mode selection) */
+#define  ADC_DUALMOD_0                  ((uint32_t)0x00010000)        /* Bit 0 */
+#define  ADC_DUALMOD_1                  ((uint32_t)0x00020000)        /* Bit 1 */
+#define  ADC_DUALMOD_2                  ((uint32_t)0x00040000)        /* Bit 2 */
+#define  ADC_DUALMOD_3                  ((uint32_t)0x00080000)        /* Bit 3 */
+
+#define  ADC_JAWDEN                     ((uint32_t)0x00400000)        /* Analog watchdog enable on injected channels */
+#define  ADC_AWDEN                      ((uint32_t)0x00800000)        /* Analog watchdog enable on regular channels */
+
+#define  ADC_TKENABLE                   ((uint32_t)0x01000000)        /*TKEY enable*/
+#define  ADC_TKITUNE                    ((uint32_t)0x02000000)        
+#define  ADC_BUFEN                      ((uint32_t)0x04000000)        
+
+#define  ADC_PGA                        ((uint32_t)0x18000000)        
+#define  ADC_PGA_0                      ((uint32_t)0x08000000)        
+#define  ADC_PGA_1                      ((uint32_t)0x10000000)        
+/*******************  Bit definition for ADC_CTLR2 register  ********************/
+#define  ADC_ADON                       ((uint32_t)0x00000001)        /* A/D Converter ON / OFF */
+#define  ADC_CONT                       ((uint32_t)0x00000002)        /* Continuous Conversion */
+#define  ADC_CAL                        ((uint32_t)0x00000004)        /* A/D Calibration */
+#define  ADC_RSTCAL                     ((uint32_t)0x00000008)        /* Reset Calibration */
+#define  ADC_DMA                        ((uint32_t)0x00000100)        /* Direct Memory access mode */
+#define  ADC_ALIGN                      ((uint32_t)0x00000800)        /* Data Alignment */
+
+#define  ADC_JEXTSEL                    ((uint32_t)0x00007000)        /* JEXTSEL[2:0] bits (External event select for injected group) */
+#define  ADC_JEXTSEL_0                  ((uint32_t)0x00001000)        /* Bit 0 */
+#define  ADC_JEXTSEL_1                  ((uint32_t)0x00002000)        /* Bit 1 */
+#define  ADC_JEXTSEL_2                  ((uint32_t)0x00004000)        /* Bit 2 */
+
+#define  ADC_JEXTTRIG                   ((uint32_t)0x00008000)        /* External Trigger Conversion mode for injected channels */
+
+#define  ADC_EXTSEL                     ((uint32_t)0x000E0000)        /* EXTSEL[2:0] bits (External Event Select for regular group) */
+#define  ADC_EXTSEL_0                   ((uint32_t)0x00020000)        /* Bit 0 */
+#define  ADC_EXTSEL_1                   ((uint32_t)0x00040000)        /* Bit 1 */
+#define  ADC_EXTSEL_2                   ((uint32_t)0x00080000)        /* Bit 2 */
+
+#define  ADC_EXTTRIG                    ((uint32_t)0x00100000)        /* External Trigger Conversion mode for regular channels */
+#define  ADC_JSWSTART                   ((uint32_t)0x00200000)        /* Start Conversion of injected channels */
+#define  ADC_SWSTART                    ((uint32_t)0x00400000)        /* Start Conversion of regular channels */
+#define  ADC_TSVREFE                    ((uint32_t)0x00800000)        /* Temperature Sensor and VREFINT Enable */
+
+/******************  Bit definition for ADC_SAMPTR1 register  *******************/
+#define  ADC_SMP10                      ((uint32_t)0x00000007)        /* SMP10[2:0] bits (Channel 10 Sample time selection) */
+#define  ADC_SMP10_0                    ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_SMP10_1                    ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_SMP10_2                    ((uint32_t)0x00000004)        /* Bit 2 */
+
+#define  ADC_SMP11                      ((uint32_t)0x00000038)        /* SMP11[2:0] bits (Channel 11 Sample time selection) */
+#define  ADC_SMP11_0                    ((uint32_t)0x00000008)        /* Bit 0 */
+#define  ADC_SMP11_1                    ((uint32_t)0x00000010)        /* Bit 1 */
+#define  ADC_SMP11_2                    ((uint32_t)0x00000020)        /* Bit 2 */
+
+#define  ADC_SMP12                      ((uint32_t)0x000001C0)        /* SMP12[2:0] bits (Channel 12 Sample time selection) */
+#define  ADC_SMP12_0                    ((uint32_t)0x00000040)        /* Bit 0 */
+#define  ADC_SMP12_1                    ((uint32_t)0x00000080)        /* Bit 1 */
+#define  ADC_SMP12_2                    ((uint32_t)0x00000100)        /* Bit 2 */
+
+#define  ADC_SMP13                      ((uint32_t)0x00000E00)        /* SMP13[2:0] bits (Channel 13 Sample time selection) */
+#define  ADC_SMP13_0                    ((uint32_t)0x00000200)        /* Bit 0 */
+#define  ADC_SMP13_1                    ((uint32_t)0x00000400)        /* Bit 1 */
+#define  ADC_SMP13_2                    ((uint32_t)0x00000800)        /* Bit 2 */
+
+#define  ADC_SMP14                      ((uint32_t)0x00007000)        /* SMP14[2:0] bits (Channel 14 Sample time selection) */
+#define  ADC_SMP14_0                    ((uint32_t)0x00001000)        /* Bit 0 */
+#define  ADC_SMP14_1                    ((uint32_t)0x00002000)        /* Bit 1 */
+#define  ADC_SMP14_2                    ((uint32_t)0x00004000)        /* Bit 2 */
+
+#define  ADC_SMP15                      ((uint32_t)0x00038000)        /* SMP15[2:0] bits (Channel 15 Sample time selection) */
+#define  ADC_SMP15_0                    ((uint32_t)0x00008000)        /* Bit 0 */
+#define  ADC_SMP15_1                    ((uint32_t)0x00010000)        /* Bit 1 */
+#define  ADC_SMP15_2                    ((uint32_t)0x00020000)        /* Bit 2 */
+
+#define  ADC_SMP16                      ((uint32_t)0x001C0000)        /* SMP16[2:0] bits (Channel 16 Sample time selection) */
+#define  ADC_SMP16_0                    ((uint32_t)0x00040000)        /* Bit 0 */
+#define  ADC_SMP16_1                    ((uint32_t)0x00080000)        /* Bit 1 */
+#define  ADC_SMP16_2                    ((uint32_t)0x00100000)        /* Bit 2 */
+
+#define  ADC_SMP17                      ((uint32_t)0x00E00000)        /* SMP17[2:0] bits (Channel 17 Sample time selection) */
+#define  ADC_SMP17_0                    ((uint32_t)0x00200000)        /* Bit 0 */
+#define  ADC_SMP17_1                    ((uint32_t)0x00400000)        /* Bit 1 */
+#define  ADC_SMP17_2                    ((uint32_t)0x00800000)        /* Bit 2 */
+
+/******************  Bit definition for ADC_SAMPTR2 register  *******************/
+#define  ADC_SMP0                       ((uint32_t)0x00000007)        /* SMP0[2:0] bits (Channel 0 Sample time selection) */
+#define  ADC_SMP0_0                     ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_SMP0_1                     ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_SMP0_2                     ((uint32_t)0x00000004)        /* Bit 2 */
+
+#define  ADC_SMP1                       ((uint32_t)0x00000038)        /* SMP1[2:0] bits (Channel 1 Sample time selection) */
+#define  ADC_SMP1_0                     ((uint32_t)0x00000008)        /* Bit 0 */
+#define  ADC_SMP1_1                     ((uint32_t)0x00000010)        /* Bit 1 */
+#define  ADC_SMP1_2                     ((uint32_t)0x00000020)        /* Bit 2 */
+
+#define  ADC_SMP2                       ((uint32_t)0x000001C0)        /* SMP2[2:0] bits (Channel 2 Sample time selection) */
+#define  ADC_SMP2_0                     ((uint32_t)0x00000040)        /* Bit 0 */
+#define  ADC_SMP2_1                     ((uint32_t)0x00000080)        /* Bit 1 */
+#define  ADC_SMP2_2                     ((uint32_t)0x00000100)        /* Bit 2 */
+
+#define  ADC_SMP3                       ((uint32_t)0x00000E00)        /* SMP3[2:0] bits (Channel 3 Sample time selection) */
+#define  ADC_SMP3_0                     ((uint32_t)0x00000200)        /* Bit 0 */
+#define  ADC_SMP3_1                     ((uint32_t)0x00000400)        /* Bit 1 */
+#define  ADC_SMP3_2                     ((uint32_t)0x00000800)        /* Bit 2 */
+
+#define  ADC_SMP4                       ((uint32_t)0x00007000)        /* SMP4[2:0] bits (Channel 4 Sample time selection) */
+#define  ADC_SMP4_0                     ((uint32_t)0x00001000)        /* Bit 0 */
+#define  ADC_SMP4_1                     ((uint32_t)0x00002000)        /* Bit 1 */
+#define  ADC_SMP4_2                     ((uint32_t)0x00004000)        /* Bit 2 */
+
+#define  ADC_SMP5                       ((uint32_t)0x00038000)        /* SMP5[2:0] bits (Channel 5 Sample time selection) */
+#define  ADC_SMP5_0                     ((uint32_t)0x00008000)        /* Bit 0 */
+#define  ADC_SMP5_1                     ((uint32_t)0x00010000)        /* Bit 1 */
+#define  ADC_SMP5_2                     ((uint32_t)0x00020000)        /* Bit 2 */
+
+#define  ADC_SMP6                       ((uint32_t)0x001C0000)        /* SMP6[2:0] bits (Channel 6 Sample time selection) */
+#define  ADC_SMP6_0                     ((uint32_t)0x00040000)        /* Bit 0 */
+#define  ADC_SMP6_1                     ((uint32_t)0x00080000)        /* Bit 1 */
+#define  ADC_SMP6_2                     ((uint32_t)0x00100000)        /* Bit 2 */
+
+#define  ADC_SMP7                       ((uint32_t)0x00E00000)        /* SMP7[2:0] bits (Channel 7 Sample time selection) */
+#define  ADC_SMP7_0                     ((uint32_t)0x00200000)        /* Bit 0 */
+#define  ADC_SMP7_1                     ((uint32_t)0x00400000)        /* Bit 1 */
+#define  ADC_SMP7_2                     ((uint32_t)0x00800000)        /* Bit 2 */
+
+#define  ADC_SMP8                       ((uint32_t)0x07000000)        /* SMP8[2:0] bits (Channel 8 Sample time selection) */
+#define  ADC_SMP8_0                     ((uint32_t)0x01000000)        /* Bit 0 */
+#define  ADC_SMP8_1                     ((uint32_t)0x02000000)        /* Bit 1 */
+#define  ADC_SMP8_2                     ((uint32_t)0x04000000)        /* Bit 2 */
+
+#define  ADC_SMP9                       ((uint32_t)0x38000000)        /* SMP9[2:0] bits (Channel 9 Sample time selection) */
+#define  ADC_SMP9_0                     ((uint32_t)0x08000000)        /* Bit 0 */
+#define  ADC_SMP9_1                     ((uint32_t)0x10000000)        /* Bit 1 */
+#define  ADC_SMP9_2                     ((uint32_t)0x20000000)        /* Bit 2 */
+
+/******************  Bit definition for ADC_IOFR1 register  *******************/
+#define  ADC_JOFFSET1                   ((uint16_t)0x0FFF)            /* Data offset for injected channel 1 */
+
+/******************  Bit definition for ADC_IOFR2 register  *******************/
+#define  ADC_JOFFSET2                   ((uint16_t)0x0FFF)            /* Data offset for injected channel 2 */
+
+/******************  Bit definition for ADC_IOFR3 register  *******************/
+#define  ADC_JOFFSET3                   ((uint16_t)0x0FFF)            /* Data offset for injected channel 3 */
+
+/******************  Bit definition for ADC_IOFR4 register  *******************/
+#define  ADC_JOFFSET4                   ((uint16_t)0x0FFF)            /* Data offset for injected channel 4 */
+
+/*******************  Bit definition for ADC_WDHTR register  ********************/
+#define  ADC_HT                         ((uint16_t)0x0FFF)            /* Analog watchdog high threshold */
+
+/*******************  Bit definition for ADC_WDLTR register  ********************/
+#define  ADC_LT                         ((uint16_t)0x0FFF)            /* Analog watchdog low threshold */
+
+/*******************  Bit definition for ADC_RSQR1 register  *******************/
+#define  ADC_SQ13                       ((uint32_t)0x0000001F)        /* SQ13[4:0] bits (13th conversion in regular sequence) */
+#define  ADC_SQ13_0                     ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_SQ13_1                     ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_SQ13_2                     ((uint32_t)0x00000004)        /* Bit 2 */
+#define  ADC_SQ13_3                     ((uint32_t)0x00000008)        /* Bit 3 */
+#define  ADC_SQ13_4                     ((uint32_t)0x00000010)        /* Bit 4 */
+
+#define  ADC_SQ14                       ((uint32_t)0x000003E0)        /* SQ14[4:0] bits (14th conversion in regular sequence) */
+#define  ADC_SQ14_0                     ((uint32_t)0x00000020)        /* Bit 0 */
+#define  ADC_SQ14_1                     ((uint32_t)0x00000040)        /* Bit 1 */
+#define  ADC_SQ14_2                     ((uint32_t)0x00000080)        /* Bit 2 */
+#define  ADC_SQ14_3                     ((uint32_t)0x00000100)        /* Bit 3 */
+#define  ADC_SQ14_4                     ((uint32_t)0x00000200)        /* Bit 4 */
+
+#define  ADC_SQ15                       ((uint32_t)0x00007C00)        /* SQ15[4:0] bits (15th conversion in regular sequence) */
+#define  ADC_SQ15_0                     ((uint32_t)0x00000400)        /* Bit 0 */
+#define  ADC_SQ15_1                     ((uint32_t)0x00000800)        /* Bit 1 */
+#define  ADC_SQ15_2                     ((uint32_t)0x00001000)        /* Bit 2 */
+#define  ADC_SQ15_3                     ((uint32_t)0x00002000)        /* Bit 3 */
+#define  ADC_SQ15_4                     ((uint32_t)0x00004000)        /* Bit 4 */
+
+#define  ADC_SQ16                       ((uint32_t)0x000F8000)        /* SQ16[4:0] bits (16th conversion in regular sequence) */
+#define  ADC_SQ16_0                     ((uint32_t)0x00008000)        /* Bit 0 */
+#define  ADC_SQ16_1                     ((uint32_t)0x00010000)        /* Bit 1 */
+#define  ADC_SQ16_2                     ((uint32_t)0x00020000)        /* Bit 2 */
+#define  ADC_SQ16_3                     ((uint32_t)0x00040000)        /* Bit 3 */
+#define  ADC_SQ16_4                     ((uint32_t)0x00080000)        /* Bit 4 */
+
+#define  ADC_L                          ((uint32_t)0x00F00000)        /* L[3:0] bits (Regular channel sequence length) */
+#define  ADC_L_0                        ((uint32_t)0x00100000)        /* Bit 0 */
+#define  ADC_L_1                        ((uint32_t)0x00200000)        /* Bit 1 */
+#define  ADC_L_2                        ((uint32_t)0x00400000)        /* Bit 2 */
+#define  ADC_L_3                        ((uint32_t)0x00800000)        /* Bit 3 */
+
+/*******************  Bit definition for ADC_RSQR2 register  *******************/
+#define  ADC_SQ7                        ((uint32_t)0x0000001F)        /* SQ7[4:0] bits (7th conversion in regular sequence) */
+#define  ADC_SQ7_0                      ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_SQ7_1                      ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_SQ7_2                      ((uint32_t)0x00000004)        /* Bit 2 */
+#define  ADC_SQ7_3                      ((uint32_t)0x00000008)        /* Bit 3 */
+#define  ADC_SQ7_4                      ((uint32_t)0x00000010)        /* Bit 4 */
+
+#define  ADC_SQ8                        ((uint32_t)0x000003E0)        /* SQ8[4:0] bits (8th conversion in regular sequence) */
+#define  ADC_SQ8_0                      ((uint32_t)0x00000020)        /* Bit 0 */
+#define  ADC_SQ8_1                      ((uint32_t)0x00000040)        /* Bit 1 */
+#define  ADC_SQ8_2                      ((uint32_t)0x00000080)        /* Bit 2 */
+#define  ADC_SQ8_3                      ((uint32_t)0x00000100)        /* Bit 3 */
+#define  ADC_SQ8_4                      ((uint32_t)0x00000200)        /* Bit 4 */
+
+#define  ADC_SQ9                        ((uint32_t)0x00007C00)        /* SQ9[4:0] bits (9th conversion in regular sequence) */
+#define  ADC_SQ9_0                      ((uint32_t)0x00000400)        /* Bit 0 */
+#define  ADC_SQ9_1                      ((uint32_t)0x00000800)        /* Bit 1 */
+#define  ADC_SQ9_2                      ((uint32_t)0x00001000)        /* Bit 2 */
+#define  ADC_SQ9_3                      ((uint32_t)0x00002000)        /* Bit 3 */
+#define  ADC_SQ9_4                      ((uint32_t)0x00004000)        /* Bit 4 */
+
+#define  ADC_SQ10                       ((uint32_t)0x000F8000)        /* SQ10[4:0] bits (10th conversion in regular sequence) */
+#define  ADC_SQ10_0                     ((uint32_t)0x00008000)        /* Bit 0 */
+#define  ADC_SQ10_1                     ((uint32_t)0x00010000)        /* Bit 1 */
+#define  ADC_SQ10_2                     ((uint32_t)0x00020000)        /* Bit 2 */
+#define  ADC_SQ10_3                     ((uint32_t)0x00040000)        /* Bit 3 */
+#define  ADC_SQ10_4                     ((uint32_t)0x00080000)        /* Bit 4 */
+
+#define  ADC_SQ11                       ((uint32_t)0x01F00000)        /* SQ11[4:0] bits (11th conversion in regular sequence) */
+#define  ADC_SQ11_0                     ((uint32_t)0x00100000)        /* Bit 0 */
+#define  ADC_SQ11_1                     ((uint32_t)0x00200000)        /* Bit 1 */
+#define  ADC_SQ11_2                     ((uint32_t)0x00400000)        /* Bit 2 */
+#define  ADC_SQ11_3                     ((uint32_t)0x00800000)        /* Bit 3 */
+#define  ADC_SQ11_4                     ((uint32_t)0x01000000)        /* Bit 4 */
+
+#define  ADC_SQ12                       ((uint32_t)0x3E000000)        /* SQ12[4:0] bits (12th conversion in regular sequence) */
+#define  ADC_SQ12_0                     ((uint32_t)0x02000000)        /* Bit 0 */
+#define  ADC_SQ12_1                     ((uint32_t)0x04000000)        /* Bit 1 */
+#define  ADC_SQ12_2                     ((uint32_t)0x08000000)        /* Bit 2 */
+#define  ADC_SQ12_3                     ((uint32_t)0x10000000)        /* Bit 3 */
+#define  ADC_SQ12_4                     ((uint32_t)0x20000000)        /* Bit 4 */
+
+/*******************  Bit definition for ADC_RSQR3 register  *******************/
+#define  ADC_SQ1                        ((uint32_t)0x0000001F)        /* SQ1[4:0] bits (1st conversion in regular sequence) */
+#define  ADC_SQ1_0                      ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_SQ1_1                      ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_SQ1_2                      ((uint32_t)0x00000004)        /* Bit 2 */
+#define  ADC_SQ1_3                      ((uint32_t)0x00000008)        /* Bit 3 */
+#define  ADC_SQ1_4                      ((uint32_t)0x00000010)        /* Bit 4 */
+
+#define  ADC_SQ2                        ((uint32_t)0x000003E0)        /* SQ2[4:0] bits (2nd conversion in regular sequence) */
+#define  ADC_SQ2_0                      ((uint32_t)0x00000020)        /* Bit 0 */
+#define  ADC_SQ2_1                      ((uint32_t)0x00000040)        /* Bit 1 */
+#define  ADC_SQ2_2                      ((uint32_t)0x00000080)        /* Bit 2 */
+#define  ADC_SQ2_3                      ((uint32_t)0x00000100)        /* Bit 3 */
+#define  ADC_SQ2_4                      ((uint32_t)0x00000200)        /* Bit 4 */
+
+#define  ADC_SQ3                        ((uint32_t)0x00007C00)        /* SQ3[4:0] bits (3rd conversion in regular sequence) */
+#define  ADC_SQ3_0                      ((uint32_t)0x00000400)        /* Bit 0 */
+#define  ADC_SQ3_1                      ((uint32_t)0x00000800)        /* Bit 1 */
+#define  ADC_SQ3_2                      ((uint32_t)0x00001000)        /* Bit 2 */
+#define  ADC_SQ3_3                      ((uint32_t)0x00002000)        /* Bit 3 */
+#define  ADC_SQ3_4                      ((uint32_t)0x00004000)        /* Bit 4 */
+
+#define  ADC_SQ4                        ((uint32_t)0x000F8000)        /* SQ4[4:0] bits (4th conversion in regular sequence) */
+#define  ADC_SQ4_0                      ((uint32_t)0x00008000)        /* Bit 0 */
+#define  ADC_SQ4_1                      ((uint32_t)0x00010000)        /* Bit 1 */
+#define  ADC_SQ4_2                      ((uint32_t)0x00020000)        /* Bit 2 */
+#define  ADC_SQ4_3                      ((uint32_t)0x00040000)        /* Bit 3 */
+#define  ADC_SQ4_4                      ((uint32_t)0x00080000)        /* Bit 4 */
+
+#define  ADC_SQ5                        ((uint32_t)0x01F00000)        /* SQ5[4:0] bits (5th conversion in regular sequence) */
+#define  ADC_SQ5_0                      ((uint32_t)0x00100000)        /* Bit 0 */
+#define  ADC_SQ5_1                      ((uint32_t)0x00200000)        /* Bit 1 */
+#define  ADC_SQ5_2                      ((uint32_t)0x00400000)        /* Bit 2 */
+#define  ADC_SQ5_3                      ((uint32_t)0x00800000)        /* Bit 3 */
+#define  ADC_SQ5_4                      ((uint32_t)0x01000000)        /* Bit 4 */
+
+#define  ADC_SQ6                        ((uint32_t)0x3E000000)        /* SQ6[4:0] bits (6th conversion in regular sequence) */
+#define  ADC_SQ6_0                      ((uint32_t)0x02000000)        /* Bit 0 */
+#define  ADC_SQ6_1                      ((uint32_t)0x04000000)        /* Bit 1 */
+#define  ADC_SQ6_2                      ((uint32_t)0x08000000)        /* Bit 2 */
+#define  ADC_SQ6_3                      ((uint32_t)0x10000000)        /* Bit 3 */
+#define  ADC_SQ6_4                      ((uint32_t)0x20000000)        /* Bit 4 */
+
+/*******************  Bit definition for ADC_ISQR register  *******************/
+#define  ADC_JSQ1                       ((uint32_t)0x0000001F)        /* JSQ1[4:0] bits (1st conversion in injected sequence) */  
+#define  ADC_JSQ1_0                     ((uint32_t)0x00000001)        /* Bit 0 */
+#define  ADC_JSQ1_1                     ((uint32_t)0x00000002)        /* Bit 1 */
+#define  ADC_JSQ1_2                     ((uint32_t)0x00000004)        /* Bit 2 */
+#define  ADC_JSQ1_3                     ((uint32_t)0x00000008)        /* Bit 3 */
+#define  ADC_JSQ1_4                     ((uint32_t)0x00000010)        /* Bit 4 */
+
+#define  ADC_JSQ2                       ((uint32_t)0x000003E0)        /* JSQ2[4:0] bits (2nd conversion in injected sequence) */
+#define  ADC_JSQ2_0                     ((uint32_t)0x00000020)        /* Bit 0 */
+#define  ADC_JSQ2_1                     ((uint32_t)0x00000040)        /* Bit 1 */
+#define  ADC_JSQ2_2                     ((uint32_t)0x00000080)        /* Bit 2 */
+#define  ADC_JSQ2_3                     ((uint32_t)0x00000100)        /* Bit 3 */
+#define  ADC_JSQ2_4                     ((uint32_t)0x00000200)        /* Bit 4 */
+
+#define  ADC_JSQ3                       ((uint32_t)0x00007C00)        /* JSQ3[4:0] bits (3rd conversion in injected sequence) */
+#define  ADC_JSQ3_0                     ((uint32_t)0x00000400)        /* Bit 0 */
+#define  ADC_JSQ3_1                     ((uint32_t)0x00000800)        /* Bit 1 */
+#define  ADC_JSQ3_2                     ((uint32_t)0x00001000)        /* Bit 2 */
+#define  ADC_JSQ3_3                     ((uint32_t)0x00002000)        /* Bit 3 */
+#define  ADC_JSQ3_4                     ((uint32_t)0x00004000)        /* Bit 4 */
+
+#define  ADC_JSQ4                       ((uint32_t)0x000F8000)        /* JSQ4[4:0] bits (4th conversion in injected sequence) */
+#define  ADC_JSQ4_0                     ((uint32_t)0x00008000)        /* Bit 0 */
+#define  ADC_JSQ4_1                     ((uint32_t)0x00010000)        /* Bit 1 */
+#define  ADC_JSQ4_2                     ((uint32_t)0x00020000)        /* Bit 2 */
+#define  ADC_JSQ4_3                     ((uint32_t)0x00040000)        /* Bit 3 */
+#define  ADC_JSQ4_4                     ((uint32_t)0x00080000)        /* Bit 4 */
+
+#define  ADC_JL                         ((uint32_t)0x00300000)        /* JL[1:0] bits (Injected Sequence length) */
+#define  ADC_JL_0                       ((uint32_t)0x00100000)        /* Bit 0 */
+#define  ADC_JL_1                       ((uint32_t)0x00200000)        /* Bit 1 */
+
+/*******************  Bit definition for ADC_IDATAR1 register  *******************/
+#define  ADC_IDATAR1_JDATA              ((uint16_t)0xFFFF)            /* Injected data */
+
+/*******************  Bit definition for ADC_IDATAR2 register  *******************/
+#define  ADC_IDATAR2_JDATA              ((uint16_t)0xFFFF)            /* Injected data */
+
+/*******************  Bit definition for ADC_IDATAR3 register  *******************/
+#define  ADC_IDATAR3_JDATA              ((uint16_t)0xFFFF)            /* Injected data */
+
+/*******************  Bit definition for ADC_IDATAR4 register  *******************/
+#define  ADC_IDATAR4_JDATA              ((uint16_t)0xFFFF)            /* Injected data */
+
+/********************  Bit definition for ADC_RDATAR register  ********************/
+#define  ADC_RDATAR_DATA                ((uint32_t)0x0000FFFF)        /* Regular data */
+#define  ADC_RDATAR_ADC2DATA            ((uint32_t)0xFFFF0000)        /* ADC2 data */
+
+/********************  Bit definition for ADC_AUX register  ********************/
+#define  ADC_SMP_SEL_0                  ((uint32_t)0x00000001)        /* channel_0 */
+#define  ADC_SMP_SEL_1                  ((uint32_t)0x00000002)        /* channel_1 */
+#define  ADC_SMP_SEL_2                  ((uint32_t)0x00000004)        /* channel_2 */
+#define  ADC_SMP_SEL_3                  ((uint32_t)0x00000008)        /* channel_3 */
+#define  ADC_SMP_SEL_4                  ((uint32_t)0x00000010)        /* channel_4 */
+#define  ADC_SMP_SEL_5                  ((uint32_t)0x00000020)        /* channel_5 */
+#define  ADC_SMP_SEL_6                  ((uint32_t)0x00000040)        /* channel_6 */
+#define  ADC_SMP_SEL_7                  ((uint32_t)0x00000080)        /* channel_7 */
+#define  ADC_SMP_SEL_8                  ((uint32_t)0x00000100)        /* channel_8 */
+#define  ADC_SMP_SEL_9                  ((uint32_t)0x00000200)        /* channel_9 */
+#define  ADC_SMP_SEL_10                 ((uint32_t)0x00000400)        /* channel_10 */
+#define  ADC_SMP_SEL_11                 ((uint32_t)0x00000800)        /* channel_11 */
+#define  ADC_SMP_SEL_12                 ((uint32_t)0x00001000)        /* channel_12 */
+#define  ADC_SMP_SEL_13                 ((uint32_t)0x00002000)        /* channel_13 */
+#define  ADC_SMP_SEL_14                 ((uint32_t)0x00004000)        /* channel_14 */
+#define  ADC_SMP_SEL_15                 ((uint32_t)0x00008000)        /* channel_15 */
+#define  ADC_SMP_SEL_16                 ((uint32_t)0x00010000)        /* channel_16 */
+#define  ADC_SMP_SEL_17                 ((uint32_t)0x00020000)        /* channel_17 */
+
+/******************************************************************************/
+/*                            Backup registers                                */
+/******************************************************************************/
+
+/*******************  Bit definition for BKP_DATAR1 register  ********************/
+#define  BKP_DATAR1_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR2 register  ********************/
+#define  BKP_DATAR2_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR3 register  ********************/
+#define  BKP_DATAR3_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR4 register  ********************/
+#define  BKP_DATAR4_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR5 register  ********************/
+#define  BKP_DATAR5_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR6 register  ********************/
+#define  BKP_DATAR6_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR7 register  ********************/
+#define  BKP_DATAR7_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR8 register  ********************/
+#define  BKP_DATAR8_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR9 register  ********************/
+#define  BKP_DATAR9_D                           ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR10 register  *******************/
+#define  BKP_DATAR10_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR11 register  *******************/
+#define  BKP_DATAR11_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR12 register  *******************/
+#define  BKP_DATAR12_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR13 register  *******************/
+#define  BKP_DATAR13_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR14 register  *******************/
+#define  BKP_DATAR14_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR15 register  *******************/
+#define  BKP_DATAR15_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR16 register  *******************/
+#define  BKP_DATAR16_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR17 register  *******************/
+#define  BKP_DATAR17_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/******************  Bit definition for BKP_DATAR18 register  ********************/
+#define  BKP_DATAR18_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR19 register  *******************/
+#define  BKP_DATAR19_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR20 register  *******************/
+#define  BKP_DATAR20_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR21 register  *******************/
+#define  BKP_DATAR21_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR22 register  *******************/
+#define  BKP_DATAR22_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR23 register  *******************/
+#define  BKP_DATAR23_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR24 register  *******************/
+#define  BKP_DATAR24_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR25 register  *******************/
+#define  BKP_DATAR25_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR26 register  *******************/
+#define  BKP_DATAR26_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR27 register  *******************/
+#define  BKP_DATAR27_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR28 register  *******************/
+#define  BKP_DATAR28_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR29 register  *******************/
+#define  BKP_DATAR29_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR30 register  *******************/
+#define  BKP_DATAR30_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR31 register  *******************/
+#define  BKP_DATAR31_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR32 register  *******************/
+#define  BKP_DATAR32_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR33 register  *******************/
+#define  BKP_DATAR33_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR34 register  *******************/
+#define  BKP_DATAR34_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR35 register  *******************/
+#define  BKP_DATAR35_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR36 register  *******************/
+#define  BKP_DATAR36_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR37 register  *******************/
+#define  BKP_DATAR37_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR38 register  *******************/
+#define  BKP_DATAR38_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR39 register  *******************/
+#define  BKP_DATAR39_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR40 register  *******************/
+#define  BKP_DATAR40_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR41 register  *******************/
+#define  BKP_DATAR41_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/*******************  Bit definition for BKP_DATAR42 register  *******************/
+#define  BKP_DATAR42_D                          ((uint16_t)0xFFFF)     /* Backup data */
+
+/******************  Bit definition for BKP_OCTLR register  *******************/
+#define  BKP_CAL                                ((uint16_t)0x007F)     /* Calibration value */
+#define  BKP_CCO                                ((uint16_t)0x0080)     /* Calibration Clock Output */
+#define  BKP_ASOE                               ((uint16_t)0x0100)     /* Alarm or Second Output Enable */
+#define  BKP_ASOS                               ((uint16_t)0x0200)     /* Alarm or Second Output Selection */
+
+/********************  Bit definition for BKP_TPCTLR register  ********************/
+#define  BKP_TPE                                ((uint8_t)0x01)        /* TAMPER pin enable */
+#define  BKP_TPAL                               ((uint8_t)0x02)        /* TAMPER pin active level */
+
+/*******************  Bit definition for BKP_TPCSR register  ********************/
+#define  BKP_CTE                                ((uint16_t)0x0001)     /* Clear Tamper event */
+#define  BKP_CTI                                ((uint16_t)0x0002)     /* Clear Tamper Interrupt */
+#define  BKP_TPIE                               ((uint16_t)0x0004)     /* TAMPER Pin interrupt enable */
+#define  BKP_TEF                                ((uint16_t)0x0100)     /* Tamper Event Flag */
+#define  BKP_TIF                                ((uint16_t)0x0200)     /* Tamper Interrupt Flag */
+
+/******************************************************************************/
+/*                         Controller Area Network                            */
+/******************************************************************************/
+
+/*******************  Bit definition for CAN_CTLR register  ********************/
+#define  CAN_CTLR_INRQ                       ((uint16_t)0x0001)            /* Initialization Request */
+#define  CAN_CTLR_SLEEP                      ((uint16_t)0x0002)            /* Sleep Mode Request */
+#define  CAN_CTLR_TXFP                       ((uint16_t)0x0004)            /* Transmit FIFO Priority */
+#define  CAN_CTLR_RFLM                       ((uint16_t)0x0008)            /* Receive FIFO Locked Mode */
+#define  CAN_CTLR_NART                       ((uint16_t)0x0010)            /* No Automatic Retransmission */
+#define  CAN_CTLR_AWUM                       ((uint16_t)0x0020)            /* Automatic Wakeup Mode */
+#define  CAN_CTLR_ABOM                       ((uint16_t)0x0040)            /* Automatic Bus-Off Management */
+#define  CAN_CTLR_TTCM                       ((uint16_t)0x0080)            /* Time Triggered Communication Mode */
+#define  CAN_CTLR_RESET                      ((uint16_t)0x8000)            /* CAN software master reset */
+#define  CAN_CTLR_DBF                        ((uint32_t)0x10000)
+
+/*******************  Bit definition for CAN_STATR register  ********************/
+#define  CAN_STATR_INAK                      ((uint16_t)0x0001)            /* Initialization Acknowledge */
+#define  CAN_STATR_SLAK                      ((uint16_t)0x0002)            /* Sleep Acknowledge */
+#define  CAN_STATR_ERRI                      ((uint16_t)0x0004)            /* Error Interrupt */
+#define  CAN_STATR_WKUI                      ((uint16_t)0x0008)            /* Wakeup Interrupt */
+#define  CAN_STATR_SLAKI                     ((uint16_t)0x0010)            /* Sleep Acknowledge Interrupt */
+#define  CAN_STATR_TXM                       ((uint16_t)0x0100)            /* Transmit Mode */
+#define  CAN_STATR_RXM                       ((uint16_t)0x0200)            /* Receive Mode */
+#define  CAN_STATR_SAMP                      ((uint16_t)0x0400)            /* Last Sample Point */
+#define  CAN_STATR_RX                        ((uint16_t)0x0800)            /* CAN Rx Signal */
+
+/*******************  Bit definition for CAN_TSTATR register  ********************/
+#define  CAN_TSTATR_RQCP0                    ((uint32_t)0x00000001)        /* Request Completed Mailbox0 */
+#define  CAN_TSTATR_TXOK0                    ((uint32_t)0x00000002)        /* Transmission OK of Mailbox0 */
+#define  CAN_TSTATR_ALST0                    ((uint32_t)0x00000004)        /* Arbitration Lost for Mailbox0 */
+#define  CAN_TSTATR_TERR0                    ((uint32_t)0x00000008)        /* Transmission Error of Mailbox0 */
+#define  CAN_TSTATR_ABRQ0                    ((uint32_t)0x00000080)        /* Abort Request for Mailbox0 */
+#define  CAN_TSTATR_RQCP1                    ((uint32_t)0x00000100)        /* Request Completed Mailbox1 */
+#define  CAN_TSTATR_TXOK1                    ((uint32_t)0x00000200)        /* Transmission OK of Mailbox1 */
+#define  CAN_TSTATR_ALST1                    ((uint32_t)0x00000400)        /* Arbitration Lost for Mailbox1 */
+#define  CAN_TSTATR_TERR1                    ((uint32_t)0x00000800)        /* Transmission Error of Mailbox1 */
+#define  CAN_TSTATR_ABRQ1                    ((uint32_t)0x00008000)        /* Abort Request for Mailbox 1 */
+#define  CAN_TSTATR_RQCP2                    ((uint32_t)0x00010000)        /* Request Completed Mailbox2 */
+#define  CAN_TSTATR_TXOK2                    ((uint32_t)0x00020000)        /* Transmission OK of Mailbox 2 */
+#define  CAN_TSTATR_ALST2                    ((uint32_t)0x00040000)        /* Arbitration Lost for mailbox 2 */
+#define  CAN_TSTATR_TERR2                    ((uint32_t)0x00080000)        /* Transmission Error of Mailbox 2 */
+#define  CAN_TSTATR_ABRQ2                    ((uint32_t)0x00800000)        /* Abort Request for Mailbox 2 */
+#define  CAN_TSTATR_CODE                     ((uint32_t)0x03000000)        /* Mailbox Code */
+
+#define  CAN_TSTATR_TME                      ((uint32_t)0x1C000000)        /* TME[2:0] bits */
+#define  CAN_TSTATR_TME0                     ((uint32_t)0x04000000)        /* Transmit Mailbox 0 Empty */
+#define  CAN_TSTATR_TME1                     ((uint32_t)0x08000000)        /* Transmit Mailbox 1 Empty */
+#define  CAN_TSTATR_TME2                     ((uint32_t)0x10000000)        /* Transmit Mailbox 2 Empty */
+
+#define  CAN_TSTATR_LOW                      ((uint32_t)0xE0000000)        /* LOW[2:0] bits */
+#define  CAN_TSTATR_LOW0                     ((uint32_t)0x20000000)        /* Lowest Priority Flag for Mailbox 0 */
+#define  CAN_TSTATR_LOW1                     ((uint32_t)0x40000000)        /* Lowest Priority Flag for Mailbox 1 */
+#define  CAN_TSTATR_LOW2                     ((uint32_t)0x80000000)        /* Lowest Priority Flag for Mailbox 2 */
+
+/*******************  Bit definition for CAN_RFIFO0 register  *******************/
+#define  CAN_RFIFO0_FMP0                     ((uint8_t)0x03)               /* FIFO 0 Message Pending */
+#define  CAN_RFIFO0_FULL0                    ((uint8_t)0x08)               /* FIFO 0 Full */
+#define  CAN_RFIFO0_FOVR0                    ((uint8_t)0x10)               /* FIFO 0 Overrun */
+#define  CAN_RFIFO0_RFOM0                    ((uint8_t)0x20)               /* Release FIFO 0 Output Mailbox */
+
+/*******************  Bit definition for CAN_RFIFO1 register  *******************/
+#define  CAN_RFIFO1_FMP1                     ((uint8_t)0x03)               /* FIFO 1 Message Pending */
+#define  CAN_RFIFO1_FULL1                    ((uint8_t)0x08)               /* FIFO 1 Full */
+#define  CAN_RFIFO1_FOVR1                    ((uint8_t)0x10)               /* FIFO 1 Overrun */
+#define  CAN_RFIFO1_RFOM1                    ((uint8_t)0x20)               /* Release FIFO 1 Output Mailbox */
+
+/********************  Bit definition for CAN_INTENR register  *******************/
+#define  CAN_INTENR_TMEIE                    ((uint32_t)0x00000001)        /* Transmit Mailbox Empty Interrupt Enable */
+#define  CAN_INTENR_FMPIE0                   ((uint32_t)0x00000002)        /* FIFO Message Pending Interrupt Enable */
+#define  CAN_INTENR_FFIE0                    ((uint32_t)0x00000004)        /* FIFO Full Interrupt Enable */
+#define  CAN_INTENR_FOVIE0                   ((uint32_t)0x00000008)        /* FIFO Overrun Interrupt Enable */
+#define  CAN_INTENR_FMPIE1                   ((uint32_t)0x00000010)        /* FIFO Message Pending Interrupt Enable */
+#define  CAN_INTENR_FFIE1                    ((uint32_t)0x00000020)        /* FIFO Full Interrupt Enable */
+#define  CAN_INTENR_FOVIE1                   ((uint32_t)0x00000040)        /* FIFO Overrun Interrupt Enable */
+#define  CAN_INTENR_EWGIE                    ((uint32_t)0x00000100)        /* Error Warning Interrupt Enable */
+#define  CAN_INTENR_EPVIE                    ((uint32_t)0x00000200)        /* Error Passive Interrupt Enable */
+#define  CAN_INTENR_BOFIE                    ((uint32_t)0x00000400)        /* Bus-Off Interrupt Enable */
+#define  CAN_INTENR_LECIE                    ((uint32_t)0x00000800)        /* Last Error Code Interrupt Enable */
+#define  CAN_INTENR_ERRIE                    ((uint32_t)0x00008000)        /* Error Interrupt Enable */
+#define  CAN_INTENR_WKUIE                    ((uint32_t)0x00010000)        /* Wakeup Interrupt Enable */
+#define  CAN_INTENR_SLKIE                    ((uint32_t)0x00020000)        /* Sleep Interrupt Enable */
+
+/********************  Bit definition for CAN_ERRSR register  *******************/
+#define  CAN_ERRSR_EWGF                      ((uint32_t)0x00000001)        /* Error Warning Flag */
+#define  CAN_ERRSR_EPVF                      ((uint32_t)0x00000002)        /* Error Passive Flag */
+#define  CAN_ERRSR_BOFF                      ((uint32_t)0x00000004)        /* Bus-Off Flag */
+
+#define  CAN_ERRSR_LEC                       ((uint32_t)0x00000070)        /* LEC[2:0] bits (Last Error Code) */
+#define  CAN_ERRSR_LEC_0                     ((uint32_t)0x00000010)        /* Bit 0 */
+#define  CAN_ERRSR_LEC_1                     ((uint32_t)0x00000020)        /* Bit 1 */
+#define  CAN_ERRSR_LEC_2                     ((uint32_t)0x00000040)        /* Bit 2 */
+
+#define  CAN_ERRSR_TEC                       ((uint32_t)0x00FF0000)        /* Least significant byte of the 9-bit Transmit Error Counter */
+#define  CAN_ERRSR_REC                       ((uint32_t)0xFF000000)        /* Receive Error Counter */
+
+/*******************  Bit definition for CAN_TTCTLR register  ********************/
+#define  CAN_TTCTLR_TIMCMV                   ((uint32_t)0x0000FFFF)        
+#define  CAN_TTCTLR_TIMRST                   ((uint32_t)0x00010000)        
+#define  CAN_TTCTLR_MODE                     ((uint32_t)0x00020000)        
+
+/*******************  Bit definition for CAN_TTCNT register  ********************/
+#define  CAN_TTCNT_TIMCNT                    ((uint32_t)0x0000FFFF)        
+
+/******************  Bit definition for CAN_TXMI0R register  ********************/
+#define  CAN_TXMI0R_TXRQ                     ((uint32_t)0x00000001)        /* Transmit Mailbox Request */
+#define  CAN_TXMI0R_RTR                      ((uint32_t)0x00000002)        /* Remote Transmission Request */
+#define  CAN_TXMI0R_IDE                      ((uint32_t)0x00000004)        /* Identifier Extension */
+#define  CAN_TXMI0R_EXID                     ((uint32_t)0x001FFFF8)        /* Extended Identifier */
+#define  CAN_TXMI0R_STID                     ((uint32_t)0xFFE00000)        /* Standard Identifier or Extended Identifier */
+
+/******************  Bit definition for CAN_TXMDT0R register  *******************/
+#define  CAN_TXMDT0R_DLC                     ((uint32_t)0x0000000F)        /* Data Length Code */
+#define  CAN_TXMDT0R_TGT                     ((uint32_t)0x00000100)        /* Transmit Global Time */
+#define  CAN_TXMDT0R_TIME                    ((uint32_t)0xFFFF0000)        /* Message Time Stamp */
+
+/******************  Bit definition for CAN_TXMDL0R register  *******************/
+#define  CAN_TXMDL0R_DATA0                   ((uint32_t)0x000000FF)        /* Data byte 0 */
+#define  CAN_TXMDL0R_DATA1                   ((uint32_t)0x0000FF00)        /* Data byte 1 */
+#define  CAN_TXMDL0R_DATA2                   ((uint32_t)0x00FF0000)        /* Data byte 2 */
+#define  CAN_TXMDL0R_DATA3                   ((uint32_t)0xFF000000)        /* Data byte 3 */
+
+/******************  Bit definition for CAN_TXMDH0R register  *******************/
+#define  CAN_TXMDH0R_DATA4                   ((uint32_t)0x000000FF)        /* Data byte 4 */
+#define  CAN_TXMDH0R_DATA5                   ((uint32_t)0x0000FF00)        /* Data byte 5 */
+#define  CAN_TXMDH0R_DATA6                   ((uint32_t)0x00FF0000)        /* Data byte 6 */
+#define  CAN_TXMDH0R_DATA7                   ((uint32_t)0xFF000000)        /* Data byte 7 */
+
+/*******************  Bit definition for CAN_TXMI1R register  *******************/
+#define  CAN_TXMI1R_TXRQ                     ((uint32_t)0x00000001)        /* Transmit Mailbox Request */
+#define  CAN_TXMI1R_RTR                      ((uint32_t)0x00000002)        /* Remote Transmission Request */
+#define  CAN_TXMI1R_IDE                      ((uint32_t)0x00000004)        /* Identifier Extension */
+#define  CAN_TXMI1R_EXID                     ((uint32_t)0x001FFFF8)        /* Extended Identifier */
+#define  CAN_TXMI1R_STID                     ((uint32_t)0xFFE00000)        /* Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_TXMDT1R register  ******************/
+#define  CAN_TXMDT1R_DLC                     ((uint32_t)0x0000000F)        /* Data Length Code */
+#define  CAN_TXMDT1R_TGT                     ((uint32_t)0x00000100)        /* Transmit Global Time */
+#define  CAN_TXMDT1R_TIME                    ((uint32_t)0xFFFF0000)        /* Message Time Stamp */
+
+/*******************  Bit definition for CAN_TXMDL1R register  ******************/
+#define  CAN_TXMDL1R_DATA0                   ((uint32_t)0x000000FF)        /* Data byte 0 */
+#define  CAN_TXMDL1R_DATA1                   ((uint32_t)0x0000FF00)        /* Data byte 1 */
+#define  CAN_TXMDL1R_DATA2                   ((uint32_t)0x00FF0000)        /* Data byte 2 */
+#define  CAN_TXMDL1R_DATA3                   ((uint32_t)0xFF000000)        /* Data byte 3 */
+
+/*******************  Bit definition for CAN_TXMDH1R register  ******************/
+#define  CAN_TXMDH1R_DATA4                   ((uint32_t)0x000000FF)        /* Data byte 4 */
+#define  CAN_TXMDH1R_DATA5                   ((uint32_t)0x0000FF00)        /* Data byte 5 */
+#define  CAN_TXMDH1R_DATA6                   ((uint32_t)0x00FF0000)        /* Data byte 6 */
+#define  CAN_TXMDH1R_DATA7                   ((uint32_t)0xFF000000)        /* Data byte 7 */
+
+/*******************  Bit definition for CAN_TXMI2R register  *******************/
+#define  CAN_TXMI2R_TXRQ                     ((uint32_t)0x00000001)        /* Transmit Mailbox Request */
+#define  CAN_TXMI2R_RTR                      ((uint32_t)0x00000002)        /* Remote Transmission Request */
+#define  CAN_TXMI2R_IDE                      ((uint32_t)0x00000004)        /* Identifier Extension */
+#define  CAN_TXMI2R_EXID                     ((uint32_t)0x001FFFF8)        /* Extended identifier */
+#define  CAN_TXMI2R_STID                     ((uint32_t)0xFFE00000)        /* Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_TXMDT2R register  ******************/  
+#define  CAN_TXMDT2R_DLC                     ((uint32_t)0x0000000F)        /* Data Length Code */
+#define  CAN_TXMDT2R_TGT                     ((uint32_t)0x00000100)        /* Transmit Global Time */
+#define  CAN_TXMDT2R_TIME                    ((uint32_t)0xFFFF0000)        /* Message Time Stamp */
+
+/*******************  Bit definition for CAN_TXMDL2R register  ******************/
+#define  CAN_TXMDL2R_DATA0                   ((uint32_t)0x000000FF)        /* Data byte 0 */
+#define  CAN_TXMDL2R_DATA1                   ((uint32_t)0x0000FF00)        /* Data byte 1 */
+#define  CAN_TXMDL2R_DATA2                   ((uint32_t)0x00FF0000)        /* Data byte 2 */
+#define  CAN_TXMDL2R_DATA3                   ((uint32_t)0xFF000000)        /* Data byte 3 */
+
+/*******************  Bit definition for CAN_TXMDH2R register  ******************/
+#define  CAN_TXMDH2R_DATA4                   ((uint32_t)0x000000FF)        /* Data byte 4 */
+#define  CAN_TXMDH2R_DATA5                   ((uint32_t)0x0000FF00)        /* Data byte 5 */
+#define  CAN_TXMDH2R_DATA6                   ((uint32_t)0x00FF0000)        /* Data byte 6 */
+#define  CAN_TXMDH2R_DATA7                   ((uint32_t)0xFF000000)        /* Data byte 7 */
+
+/*******************  Bit definition for CAN_RXMI0R register  *******************/
+#define  CAN_RXMI0R_RTR                      ((uint32_t)0x00000002)        /* Remote Transmission Request */
+#define  CAN_RXMI0R_IDE                      ((uint32_t)0x00000004)        /* Identifier Extension */
+#define  CAN_RXMI0R_EXID                     ((uint32_t)0x001FFFF8)        /* Extended Identifier */
+#define  CAN_RXMI0R_STID                     ((uint32_t)0xFFE00000)        /* Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_RXMDT0R register  ******************/
+#define  CAN_RXMDT0R_DLC                     ((uint32_t)0x0000000F)        /* Data Length Code */
+#define  CAN_RXMDT0R_FMI                     ((uint32_t)0x0000FF00)        /* Filter Match Index */
+#define  CAN_RXMDT0R_TIME                    ((uint32_t)0xFFFF0000)        /* Message Time Stamp */
+
+/*******************  Bit definition for CAN_RXMDL0R register  ******************/
+#define  CAN_RXMDL0R_DATA0                   ((uint32_t)0x000000FF)        /* Data byte 0 */
+#define  CAN_RXMDL0R_DATA1                   ((uint32_t)0x0000FF00)        /* Data byte 1 */
+#define  CAN_RXMDL0R_DATA2                   ((uint32_t)0x00FF0000)        /* Data byte 2 */
+#define  CAN_RXMDL0R_DATA3                   ((uint32_t)0xFF000000)        /* Data byte 3 */
+
+/*******************  Bit definition for CAN_RXMDH0R register  ******************/
+#define  CAN_RXMDH0R_DATA4                   ((uint32_t)0x000000FF)        /* Data byte 4 */
+#define  CAN_RXMDH0R_DATA5                   ((uint32_t)0x0000FF00)        /* Data byte 5 */
+#define  CAN_RXMDH0R_DATA6                   ((uint32_t)0x00FF0000)        /* Data byte 6 */
+#define  CAN_RXMDH0R_DATA7                   ((uint32_t)0xFF000000)        /* Data byte 7 */
+
+/*******************  Bit definition for CAN_RXMI1R register  *******************/
+#define  CAN_RXMI1R_RTR                      ((uint32_t)0x00000002)        /* Remote Transmission Request */
+#define  CAN_RXMI1R_IDE                      ((uint32_t)0x00000004)        /* Identifier Extension */
+#define  CAN_RXMI1R_EXID                     ((uint32_t)0x001FFFF8)        /* Extended identifier */
+#define  CAN_RXMI1R_STID                     ((uint32_t)0xFFE00000)        /* Standard Identifier or Extended Identifier */
+
+/*******************  Bit definition for CAN_RXMDT1R register  ******************/
+#define  CAN_RXMDT1R_DLC                     ((uint32_t)0x0000000F)        /* Data Length Code */
+#define  CAN_RXMDT1R_FMI                     ((uint32_t)0x0000FF00)        /* Filter Match Index */
+#define  CAN_RXMDT1R_TIME                    ((uint32_t)0xFFFF0000)        /* Message Time Stamp */
+
+/*******************  Bit definition for CAN_RXMDL1R register  ******************/
+#define  CAN_RXMDL1R_DATA0                   ((uint32_t)0x000000FF)        /* Data byte 0 */
+#define  CAN_RXMDL1R_DATA1                   ((uint32_t)0x0000FF00)        /* Data byte 1 */
+#define  CAN_RXMDL1R_DATA2                   ((uint32_t)0x00FF0000)        /* Data byte 2 */
+#define  CAN_RXMDL1R_DATA3                   ((uint32_t)0xFF000000)        /* Data byte 3 */
+
+/*******************  Bit definition for CAN_RXMDH1R register  ******************/
+#define  CAN_RXMDH1R_DATA4                   ((uint32_t)0x000000FF)        /* Data byte 4 */
+#define  CAN_RXMDH1R_DATA5                   ((uint32_t)0x0000FF00)        /* Data byte 5 */
+#define  CAN_RXMDH1R_DATA6                   ((uint32_t)0x00FF0000)        /* Data byte 6 */
+#define  CAN_RXMDH1R_DATA7                   ((uint32_t)0xFF000000)        /* Data byte 7 */
+
+/*******************  Bit definition for CAN_FCTLR register  ********************/
+#define  CAN_FCTLR_FINIT                     ((uint8_t)0x01)               /* Filter Init Mode */
+#define  CAN_FCTLR_CAN2SB                    ((uint16_t)0x3F00) 
+
+/*******************  Bit definition for CAN_FMCFGR register  *******************/
+#define  CAN_FMCFGR_FBM                      ((uint16_t)0x3FFF)            /* Filter Mode */
+#define  CAN_FMCFGR_FBM0                     ((uint16_t)0x0001)            /* Filter Init Mode bit 0 */
+#define  CAN_FMCFGR_FBM1                     ((uint16_t)0x0002)            /* Filter Init Mode bit 1 */
+#define  CAN_FMCFGR_FBM2                     ((uint16_t)0x0004)            /* Filter Init Mode bit 2 */
+#define  CAN_FMCFGR_FBM3                     ((uint16_t)0x0008)            /* Filter Init Mode bit 3 */
+#define  CAN_FMCFGR_FBM4                     ((uint16_t)0x0010)            /* Filter Init Mode bit 4 */
+#define  CAN_FMCFGR_FBM5                     ((uint16_t)0x0020)            /* Filter Init Mode bit 5 */
+#define  CAN_FMCFGR_FBM6                     ((uint16_t)0x0040)            /* Filter Init Mode bit 6 */
+#define  CAN_FMCFGR_FBM7                     ((uint16_t)0x0080)            /* Filter Init Mode bit 7 */
+#define  CAN_FMCFGR_FBM8                     ((uint16_t)0x0100)            /* Filter Init Mode bit 8 */
+#define  CAN_FMCFGR_FBM9                     ((uint16_t)0x0200)            /* Filter Init Mode bit 9 */
+#define  CAN_FMCFGR_FBM10                    ((uint16_t)0x0400)            /* Filter Init Mode bit 10 */
+#define  CAN_FMCFGR_FBM11                    ((uint16_t)0x0800)            /* Filter Init Mode bit 11 */
+#define  CAN_FMCFGR_FBM12                    ((uint16_t)0x1000)            /* Filter Init Mode bit 12 */
+#define  CAN_FMCFGR_FBM13                    ((uint16_t)0x2000)            /* Filter Init Mode bit 13 */
+#define  CAN_FMCFGR_FBM14                    ((uint16_t)0x4000)            /* Filter Init Mode bit 14 */
+#define  CAN_FMCFGR_FBM15                    ((uint16_t)0x8000)            /* Filter Init Mode bit 15 */
+#define  CAN_FMCFGR_FBM16                    ((uint32_t)0x10000)           /* Filter Init Mode bit 16 */
+#define  CAN_FMCFGR_FBM17                    ((uint32_t)0x20000)           /* Filter Init Mode bit 17 */
+#define  CAN_FMCFGR_FBM18                    ((uint32_t)0x40000)           /* Filter Init Mode bit 18 */
+#define  CAN_FMCFGR_FBM19                    ((uint32_t)0x80000)           /* Filter Init Mode bit 19 */
+#define  CAN_FMCFGR_FBM20                    ((uint32_t)0x100000)          /* Filter Init Mode bit 20 */
+#define  CAN_FMCFGR_FBM21                    ((uint32_t)0x200000)          /* Filter Init Mode bit 21 */
+#define  CAN_FMCFGR_FBM22                    ((uint32_t)0x400000)          /* Filter Init Mode bit 22 */
+#define  CAN_FMCFGR_FBM23                    ((uint32_t)0x800000)          /* Filter Init Mode bit 23 */
+#define  CAN_FMCFGR_FBM24                    ((uint32_t)0x1000000)         /* Filter Init Mode bit 24 */
+#define  CAN_FMCFGR_FBM25                    ((uint32_t)0x2000000)         /* Filter Init Mode bit 25 */
+#define  CAN_FMCFGR_FBM26                    ((uint32_t)0x4000000)         /* Filter Init Mode bit 26 */
+#define  CAN_FMCFGR_FBM27                    ((uint32_t)0x8000000)         /* Filter Init Mode bit 27 */
+
+/*******************  Bit definition for CAN_FSCFGR register  *******************/
+#define  CAN_FSCFGR_FSC                      ((uint16_t)0x3FFF)            /* Filter Scale Configuration */
+#define  CAN_FSCFGR_FSC0                     ((uint16_t)0x0001)            /* Filter Scale Configuration bit 0 */
+#define  CAN_FSCFGR_FSC1                     ((uint16_t)0x0002)            /* Filter Scale Configuration bit 1 */
+#define  CAN_FSCFGR_FSC2                     ((uint16_t)0x0004)            /* Filter Scale Configuration bit 2 */
+#define  CAN_FSCFGR_FSC3                     ((uint16_t)0x0008)            /* Filter Scale Configuration bit 3 */
+#define  CAN_FSCFGR_FSC4                     ((uint16_t)0x0010)            /* Filter Scale Configuration bit 4 */
+#define  CAN_FSCFGR_FSC5                     ((uint16_t)0x0020)            /* Filter Scale Configuration bit 5 */
+#define  CAN_FSCFGR_FSC6                     ((uint16_t)0x0040)            /* Filter Scale Configuration bit 6 */
+#define  CAN_FSCFGR_FSC7                     ((uint16_t)0x0080)            /* Filter Scale Configuration bit 7 */
+#define  CAN_FSCFGR_FSC8                     ((uint16_t)0x0100)            /* Filter Scale Configuration bit 8 */
+#define  CAN_FSCFGR_FSC9                     ((uint16_t)0x0200)            /* Filter Scale Configuration bit 9 */
+#define  CAN_FSCFGR_FSC10                    ((uint16_t)0x0400)            /* Filter Scale Configuration bit 10 */
+#define  CAN_FSCFGR_FSC11                    ((uint16_t)0x0800)            /* Filter Scale Configuration bit 11 */
+#define  CAN_FSCFGR_FSC12                    ((uint16_t)0x1000)            /* Filter Scale Configuration bit 12 */
+#define  CAN_FSCFGR_FSC13                    ((uint16_t)0x2000)            /* Filter Scale Configuration bit 13 */
+#define  CAN_FSCFGR_FSC14                    ((uint16_t)0x4000)            /* Filter Scale Configuration bit 14 */
+#define  CAN_FSCFGR_FSC15                    ((uint16_t)0x8000)            /* Filter Scale Configuration bit 15 */
+#define  CAN_FSCFGR_FSC16                    ((uint32_t)0x10000)           /* Filter Scale Configuration bit 16 */
+#define  CAN_FSCFGR_FSC17                    ((uint32_t)0x20000)           /* Filter Scale Configuration bit 17 */
+#define  CAN_FSCFGR_FSC18                    ((uint32_t)0x40000)           /* Filter Scale Configuration bit 18 */
+#define  CAN_FSCFGR_FSC19                    ((uint32_t)0x80000)           /* Filter Scale Configuration bit 19 */
+#define  CAN_FSCFGR_FSC20                    ((uint32_t)0x100000)          /* Filter Scale Configuration bit 20 */
+#define  CAN_FSCFGR_FSC21                    ((uint32_t)0x200000)          /* Filter Scale Configuration bit 21 */
+#define  CAN_FSCFGR_FSC22                    ((uint32_t)0x400000)          /* Filter Scale Configuration bit 22 */
+#define  CAN_FSCFGR_FSC23                    ((uint32_t)0x800000)          /* Filter Scale Configuration bit 23 */
+#define  CAN_FSCFGR_FSC24                    ((uint32_t)0x1000000)         /* Filter Scale Configuration bit 24 */
+#define  CAN_FSCFGR_FSC25                    ((uint32_t)0x2000000)         /* Filter Scale Configuration bit 25 */
+#define  CAN_FSCFGR_FSC26                    ((uint32_t)0x4000000)         /* Filter Scale Configuration bit 26 */
+#define  CAN_FSCFGR_FSC27                    ((uint32_t)0x8000000)         /* Filter Scale Configuration bit 27 */
+
+/******************  Bit definition for CAN_FAFIFOR register  *******************/
+#define  CAN_FAFIFOR_FFA                     ((uint16_t)0x3FFF)            /* Filter FIFO Assignment */
+#define  CAN_FAFIFOR_FFA0                    ((uint16_t)0x0001)            /* Filter FIFO Assignment for Filter 0 */
+#define  CAN_FAFIFOR_FFA1                    ((uint16_t)0x0002)            /* Filter FIFO Assignment for Filter 1 */
+#define  CAN_FAFIFOR_FFA2                    ((uint16_t)0x0004)            /* Filter FIFO Assignment for Filter 2 */
+#define  CAN_FAFIFOR_FFA3                    ((uint16_t)0x0008)            /* Filter FIFO Assignment for Filter 3 */
+#define  CAN_FAFIFOR_FFA4                    ((uint16_t)0x0010)            /* Filter FIFO Assignment for Filter 4 */
+#define  CAN_FAFIFOR_FFA5                    ((uint16_t)0x0020)            /* Filter FIFO Assignment for Filter 5 */
+#define  CAN_FAFIFOR_FFA6                    ((uint16_t)0x0040)            /* Filter FIFO Assignment for Filter 6 */
+#define  CAN_FAFIFOR_FFA7                    ((uint16_t)0x0080)            /* Filter FIFO Assignment for Filter 7 */
+#define  CAN_FAFIFOR_FFA8                    ((uint16_t)0x0100)            /* Filter FIFO Assignment for Filter 8 */
+#define  CAN_FAFIFOR_FFA9                    ((uint16_t)0x0200)            /* Filter FIFO Assignment for Filter 9 */
+#define  CAN_FAFIFOR_FFA10                   ((uint16_t)0x0400)            /* Filter FIFO Assignment for Filter 10 */
+#define  CAN_FAFIFOR_FFA11                   ((uint16_t)0x0800)            /* Filter FIFO Assignment for Filter 11 */
+#define  CAN_FAFIFOR_FFA12                   ((uint16_t)0x1000)            /* Filter FIFO Assignment for Filter 12 */
+#define  CAN_FAFIFOR_FFA13                   ((uint16_t)0x2000)            /* Filter FIFO Assignment for Filter 13 */
+#define  CAN_FAFIFOR_FFA14                   ((uint32_t)0x4000)            /* Filter FIFO Assignment for Filter 14 */
+#define  CAN_FAFIFOR_FFA15                   ((uint32_t)0x8000)            /* Filter FIFO Assignment for Filter 15 */
+#define  CAN_FAFIFOR_FFA16                   ((uint32_t)0x10000)           /* Filter FIFO Assignment for Filter 16 */
+#define  CAN_FAFIFOR_FFA17                   ((uint32_t)0x20000)           /* Filter FIFO Assignment for Filter 17 */
+#define  CAN_FAFIFOR_FFA18                   ((uint32_t)0x40000)           /* Filter FIFO Assignment for Filter 18 */
+#define  CAN_FAFIFOR_FFA19                   ((uint32_t)0x80000)           /* Filter FIFO Assignment for Filter 19 */
+#define  CAN_FAFIFOR_FFA20                   ((uint32_t)0x100000)          /* Filter FIFO Assignment for Filter 20 */
+#define  CAN_FAFIFOR_FFA21                   ((uint32_t)0x200000)          /* Filter FIFO Assignment for Filter 21 */
+#define  CAN_FAFIFOR_FFA22                   ((uint32_t)0x400000)          /* Filter FIFO Assignment for Filter 22 */
+#define  CAN_FAFIFOR_FFA23                   ((uint32_t)0x800000)          /* Filter FIFO Assignment for Filter 23 */
+#define  CAN_FAFIFOR_FFA24                   ((uint32_t)0x1000000)         /* Filter FIFO Assignment for Filter 24 */
+#define  CAN_FAFIFOR_FFA25                   ((uint32_t)0x2000000)         /* Filter FIFO Assignment for Filter 25 */
+#define  CAN_FAFIFOR_FFA26                   ((uint32_t)0x4000000)         /* Filter FIFO Assignment for Filter 26 */
+#define  CAN_FAFIFOR_FFA27                   ((uint32_t)0x8000000)         /* Filter FIFO Assignment for Filter 27 */
+
+/*******************  Bit definition for CAN_FWR register  *******************/
+#define  CAN_FWR_FACT                        ((uint16_t)0x3FFF)            /* Filter Active */
+#define  CAN_FWR_FACT0                       ((uint16_t)0x0001)            /* Filter 0 Active */
+#define  CAN_FWR_FACT1                       ((uint16_t)0x0002)            /* Filter 1 Active */
+#define  CAN_FWR_FACT2                       ((uint16_t)0x0004)            /* Filter 2 Active */
+#define  CAN_FWR_FACT3                       ((uint16_t)0x0008)            /* Filter 3 Active */
+#define  CAN_FWR_FACT4                       ((uint16_t)0x0010)            /* Filter 4 Active */
+#define  CAN_FWR_FACT5                       ((uint16_t)0x0020)            /* Filter 5 Active */
+#define  CAN_FWR_FACT6                       ((uint16_t)0x0040)            /* Filter 6 Active */
+#define  CAN_FWR_FACT7                       ((uint16_t)0x0080)            /* Filter 7 Active */
+#define  CAN_FWR_FACT8                       ((uint16_t)0x0100)            /* Filter 8 Active */
+#define  CAN_FWR_FACT9                       ((uint16_t)0x0200)            /* Filter 9 Active */
+#define  CAN_FWR_FACT10                      ((uint16_t)0x0400)            /* Filter 10 Active */
+#define  CAN_FWR_FACT11                      ((uint16_t)0x0800)            /* Filter 11 Active */
+#define  CAN_FWR_FACT12                      ((uint16_t)0x1000)            /* Filter 12 Active */
+#define  CAN_FWR_FACT13                      ((uint16_t)0x2000)            /* Filter 13 Active */
+#define  CAN_FWR_FACT14                      ((uint16_t)0x4000)            /* Filter 14 Active */
+#define  CAN_FWR_FACT15                      ((uint16_t)0x8000)            /* Filter 15 Active */
+#define  CAN_FWR_FACT16                      ((uint32_t)0x10000)           /* Filter 16 Active */
+#define  CAN_FWR_FACT17                      ((uint32_t)0x20000)           /* Filter 17 Active */
+#define  CAN_FWR_FACT18                      ((uint32_t)0x40000)           /* Filter 18 Active */
+#define  CAN_FWR_FACT19                      ((uint32_t)0x80000)           /* Filter 19 Active */
+#define  CAN_FWR_FACT20                      ((uint32_t)0x100000)          /* Filter 20 Active */
+#define  CAN_FWR_FACT21                      ((uint32_t)0x200000)          /* Filter 21 Active */
+#define  CAN_FWR_FACT22                      ((uint32_t)0x400000)          /* Filter 22 Active */
+#define  CAN_FWR_FACT23                      ((uint32_t)0x800000)          /* Filter 23 Active */
+#define  CAN_FWR_FACT24                      ((uint32_t)0x1000000)         /* Filter 24 Active */
+#define  CAN_FWR_FACT25                      ((uint32_t)0x2000000)         /* Filter 25 Active */
+#define  CAN_FWR_FACT26                      ((uint32_t)0x4000000)         /* Filter 26 Active */
+#define  CAN_FWR_FACT27                      ((uint32_t)0x8000000)         /* Filter 27 Active */
+
+/*******************  Bit definition for CAN_F0R1 register  *******************/
+#define  CAN_F0R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F0R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F0R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F0R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F0R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F0R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F0R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F0R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F0R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F0R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F0R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F0R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F0R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F0R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F0R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F0R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F0R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F0R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F0R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F0R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F0R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F0R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F0R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F0R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F0R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F0R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F0R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F0R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F0R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F0R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F0R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F0R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F1R1 register  *******************/
+#define  CAN_F1R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F1R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F1R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F1R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F1R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F1R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F1R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F1R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F1R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F1R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F1R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F1R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F1R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F1R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F1R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F1R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F1R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F1R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F1R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F1R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F1R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F1R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F1R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F1R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F1R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F1R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F1R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F1R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F1R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F1R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F1R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F1R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F2R1 register  *******************/
+#define  CAN_F2R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F2R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F2R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F2R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F2R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F2R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F2R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F2R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F2R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F2R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F2R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F2R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F2R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F2R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F2R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F2R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F2R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F2R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F2R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F2R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F2R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F2R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F2R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F2R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F2R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F2R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F2R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F2R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F2R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F2R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F2R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F2R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F3R1 register  *******************/
+#define  CAN_F3R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F3R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F3R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F3R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F3R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F3R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F3R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F3R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F3R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F3R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F3R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F3R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F3R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F3R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F3R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F3R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F3R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F3R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F3R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F3R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F3R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F3R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F3R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F3R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F3R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F3R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F3R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F3R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F3R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F3R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F3R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F3R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F4R1 register  *******************/
+#define  CAN_F4R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F4R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F4R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F4R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F4R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F4R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F4R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F4R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F4R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F4R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F4R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F4R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F4R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F4R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F4R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F4R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F4R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F4R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F4R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F4R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F4R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F4R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F4R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F4R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F4R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F4R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F4R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F4R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F4R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F4R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F4R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F4R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F5R1 register  *******************/
+#define  CAN_F5R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F5R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F5R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F5R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F5R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F5R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F5R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F5R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F5R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F5R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F5R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F5R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F5R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F5R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F5R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F5R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F5R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F5R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F5R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F5R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F5R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F5R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F5R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F5R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F5R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F5R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F5R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F5R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F5R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F5R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F5R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F5R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F6R1 register  *******************/
+#define  CAN_F6R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F6R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F6R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F6R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F6R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F6R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F6R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F6R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F6R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F6R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F6R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F6R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F6R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F6R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F6R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F6R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F6R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F6R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F6R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F6R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F6R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F6R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F6R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F6R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F6R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F6R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F6R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F6R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F6R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F6R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F6R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F6R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F7R1 register  *******************/
+#define  CAN_F7R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F7R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F7R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F7R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F7R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F7R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F7R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F7R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F7R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F7R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F7R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F7R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F7R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F7R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F7R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F7R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F7R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F7R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F7R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F7R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F7R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F7R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F7R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F7R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F7R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F7R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F7R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F7R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F7R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F7R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F7R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F7R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F8R1 register  *******************/
+#define  CAN_F8R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F8R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F8R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F8R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F8R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F8R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F8R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F8R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F8R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F8R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F8R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F8R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F8R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F8R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F8R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F8R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F8R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F8R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F8R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F8R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F8R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F8R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F8R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F8R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F8R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F8R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F8R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F8R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F8R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F8R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F8R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F8R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F9R1 register  *******************/
+#define  CAN_F9R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F9R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F9R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F9R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F9R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F9R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F9R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F9R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F9R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F9R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F9R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F9R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F9R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F9R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F9R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F9R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F9R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F9R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F9R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F9R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F9R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F9R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F9R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F9R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F9R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F9R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F9R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F9R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F9R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F9R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F9R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F9R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F10R1 register  ******************/
+#define  CAN_F10R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F10R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F10R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F10R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F10R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F10R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F10R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F10R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F10R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F10R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F10R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F10R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F10R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F10R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F10R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F10R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F10R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F10R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F10R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F10R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F10R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F10R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F10R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F10R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F10R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F10R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F10R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F10R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F10R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F10R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F10R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F10R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F11R1 register  ******************/
+#define  CAN_F11R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F11R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F11R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F11R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F11R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F11R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F11R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F11R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F11R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F11R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F11R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F11R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F11R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F11R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F11R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F11R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F11R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F11R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F11R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F11R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F11R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F11R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F11R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F11R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F11R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F11R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F11R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F11R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F11R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F11R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F11R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F11R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F12R1 register  ******************/
+#define  CAN_F12R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F12R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F12R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F12R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F12R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F12R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F12R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F12R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F12R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F12R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F12R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F12R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F12R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F12R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F12R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F12R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F12R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F12R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F12R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F12R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F12R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F12R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F12R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F12R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F12R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F12R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F12R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F12R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F12R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F12R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F12R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F12R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F13R1 register  ******************/
+#define  CAN_F13R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F13R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F13R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F13R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F13R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F13R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F13R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F13R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F13R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F13R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F13R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F13R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F13R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F13R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F13R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F13R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F13R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F13R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F13R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F13R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F13R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F13R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F13R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F13R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F13R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F13R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F13R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F13R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F13R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F13R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F13R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F13R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F14R1 register  ******************/
+#define  CAN_F14R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F14R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F14R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F14R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F14R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F14R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F14R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F14R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F14R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F14R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F14R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F14R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F14R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F14R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F14R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F14R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F14R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F14R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F14R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F14R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F14R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F14R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F14R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F14R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F14R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F14R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F14R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F14R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F14R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F14R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F14R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F14R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+
+/*******************  Bit definition for CAN_F15R1 register  *******************/
+#define  CAN_F15R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F15R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F15R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F15R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F15R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F15R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F15R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F15R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F15R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F15R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F15R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F15R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F15R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F15R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F15R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F15R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F15R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F15R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F15R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F15R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F15R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F15R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F15R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F15R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F15R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F15R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F15R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F15R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F15R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F15R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F15R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F15R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F16R1 register  *******************/
+#define  CAN_F16R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F16R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F16R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F16R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F16R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F16R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F16R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F16R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F16R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F16R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F16R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F16R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F16R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F16R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F16R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F16R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F16R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F16R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F16R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F16R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F16R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F16R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F16R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F16R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F16R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F16R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F16R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F16R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F16R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F16R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F16R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F16R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F17R1 register  *******************/
+#define  CAN_F17R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F17R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F17R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F17R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F17R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F17R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F17R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F17R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F17R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F17R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F17R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F17R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F17R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F17R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F17R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F17R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F17R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F17R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F17R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F17R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F17R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F17R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F17R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F17R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F17R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F17R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F17R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F17R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F17R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F17R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F17R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F17R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F18R1 register  *******************/
+#define  CAN_F18R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F18R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F18R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F18R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F18R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F18R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F18R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F18R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F18R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F18R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F18R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F18R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F18R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F18R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F18R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F18R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F18R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F18R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F18R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F18R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F18R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F18R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F18R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F18R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F18R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F18R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F18R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F18R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F18R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F18R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F18R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F18R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F19R1 register  *******************/
+#define  CAN_F19R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F19R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F19R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F19R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F19R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F19R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F19R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F19R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F19R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F19R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F19R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F19R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F19R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F19R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F19R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F19R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F19R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F19R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F19R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F19R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F19R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F19R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F19R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F19R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F19R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F19R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F19R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F19R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F19R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F19R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F19R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F19R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F20R1 register  *******************/
+#define  CAN_F20R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F20R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F20R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F20R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F20R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F20R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F20R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F20R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F20R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F20R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F20R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F20R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F20R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F20R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F20R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F20R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F20R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F20R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F20R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F20R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F20R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F20R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F20R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F20R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F20R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F20R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F20R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F20R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F20R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F20R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F20R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F20R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F21R1 register  *******************/
+#define  CAN_F21R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F21R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F21R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F21R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F21R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F21R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F21R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F21R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F21R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F21R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F21R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F21R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F21R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F21R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F21R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F21R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F21R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F21R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F21R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F21R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F21R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F21R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F21R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F21R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F21R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F21R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F21R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F21R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F21R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F21R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F21R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F21R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F22R1 register  *******************/
+#define  CAN_F22R1_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F22R1_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F22R1_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F22R1_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F22R1_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F22R1_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F22R1_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F22R1_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F22R1_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F22R1_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F22R1_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F22R1_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F22R1_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F22R1_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F22R1_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F22R1_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F22R1_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F22R1_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F22R1_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F22R1_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F22R1_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F22R1_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F22R1_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F22R1_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F22R1_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F22R1_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F22R1_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F22R1_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F22R1_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F22R1_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F22R1_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F22R1_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F23R1 register  ******************/
+#define  CAN_F23R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F23R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F23R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F23R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F23R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F23R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F23R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F23R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F23R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F23R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F23R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F23R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F23R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F23R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F23R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F23R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F23R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F23R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F23R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F23R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F23R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F23R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F23R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F23R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F23R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F23R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F23R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F23R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F23R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F23R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F23R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F23R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F24R1 register  ******************/
+#define  CAN_F24R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F24R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F24R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F24R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F24R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F24R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F24R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F24R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F24R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F24R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F24R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F24R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F24R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F24R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F24R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F24R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F24R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F24R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F24R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F24R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F24R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F24R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F24R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F24R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F24R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F24R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F24R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F24R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F24R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F24R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F24R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F24R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F25R1 register  ******************/
+#define  CAN_F25R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F25R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F25R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F25R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F25R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F25R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F25R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F25R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F25R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F25R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F25R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F25R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F25R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F25R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F25R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F25R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F25R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F25R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F25R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F25R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F25R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F25R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F25R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F25R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F25R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F25R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F25R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F25R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F25R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F25R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F25R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F25R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F26R1 register  ******************/
+#define  CAN_F26R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F26R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F26R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F26R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F26R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F26R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F26R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F26R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F26R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F26R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F26R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F26R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F26R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F26R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F26R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F26R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F26R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F26R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F26R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F26R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F26R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F26R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F26R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F26R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F26R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F26R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F26R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F26R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F26R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F26R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F26R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F26R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F27R1 register  ******************/
+#define  CAN_F27R1_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F27R1_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F27R1_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F27R1_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F27R1_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F27R1_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F27R1_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F27R1_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F27R1_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F27R1_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F27R1_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F27R1_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F27R1_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F27R1_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F27R1_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F27R1_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F27R1_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F27R1_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F27R1_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F27R1_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F27R1_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F27R1_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F27R1_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F27R1_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F27R1_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F27R1_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F27R1_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F27R1_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F27R1_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F27R1_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F27R1_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F27R1_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F0R2 register  *******************/
+#define  CAN_F0R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F0R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F0R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F0R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F0R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F0R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F0R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F0R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F0R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F0R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F0R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F0R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F0R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F0R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F0R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F0R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F0R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F0R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F0R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F0R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F0R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F0R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F0R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F0R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F0R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F0R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F0R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F0R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F0R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F0R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F0R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F0R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F1R2 register  *******************/
+#define  CAN_F1R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F1R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F1R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F1R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F1R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F1R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F1R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F1R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F1R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F1R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F1R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F1R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F1R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F1R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F1R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F1R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F1R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F1R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F1R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F1R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F1R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F1R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F1R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F1R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F1R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F1R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F1R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F1R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F1R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F1R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F1R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F1R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F2R2 register  *******************/
+#define  CAN_F2R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F2R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F2R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F2R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F2R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F2R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F2R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F2R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F2R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F2R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F2R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F2R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F2R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F2R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F2R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F2R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F2R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F2R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F2R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F2R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F2R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F2R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F2R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F2R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F2R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F2R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F2R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F2R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F2R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F2R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F2R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F2R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F3R2 register  *******************/
+#define  CAN_F3R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F3R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F3R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F3R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F3R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F3R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F3R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F3R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F3R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F3R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F3R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F3R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F3R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F3R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F3R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F3R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F3R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F3R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F3R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F3R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F3R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F3R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F3R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F3R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F3R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F3R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F3R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F3R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F3R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F3R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F3R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F3R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F4R2 register  *******************/
+#define  CAN_F4R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F4R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F4R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F4R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F4R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F4R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F4R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F4R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F4R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F4R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F4R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F4R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F4R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F4R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F4R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F4R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F4R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F4R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F4R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F4R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F4R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F4R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F4R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F4R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F4R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F4R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F4R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F4R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F4R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F4R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F4R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F4R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F5R2 register  *******************/
+#define  CAN_F5R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F5R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F5R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F5R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F5R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F5R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F5R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F5R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F5R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F5R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F5R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F5R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F5R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F5R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F5R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F5R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F5R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F5R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F5R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F5R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F5R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F5R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F5R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F5R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F5R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F5R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F5R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F5R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F5R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F5R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F5R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F5R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F6R2 register  *******************/
+#define  CAN_F6R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F6R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F6R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F6R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F6R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F6R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F6R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F6R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F6R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F6R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F6R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F6R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F6R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F6R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F6R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F6R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F6R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F6R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F6R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F6R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F6R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F6R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F6R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F6R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F6R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F6R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F6R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F6R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F6R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F6R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F6R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F6R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F7R2 register  *******************/
+#define  CAN_F7R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F7R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F7R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F7R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F7R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F7R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F7R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F7R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F7R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F7R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F7R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F7R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F7R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F7R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F7R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F7R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F7R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F7R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F7R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F7R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F7R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F7R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F7R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F7R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F7R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F7R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F7R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F7R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F7R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F7R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F7R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F7R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F8R2 register  *******************/
+#define  CAN_F8R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F8R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F8R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F8R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F8R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F8R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F8R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F8R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F8R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F8R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F8R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F8R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F8R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F8R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F8R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F8R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F8R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F8R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F8R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F8R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F8R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F8R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F8R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F8R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F8R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F8R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F8R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F8R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F8R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F8R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F8R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F8R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F9R2 register  *******************/
+#define  CAN_F9R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F9R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F9R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F9R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F9R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F9R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F9R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F9R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F9R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F9R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F9R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F9R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F9R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F9R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F9R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F9R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F9R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F9R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F9R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F9R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F9R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F9R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F9R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F9R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F9R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F9R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F9R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F9R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F9R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F9R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F9R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F9R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F10R2 register  ******************/
+#define  CAN_F10R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F10R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F10R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F10R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F10R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F10R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F10R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F10R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F10R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F10R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F10R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F10R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F10R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F10R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F10R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F10R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F10R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F10R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F10R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F10R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F10R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F10R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F10R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F10R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F10R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F10R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F10R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F10R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F10R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F10R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F10R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F10R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F11R2 register  ******************/
+#define  CAN_F11R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F11R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F11R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F11R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F11R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F11R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F11R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F11R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F11R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F11R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F11R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F11R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F11R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F11R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F11R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F11R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F11R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F11R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F11R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F11R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F11R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F11R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F11R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F11R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F11R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F11R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F11R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F11R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F11R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F11R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F11R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F11R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F12R2 register  ******************/
+#define  CAN_F12R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F12R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F12R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F12R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F12R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F12R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F12R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F12R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F12R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F12R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F12R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F12R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F12R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F12R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F12R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F12R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F12R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F12R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F12R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F12R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F12R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F12R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F12R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F12R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F12R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F12R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F12R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F12R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F12R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F12R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F12R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F12R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F13R2 register  ******************/
+#define  CAN_F13R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F13R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F13R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F13R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F13R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F13R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F13R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F13R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F13R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F13R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F13R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F13R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F13R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F13R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F13R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F13R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F13R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F13R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F13R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F13R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F13R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F13R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F13R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F13R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F13R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F13R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F13R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F13R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F13R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F13R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F13R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F13R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F14R2 register  *******************/
+#define  CAN_F14R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F14R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F14R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F14R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F14R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F14R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F14R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F14R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F14R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F14R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F14R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F14R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F14R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F14R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F14R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F14R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F14R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F14R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F14R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F14R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F14R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F14R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F14R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F14R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F14R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F14R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F14R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F14R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F14R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F14R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F14R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F14R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F15R2 register  *******************/
+#define  CAN_F15R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F15R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F15R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F15R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F15R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F15R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F15R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F15R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F15R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F15R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F15R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F15R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F15R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F15R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F15R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F15R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F15R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F15R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F15R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F15R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F15R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F15R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F15R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F15R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F15R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F15R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F15R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F15R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F15R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F15R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F15R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F15R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F16R2 register  *******************/
+#define  CAN_F16R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F16R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F16R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F16R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F16R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F16R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F16R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F16R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F16R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F16R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F16R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F16R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F16R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F16R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F16R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F16R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F16R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F16R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F16R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F16R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F16R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F16R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F16R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F16R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F16R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F16R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F16R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F16R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F16R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F16R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F16R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F16R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F17R2 register  *******************/
+#define  CAN_F17R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F17R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F17R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F17R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F17R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F17R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F17R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F17R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F17R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F17R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F17R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F17R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F17R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F17R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F17R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F17R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F17R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F17R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F17R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F17R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F17R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F17R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F17R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F17R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F17R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F17R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F17R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F17R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F17R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F17R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F17R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F17R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F18R2 register  *******************/
+#define  CAN_F18R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F18R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F18R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F18R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F18R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F18R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F18R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F18R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F18R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F18R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F18R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F18R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F18R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F18R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F18R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F18R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F18R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F18R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F18R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F18R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F18R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F18R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F18R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F18R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F18R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F18R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F18R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F18R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F18R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F18R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F18R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F18R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F19R2 register  *******************/
+#define  CAN_F19R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F19R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F19R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F19R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F19R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F19R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F19R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F19R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F19R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F19R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F19R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F19R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F19R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F19R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F19R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F19R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F19R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F19R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F19R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F19R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F19R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F19R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F19R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F19R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F19R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F19R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F19R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F19R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F19R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F19R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F19R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F19R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F20R2 register  *******************/
+#define  CAN_F20R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F20R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F20R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F20R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F20R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F20R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F20R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F20R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F20R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F20R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F20R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F20R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F20R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F20R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F20R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F20R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F20R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F20R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F20R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F20R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F20R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F20R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F20R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F20R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F20R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F20R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F20R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F20R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F20R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F20R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F20R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F20R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F21R2 register  *******************/
+#define  CAN_F21R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F21R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F21R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F21R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F21R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F21R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F21R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F21R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F21R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F21R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F21R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F21R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F21R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F21R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F21R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F21R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F21R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F21R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F21R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F21R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F21R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F21R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F21R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F21R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F21R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F21R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F21R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F21R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F21R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F21R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F21R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F21R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F22R2 register  *******************/
+#define  CAN_F22R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F22R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F22R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F22R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F22R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F22R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F22R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F22R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F22R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F22R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F22R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F22R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F22R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F22R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F22R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F22R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F22R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F22R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F22R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F22R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F22R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F22R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F22R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F22R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F22R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F22R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F22R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F22R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F22R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F22R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F22R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F22R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F23R2 register  *******************/
+#define  CAN_F23R2_FB0                        ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F23R2_FB1                        ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F23R2_FB2                        ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F23R2_FB3                        ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F23R2_FB4                        ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F23R2_FB5                        ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F23R2_FB6                        ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F23R2_FB7                        ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F23R2_FB8                        ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F23R2_FB9                        ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F23R2_FB10                       ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F23R2_FB11                       ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F23R2_FB12                       ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F23R2_FB13                       ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F23R2_FB14                       ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F23R2_FB15                       ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F23R2_FB16                       ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F23R2_FB17                       ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F23R2_FB18                       ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F23R2_FB19                       ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F23R2_FB20                       ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F23R2_FB21                       ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F23R2_FB22                       ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F23R2_FB23                       ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F23R2_FB24                       ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F23R2_FB25                       ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F23R2_FB26                       ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F23R2_FB27                       ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F23R2_FB28                       ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F23R2_FB29                       ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F23R2_FB30                       ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F23R2_FB31                       ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F24R2 register  ******************/
+#define  CAN_F24R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F24R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F24R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F24R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F24R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F24R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F24R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F24R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F24R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F24R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F24R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F24R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F24R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F24R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F24R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F24R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F24R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F24R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F24R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F24R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F24R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F24R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F24R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F24R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F24R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F24R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F24R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F24R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F24R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F24R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F24R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F24R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F25R2 register  ******************/
+#define  CAN_F25R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F25R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F25R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F25R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F25R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F25R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F25R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F25R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F25R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F25R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F25R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F25R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F25R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F25R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F25R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F25R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F25R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F25R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F25R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F25R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F25R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F25R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F25R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F25R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F25R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F25R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F25R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F25R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F25R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F25R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F25R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F25R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F26R2 register  ******************/
+#define  CAN_F26R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F26R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F26R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F26R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F26R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F26R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F26R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F26R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F26R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F26R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F26R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F26R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F26R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F26R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F26R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F26R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F26R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F26R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F26R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F26R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F26R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F26R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F26R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F26R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F26R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F26R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F26R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F26R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F26R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F26R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F26R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F26R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/*******************  Bit definition for CAN_F27R2 register  ******************/
+#define  CAN_F27R2_FB0                       ((uint32_t)0x00000001)        /* Filter bit 0 */
+#define  CAN_F27R2_FB1                       ((uint32_t)0x00000002)        /* Filter bit 1 */
+#define  CAN_F27R2_FB2                       ((uint32_t)0x00000004)        /* Filter bit 2 */
+#define  CAN_F27R2_FB3                       ((uint32_t)0x00000008)        /* Filter bit 3 */
+#define  CAN_F27R2_FB4                       ((uint32_t)0x00000010)        /* Filter bit 4 */
+#define  CAN_F27R2_FB5                       ((uint32_t)0x00000020)        /* Filter bit 5 */
+#define  CAN_F27R2_FB6                       ((uint32_t)0x00000040)        /* Filter bit 6 */
+#define  CAN_F27R2_FB7                       ((uint32_t)0x00000080)        /* Filter bit 7 */
+#define  CAN_F27R2_FB8                       ((uint32_t)0x00000100)        /* Filter bit 8 */
+#define  CAN_F27R2_FB9                       ((uint32_t)0x00000200)        /* Filter bit 9 */
+#define  CAN_F27R2_FB10                      ((uint32_t)0x00000400)        /* Filter bit 10 */
+#define  CAN_F27R2_FB11                      ((uint32_t)0x00000800)        /* Filter bit 11 */
+#define  CAN_F27R2_FB12                      ((uint32_t)0x00001000)        /* Filter bit 12 */
+#define  CAN_F27R2_FB13                      ((uint32_t)0x00002000)        /* Filter bit 13 */
+#define  CAN_F27R2_FB14                      ((uint32_t)0x00004000)        /* Filter bit 14 */
+#define  CAN_F27R2_FB15                      ((uint32_t)0x00008000)        /* Filter bit 15 */
+#define  CAN_F27R2_FB16                      ((uint32_t)0x00010000)        /* Filter bit 16 */
+#define  CAN_F27R2_FB17                      ((uint32_t)0x00020000)        /* Filter bit 17 */
+#define  CAN_F27R2_FB18                      ((uint32_t)0x00040000)        /* Filter bit 18 */
+#define  CAN_F27R2_FB19                      ((uint32_t)0x00080000)        /* Filter bit 19 */
+#define  CAN_F27R2_FB20                      ((uint32_t)0x00100000)        /* Filter bit 20 */
+#define  CAN_F27R2_FB21                      ((uint32_t)0x00200000)        /* Filter bit 21 */
+#define  CAN_F27R2_FB22                      ((uint32_t)0x00400000)        /* Filter bit 22 */
+#define  CAN_F27R2_FB23                      ((uint32_t)0x00800000)        /* Filter bit 23 */
+#define  CAN_F27R2_FB24                      ((uint32_t)0x01000000)        /* Filter bit 24 */
+#define  CAN_F27R2_FB25                      ((uint32_t)0x02000000)        /* Filter bit 25 */
+#define  CAN_F27R2_FB26                      ((uint32_t)0x04000000)        /* Filter bit 26 */
+#define  CAN_F27R2_FB27                      ((uint32_t)0x08000000)        /* Filter bit 27 */
+#define  CAN_F27R2_FB28                      ((uint32_t)0x10000000)        /* Filter bit 28 */
+#define  CAN_F27R2_FB29                      ((uint32_t)0x20000000)        /* Filter bit 29 */
+#define  CAN_F27R2_FB30                      ((uint32_t)0x40000000)        /* Filter bit 30 */
+#define  CAN_F27R2_FB31                      ((uint32_t)0x80000000)        /* Filter bit 31 */
+
+/******************************************************************************/
+/*                          CRC Calculation Unit                              */
+/******************************************************************************/
+
+/*******************  Bit definition for CRC_DATAR register  *********************/
+#define  CRC_DATAR_DR                           ((uint32_t)0xFFFFFFFF) /* Data register bits */
+
+
+/*******************  Bit definition for CRC_IDATAR register  ********************/
+#define  CRC_IDR_IDATAR                         ((uint8_t)0xFF)        /* General-purpose 8-bit data register bits */
+
+
+/********************  Bit definition for CRC_CTLR register  ********************/
+#define  CRC_CTLR_RESET                         ((uint8_t)0x01)        /* RESET bit */
+
+/******************************************************************************/
+/*                      Digital to Analog Converter                           */
+/******************************************************************************/
+
+/********************  Bit definition for DAC_CTLR register  ********************/
+#define  DAC_EN1                          ((uint32_t)0x00000001)        /* DAC channel1 enable */
+#define  DAC_BOFF1                        ((uint32_t)0x00000002)        /* DAC channel1 output buffer disable */
+#define  DAC_TEN1                         ((uint32_t)0x00000004)        /* DAC channel1 Trigger enable */
+
+#define  DAC_TSEL1                        ((uint32_t)0x00000038)        /* TSEL1[2:0] (DAC channel1 Trigger selection) */
+#define  DAC_TSEL1_0                      ((uint32_t)0x00000008)        /* Bit 0 */
+#define  DAC_TSEL1_1                      ((uint32_t)0x00000010)        /* Bit 1 */
+#define  DAC_TSEL1_2                      ((uint32_t)0x00000020)        /* Bit 2 */
+
+#define  DAC_WAVE1                        ((uint32_t)0x000000C0)        /* WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */
+#define  DAC_WAVE1_0                      ((uint32_t)0x00000040)        /* Bit 0 */
+#define  DAC_WAVE1_1                      ((uint32_t)0x00000080)        /* Bit 1 */
+
+#define  DAC_MAMP1                        ((uint32_t)0x00000F00)        /* MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */
+#define  DAC_MAMP1_0                      ((uint32_t)0x00000100)        /* Bit 0 */
+#define  DAC_MAMP1_1                      ((uint32_t)0x00000200)        /* Bit 1 */
+#define  DAC_MAMP1_2                      ((uint32_t)0x00000400)        /* Bit 2 */
+#define  DAC_MAMP1_3                      ((uint32_t)0x00000800)        /* Bit 3 */
+
+#define  DAC_DMAEN1                       ((uint32_t)0x00001000)        /* DAC channel1 DMA enable */
+#define  DAC_EN2                          ((uint32_t)0x00010000)        /* DAC channel2 enable */
+#define  DAC_BOFF2                        ((uint32_t)0x00020000)        /* DAC channel2 output buffer disable */
+#define  DAC_TEN2                         ((uint32_t)0x00040000)        /* DAC channel2 Trigger enable */
+
+#define  DAC_TSEL2                        ((uint32_t)0x00380000)        /* TSEL2[2:0] (DAC channel2 Trigger selection) */
+#define  DAC_TSEL2_0                      ((uint32_t)0x00080000)        /* Bit 0 */
+#define  DAC_TSEL2_1                      ((uint32_t)0x00100000)        /* Bit 1 */
+#define  DAC_TSEL2_2                      ((uint32_t)0x00200000)        /* Bit 2 */
+
+#define  DAC_WAVE2                        ((uint32_t)0x00C00000)        /* WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */
+#define  DAC_WAVE2_0                      ((uint32_t)0x00400000)        /* Bit 0 */
+#define  DAC_WAVE2_1                      ((uint32_t)0x00800000)        /* Bit 1 */
+
+#define  DAC_MAMP2                        ((uint32_t)0x0F000000)        /* MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */
+#define  DAC_MAMP2_0                      ((uint32_t)0x01000000)        /* Bit 0 */
+#define  DAC_MAMP2_1                      ((uint32_t)0x02000000)        /* Bit 1 */
+#define  DAC_MAMP2_2                      ((uint32_t)0x04000000)        /* Bit 2 */
+#define  DAC_MAMP2_3                      ((uint32_t)0x08000000)        /* Bit 3 */
+
+#define  DAC_DMAEN2                       ((uint32_t)0x10000000)        /* DAC channel2 DMA enabled */
+
+/*****************  Bit definition for DAC_SWTR register  ******************/
+#define  DAC_SWTRIG1                      ((uint8_t)0x01)               /* DAC channel1 software trigger */
+#define  DAC_SWTRIG2                      ((uint8_t)0x02)               /* DAC channel2 software trigger */
+
+/*****************  Bit definition for DAC_R12BDHR1 register  ******************/
+#define  DAC_DHR12R1                      ((uint16_t)0x0FFF)            /* DAC channel1 12-bit Right aligned data */
+
+/*****************  Bit definition for DAC_L12BDHR1 register  ******************/
+#define  DAC_DHR12L1                      ((uint16_t)0xFFF0)            /* DAC channel1 12-bit Left aligned data */
+
+/******************  Bit definition for DAC_R8BDHR1 register  ******************/
+#define  DAC_DHR8R1                       ((uint8_t)0xFF)               /* DAC channel1 8-bit Right aligned data */
+
+/*****************  Bit definition for DAC_R12BDHR2 register  ******************/
+#define  DAC_DHR12R2                      ((uint16_t)0x0FFF)            /* DAC channel2 12-bit Right aligned data */
+
+/*****************  Bit definition for DAC_L12BDHR2 register  ******************/
+#define  DAC_DHR12L2                      ((uint16_t)0xFFF0)            /* DAC channel2 12-bit Left aligned data */
+
+/******************  Bit definition for DAC_R8BDHR2 register  ******************/
+#define  DAC_DHR8R2                       ((uint8_t)0xFF)               /* DAC channel2 8-bit Right aligned data */
+
+/*****************  Bit definition for DAC_RD12BDHR register  ******************/
+#define  DAC_RD12BDHR_DACC1DHR            ((uint32_t)0x00000FFF)        /* DAC channel1 12-bit Right aligned data */
+#define  DAC_RD12BDHR_DACC2DHR            ((uint32_t)0x0FFF0000)        /* DAC channel2 12-bit Right aligned data */
+
+/*****************  Bit definition for DAC_LD12BDHR register  ******************/
+#define  DAC_LD12BDHR_DACC1DHR            ((uint32_t)0x0000FFF0)        /* DAC channel1 12-bit Left aligned data */
+#define  DAC_LD12BDHR_DACC2DHR            ((uint32_t)0xFFF00000)        /* DAC channel2 12-bit Left aligned data */
+
+/******************  Bit definition for DAC_RD8BDHR register  ******************/
+#define  DAC_RD8BDHR_DACC1DHR             ((uint16_t)0x00FF)            /* DAC channel1 8-bit Right aligned data */
+#define  DAC_RD8BDHR_DACC2DHR             ((uint16_t)0xFF00)            /* DAC channel2 8-bit Right aligned data */
+
+/*******************  Bit definition for DAC_DOR1 register  *******************/
+#define  DAC_DACC1DOR                     ((uint16_t)0x0FFF)            /* DAC channel1 data output */
+
+/*******************  Bit definition for DAC_DOR2 register  *******************/
+#define  DAC_DACC2DOR                     ((uint16_t)0x0FFF)            /* DAC channel2 data output */
+
+/******************************************************************************/
+/*                             DMA Controller                                 */
+/******************************************************************************/
+
+/*******************  Bit definition for DMA_INTFR register  ********************/
+#define  DMA_GIF1                           ((uint32_t)0x00000001)        /* Channel 1 Global interrupt flag */
+#define  DMA_TCIF1                          ((uint32_t)0x00000002)        /* Channel 1 Transfer Complete flag */
+#define  DMA_HTIF1                          ((uint32_t)0x00000004)        /* Channel 1 Half Transfer flag */
+#define  DMA_TEIF1                          ((uint32_t)0x00000008)        /* Channel 1 Transfer Error flag */
+#define  DMA_GIF2                           ((uint32_t)0x00000010)        /* Channel 2 Global interrupt flag */
+#define  DMA_TCIF2                          ((uint32_t)0x00000020)        /* Channel 2 Transfer Complete flag */
+#define  DMA_HTIF2                          ((uint32_t)0x00000040)        /* Channel 2 Half Transfer flag */
+#define  DMA_TEIF2                          ((uint32_t)0x00000080)        /* Channel 2 Transfer Error flag */
+#define  DMA_GIF3                           ((uint32_t)0x00000100)        /* Channel 3 Global interrupt flag */
+#define  DMA_TCIF3                          ((uint32_t)0x00000200)        /* Channel 3 Transfer Complete flag */
+#define  DMA_HTIF3                          ((uint32_t)0x00000400)        /* Channel 3 Half Transfer flag */
+#define  DMA_TEIF3                          ((uint32_t)0x00000800)        /* Channel 3 Transfer Error flag */
+#define  DMA_GIF4                           ((uint32_t)0x00001000)        /* Channel 4 Global interrupt flag */
+#define  DMA_TCIF4                          ((uint32_t)0x00002000)        /* Channel 4 Transfer Complete flag */
+#define  DMA_HTIF4                          ((uint32_t)0x00004000)        /* Channel 4 Half Transfer flag */
+#define  DMA_TEIF4                          ((uint32_t)0x00008000)        /* Channel 4 Transfer Error flag */
+#define  DMA_GIF5                           ((uint32_t)0x00010000)        /* Channel 5 Global interrupt flag */
+#define  DMA_TCIF5                          ((uint32_t)0x00020000)        /* Channel 5 Transfer Complete flag */
+#define  DMA_HTIF5                          ((uint32_t)0x00040000)        /* Channel 5 Half Transfer flag */
+#define  DMA_TEIF5                          ((uint32_t)0x00080000)        /* Channel 5 Transfer Error flag */
+#define  DMA_GIF6                           ((uint32_t)0x00100000)        /* Channel 6 Global interrupt flag */
+#define  DMA_TCIF6                          ((uint32_t)0x00200000)        /* Channel 6 Transfer Complete flag */
+#define  DMA_HTIF6                          ((uint32_t)0x00400000)        /* Channel 6 Half Transfer flag */
+#define  DMA_TEIF6                          ((uint32_t)0x00800000)        /* Channel 6 Transfer Error flag */
+#define  DMA_GIF7                           ((uint32_t)0x01000000)        /* Channel 7 Global interrupt flag */
+#define  DMA_TCIF7                          ((uint32_t)0x02000000)        /* Channel 7 Transfer Complete flag */
+#define  DMA_HTIF7                          ((uint32_t)0x04000000)        /* Channel 7 Half Transfer flag */
+#define  DMA_TEIF7                          ((uint32_t)0x08000000)        /* Channel 7 Transfer Error flag */
+
+#define  DMA_GIF8                           ((uint32_t)0x00000001)        /* Channel 8 Global interrupt flag */
+#define  DMA_TCIF8                          ((uint32_t)0x00000002)        /* Channel 8 Transfer Complete flag */
+#define  DMA_HTIF8                          ((uint32_t)0x00000004)        /* Channel 8 Half Transfer flag */
+#define  DMA_TEIF8                          ((uint32_t)0x00000008)        /* Channel 8 Transfer Error flag */
+#define  DMA_GIF9                           ((uint32_t)0x00000010)        /* Channel 9 Global interrupt flag */
+#define  DMA_TCIF9                          ((uint32_t)0x00000020)        /* Channel 9 Transfer Complete flag */
+#define  DMA_HTIF9                          ((uint32_t)0x00000040)        /* Channel 9 Half Transfer flag */
+#define  DMA_TEIF9                          ((uint32_t)0x00000080)        /* Channel 9 Transfer Error flag */
+#define  DMA_GIF10                          ((uint32_t)0x00000100)        /* Channel 10 Global interrupt flag */
+#define  DMA_TCIF10                         ((uint32_t)0x00000200)        /* Channel 10 Transfer Complete flag */
+#define  DMA_HTIF10                         ((uint32_t)0x00000400)        /* Channel 10 Half Transfer flag */
+#define  DMA_TEIF10                         ((uint32_t)0x00000800)        /* Channel 10 Transfer Error flag */
+#define  DMA_GIF11                          ((uint32_t)0x00001000)        /* Channel 11 Global interrupt flag */
+#define  DMA_TCIF11                         ((uint32_t)0x00002000)        /* Channel 11 Transfer Complete flag */
+#define  DMA_HTIF11                         ((uint32_t)0x00004000)        /* Channel 11 Half Transfer flag */
+#define  DMA_TEIF11                         ((uint32_t)0x00008000)        /* Channel 11 Transfer Error flag */
+
+/*******************  Bit definition for DMA_INTFCR register  *******************/
+#define  DMA_CGIF1                          ((uint32_t)0x00000001)        /* Channel 1 Global interrupt clear */
+#define  DMA_CTCIF1                         ((uint32_t)0x00000002)        /* Channel 1 Transfer Complete clear */
+#define  DMA_CHTIF1                         ((uint32_t)0x00000004)        /* Channel 1 Half Transfer clear */
+#define  DMA_CTEIF1                         ((uint32_t)0x00000008)        /* Channel 1 Transfer Error clear */
+#define  DMA_CGIF2                          ((uint32_t)0x00000010)        /* Channel 2 Global interrupt clear */
+#define  DMA_CTCIF2                         ((uint32_t)0x00000020)        /* Channel 2 Transfer Complete clear */
+#define  DMA_CHTIF2                         ((uint32_t)0x00000040)        /* Channel 2 Half Transfer clear */
+#define  DMA_CTEIF2                         ((uint32_t)0x00000080)        /* Channel 2 Transfer Error clear */
+#define  DMA_CGIF3                          ((uint32_t)0x00000100)        /* Channel 3 Global interrupt clear */
+#define  DMA_CTCIF3                         ((uint32_t)0x00000200)        /* Channel 3 Transfer Complete clear */
+#define  DMA_CHTIF3                         ((uint32_t)0x00000400)        /* Channel 3 Half Transfer clear */
+#define  DMA_CTEIF3                         ((uint32_t)0x00000800)        /* Channel 3 Transfer Error clear */
+#define  DMA_CGIF4                          ((uint32_t)0x00001000)        /* Channel 4 Global interrupt clear */
+#define  DMA_CTCIF4                         ((uint32_t)0x00002000)        /* Channel 4 Transfer Complete clear */
+#define  DMA_CHTIF4                         ((uint32_t)0x00004000)        /* Channel 4 Half Transfer clear */
+#define  DMA_CTEIF4                         ((uint32_t)0x00008000)        /* Channel 4 Transfer Error clear */
+#define  DMA_CGIF5                          ((uint32_t)0x00010000)        /* Channel 5 Global interrupt clear */
+#define  DMA_CTCIF5                         ((uint32_t)0x00020000)        /* Channel 5 Transfer Complete clear */
+#define  DMA_CHTIF5                         ((uint32_t)0x00040000)        /* Channel 5 Half Transfer clear */
+#define  DMA_CTEIF5                         ((uint32_t)0x00080000)        /* Channel 5 Transfer Error clear */
+#define  DMA_CGIF6                          ((uint32_t)0x00100000)        /* Channel 6 Global interrupt clear */
+#define  DMA_CTCIF6                         ((uint32_t)0x00200000)        /* Channel 6 Transfer Complete clear */
+#define  DMA_CHTIF6                         ((uint32_t)0x00400000)        /* Channel 6 Half Transfer clear */
+#define  DMA_CTEIF6                         ((uint32_t)0x00800000)        /* Channel 6 Transfer Error clear */
+#define  DMA_CGIF7                          ((uint32_t)0x01000000)        /* Channel 7 Global interrupt clear */
+#define  DMA_CTCIF7                         ((uint32_t)0x02000000)        /* Channel 7 Transfer Complete clear */
+#define  DMA_CHTIF7                         ((uint32_t)0x04000000)        /* Channel 7 Half Transfer clear */
+#define  DMA_CTEIF7                         ((uint32_t)0x08000000)        /* Channel 7 Transfer Error clear */
+#define  DMA_CGIF8                          ((uint32_t)0x10000000)        /* Channel 8 Global interrupt clear */
+#define  DMA_CTCIF8                         ((uint32_t)0x20000000)        /* Channel 8 Transfer Complete clear */
+#define  DMA_CHTIF8                         ((uint32_t)0x40000000)        /* Channel 8 Half Transfer clear */
+#define  DMA_CTEIF8                         ((uint32_t)0x80000000)        /* Channel 8 Transfer Error clear */
+
+/*******************  Bit definition for DMA_CFGR1 register  *******************/
+#define  DMA_CFGR1_EN                       ((uint16_t)0x0001)            /* Channel enable*/
+#define  DMA_CFGR1_TCIE                     ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFGR1_HTIE                     ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFGR1_TEIE                     ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFGR1_DIR                      ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFGR1_CIRC                     ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFGR1_PINC                     ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFGR1_MINC                     ((uint16_t)0x0080)            /* Memory increment mode */
+
+#define  DMA_CFGR1_PSIZE                    ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFGR1_PSIZE_0                  ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFGR1_PSIZE_1                  ((uint16_t)0x0200)            /* Bit 1 */
+
+#define  DMA_CFGR1_MSIZE                    ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFGR1_MSIZE_0                  ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFGR1_MSIZE_1                  ((uint16_t)0x0800)            /* Bit 1 */
+
+#define  DMA_CFGR1_PL                       ((uint16_t)0x3000)            /* PL[1:0] bits(Channel Priority level) */
+#define  DMA_CFGR1_PL_0                     ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFGR1_PL_1                     ((uint16_t)0x2000)            /* Bit 1 */
+
+#define  DMA_CFGR1_MEM2MEM                  ((uint16_t)0x4000)            /* Memory to memory mode */
+
+/*******************  Bit definition for DMA_CFGR2 register  *******************/
+#define  DMA_CFGR2_EN                       ((uint16_t)0x0001)            /* Channel enable */
+#define  DMA_CFGR2_TCIE                     ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFGR2_HTIE                     ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFGR2_TEIE                     ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFGR2_DIR                      ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFGR2_CIRC                     ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFGR2_PINC                     ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFGR2_MINC                     ((uint16_t)0x0080)            /* Memory increment mode */
+
+#define  DMA_CFGR2_PSIZE                    ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFGR2_PSIZE_0                  ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFGR2_PSIZE_1                  ((uint16_t)0x0200)            /* Bit 1 */
+
+#define  DMA_CFGR2_MSIZE                    ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFGR2_MSIZE_0                  ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFGR2_MSIZE_1                  ((uint16_t)0x0800)            /* Bit 1 */
+
+#define  DMA_CFGR2_PL                       ((uint16_t)0x3000)            /* PL[1:0] bits (Channel Priority level) */
+#define  DMA_CFGR2_PL_0                     ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFGR2_PL_1                     ((uint16_t)0x2000)            /* Bit 1 */
+
+#define  DMA_CFGR2_MEM2MEM                  ((uint16_t)0x4000)            /* Memory to memory mode */
+
+/*******************  Bit definition for DMA_CFGR3 register  *******************/
+#define  DMA_CFGR3_EN                       ((uint16_t)0x0001)            /* Channel enable */
+#define  DMA_CFGR3_TCIE                     ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFGR3_HTIE                     ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFGR3_TEIE                     ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFGR3_DIR                      ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFGR3_CIRC                     ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFGR3_PINC                     ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFGR3_MINC                     ((uint16_t)0x0080)            /* Memory increment mode */
+
+#define  DMA_CFGR3_PSIZE                    ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFGR3_PSIZE_0                  ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFGR3_PSIZE_1                  ((uint16_t)0x0200)            /* Bit 1 */
+
+#define  DMA_CFGR3_MSIZE                    ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFGR3_MSIZE_0                  ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFGR3_MSIZE_1                  ((uint16_t)0x0800)            /* Bit 1 */
+
+#define  DMA_CFGR3_PL                       ((uint16_t)0x3000)            /* PL[1:0] bits (Channel Priority level) */
+#define  DMA_CFGR3_PL_0                     ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFGR3_PL_1                     ((uint16_t)0x2000)            /* Bit 1 */
+
+#define  DMA_CFGR3_MEM2MEM                  ((uint16_t)0x4000)            /* Memory to memory mode */
+
+/*******************  Bit definition for DMA_CFG4 register  *******************/
+#define  DMA_CFG4_EN                        ((uint16_t)0x0001)            /* Channel enable */
+#define  DMA_CFG4_TCIE                      ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFG4_HTIE                      ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFG4_TEIE                      ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFG4_DIR                       ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFG4_CIRC                      ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFG4_PINC                      ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFG4_MINC                      ((uint16_t)0x0080)            /* Memory increment mode */
+
+#define  DMA_CFG4_PSIZE                     ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFG4_PSIZE_0                   ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFG4_PSIZE_1                   ((uint16_t)0x0200)            /* Bit 1 */
+             
+#define  DMA_CFG4_MSIZE                     ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFG4_MSIZE_0                   ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFG4_MSIZE_1                   ((uint16_t)0x0800)            /* Bit 1 */
+             
+#define  DMA_CFG4_PL                        ((uint16_t)0x3000)            /* PL[1:0] bits (Channel Priority level) */
+#define  DMA_CFG4_PL_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFG4_PL_1                      ((uint16_t)0x2000)            /* Bit 1 */
+             
+#define  DMA_CFG4_MEM2MEM                   ((uint16_t)0x4000)            /* Memory to memory mode */
+
+/******************  Bit definition for DMA_CFG5 register  *******************/
+#define  DMA_CFG5_EN                        ((uint16_t)0x0001)            /* Channel enable */
+#define  DMA_CFG5_TCIE                      ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFG5_HTIE                      ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFG5_TEIE                      ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFG5_DIR                       ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFG5_CIRC                      ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFG5_PINC                      ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFG5_MINC                      ((uint16_t)0x0080)            /* Memory increment mode */
+             
+#define  DMA_CFG5_PSIZE                     ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFG5_PSIZE_0                   ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFG5_PSIZE_1                   ((uint16_t)0x0200)            /* Bit 1 */
+             
+#define  DMA_CFG5_MSIZE                     ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFG5_MSIZE_0                   ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFG5_MSIZE_1                   ((uint16_t)0x0800)            /* Bit 1 */
+             
+#define  DMA_CFG5_PL                        ((uint16_t)0x3000)            /* PL[1:0] bits (Channel Priority level) */
+#define  DMA_CFG5_PL_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFG5_PL_1                      ((uint16_t)0x2000)            /* Bit 1 */
+             
+#define  DMA_CFG5_MEM2MEM                   ((uint16_t)0x4000)            /* Memory to memory mode enable */
+
+/*******************  Bit definition for DMA_CFG6 register  *******************/
+#define  DMA_CFG6_EN                        ((uint16_t)0x0001)            /* Channel enable */
+#define  DMA_CFG6_TCIE                      ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFG6_HTIE                      ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFG6_TEIE                      ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFG6_DIR                       ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFG6_CIRC                      ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFG6_PINC                      ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFG6_MINC                      ((uint16_t)0x0080)            /* Memory increment mode */
+             
+#define  DMA_CFG6_PSIZE                     ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFG6_PSIZE_0                   ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFG6_PSIZE_1                   ((uint16_t)0x0200)            /* Bit 1 */
+             
+#define  DMA_CFG6_MSIZE                     ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFG6_MSIZE_0                   ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFG6_MSIZE_1                   ((uint16_t)0x0800)            /* Bit 1 */
+             
+#define  DMA_CFG6_PL                        ((uint16_t)0x3000)            /* PL[1:0] bits (Channel Priority level) */
+#define  DMA_CFG6_PL_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFG6_PL_1                      ((uint16_t)0x2000)            /* Bit 1 */
+             
+#define  DMA_CFG6_MEM2MEM                   ((uint16_t)0x4000)            /* Memory to memory mode */
+
+/*******************  Bit definition for DMA_CFG7 register  *******************/
+#define  DMA_CFG7_EN                        ((uint16_t)0x0001)            /* Channel enable */
+#define  DMA_CFG7_TCIE                      ((uint16_t)0x0002)            /* Transfer complete interrupt enable */
+#define  DMA_CFG7_HTIE                      ((uint16_t)0x0004)            /* Half Transfer interrupt enable */
+#define  DMA_CFG7_TEIE                      ((uint16_t)0x0008)            /* Transfer error interrupt enable */
+#define  DMA_CFG7_DIR                       ((uint16_t)0x0010)            /* Data transfer direction */
+#define  DMA_CFG7_CIRC                      ((uint16_t)0x0020)            /* Circular mode */
+#define  DMA_CFG7_PINC                      ((uint16_t)0x0040)            /* Peripheral increment mode */
+#define  DMA_CFG7_MINC                      ((uint16_t)0x0080)            /* Memory increment mode */
+             
+#define  DMA_CFG7_PSIZE                     ((uint16_t)0x0300)            /* PSIZE[1:0] bits (Peripheral size) */
+#define  DMA_CFG7_PSIZE_0                   ((uint16_t)0x0100)            /* Bit 0 */
+#define  DMA_CFG7_PSIZE_1                   ((uint16_t)0x0200)            /* Bit 1 */
+             
+#define  DMA_CFG7_MSIZE                     ((uint16_t)0x0C00)            /* MSIZE[1:0] bits (Memory size) */
+#define  DMA_CFG7_MSIZE_0                   ((uint16_t)0x0400)            /* Bit 0 */
+#define  DMA_CFG7_MSIZE_1                   ((uint16_t)0x0800)            /* Bit 1 */
+             
+#define  DMA_CFG7_PL                        ((uint16_t)0x3000)            /* PL[1:0] bits (Channel Priority level) */
+#define  DMA_CFG7_PL_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  DMA_CFG7_PL_1                      ((uint16_t)0x2000)            /* Bit 1 */
+             
+#define  DMA_CFG7_MEM2MEM                   ((uint16_t)0x4000)            /* Memory to memory mode enable */
+
+/******************  Bit definition for DMA_CNTR1 register  ******************/
+#define  DMA_CNTR1_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR2 register  ******************/
+#define  DMA_CNTR2_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR3 register  ******************/
+#define  DMA_CNTR3_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR4 register  ******************/
+#define  DMA_CNTR4_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR5 register  ******************/
+#define  DMA_CNTR5_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR6 register  ******************/
+#define  DMA_CNTR6_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR7 register  ******************/
+#define  DMA_CNTR7_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_CNTR8 register  ******************/
+#define  DMA_CNTR8_NDT                      ((uint16_t)0xFFFF)            /* Number of data to Transfer */
+
+/******************  Bit definition for DMA_PADDR1 register  *******************/
+#define  DMA_PADDR1_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR2 register  *******************/
+#define  DMA_PADDR2_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR3 register  *******************/
+#define  DMA_PADDR3_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR4 register  *******************/
+#define  DMA_PADDR4_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR5 register  *******************/
+#define  DMA_PADDR5_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR6 register  *******************/
+#define  DMA_PADDR6_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR7 register  *******************/
+#define  DMA_PADDR7_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_PADDR8 register  *******************/
+#define  DMA_PADDR8_PA                      ((uint32_t)0xFFFFFFFF)        /* Peripheral Address */
+
+/******************  Bit definition for DMA_MADDR1 register  *******************/
+#define  DMA_MADDR1_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR2 register  *******************/
+#define  DMA_MADDR2_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR3 register  *******************/
+#define  DMA_MADDR3_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR4 register  *******************/
+#define  DMA_MADDR4_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR5 register  *******************/
+#define  DMA_MADDR5_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR6 register  *******************/
+#define  DMA_MADDR6_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR7 register  *******************/
+#define  DMA_MADDR7_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************  Bit definition for DMA_MADDR8 register  *******************/
+#define  DMA_MADDR8_MA                      ((uint32_t)0xFFFFFFFF)        /* Memory Address */
+
+/******************************************************************************/
+/*                    External Interrupt/Event Controller                     */
+/******************************************************************************/
+
+/*******************  Bit definition for EXTI_INTENR register  *******************/
+#define  EXTI_INTENR_MR0                        ((uint32_t)0x00000001)        /* Interrupt Mask on line 0 */
+#define  EXTI_INTENR_MR1                        ((uint32_t)0x00000002)        /* Interrupt Mask on line 1 */
+#define  EXTI_INTENR_MR2                        ((uint32_t)0x00000004)        /* Interrupt Mask on line 2 */
+#define  EXTI_INTENR_MR3                        ((uint32_t)0x00000008)        /* Interrupt Mask on line 3 */
+#define  EXTI_INTENR_MR4                        ((uint32_t)0x00000010)        /* Interrupt Mask on line 4 */
+#define  EXTI_INTENR_MR5                        ((uint32_t)0x00000020)        /* Interrupt Mask on line 5 */
+#define  EXTI_INTENR_MR6                        ((uint32_t)0x00000040)        /* Interrupt Mask on line 6 */
+#define  EXTI_INTENR_MR7                        ((uint32_t)0x00000080)        /* Interrupt Mask on line 7 */
+#define  EXTI_INTENR_MR8                        ((uint32_t)0x00000100)        /* Interrupt Mask on line 8 */
+#define  EXTI_INTENR_MR9                        ((uint32_t)0x00000200)        /* Interrupt Mask on line 9 */
+#define  EXTI_INTENR_MR10                       ((uint32_t)0x00000400)        /* Interrupt Mask on line 10 */
+#define  EXTI_INTENR_MR11                       ((uint32_t)0x00000800)        /* Interrupt Mask on line 11 */
+#define  EXTI_INTENR_MR12                       ((uint32_t)0x00001000)        /* Interrupt Mask on line 12 */
+#define  EXTI_INTENR_MR13                       ((uint32_t)0x00002000)        /* Interrupt Mask on line 13 */
+#define  EXTI_INTENR_MR14                       ((uint32_t)0x00004000)        /* Interrupt Mask on line 14 */
+#define  EXTI_INTENR_MR15                       ((uint32_t)0x00008000)        /* Interrupt Mask on line 15 */
+#define  EXTI_INTENR_MR16                       ((uint32_t)0x00010000)        /* Interrupt Mask on line 16 */
+#define  EXTI_INTENR_MR17                       ((uint32_t)0x00020000)        /* Interrupt Mask on line 17 */
+#define  EXTI_INTENR_MR18                       ((uint32_t)0x00040000)        /* Interrupt Mask on line 18 */
+#define  EXTI_INTENR_MR19                       ((uint32_t)0x00080000)        /* Interrupt Mask on line 19 */
+#define  EXTI_INTENR_MR20                       ((uint32_t)0x00100000)        /* Interrupt Mask on line 20 */
+
+/*******************  Bit definition for EXTI_EVENR register  *******************/
+#define  EXTI_EVENR_MR0                         ((uint32_t)0x00000001)        /* Event Mask on line 0 */
+#define  EXTI_EVENR_MR1                         ((uint32_t)0x00000002)        /* Event Mask on line 1 */
+#define  EXTI_EVENR_MR2                         ((uint32_t)0x00000004)        /* Event Mask on line 2 */
+#define  EXTI_EVENR_MR3                         ((uint32_t)0x00000008)        /* Event Mask on line 3 */
+#define  EXTI_EVENR_MR4                         ((uint32_t)0x00000010)        /* Event Mask on line 4 */
+#define  EXTI_EVENR_MR5                         ((uint32_t)0x00000020)        /* Event Mask on line 5 */
+#define  EXTI_EVENR_MR6                         ((uint32_t)0x00000040)        /* Event Mask on line 6 */
+#define  EXTI_EVENR_MR7                         ((uint32_t)0x00000080)        /* Event Mask on line 7 */
+#define  EXTI_EVENR_MR8                         ((uint32_t)0x00000100)        /* Event Mask on line 8 */
+#define  EXTI_EVENR_MR9                         ((uint32_t)0x00000200)        /* Event Mask on line 9 */
+#define  EXTI_EVENR_MR10                        ((uint32_t)0x00000400)        /* Event Mask on line 10 */
+#define  EXTI_EVENR_MR11                        ((uint32_t)0x00000800)        /* Event Mask on line 11 */
+#define  EXTI_EVENR_MR12                        ((uint32_t)0x00001000)        /* Event Mask on line 12 */
+#define  EXTI_EVENR_MR13                        ((uint32_t)0x00002000)        /* Event Mask on line 13 */
+#define  EXTI_EVENR_MR14                        ((uint32_t)0x00004000)        /* Event Mask on line 14 */
+#define  EXTI_EVENR_MR15                        ((uint32_t)0x00008000)        /* Event Mask on line 15 */
+#define  EXTI_EVENR_MR16                        ((uint32_t)0x00010000)        /* Event Mask on line 16 */
+#define  EXTI_EVENR_MR17                        ((uint32_t)0x00020000)        /* Event Mask on line 17 */
+#define  EXTI_EVENR_MR18                        ((uint32_t)0x00040000)        /* Event Mask on line 18 */
+#define  EXTI_EVENR_MR19                        ((uint32_t)0x00080000)        /* Event Mask on line 19 */
+#define  EXTI_EVENR_MR20                        ((uint32_t)0x00100000)        /* Event Mask on line 20 */
+
+/******************  Bit definition for EXTI_RTENR register  *******************/
+#define  EXTI_RTENR_TR0                         ((uint32_t)0x00000001)        /* Rising trigger event configuration bit of line 0 */
+#define  EXTI_RTENR_TR1                         ((uint32_t)0x00000002)        /* Rising trigger event configuration bit of line 1 */
+#define  EXTI_RTENR_TR2                         ((uint32_t)0x00000004)        /* Rising trigger event configuration bit of line 2 */
+#define  EXTI_RTENR_TR3                         ((uint32_t)0x00000008)        /* Rising trigger event configuration bit of line 3 */
+#define  EXTI_RTENR_TR4                         ((uint32_t)0x00000010)        /* Rising trigger event configuration bit of line 4 */
+#define  EXTI_RTENR_TR5                         ((uint32_t)0x00000020)        /* Rising trigger event configuration bit of line 5 */
+#define  EXTI_RTENR_TR6                         ((uint32_t)0x00000040)        /* Rising trigger event configuration bit of line 6 */
+#define  EXTI_RTENR_TR7                         ((uint32_t)0x00000080)        /* Rising trigger event configuration bit of line 7 */
+#define  EXTI_RTENR_TR8                         ((uint32_t)0x00000100)        /* Rising trigger event configuration bit of line 8 */
+#define  EXTI_RTENR_TR9                         ((uint32_t)0x00000200)        /* Rising trigger event configuration bit of line 9 */
+#define  EXTI_RTENR_TR10                        ((uint32_t)0x00000400)        /* Rising trigger event configuration bit of line 10 */
+#define  EXTI_RTENR_TR11                        ((uint32_t)0x00000800)        /* Rising trigger event configuration bit of line 11 */
+#define  EXTI_RTENR_TR12                        ((uint32_t)0x00001000)        /* Rising trigger event configuration bit of line 12 */
+#define  EXTI_RTENR_TR13                        ((uint32_t)0x00002000)        /* Rising trigger event configuration bit of line 13 */
+#define  EXTI_RTENR_TR14                        ((uint32_t)0x00004000)        /* Rising trigger event configuration bit of line 14 */
+#define  EXTI_RTENR_TR15                        ((uint32_t)0x00008000)        /* Rising trigger event configuration bit of line 15 */
+#define  EXTI_RTENR_TR16                        ((uint32_t)0x00010000)        /* Rising trigger event configuration bit of line 16 */
+#define  EXTI_RTENR_TR17                        ((uint32_t)0x00020000)        /* Rising trigger event configuration bit of line 17 */
+#define  EXTI_RTENR_TR18                        ((uint32_t)0x00040000)        /* Rising trigger event configuration bit of line 18 */
+#define  EXTI_RTENR_TR19                        ((uint32_t)0x00080000)        /* Rising trigger event configuration bit of line 19 */
+#define  EXTI_RTENR_TR20                        ((uint32_t)0x00100000)        /* Rising trigger event configuration bit of line 20 */
+
+/******************  Bit definition for EXTI_FTENR register  *******************/
+#define  EXTI_FTENR_TR0                         ((uint32_t)0x00000001)        /* Falling trigger event configuration bit of line 0 */
+#define  EXTI_FTENR_TR1                         ((uint32_t)0x00000002)        /* Falling trigger event configuration bit of line 1 */
+#define  EXTI_FTENR_TR2                         ((uint32_t)0x00000004)        /* Falling trigger event configuration bit of line 2 */
+#define  EXTI_FTENR_TR3                         ((uint32_t)0x00000008)        /* Falling trigger event configuration bit of line 3 */
+#define  EXTI_FTENR_TR4                         ((uint32_t)0x00000010)        /* Falling trigger event configuration bit of line 4 */
+#define  EXTI_FTENR_TR5                         ((uint32_t)0x00000020)        /* Falling trigger event configuration bit of line 5 */
+#define  EXTI_FTENR_TR6                         ((uint32_t)0x00000040)        /* Falling trigger event configuration bit of line 6 */
+#define  EXTI_FTENR_TR7                         ((uint32_t)0x00000080)        /* Falling trigger event configuration bit of line 7 */
+#define  EXTI_FTENR_TR8                         ((uint32_t)0x00000100)        /* Falling trigger event configuration bit of line 8 */
+#define  EXTI_FTENR_TR9                         ((uint32_t)0x00000200)        /* Falling trigger event configuration bit of line 9 */
+#define  EXTI_FTENR_TR10                        ((uint32_t)0x00000400)        /* Falling trigger event configuration bit of line 10 */
+#define  EXTI_FTENR_TR11                        ((uint32_t)0x00000800)        /* Falling trigger event configuration bit of line 11 */
+#define  EXTI_FTENR_TR12                        ((uint32_t)0x00001000)        /* Falling trigger event configuration bit of line 12 */
+#define  EXTI_FTENR_TR13                        ((uint32_t)0x00002000)        /* Falling trigger event configuration bit of line 13 */
+#define  EXTI_FTENR_TR14                        ((uint32_t)0x00004000)        /* Falling trigger event configuration bit of line 14 */
+#define  EXTI_FTENR_TR15                        ((uint32_t)0x00008000)        /* Falling trigger event configuration bit of line 15 */
+#define  EXTI_FTENR_TR16                        ((uint32_t)0x00010000)        /* Falling trigger event configuration bit of line 16 */
+#define  EXTI_FTENR_TR17                        ((uint32_t)0x00020000)        /* Falling trigger event configuration bit of line 17 */
+#define  EXTI_FTENR_TR18                        ((uint32_t)0x00040000)        /* Falling trigger event configuration bit of line 18 */
+#define  EXTI_FTENR_TR19                        ((uint32_t)0x00080000)        /* Falling trigger event configuration bit of line 19 */
+#define  EXTI_FTENR_TR20                        ((uint32_t)0x00100000)        /* Falling trigger event configuration bit of line 20 */
+
+/******************  Bit definition for EXTI_SWIEVR register  ******************/
+#define  EXTI_SWIEVR_SWIEVR0                    ((uint32_t)0x00000001)        /* Software Interrupt on line 0 */
+#define  EXTI_SWIEVR_SWIEVR1                    ((uint32_t)0x00000002)        /* Software Interrupt on line 1 */
+#define  EXTI_SWIEVR_SWIEVR2                    ((uint32_t)0x00000004)        /* Software Interrupt on line 2 */
+#define  EXTI_SWIEVR_SWIEVR3                    ((uint32_t)0x00000008)        /* Software Interrupt on line 3 */
+#define  EXTI_SWIEVR_SWIEVR4                    ((uint32_t)0x00000010)        /* Software Interrupt on line 4 */
+#define  EXTI_SWIEVR_SWIEVR5                    ((uint32_t)0x00000020)        /* Software Interrupt on line 5 */
+#define  EXTI_SWIEVR_SWIEVR6                    ((uint32_t)0x00000040)        /* Software Interrupt on line 6 */
+#define  EXTI_SWIEVR_SWIEVR7                    ((uint32_t)0x00000080)        /* Software Interrupt on line 7 */
+#define  EXTI_SWIEVR_SWIEVR8                    ((uint32_t)0x00000100)        /* Software Interrupt on line 8 */
+#define  EXTI_SWIEVR_SWIEVR9                    ((uint32_t)0x00000200)        /* Software Interrupt on line 9 */
+#define  EXTI_SWIEVR_SWIEVR10                   ((uint32_t)0x00000400)        /* Software Interrupt on line 10 */
+#define  EXTI_SWIEVR_SWIEVR11                   ((uint32_t)0x00000800)        /* Software Interrupt on line 11 */
+#define  EXTI_SWIEVR_SWIEVR12                   ((uint32_t)0x00001000)        /* Software Interrupt on line 12 */
+#define  EXTI_SWIEVR_SWIEVR13                   ((uint32_t)0x00002000)        /* Software Interrupt on line 13 */
+#define  EXTI_SWIEVR_SWIEVR14                   ((uint32_t)0x00004000)        /* Software Interrupt on line 14 */
+#define  EXTI_SWIEVR_SWIEVR15                   ((uint32_t)0x00008000)        /* Software Interrupt on line 15 */
+#define  EXTI_SWIEVR_SWIEVR16                   ((uint32_t)0x00010000)        /* Software Interrupt on line 16 */
+#define  EXTI_SWIEVR_SWIEVR17                   ((uint32_t)0x00020000)        /* Software Interrupt on line 17 */
+#define  EXTI_SWIEVR_SWIEVR18                   ((uint32_t)0x00040000)        /* Software Interrupt on line 18 */
+#define  EXTI_SWIEVR_SWIEVR19                   ((uint32_t)0x00080000)        /* Software Interrupt on line 19 */
+#define  EXTI_SWIEVR_SWIEVR20                   ((uint32_t)0x00100000)        /* Software Interrupt on line 20 */
+
+/*******************  Bit definition for EXTI_INTFR register  ********************/
+#define  EXTI_INTF_INTF0                        ((uint32_t)0x00000001)        /* Pending bit for line 0 */
+#define  EXTI_INTF_INTF1                        ((uint32_t)0x00000002)        /* Pending bit for line 1 */
+#define  EXTI_INTF_INTF2                        ((uint32_t)0x00000004)        /* Pending bit for line 2 */
+#define  EXTI_INTF_INTF3                        ((uint32_t)0x00000008)        /* Pending bit for line 3 */
+#define  EXTI_INTF_INTF4                        ((uint32_t)0x00000010)        /* Pending bit for line 4 */
+#define  EXTI_INTF_INTF5                        ((uint32_t)0x00000020)        /* Pending bit for line 5 */
+#define  EXTI_INTF_INTF6                        ((uint32_t)0x00000040)        /* Pending bit for line 6 */
+#define  EXTI_INTF_INTF7                        ((uint32_t)0x00000080)        /* Pending bit for line 7 */
+#define  EXTI_INTF_INTF8                        ((uint32_t)0x00000100)        /* Pending bit for line 8 */
+#define  EXTI_INTF_INTF9                        ((uint32_t)0x00000200)        /* Pending bit for line 9 */
+#define  EXTI_INTF_INTF10                       ((uint32_t)0x00000400)        /* Pending bit for line 10 */
+#define  EXTI_INTF_INTF11                       ((uint32_t)0x00000800)        /* Pending bit for line 11 */
+#define  EXTI_INTF_INTF12                       ((uint32_t)0x00001000)        /* Pending bit for line 12 */
+#define  EXTI_INTF_INTF13                       ((uint32_t)0x00002000)        /* Pending bit for line 13 */
+#define  EXTI_INTF_INTF14                       ((uint32_t)0x00004000)        /* Pending bit for line 14 */
+#define  EXTI_INTF_INTF15                       ((uint32_t)0x00008000)        /* Pending bit for line 15 */
+#define  EXTI_INTF_INTF16                       ((uint32_t)0x00010000)        /* Pending bit for line 16 */
+#define  EXTI_INTF_INTF17                       ((uint32_t)0x00020000)        /* Pending bit for line 17 */
+#define  EXTI_INTF_INTF18                       ((uint32_t)0x00040000)        /* Pending bit for line 18 */
+#define  EXTI_INTF_INTF19                       ((uint32_t)0x00080000)        /* Pending bit for line 19 */
+#define  EXTI_INTF_INTF20                       ((uint32_t)0x00100000)        /* Pending bit for line 20 */
+
+/******************************************************************************/
+/*                      FLASH and Option Bytes Registers                      */
+/******************************************************************************/
+
+
+/*******************  Bit definition for FLASH_ACTLR register  ******************/
+
+/******************  Bit definition for FLASH_KEYR register  ******************/
+#define  FLASH_KEYR_FKEYR                      ((uint32_t)0xFFFFFFFF)        /* FPEC Key */
+#define  FLASH_KEYR_KEY1                       ((uint32_t)0x45670123)
+#define  FLASH_KEYR_KEY2                       ((uint32_t)0xCDEF89AB)
+
+/*****************  Bit definition for FLASH_OBKEYR register  ****************/
+#define  FLASH_OBKEYR_OBKEYR                   ((uint32_t)0xFFFFFFFF)        /* Option Byte Key */
+
+/******************  Bit definition for FLASH_STATR register  *******************/
+#define  FLASH_STATR_BSY                       ((uint8_t)0x01)               /* Busy */
+#define  FLASH_STATR_WRBSY                     ((uint8_t)0x02)               
+#define  FLASH_STATR_WRPRTERR                  ((uint8_t)0x10)               /* Write Protection Error */
+#define  FLASH_STATR_EOP                       ((uint8_t)0x20)               /* End of operation */
+#define  FLASH_STATR_EHMODS                    ((uint8_t)0x80)               
+
+/*******************  Bit definition for FLASH_CTLR register  *******************/
+#define  FLASH_CTLR_PG                         ((uint32_t)0x00000001)        /* Programming */
+#define  FLASH_CTLR_PER                        ((uint32_t)0x00000002)        /* Sector Erase 4K */
+#define  FLASH_CTLR_MER                        ((uint32_t)0x00000004)        /* Mass Erase */
+#define  FLASH_CTLR_OPTPG                      ((uint32_t)0x00000010)        /* Option Byte Programming */
+#define  FLASH_CTLR_OPTER                      ((uint32_t)0x00000020)        /* Option Byte Erase */
+#define  FLASH_CTLR_STRT                       ((uint32_t)0x00000040)        /* Start */
+#define  FLASH_CTLR_LOCK                       ((uint32_t)0x00000080)        /* Lock */
+#define  FLASH_CTLR_OPTWRE                     ((uint32_t)0x00000200)        /* Option Bytes Write Enable */
+#define  FLASH_CTLR_ERRIE                      ((uint32_t)0x00000400)        /* Error Interrupt Enable */
+#define  FLASH_CTLR_EOPIE                      ((uint32_t)0x00001000)        /* End of operation interrupt enable */
+#define  FLASH_CTLR_FAST_LOCK                  ((uint32_t)0x00008000)        /* Fast Lock */
+#define  FLASH_CTLR_PAGE_PG                    ((uint32_t)0x00010000)        /* Page Programming 256Byte */
+#define  FLASH_CTLR_PAGE_ER                    ((uint32_t)0x00020000)        /* Page Erase 256Byte */
+#define  FLASH_CTLR_PAGE_BER32                 ((uint32_t)0x00040000)        /* Block Erase 32K */
+#define  FLASH_CTLR_PAGE_BER64                 ((uint32_t)0x00080000)        /* Block Erase 64K */
+#define  FLASH_CTLR_PG_STRT                    ((uint32_t)0x00200000)        /* Page Programming Start */
+#define  FLASH_CTLR_RSENACT                    ((uint32_t)0x00400000)
+#define  FLASH_CTLR_EHMOD                      ((uint32_t)0x01000000)
+#define  FLASH_CTLR_SCKMOD                     ((uint32_t)0x02000000)
+
+/*******************  Bit definition for FLASH_ADDR register  *******************/
+#define  FLASH_ADDR_FAR                        ((uint32_t)0xFFFFFFFF)        /* Flash Address */
+
+/******************  Bit definition for FLASH_OBR register  *******************/
+#define  FLASH_OBR_OPTERR                      ((uint16_t)0x0001)            /* Option Byte Error */
+#define  FLASH_OBR_RDPRT                       ((uint16_t)0x0002)            /* Read protection */
+
+#define  FLASH_OBR_USER                        ((uint16_t)0x03FC)            /* User Option Bytes */
+#define  FLASH_OBR_WDG_SW                      ((uint16_t)0x0004)            /* WDG_SW */
+#define  FLASH_OBR_nRST_STOP                   ((uint16_t)0x0008)            /* nRST_STOP */
+#define  FLASH_OBR_nRST_STDBY                  ((uint16_t)0x0010)            /* nRST_STDBY */
+#define  FLASH_OBR_RAM_CODE_MOD                ((uint16_t)0x0300)            
+#define  FLASH_OBR_RAM_CODE_MOD_BIT1           ((uint16_t)0x0100)
+#define  FLASH_OBR_RAM_CODE_MOD_BIT2           ((uint16_t)0x0200)
+
+/******************  Bit definition for FLASH_WPR register  ******************/
+#define  FLASH_WPR_WRP                         ((uint32_t)0xFFFFFFFF)        /* Write Protect */
+
+/******************  Bit definition for FLASH_MODEKEYR register  ******************/
+#define  FLASH_MODEKEYR_KEY1                   ((uint32_t)0x45670123)        
+#define  FLASH_MODEKEYR_KEY2                   ((uint32_t)0xCDEF89AB)        
+
+/******************  Bit definition for FLASH_RDPR register  *******************/
+#define  FLASH_RDPR_RDPR                       ((uint32_t)0x000000FF)        /* Read protection option byte */
+#define  FLASH_RDPR_nRDPR                      ((uint32_t)0x0000FF00)        /* Read protection complemented option byte */
+
+/******************  Bit definition for FLASH_USER register  ******************/
+#define  FLASH_USER_USER                       ((uint32_t)0x00FF0000)        /* User option byte */
+#define  FLASH_USER_nUSER                      ((uint32_t)0xFF000000)        /* User complemented option byte */
+
+/******************  Bit definition for FLASH_Data0 register  *****************/
+#define  FLASH_Data0_Data0                     ((uint32_t)0x000000FF)        /* User data storage option byte */
+#define  FLASH_Data0_nData0                    ((uint32_t)0x0000FF00)        /* User data storage complemented option byte */
+
+/******************  Bit definition for FLASH_Data1 register  *****************/
+#define  FLASH_Data1_Data1                     ((uint32_t)0x00FF0000)        /* User data storage option byte */
+#define  FLASH_Data1_nData1                    ((uint32_t)0xFF000000)        /* User data storage complemented option byte */
+
+/******************  Bit definition for FLASH_WRPR0 register  ******************/
+#define  FLASH_WRPR0_WRPR0                     ((uint32_t)0x000000FF)        /* Flash memory write protection option bytes */
+#define  FLASH_WRPR0_nWRPR0                    ((uint32_t)0x0000FF00)        /* Flash memory write protection complemented option bytes */
+
+/******************  Bit definition for FLASH_WRPR1 register  ******************/
+#define  FLASH_WRPR1_WRPR1                     ((uint32_t)0x00FF0000)        /* Flash memory write protection option bytes */
+#define  FLASH_WRPR1_nWRPR1                    ((uint32_t)0xFF000000)        /* Flash memory write protection complemented option bytes */
+
+/******************  Bit definition for FLASH_WRPR2 register  ******************/
+#define  FLASH_WRPR2_WRPR2                     ((uint32_t)0x000000FF)        /* Flash memory write protection option bytes */
+#define  FLASH_WRPR2_nWRPR2                    ((uint32_t)0x0000FF00)        /* Flash memory write protection complemented option bytes */
+
+/******************  Bit definition for FLASH_WRPR3 register  ******************/
+#define  FLASH_WRPR3_WRPR3                     ((uint32_t)0x00FF0000)        /* Flash memory write protection option bytes */
+#define  FLASH_WRPR3_nWRPR3                    ((uint32_t)0xFF000000)        /* Flash memory write protection complemented option bytes */
+
+/******************************************************************************/
+/*                General Purpose and Alternate Function I/O                  */
+/******************************************************************************/
+
+/*******************  Bit definition for GPIO_CFGLR register  *******************/
+#define  GPIO_CFGLR_MODE                       ((uint32_t)0x33333333)        /* Port x mode bits */
+
+#define  GPIO_CFGLR_MODE0                      ((uint32_t)0x00000003)        /* MODE0[1:0] bits (Port x mode bits, pin 0) */
+#define  GPIO_CFGLR_MODE0_0                    ((uint32_t)0x00000001)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE0_1                    ((uint32_t)0x00000002)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE1                      ((uint32_t)0x00000030)        /* MODE1[1:0] bits (Port x mode bits, pin 1) */
+#define  GPIO_CFGLR_MODE1_0                    ((uint32_t)0x00000010)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE1_1                    ((uint32_t)0x00000020)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE2                      ((uint32_t)0x00000300)        /* MODE2[1:0] bits (Port x mode bits, pin 2) */
+#define  GPIO_CFGLR_MODE2_0                    ((uint32_t)0x00000100)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE2_1                    ((uint32_t)0x00000200)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE3                      ((uint32_t)0x00003000)        /* MODE3[1:0] bits (Port x mode bits, pin 3) */
+#define  GPIO_CFGLR_MODE3_0                    ((uint32_t)0x00001000)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE3_1                    ((uint32_t)0x00002000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE4                      ((uint32_t)0x00030000)        /* MODE4[1:0] bits (Port x mode bits, pin 4) */
+#define  GPIO_CFGLR_MODE4_0                    ((uint32_t)0x00010000)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE4_1                    ((uint32_t)0x00020000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE5                      ((uint32_t)0x00300000)        /* MODE5[1:0] bits (Port x mode bits, pin 5) */
+#define  GPIO_CFGLR_MODE5_0                    ((uint32_t)0x00100000)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE5_1                    ((uint32_t)0x00200000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE6                      ((uint32_t)0x03000000)        /* MODE6[1:0] bits (Port x mode bits, pin 6) */
+#define  GPIO_CFGLR_MODE6_0                    ((uint32_t)0x01000000)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE6_1                    ((uint32_t)0x02000000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_MODE7                      ((uint32_t)0x30000000)        /* MODE7[1:0] bits (Port x mode bits, pin 7) */
+#define  GPIO_CFGLR_MODE7_0                    ((uint32_t)0x10000000)        /* Bit 0 */
+#define  GPIO_CFGLR_MODE7_1                    ((uint32_t)0x20000000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF                        ((uint32_t)0xCCCCCCCC)        /* Port x configuration bits */
+
+#define  GPIO_CFGLR_CNF0                       ((uint32_t)0x0000000C)        /* CNF0[1:0] bits (Port x configuration bits, pin 0) */
+#define  GPIO_CFGLR_CNF0_0                     ((uint32_t)0x00000004)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF0_1                     ((uint32_t)0x00000008)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF1                       ((uint32_t)0x000000C0)        /* CNF1[1:0] bits (Port x configuration bits, pin 1) */
+#define  GPIO_CFGLR_CNF1_0                     ((uint32_t)0x00000040)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF1_1                     ((uint32_t)0x00000080)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF2                       ((uint32_t)0x00000C00)        /* CNF2[1:0] bits (Port x configuration bits, pin 2) */
+#define  GPIO_CFGLR_CNF2_0                     ((uint32_t)0x00000400)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF2_1                     ((uint32_t)0x00000800)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF3                       ((uint32_t)0x0000C000)        /* CNF3[1:0] bits (Port x configuration bits, pin 3) */
+#define  GPIO_CFGLR_CNF3_0                     ((uint32_t)0x00004000)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF3_1                     ((uint32_t)0x00008000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF4                       ((uint32_t)0x000C0000)        /* CNF4[1:0] bits (Port x configuration bits, pin 4) */
+#define  GPIO_CFGLR_CNF4_0                     ((uint32_t)0x00040000)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF4_1                     ((uint32_t)0x00080000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF5                       ((uint32_t)0x00C00000)        /* CNF5[1:0] bits (Port x configuration bits, pin 5) */
+#define  GPIO_CFGLR_CNF5_0                     ((uint32_t)0x00400000)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF5_1                     ((uint32_t)0x00800000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF6                       ((uint32_t)0x0C000000)        /* CNF6[1:0] bits (Port x configuration bits, pin 6) */
+#define  GPIO_CFGLR_CNF6_0                     ((uint32_t)0x04000000)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF6_1                     ((uint32_t)0x08000000)        /* Bit 1 */
+
+#define  GPIO_CFGLR_CNF7                       ((uint32_t)0xC0000000)        /* CNF7[1:0] bits (Port x configuration bits, pin 7) */
+#define  GPIO_CFGLR_CNF7_0                     ((uint32_t)0x40000000)        /* Bit 0 */
+#define  GPIO_CFGLR_CNF7_1                     ((uint32_t)0x80000000)        /* Bit 1 */
+
+/*******************  Bit definition for GPIO_CFGHR register  *******************/
+#define  GPIO_CFGHR_MODE                       ((uint32_t)0x33333333)        /* Port x mode bits */
+
+#define  GPIO_CFGHR_MODE8                      ((uint32_t)0x00000003)        /* MODE8[1:0] bits (Port x mode bits, pin 8) */
+#define  GPIO_CFGHR_MODE8_0                    ((uint32_t)0x00000001)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE8_1                    ((uint32_t)0x00000002)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE9                      ((uint32_t)0x00000030)        /* MODE9[1:0] bits (Port x mode bits, pin 9) */
+#define  GPIO_CFGHR_MODE9_0                    ((uint32_t)0x00000010)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE9_1                    ((uint32_t)0x00000020)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE10                     ((uint32_t)0x00000300)        /* MODE10[1:0] bits (Port x mode bits, pin 10) */
+#define  GPIO_CFGHR_MODE10_0                   ((uint32_t)0x00000100)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE10_1                   ((uint32_t)0x00000200)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE11                     ((uint32_t)0x00003000)        /* MODE11[1:0] bits (Port x mode bits, pin 11) */
+#define  GPIO_CFGHR_MODE11_0                   ((uint32_t)0x00001000)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE11_1                   ((uint32_t)0x00002000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE12                     ((uint32_t)0x00030000)        /* MODE12[1:0] bits (Port x mode bits, pin 12) */
+#define  GPIO_CFGHR_MODE12_0                   ((uint32_t)0x00010000)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE12_1                   ((uint32_t)0x00020000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE13                     ((uint32_t)0x00300000)        /* MODE13[1:0] bits (Port x mode bits, pin 13) */
+#define  GPIO_CFGHR_MODE13_0                   ((uint32_t)0x00100000)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE13_1                   ((uint32_t)0x00200000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE14                     ((uint32_t)0x03000000)        /* MODE14[1:0] bits (Port x mode bits, pin 14) */
+#define  GPIO_CFGHR_MODE14_0                   ((uint32_t)0x01000000)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE14_1                   ((uint32_t)0x02000000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_MODE15                     ((uint32_t)0x30000000)        /* MODE15[1:0] bits (Port x mode bits, pin 15) */
+#define  GPIO_CFGHR_MODE15_0                   ((uint32_t)0x10000000)        /* Bit 0 */
+#define  GPIO_CFGHR_MODE15_1                   ((uint32_t)0x20000000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF                        ((uint32_t)0xCCCCCCCC)        /* Port x configuration bits */
+
+#define  GPIO_CFGHR_CNF8                       ((uint32_t)0x0000000C)        /* CNF8[1:0] bits (Port x configuration bits, pin 8) */
+#define  GPIO_CFGHR_CNF8_0                     ((uint32_t)0x00000004)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF8_1                     ((uint32_t)0x00000008)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF9                       ((uint32_t)0x000000C0)        /* CNF9[1:0] bits (Port x configuration bits, pin 9) */
+#define  GPIO_CFGHR_CNF9_0                     ((uint32_t)0x00000040)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF9_1                     ((uint32_t)0x00000080)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF10                      ((uint32_t)0x00000C00)        /* CNF10[1:0] bits (Port x configuration bits, pin 10) */
+#define  GPIO_CFGHR_CNF10_0                    ((uint32_t)0x00000400)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF10_1                    ((uint32_t)0x00000800)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF11                      ((uint32_t)0x0000C000)        /* CNF11[1:0] bits (Port x configuration bits, pin 11) */
+#define  GPIO_CFGHR_CNF11_0                    ((uint32_t)0x00004000)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF11_1                    ((uint32_t)0x00008000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF12                      ((uint32_t)0x000C0000)        /* CNF12[1:0] bits (Port x configuration bits, pin 12) */
+#define  GPIO_CFGHR_CNF12_0                    ((uint32_t)0x00040000)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF12_1                    ((uint32_t)0x00080000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF13                      ((uint32_t)0x00C00000)        /* CNF13[1:0] bits (Port x configuration bits, pin 13) */
+#define  GPIO_CFGHR_CNF13_0                    ((uint32_t)0x00400000)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF13_1                    ((uint32_t)0x00800000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF14                      ((uint32_t)0x0C000000)        /* CNF14[1:0] bits (Port x configuration bits, pin 14) */
+#define  GPIO_CFGHR_CNF14_0                    ((uint32_t)0x04000000)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF14_1                    ((uint32_t)0x08000000)        /* Bit 1 */
+
+#define  GPIO_CFGHR_CNF15                      ((uint32_t)0xC0000000)        /* CNF15[1:0] bits (Port x configuration bits, pin 15) */
+#define  GPIO_CFGHR_CNF15_0                    ((uint32_t)0x40000000)        /* Bit 0 */
+#define  GPIO_CFGHR_CNF15_1                    ((uint32_t)0x80000000)        /* Bit 1 */
+
+/*******************  Bit definition for GPIO_INDR register  *******************/
+#define GPIO_INDR_IDR0                         ((uint16_t)0x0001)            /* Port input data, bit 0 */
+#define GPIO_INDR_IDR1                         ((uint16_t)0x0002)            /* Port input data, bit 1 */
+#define GPIO_INDR_IDR2                         ((uint16_t)0x0004)            /* Port input data, bit 2 */
+#define GPIO_INDR_IDR3                         ((uint16_t)0x0008)            /* Port input data, bit 3 */
+#define GPIO_INDR_IDR4                         ((uint16_t)0x0010)            /* Port input data, bit 4 */
+#define GPIO_INDR_IDR5                         ((uint16_t)0x0020)            /* Port input data, bit 5 */
+#define GPIO_INDR_IDR6                         ((uint16_t)0x0040)            /* Port input data, bit 6 */
+#define GPIO_INDR_IDR7                         ((uint16_t)0x0080)            /* Port input data, bit 7 */
+#define GPIO_INDR_IDR8                         ((uint16_t)0x0100)            /* Port input data, bit 8 */
+#define GPIO_INDR_IDR9                         ((uint16_t)0x0200)            /* Port input data, bit 9 */
+#define GPIO_INDR_IDR10                        ((uint16_t)0x0400)            /* Port input data, bit 10 */
+#define GPIO_INDR_IDR11                        ((uint16_t)0x0800)            /* Port input data, bit 11 */
+#define GPIO_INDR_IDR12                        ((uint16_t)0x1000)            /* Port input data, bit 12 */
+#define GPIO_INDR_IDR13                        ((uint16_t)0x2000)            /* Port input data, bit 13 */
+#define GPIO_INDR_IDR14                        ((uint16_t)0x4000)            /* Port input data, bit 14 */
+#define GPIO_INDR_IDR15                        ((uint16_t)0x8000)            /* Port input data, bit 15 */
+
+/*******************  Bit definition for GPIO_OUTDR register  *******************/
+#define GPIO_OUTDR_ODR0                        ((uint16_t)0x0001)            /* Port output data, bit 0 */
+#define GPIO_OUTDR_ODR1                        ((uint16_t)0x0002)            /* Port output data, bit 1 */
+#define GPIO_OUTDR_ODR2                        ((uint16_t)0x0004)            /* Port output data, bit 2 */
+#define GPIO_OUTDR_ODR3                        ((uint16_t)0x0008)            /* Port output data, bit 3 */
+#define GPIO_OUTDR_ODR4                        ((uint16_t)0x0010)            /* Port output data, bit 4 */
+#define GPIO_OUTDR_ODR5                        ((uint16_t)0x0020)            /* Port output data, bit 5 */
+#define GPIO_OUTDR_ODR6                        ((uint16_t)0x0040)            /* Port output data, bit 6 */
+#define GPIO_OUTDR_ODR7                        ((uint16_t)0x0080)            /* Port output data, bit 7 */
+#define GPIO_OUTDR_ODR8                        ((uint16_t)0x0100)            /* Port output data, bit 8 */
+#define GPIO_OUTDR_ODR9                        ((uint16_t)0x0200)            /* Port output data, bit 9 */
+#define GPIO_OUTDR_ODR10                       ((uint16_t)0x0400)            /* Port output data, bit 10 */
+#define GPIO_OUTDR_ODR11                       ((uint16_t)0x0800)            /* Port output data, bit 11 */
+#define GPIO_OUTDR_ODR12                       ((uint16_t)0x1000)            /* Port output data, bit 12 */
+#define GPIO_OUTDR_ODR13                       ((uint16_t)0x2000)            /* Port output data, bit 13 */
+#define GPIO_OUTDR_ODR14                       ((uint16_t)0x4000)            /* Port output data, bit 14 */
+#define GPIO_OUTDR_ODR15                       ((uint16_t)0x8000)            /* Port output data, bit 15 */
+
+/******************  Bit definition for GPIO_BSHR register  *******************/
+#define GPIO_BSHR_BS0                          ((uint32_t)0x00000001)        /* Port x Set bit 0 */
+#define GPIO_BSHR_BS1                          ((uint32_t)0x00000002)        /* Port x Set bit 1 */
+#define GPIO_BSHR_BS2                          ((uint32_t)0x00000004)        /* Port x Set bit 2 */
+#define GPIO_BSHR_BS3                          ((uint32_t)0x00000008)        /* Port x Set bit 3 */
+#define GPIO_BSHR_BS4                          ((uint32_t)0x00000010)        /* Port x Set bit 4 */
+#define GPIO_BSHR_BS5                          ((uint32_t)0x00000020)        /* Port x Set bit 5 */
+#define GPIO_BSHR_BS6                          ((uint32_t)0x00000040)        /* Port x Set bit 6 */
+#define GPIO_BSHR_BS7                          ((uint32_t)0x00000080)        /* Port x Set bit 7 */
+#define GPIO_BSHR_BS8                          ((uint32_t)0x00000100)        /* Port x Set bit 8 */
+#define GPIO_BSHR_BS9                          ((uint32_t)0x00000200)        /* Port x Set bit 9 */
+#define GPIO_BSHR_BS10                         ((uint32_t)0x00000400)        /* Port x Set bit 10 */
+#define GPIO_BSHR_BS11                         ((uint32_t)0x00000800)        /* Port x Set bit 11 */
+#define GPIO_BSHR_BS12                         ((uint32_t)0x00001000)        /* Port x Set bit 12 */
+#define GPIO_BSHR_BS13                         ((uint32_t)0x00002000)        /* Port x Set bit 13 */
+#define GPIO_BSHR_BS14                         ((uint32_t)0x00004000)        /* Port x Set bit 14 */
+#define GPIO_BSHR_BS15                         ((uint32_t)0x00008000)        /* Port x Set bit 15 */
+
+#define GPIO_BSHR_BR0                          ((uint32_t)0x00010000)        /* Port x Reset bit 0 */
+#define GPIO_BSHR_BR1                          ((uint32_t)0x00020000)        /* Port x Reset bit 1 */
+#define GPIO_BSHR_BR2                          ((uint32_t)0x00040000)        /* Port x Reset bit 2 */
+#define GPIO_BSHR_BR3                          ((uint32_t)0x00080000)        /* Port x Reset bit 3 */
+#define GPIO_BSHR_BR4                          ((uint32_t)0x00100000)        /* Port x Reset bit 4 */
+#define GPIO_BSHR_BR5                          ((uint32_t)0x00200000)        /* Port x Reset bit 5 */
+#define GPIO_BSHR_BR6                          ((uint32_t)0x00400000)        /* Port x Reset bit 6 */
+#define GPIO_BSHR_BR7                          ((uint32_t)0x00800000)        /* Port x Reset bit 7 */
+#define GPIO_BSHR_BR8                          ((uint32_t)0x01000000)        /* Port x Reset bit 8 */
+#define GPIO_BSHR_BR9                          ((uint32_t)0x02000000)        /* Port x Reset bit 9 */
+#define GPIO_BSHR_BR10                         ((uint32_t)0x04000000)        /* Port x Reset bit 10 */
+#define GPIO_BSHR_BR11                         ((uint32_t)0x08000000)        /* Port x Reset bit 11 */
+#define GPIO_BSHR_BR12                         ((uint32_t)0x10000000)        /* Port x Reset bit 12 */
+#define GPIO_BSHR_BR13                         ((uint32_t)0x20000000)        /* Port x Reset bit 13 */
+#define GPIO_BSHR_BR14                         ((uint32_t)0x40000000)        /* Port x Reset bit 14 */
+#define GPIO_BSHR_BR15                         ((uint32_t)0x80000000)        /* Port x Reset bit 15 */
+
+/*******************  Bit definition for GPIO_BCR register  *******************/
+#define GPIO_BCR_BR0                           ((uint16_t)0x0001)            /* Port x Reset bit 0 */
+#define GPIO_BCR_BR1                           ((uint16_t)0x0002)            /* Port x Reset bit 1 */
+#define GPIO_BCR_BR2                           ((uint16_t)0x0004)            /* Port x Reset bit 2 */
+#define GPIO_BCR_BR3                           ((uint16_t)0x0008)            /* Port x Reset bit 3 */
+#define GPIO_BCR_BR4                           ((uint16_t)0x0010)            /* Port x Reset bit 4 */
+#define GPIO_BCR_BR5                           ((uint16_t)0x0020)            /* Port x Reset bit 5 */
+#define GPIO_BCR_BR6                           ((uint16_t)0x0040)            /* Port x Reset bit 6 */
+#define GPIO_BCR_BR7                           ((uint16_t)0x0080)            /* Port x Reset bit 7 */
+#define GPIO_BCR_BR8                           ((uint16_t)0x0100)            /* Port x Reset bit 8 */
+#define GPIO_BCR_BR9                           ((uint16_t)0x0200)            /* Port x Reset bit 9 */
+#define GPIO_BCR_BR10                          ((uint16_t)0x0400)            /* Port x Reset bit 10 */
+#define GPIO_BCR_BR11                          ((uint16_t)0x0800)            /* Port x Reset bit 11 */
+#define GPIO_BCR_BR12                          ((uint16_t)0x1000)            /* Port x Reset bit 12 */
+#define GPIO_BCR_BR13                          ((uint16_t)0x2000)            /* Port x Reset bit 13 */
+#define GPIO_BCR_BR14                          ((uint16_t)0x4000)            /* Port x Reset bit 14 */
+#define GPIO_BCR_BR15                          ((uint16_t)0x8000)            /* Port x Reset bit 15 */
+
+/******************  Bit definition for GPIO_LCKR register  *******************/
+#define GPIO_LCK0                              ((uint32_t)0x00000001)        /* Port x Lock bit 0 */
+#define GPIO_LCK1                              ((uint32_t)0x00000002)        /* Port x Lock bit 1 */
+#define GPIO_LCK2                              ((uint32_t)0x00000004)        /* Port x Lock bit 2 */
+#define GPIO_LCK3                              ((uint32_t)0x00000008)        /* Port x Lock bit 3 */
+#define GPIO_LCK4                              ((uint32_t)0x00000010)        /* Port x Lock bit 4 */
+#define GPIO_LCK5                              ((uint32_t)0x00000020)        /* Port x Lock bit 5 */
+#define GPIO_LCK6                              ((uint32_t)0x00000040)        /* Port x Lock bit 6 */
+#define GPIO_LCK7                              ((uint32_t)0x00000080)        /* Port x Lock bit 7 */
+#define GPIO_LCK8                              ((uint32_t)0x00000100)        /* Port x Lock bit 8 */
+#define GPIO_LCK9                              ((uint32_t)0x00000200)        /* Port x Lock bit 9 */
+#define GPIO_LCK10                             ((uint32_t)0x00000400)        /* Port x Lock bit 10 */
+#define GPIO_LCK11                             ((uint32_t)0x00000800)        /* Port x Lock bit 11 */
+#define GPIO_LCK12                             ((uint32_t)0x00001000)        /* Port x Lock bit 12 */
+#define GPIO_LCK13                             ((uint32_t)0x00002000)        /* Port x Lock bit 13 */
+#define GPIO_LCK14                             ((uint32_t)0x00004000)        /* Port x Lock bit 14 */
+#define GPIO_LCK15                             ((uint32_t)0x00008000)        /* Port x Lock bit 15 */
+#define GPIO_LCKK                              ((uint32_t)0x00010000)        /* Lock key */
+
+
+/******************  Bit definition for AFIO_ECR register  *******************/
+#define AFIO_ECR_PIN                           ((uint8_t)0x0F)               /* PIN[3:0] bits (Pin selection) */
+#define AFIO_ECR_PIN_0                         ((uint8_t)0x01)               /* Bit 0 */
+#define AFIO_ECR_PIN_1                         ((uint8_t)0x02)               /* Bit 1 */
+#define AFIO_ECR_PIN_2                         ((uint8_t)0x04)               /* Bit 2 */
+#define AFIO_ECR_PIN_3                         ((uint8_t)0x08)               /* Bit 3 */
+
+#define AFIO_ECR_PIN_PX0                       ((uint8_t)0x00)               /* Pin 0 selected */
+#define AFIO_ECR_PIN_PX1                       ((uint8_t)0x01)               /* Pin 1 selected */
+#define AFIO_ECR_PIN_PX2                       ((uint8_t)0x02)               /* Pin 2 selected */
+#define AFIO_ECR_PIN_PX3                       ((uint8_t)0x03)               /* Pin 3 selected */
+#define AFIO_ECR_PIN_PX4                       ((uint8_t)0x04)               /* Pin 4 selected */
+#define AFIO_ECR_PIN_PX5                       ((uint8_t)0x05)               /* Pin 5 selected */
+#define AFIO_ECR_PIN_PX6                       ((uint8_t)0x06)               /* Pin 6 selected */
+#define AFIO_ECR_PIN_PX7                       ((uint8_t)0x07)               /* Pin 7 selected */
+#define AFIO_ECR_PIN_PX8                       ((uint8_t)0x08)               /* Pin 8 selected */
+#define AFIO_ECR_PIN_PX9                       ((uint8_t)0x09)               /* Pin 9 selected */
+#define AFIO_ECR_PIN_PX10                      ((uint8_t)0x0A)               /* Pin 10 selected */
+#define AFIO_ECR_PIN_PX11                      ((uint8_t)0x0B)               /* Pin 11 selected */
+#define AFIO_ECR_PIN_PX12                      ((uint8_t)0x0C)               /* Pin 12 selected */
+#define AFIO_ECR_PIN_PX13                      ((uint8_t)0x0D)               /* Pin 13 selected */
+#define AFIO_ECR_PIN_PX14                      ((uint8_t)0x0E)               /* Pin 14 selected */
+#define AFIO_ECR_PIN_PX15                      ((uint8_t)0x0F)               /* Pin 15 selected */
+
+#define AFIO_ECR_PORT                          ((uint8_t)0x70)               /* PORT[2:0] bits (Port selection) */
+#define AFIO_ECR_PORT_0                        ((uint8_t)0x10)               /* Bit 0 */
+#define AFIO_ECR_PORT_1                        ((uint8_t)0x20)               /* Bit 1 */
+#define AFIO_ECR_PORT_2                        ((uint8_t)0x40)               /* Bit 2 */
+
+#define AFIO_ECR_PORT_PA                       ((uint8_t)0x00)               /* Port A selected */
+#define AFIO_ECR_PORT_PB                       ((uint8_t)0x10)               /* Port B selected */
+#define AFIO_ECR_PORT_PC                       ((uint8_t)0x20)               /* Port C selected */
+#define AFIO_ECR_PORT_PD                       ((uint8_t)0x30)               /* Port D selected */
+#define AFIO_ECR_PORT_PE                       ((uint8_t)0x40)               /* Port E selected */
+
+#define AFIO_ECR_EVOE                          ((uint8_t)0x80)               /* Event Output Enable */
+
+/******************  Bit definition for AFIO_PCFR1register  *******************/
+#define AFIO_PCFR1_SPI1_REMAP                  ((uint32_t)0x00000001)        /* SPI1 remapping */
+#define AFIO_PCFR1_I2C1_REMAP                  ((uint32_t)0x00000002)        /* I2C1 remapping */
+#define AFIO_PCFR1_USART1_REMAP                ((uint32_t)0x00000004)        /* USART1 remapping */
+#define AFIO_PCFR1_USART2_REMAP                ((uint32_t)0x00000008)        /* USART2 remapping */
+
+#define AFIO_PCFR1_USART3_REMAP                ((uint32_t)0x00000030)        /* USART3_REMAP[1:0] bits (USART3 remapping) */
+#define AFIO_PCFR1_USART3_REMAP_0              ((uint32_t)0x00000010)        /* Bit 0 */
+#define AFIO_PCFR1_USART3_REMAP_1              ((uint32_t)0x00000020)        /* Bit 1 */
+
+#define AFIO_PCFR1_USART3_REMAP_NOREMAP        ((uint32_t)0x00000000)        /* No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */
+#define AFIO_PCFR1_USART3_REMAP_PARTIALREMAP1  ((uint32_t)0x00000010)        /* Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */
+#define AFIO_PCFR1_USART3_REMAP_PARTIALREMAP2  ((uint32_t)0x00000020)
+#define AFIO_PCFR1_USART3_REMAP_FULLREMAP      ((uint32_t)0x00000030)        /* Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */
+
+#define AFIO_PCFR1_TIM1_REMAP                  ((uint32_t)0x000000C0)        /* TIM1_REMAP[1:0] bits (TIM1 remapping) */
+#define AFIO_PCFR1_TIM1_REMAP_0                ((uint32_t)0x00000040)        /* Bit 0 */
+#define AFIO_PCFR1_TIM1_REMAP_1                ((uint32_t)0x00000080)        /* Bit 1 */
+
+#define AFIO_PCFR1_TIM1_REMAP_NOREMAP          ((uint32_t)0x00000000)        /* No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */
+#define AFIO_PCFR1_TIM1_REMAP_PARTIALREMAP     ((uint32_t)0x00000040)        /* Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */
+#define AFIO_PCFR1_TIM1_REMAP_FULLREMAP        ((uint32_t)0x000000C0)        /* Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */
+
+#define AFIO_PCFR1_TIM2_REMAP                  ((uint32_t)0x00000300)        /* TIM2_REMAP[1:0] bits (TIM2 remapping) */
+#define AFIO_PCFR1_TIM2_REMAP_0                ((uint32_t)0x00000100)        /* Bit 0 */
+#define AFIO_PCFR1_TIM2_REMAP_1                ((uint32_t)0x00000200)        /* Bit 1 */
+
+#define AFIO_PCFR1_TIM2_REMAP_NOREMAP          ((uint32_t)0x00000000)        /* No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */
+#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP1    ((uint32_t)0x00000100)        /* Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */
+#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP2    ((uint32_t)0x00000200)        /* Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */
+#define AFIO_PCFR1_TIM2_REMAP_FULLREMAP        ((uint32_t)0x00000300)        /* Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */
+
+#define AFIO_PCFR1_TIM3_REMAP                  ((uint32_t)0x00000C00)        /* TIM3_REMAP[1:0] bits (TIM3 remapping) */
+#define AFIO_PCFR1_TIM3_REMAP_0                ((uint32_t)0x00000400)        /* Bit 0 */
+#define AFIO_PCFR1_TIM3_REMAP_1                ((uint32_t)0x00000800)        /* Bit 1 */
+
+#define AFIO_PCFR1_TIM3_REMAP_NOREMAP          ((uint32_t)0x00000000)        /* No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */
+#define AFIO_PCFR1_TIM3_REMAP_PARTIALREMAP     ((uint32_t)0x00000800)        /* Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */
+#define AFIO_PCFR1_TIM3_REMAP_FULLREMAP        ((uint32_t)0x00000C00)        /* Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */
+
+#define AFIO_PCFR1_TIM4_REMAP                  ((uint32_t)0x00001000)        /* TIM4_REMAP bit (TIM4 remapping) */
+
+#define AFIO_PCFR1_CAN_REMAP                   ((uint32_t)0x00006000)        /* CAN_REMAP[1:0] bits (CAN Alternate function remapping) */
+#define AFIO_PCFR1_CAN_REMAP_0                 ((uint32_t)0x00002000)        /* Bit 0 */
+#define AFIO_PCFR1_CAN_REMAP_1                 ((uint32_t)0x00004000)        /* Bit 1 */
+
+#define AFIO_PCFR1_CAN_REMAP_REMAP1            ((uint32_t)0x00000000)        /* CANRX mapped to PA11, CANTX mapped to PA12 */
+#define AFIO_PCFR1_CAN_REMAP_REMAP2            ((uint32_t)0x00004000)        /* CANRX mapped to PB8, CANTX mapped to PB9 */
+#define AFIO_PCFR1_CAN_REMAP_REMAP3            ((uint32_t)0x00006000)        /* CANRX mapped to PD0, CANTX mapped to PD1 */
+
+#define AFIO_PCFR1_PD01_REMAP                  ((uint32_t)0x00008000)        /* Port D0/Port D1 mapping on OSC_IN/OSC_OUT */
+#define AFIO_PCFR1_TIM5CH4_IREMAP              ((uint32_t)0x00010000)        /* TIM5 Channel4 Internal Remap */
+#define AFIO_PCFR1_ADC1_ETRGINJ_REMAP          ((uint32_t)0x00020000)        /* ADC 1 External Trigger Injected Conversion remapping */
+#define AFIO_PCFR1_ADC1_ETRGREG_REMAP          ((uint32_t)0x00040000)        /* ADC 1 External Trigger Regular Conversion remapping */
+#define AFIO_PCFR1_ADC2_ETRGINJ_REMAP          ((uint32_t)0x00080000)        /* ADC 2 External Trigger Injected Conversion remapping */
+#define AFIO_PCFR1_ADC2_ETRGREG_REMAP          ((uint32_t)0x00100000)        /* ADC 2 External Trigger Regular Conversion remapping */
+
+#define AFIO_PCFR1_ETH_REMAP                   ((uint32_t)0x00200000)
+
+#define AFIO_PCFR1_CAN2_REMAP                  ((uint32_t)0x00400000)
+
+#define AFIO_PCFR1_MII_RMII_REMAP              ((uint32_t)0x00800000)
+
+#define AFIO_PCFR1_SWJ_CFG                     ((uint32_t)0x07000000)        /* SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */
+#define AFIO_PCFR1_SWJ_CFG_0                   ((uint32_t)0x01000000)        /* Bit 0 */
+#define AFIO_PCFR1_SWJ_CFG_1                   ((uint32_t)0x02000000)        /* Bit 1 */
+#define AFIO_PCFR1_SWJ_CFG_2                   ((uint32_t)0x04000000)        /* Bit 2 */
+
+#define AFIO_PCFR1_SWJ_CFG_RESET               ((uint32_t)0x00000000)        /* Full SWJ (JTAG-DP + SW-DP) : Reset State */
+#define AFIO_PCFR1_SWJ_CFG_NOJNTRST            ((uint32_t)0x01000000)        /* Full SWJ (JTAG-DP + SW-DP) but without JNTRST */
+#define AFIO_PCFR1_SWJ_CFG_JTAGDISABLE         ((uint32_t)0x02000000)        /* JTAG-DP Disabled and SW-DP Enabled */
+#define AFIO_PCFR1_SWJ_CFG_DISABLE             ((uint32_t)0x04000000)        /* JTAG-DP Disabled and SW-DP Disabled */
+
+#define AFIO_PCFR1_SPI3_REMAP                  ((uint32_t)0x10000000)
+
+#define AFIO_PCFR1_TIM2ITR1_REMAP              ((uint32_t)0x20000000)
+
+#define AFIO_PCFR1_PTP_PPS_REMAP               ((uint32_t)0x40000000)
+
+/*****************  Bit definition for AFIO_EXTICR1 register  *****************/
+#define AFIO_EXTICR1_EXTI0                     ((uint16_t)0x000F)            /* EXTI 0 configuration */
+#define AFIO_EXTICR1_EXTI1                     ((uint16_t)0x00F0)            /* EXTI 1 configuration */
+#define AFIO_EXTICR1_EXTI2                     ((uint16_t)0x0F00)            /* EXTI 2 configuration */
+#define AFIO_EXTICR1_EXTI3                     ((uint16_t)0xF000)            /* EXTI 3 configuration */
+
+#define AFIO_EXTICR1_EXTI0_PA                  ((uint16_t)0x0000)            /* PA[0] pin */
+#define AFIO_EXTICR1_EXTI0_PB                  ((uint16_t)0x0001)            /* PB[0] pin */
+#define AFIO_EXTICR1_EXTI0_PC                  ((uint16_t)0x0002)            /* PC[0] pin */
+#define AFIO_EXTICR1_EXTI0_PD                  ((uint16_t)0x0003)            /* PD[0] pin */
+#define AFIO_EXTICR1_EXTI0_PE                  ((uint16_t)0x0004)            /* PE[0] pin */
+
+#define AFIO_EXTICR1_EXTI1_PA                  ((uint16_t)0x0000)            /* PA[1] pin */
+#define AFIO_EXTICR1_EXTI1_PB                  ((uint16_t)0x0010)            /* PB[1] pin */
+#define AFIO_EXTICR1_EXTI1_PC                  ((uint16_t)0x0020)            /* PC[1] pin */
+#define AFIO_EXTICR1_EXTI1_PD                  ((uint16_t)0x0030)            /* PD[1] pin */
+#define AFIO_EXTICR1_EXTI1_PE                  ((uint16_t)0x0040)            /* PE[1] pin */
+ 
+#define AFIO_EXTICR1_EXTI2_PA                  ((uint16_t)0x0000)            /* PA[2] pin */
+#define AFIO_EXTICR1_EXTI2_PB                  ((uint16_t)0x0100)            /* PB[2] pin */
+#define AFIO_EXTICR1_EXTI2_PC                  ((uint16_t)0x0200)            /* PC[2] pin */
+#define AFIO_EXTICR1_EXTI2_PD                  ((uint16_t)0x0300)            /* PD[2] pin */
+#define AFIO_EXTICR1_EXTI2_PE                  ((uint16_t)0x0400)            /* PE[2] pin */
+
+#define AFIO_EXTICR1_EXTI3_PA                  ((uint16_t)0x0000)            /* PA[3] pin */
+#define AFIO_EXTICR1_EXTI3_PB                  ((uint16_t)0x1000)            /* PB[3] pin */
+#define AFIO_EXTICR1_EXTI3_PC                  ((uint16_t)0x2000)            /* PC[3] pin */
+#define AFIO_EXTICR1_EXTI3_PD                  ((uint16_t)0x3000)            /* PD[3] pin */
+#define AFIO_EXTICR1_EXTI3_PE                  ((uint16_t)0x4000)            /* PE[3] pin */
+
+/*****************  Bit definition for AFIO_EXTICR2 register  *****************/
+#define AFIO_EXTICR2_EXTI4                     ((uint16_t)0x000F)            /* EXTI 4 configuration */
+#define AFIO_EXTICR2_EXTI5                     ((uint16_t)0x00F0)            /* EXTI 5 configuration */
+#define AFIO_EXTICR2_EXTI6                     ((uint16_t)0x0F00)            /* EXTI 6 configuration */
+#define AFIO_EXTICR2_EXTI7                     ((uint16_t)0xF000)            /* EXTI 7 configuration */
+
+#define AFIO_EXTICR2_EXTI4_PA                  ((uint16_t)0x0000)            /* PA[4] pin */
+#define AFIO_EXTICR2_EXTI4_PB                  ((uint16_t)0x0001)            /* PB[4] pin */
+#define AFIO_EXTICR2_EXTI4_PC                  ((uint16_t)0x0002)            /* PC[4] pin */
+#define AFIO_EXTICR2_EXTI4_PD                  ((uint16_t)0x0003)            /* PD[4] pin */
+#define AFIO_EXTICR2_EXTI4_PE                  ((uint16_t)0x0004)            /* PE[4] pin */
+
+#define AFIO_EXTICR2_EXTI5_PA                  ((uint16_t)0x0000)            /* PA[5] pin */
+#define AFIO_EXTICR2_EXTI5_PB                  ((uint16_t)0x0010)            /* PB[5] pin */
+#define AFIO_EXTICR2_EXTI5_PC                  ((uint16_t)0x0020)            /* PC[5] pin */
+#define AFIO_EXTICR2_EXTI5_PD                  ((uint16_t)0x0030)            /* PD[5] pin */
+#define AFIO_EXTICR2_EXTI5_PE                  ((uint16_t)0x0040)            /* PE[5] pin */
+
+#define AFIO_EXTICR2_EXTI6_PA                  ((uint16_t)0x0000)            /* PA[6] pin */
+#define AFIO_EXTICR2_EXTI6_PB                  ((uint16_t)0x0100)            /* PB[6] pin */
+#define AFIO_EXTICR2_EXTI6_PC                  ((uint16_t)0x0200)            /* PC[6] pin */
+#define AFIO_EXTICR2_EXTI6_PD                  ((uint16_t)0x0300)            /* PD[6] pin */
+#define AFIO_EXTICR2_EXTI6_PE                  ((uint16_t)0x0400)            /* PE[6] pin */
+
+#define AFIO_EXTICR2_EXTI7_PA                  ((uint16_t)0x0000)            /* PA[7] pin */
+#define AFIO_EXTICR2_EXTI7_PB                  ((uint16_t)0x1000)            /* PB[7] pin */
+#define AFIO_EXTICR2_EXTI7_PC                  ((uint16_t)0x2000)            /* PC[7] pin */
+#define AFIO_EXTICR2_EXTI7_PD                  ((uint16_t)0x3000)            /* PD[7] pin */
+#define AFIO_EXTICR2_EXTI7_PE                  ((uint16_t)0x4000)            /* PE[7] pin */
+
+/*****************  Bit definition for AFIO_EXTICR3 register  *****************/
+#define AFIO_EXTICR3_EXTI8                     ((uint16_t)0x000F)            /* EXTI 8 configuration */
+#define AFIO_EXTICR3_EXTI9                     ((uint16_t)0x00F0)            /* EXTI 9 configuration */
+#define AFIO_EXTICR3_EXTI10                    ((uint16_t)0x0F00)            /* EXTI 10 configuration */
+#define AFIO_EXTICR3_EXTI11                    ((uint16_t)0xF000)            /* EXTI 11 configuration */
+
+#define AFIO_EXTICR3_EXTI8_PA                  ((uint16_t)0x0000)            /* PA[8] pin */
+#define AFIO_EXTICR3_EXTI8_PB                  ((uint16_t)0x0001)            /* PB[8] pin */
+#define AFIO_EXTICR3_EXTI8_PC                  ((uint16_t)0x0002)            /* PC[8] pin */
+#define AFIO_EXTICR3_EXTI8_PD                  ((uint16_t)0x0003)            /* PD[8] pin */
+#define AFIO_EXTICR3_EXTI8_PE                  ((uint16_t)0x0004)            /* PE[8] pin */
+
+#define AFIO_EXTICR3_EXTI9_PA                  ((uint16_t)0x0000)            /* PA[9] pin */
+#define AFIO_EXTICR3_EXTI9_PB                  ((uint16_t)0x0010)            /* PB[9] pin */
+#define AFIO_EXTICR3_EXTI9_PC                  ((uint16_t)0x0020)            /* PC[9] pin */
+#define AFIO_EXTICR3_EXTI9_PD                  ((uint16_t)0x0030)            /* PD[9] pin */
+#define AFIO_EXTICR3_EXTI9_PE                  ((uint16_t)0x0040)            /* PE[9] pin */
+ 
+#define AFIO_EXTICR3_EXTI10_PA                 ((uint16_t)0x0000)            /* PA[10] pin */
+#define AFIO_EXTICR3_EXTI10_PB                 ((uint16_t)0x0100)            /* PB[10] pin */
+#define AFIO_EXTICR3_EXTI10_PC                 ((uint16_t)0x0200)            /* PC[10] pin */
+#define AFIO_EXTICR3_EXTI10_PD                 ((uint16_t)0x0300)            /* PD[10] pin */
+#define AFIO_EXTICR3_EXTI10_PE                 ((uint16_t)0x0400)            /* PE[10] pin */
+
+#define AFIO_EXTICR3_EXTI11_PA                 ((uint16_t)0x0000)            /* PA[11] pin */
+#define AFIO_EXTICR3_EXTI11_PB                 ((uint16_t)0x1000)            /* PB[11] pin */
+#define AFIO_EXTICR3_EXTI11_PC                 ((uint16_t)0x2000)            /* PC[11] pin */
+#define AFIO_EXTICR3_EXTI11_PD                 ((uint16_t)0x3000)            /* PD[11] pin */
+#define AFIO_EXTICR3_EXTI11_PE                 ((uint16_t)0x4000)            /* PE[11] pin */
+
+/*****************  Bit definition for AFIO_EXTICR4 register  *****************/
+#define AFIO_EXTICR4_EXTI12                    ((uint16_t)0x000F)            /* EXTI 12 configuration */
+#define AFIO_EXTICR4_EXTI13                    ((uint16_t)0x00F0)            /* EXTI 13 configuration */
+#define AFIO_EXTICR4_EXTI14                    ((uint16_t)0x0F00)            /* EXTI 14 configuration */
+#define AFIO_EXTICR4_EXTI15                    ((uint16_t)0xF000)            /* EXTI 15 configuration */
+
+#define AFIO_EXTICR4_EXTI12_PA                 ((uint16_t)0x0000)            /* PA[12] pin */
+#define AFIO_EXTICR4_EXTI12_PB                 ((uint16_t)0x0001)            /* PB[12] pin */
+#define AFIO_EXTICR4_EXTI12_PC                 ((uint16_t)0x0002)            /* PC[12] pin */
+#define AFIO_EXTICR4_EXTI12_PD                 ((uint16_t)0x0003)            /* PD[12] pin */
+#define AFIO_EXTICR4_EXTI12_PE                 ((uint16_t)0x0004)            /* PE[12] pin */
+
+#define AFIO_EXTICR4_EXTI13_PA                 ((uint16_t)0x0000)            /* PA[13] pin */
+#define AFIO_EXTICR4_EXTI13_PB                 ((uint16_t)0x0010)            /* PB[13] pin */
+#define AFIO_EXTICR4_EXTI13_PC                 ((uint16_t)0x0020)            /* PC[13] pin */
+#define AFIO_EXTICR4_EXTI13_PD                 ((uint16_t)0x0030)            /* PD[13] pin */
+#define AFIO_EXTICR4_EXTI13_PE                 ((uint16_t)0x0040)            /* PE[13] pin */
+
+#define AFIO_EXTICR4_EXTI14_PA                 ((uint16_t)0x0000)            /* PA[14] pin */
+#define AFIO_EXTICR4_EXTI14_PB                 ((uint16_t)0x0100)            /* PB[14] pin */
+#define AFIO_EXTICR4_EXTI14_PC                 ((uint16_t)0x0200)            /* PC[14] pin */
+#define AFIO_EXTICR4_EXTI14_PD                 ((uint16_t)0x0300)            /* PD[14] pin */
+#define AFIO_EXTICR4_EXTI14_PE                 ((uint16_t)0x0400)            /* PE[14] pin *//
+
+#define AFIO_EXTICR4_EXTI15_PA                 ((uint16_t)0x0000)            /* PA[15] pin */
+#define AFIO_EXTICR4_EXTI15_PB                 ((uint16_t)0x1000)            /* PB[15] pin */
+#define AFIO_EXTICR4_EXTI15_PC                 ((uint16_t)0x2000)            /* PC[15] pin */
+#define AFIO_EXTICR4_EXTI15_PD                 ((uint16_t)0x3000)            /* PD[15] pin */
+#define AFIO_EXTICR4_EXTI15_PE                 ((uint16_t)0x4000)            /* PE[15] pin */
+
+/******************  Bit definition for AFIO_PCFR2register  *******************/
+#define AFIO_PCFR2_TIM8_REMAP                  ((uint32_t)0x00000004)        
+
+#define AFIO_PCFR2_TIM9_REMAP                  ((uint32_t)0x00000018)        
+#define AFIO_PCFR2_TIM9_REMAP_0                ((uint32_t)0x00000008)
+#define AFIO_PCFR2_TIM9_REMAP_1                ((uint32_t)0x00000010)
+
+#define AFIO_PCFR2_TIM9_REMAP_NOREMAP          ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_TIM9_REMAP_PARTIALREMAP     ((uint32_t)0x00000008)        
+#define AFIO_PCFR2_TIM9_REMAP_FULLREMAP        ((uint32_t)0x00000010)        
+
+#define AFIO_PCFR2_TIM10_REMAP                 ((uint32_t)0x00000060)        
+#define AFIO_PCFR2_TIM10_REMAP_0               ((uint32_t)0x00000020)
+#define AFIO_PCFR2_TIM10_REMAP_1               ((uint32_t)0x00000040)
+
+#define AFIO_PCFR2_TIM10_REMAP_NOREMAP         ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_TIM10_REMAP_PARTIALREMAP    ((uint32_t)0x00000020)        
+#define AFIO_PCFR2_TIM10_REMAP_FULLREMAP       ((uint32_t)0x00000040)        
+
+#define AFIO_PCFR2_FSMC_NADV_REMAP             ((uint32_t)0x00000400)
+
+
+#define AFIO_PCFR2_USART4_REMAP                ((uint32_t)0x00030000)        
+#define AFIO_PCFR2_USART4_REMAP_0              ((uint32_t)0x00010000)
+#define AFIO_PCFR2_USART4_REMAP_1              ((uint32_t)0x00020000)
+
+#define AFIO_PCFR2_USART4_REMAP_NOREMAP        ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_USART4_REMAP_PARTIALREMAP   ((uint32_t)0x00010000)        
+#define AFIO_PCFR2_USART4_REMAP_FULLREMAP      ((uint32_t)0x00020000)        
+
+#define AFIO_PCFR2_USART5_REMAP                ((uint32_t)0x000C0000)        
+#define AFIO_PCFR2_USART5_REMAP_0              ((uint32_t)0x00040000)
+#define AFIO_PCFR2_USART5_REMAP_1              ((uint32_t)0x00080000)
+
+#define AFIO_PCFR2_USART5_REMAP_NOREMAP        ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_USART5_REMAP_PARTIALREMAP   ((uint32_t)0x00040000)        
+#define AFIO_PCFR2_USART5_REMAP_FULLREMAP      ((uint32_t)0x00080000)        
+
+#define AFIO_PCFR2_USART6_REMAP                ((uint32_t)0x00300000)        
+#define AFIO_PCFR2_USART6_REMAP_0              ((uint32_t)0x00100000)
+#define AFIO_PCFR2_USART6_REMAP_1              ((uint32_t)0x00200000)
+
+#define AFIO_PCFR2_USART6_REMAP_NOREMAP        ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_USART6_REMAP_PARTIALREMAP   ((uint32_t)0x00100000)        
+#define AFIO_PCFR2_USART6_REMAP_FULLREMAP      ((uint32_t)0x00200000)        
+
+#define AFIO_PCFR2_USART7_REMAP                ((uint32_t)0x00C00000)        
+#define AFIO_PCFR2_USART7_REMAP_0              ((uint32_t)0x00400000)
+#define AFIO_PCFR2_USART7_REMAP_1              ((uint32_t)0x00800000)
+
+#define AFIO_PCFR2_USART7_REMAP_NOREMAP        ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_USART7_REMAP_PARTIALREMAP   ((uint32_t)0x00400000)        
+#define AFIO_PCFR2_USART7_REMAP_FULLREMAP      ((uint32_t)0x00800000)        
+
+#define AFIO_PCFR2_USART8_REMAP                ((uint32_t)0x03000000)        
+#define AFIO_PCFR2_USART8_REMAP_0              ((uint32_t)0x01000000)
+#define AFIO_PCFR2_USART8_REMAP_1              ((uint32_t)0x02000000)
+
+#define AFIO_PCFR2_USART8_REMAP_NOREMAP        ((uint32_t)0x00000000)        
+#define AFIO_PCFR2_USART8_REMAP_PARTIALREMAP   ((uint32_t)0x01000000)        
+#define AFIO_PCFR2_USART8_REMAP_FULLREMAP      ((uint32_t)0x02000000)        
+
+#define AFIO_PCFR2_USART1_REMAP                ((uint32_t)0x04000000)        
+
+/******************************************************************************/
+/*                           Independent WATCHDOG                             */
+/******************************************************************************/
+
+/*******************  Bit definition for IWDG_CTLR register  ********************/
+#define  IWDG_KEY                              ((uint16_t)0xFFFF)            /* Key value (write only, read 0000h) */
+
+/*******************  Bit definition for IWDG_PSCR register  ********************/
+#define  IWDG_PR                               ((uint8_t)0x07)               /* PR[2:0] (Prescaler divider) */
+#define  IWDG_PR_0                             ((uint8_t)0x01)               /* Bit 0 */
+#define  IWDG_PR_1                             ((uint8_t)0x02)               /* Bit 1 */
+#define  IWDG_PR_2                             ((uint8_t)0x04)               /* Bit 2 */
+
+/*******************  Bit definition for IWDG_RLDR register  *******************/
+#define  IWDG_RL                               ((uint16_t)0x0FFF)            /* Watchdog counter reload value */
+
+/*******************  Bit definition for IWDG_STATR register  ********************/
+#define  IWDG_PVU                              ((uint8_t)0x01)               /* Watchdog prescaler value update */
+#define  IWDG_RVU                              ((uint8_t)0x02)               /* Watchdog counter reload value update */
+
+/******************************************************************************/
+/*                      Inter-integrated Circuit Interface                    */
+/******************************************************************************/
+
+/*******************  Bit definition for I2C_CTLR1 register  ********************/
+#define  I2C_CTLR1_PE                          ((uint16_t)0x0001)            /* Peripheral Enable */
+#define  I2C_CTLR1_SMBUS                       ((uint16_t)0x0002)            /* SMBus Mode */
+#define  I2C_CTLR1_SMBTYPE                     ((uint16_t)0x0008)            /* SMBus Type */
+#define  I2C_CTLR1_ENARP                       ((uint16_t)0x0010)            /* ARP Enable */
+#define  I2C_CTLR1_ENPEC                       ((uint16_t)0x0020)            /* PEC Enable */
+#define  I2C_CTLR1_ENGC                        ((uint16_t)0x0040)            /* General Call Enable */
+#define  I2C_CTLR1_NOSTRETCH                   ((uint16_t)0x0080)            /* Clock Stretching Disable (Slave mode) */
+#define  I2C_CTLR1_START                       ((uint16_t)0x0100)            /* Start Generation */
+#define  I2C_CTLR1_STOP                        ((uint16_t)0x0200)            /* Stop Generation */
+#define  I2C_CTLR1_ACK                         ((uint16_t)0x0400)            /* Acknowledge Enable */
+#define  I2C_CTLR1_POS                         ((uint16_t)0x0800)            /* Acknowledge/PEC Position (for data reception) */
+#define  I2C_CTLR1_PEC                         ((uint16_t)0x1000)            /* Packet Error Checking */
+#define  I2C_CTLR1_ALERT                       ((uint16_t)0x2000)            /* SMBus Alert */
+#define  I2C_CTLR1_SWRST                       ((uint16_t)0x8000)            /* Software Reset */
+
+/*******************  Bit definition for I2C_CTLR2 register  ********************/
+#define  I2C_CTLR2_FREQ                        ((uint16_t)0x003F)            /* FREQ[5:0] bits (Peripheral Clock Frequency) */
+#define  I2C_CTLR2_FREQ_0                      ((uint16_t)0x0001)            /* Bit 0 */
+#define  I2C_CTLR2_FREQ_1                      ((uint16_t)0x0002)            /* Bit 1 */
+#define  I2C_CTLR2_FREQ_2                      ((uint16_t)0x0004)            /* Bit 2 */
+#define  I2C_CTLR2_FREQ_3                      ((uint16_t)0x0008)            /* Bit 3 */
+#define  I2C_CTLR2_FREQ_4                      ((uint16_t)0x0010)            /* Bit 4 */
+#define  I2C_CTLR2_FREQ_5                      ((uint16_t)0x0020)            /* Bit 5 */
+
+#define  I2C_CTLR2_ITERREN                     ((uint16_t)0x0100)            /* Error Interrupt Enable */
+#define  I2C_CTLR2_ITEVTEN                     ((uint16_t)0x0200)            /* Event Interrupt Enable */
+#define  I2C_CTLR2_ITBUFEN                     ((uint16_t)0x0400)            /* Buffer Interrupt Enable */
+#define  I2C_CTLR2_DMAEN                       ((uint16_t)0x0800)            /* DMA Requests Enable */
+#define  I2C_CTLR2_LAST                        ((uint16_t)0x1000)            /* DMA Last Transfer */
+
+/*******************  Bit definition for I2C_OADDR1 register  *******************/
+#define  I2C_OADDR1_ADD0                       ((uint16_t)0x0001)
+#define  I2C_OADDR1_ADD1_7                     ((uint16_t)0x00FE)            /* Interface Address */
+#define  I2C_OADDR1_ADD8_9                     ((uint16_t)0x0300)            /* Interface Address */
+
+#define  I2C_OADDR1_ADD0                       ((uint16_t)0x0001)            /* Bit 0 */
+#define  I2C_OADDR1_ADD1                       ((uint16_t)0x0002)            /* Bit 1 */
+#define  I2C_OADDR1_ADD2                       ((uint16_t)0x0004)            /* Bit 2 */
+#define  I2C_OADDR1_ADD3                       ((uint16_t)0x0008)            /* Bit 3 */
+#define  I2C_OADDR1_ADD4                       ((uint16_t)0x0010)            /* Bit 4 */
+#define  I2C_OADDR1_ADD5                       ((uint16_t)0x0020)            /* Bit 5 */
+#define  I2C_OADDR1_ADD6                       ((uint16_t)0x0040)            /* Bit 6 */
+#define  I2C_OADDR1_ADD7                       ((uint16_t)0x0080)            /* Bit 7 */
+#define  I2C_OADDR1_ADD8                       ((uint16_t)0x0100)            /* Bit 8 */
+#define  I2C_OADDR1_ADD9                       ((uint16_t)0x0200)            /* Bit 9 */
+
+#define  I2C_OADDR1_ADDMODE                    ((uint16_t)0x8000)            /* Addressing Mode (Slave mode) */
+
+/*******************  Bit definition for I2C_OADDR2 register  *******************/
+#define  I2C_OADDR2_ENDUAL                     ((uint8_t)0x01)               /* Dual addressing mode enable */
+#define  I2C_OADDR2_ADD2                       ((uint8_t)0xFE)               /* Interface address */
+
+/********************  Bit definition for I2C_DATAR register  ********************/
+#define  I2C_DR_DATAR                          ((uint8_t)0xFF)               /* 8-bit Data Register */
+
+/*******************  Bit definition for I2C_STAR1 register  ********************/
+#define  I2C_STAR1_SB                          ((uint16_t)0x0001)            /* Start Bit (Master mode) */
+#define  I2C_STAR1_ADDR                        ((uint16_t)0x0002)            /* Address sent (master mode)/matched (slave mode) */
+#define  I2C_STAR1_BTF                         ((uint16_t)0x0004)            /* Byte Transfer Finished */
+#define  I2C_STAR1_ADD10                       ((uint16_t)0x0008)            /* 10-bit header sent (Master mode) */
+#define  I2C_STAR1_STOPF                       ((uint16_t)0x0010)            /* Stop detection (Slave mode) */
+#define  I2C_STAR1_RXNE                        ((uint16_t)0x0040)            /* Data Register not Empty (receivers) */
+#define  I2C_STAR1_TXE                         ((uint16_t)0x0080)            /* Data Register Empty (transmitters) */
+#define  I2C_STAR1_BERR                        ((uint16_t)0x0100)            /* Bus Error */
+#define  I2C_STAR1_ARLO                        ((uint16_t)0x0200)            /* Arbitration Lost (master mode) */
+#define  I2C_STAR1_AF                          ((uint16_t)0x0400)            /* Acknowledge Failure */
+#define  I2C_STAR1_OVR                         ((uint16_t)0x0800)            /* Overrun/Underrun */
+#define  I2C_STAR1_PECERR                      ((uint16_t)0x1000)            /* PEC Error in reception */
+#define  I2C_STAR1_TIMEOUT                     ((uint16_t)0x4000)            /* Timeout or Tlow Error */
+#define  I2C_STAR1_SMBALERT                    ((uint16_t)0x8000)            /* SMBus Alert */
+
+/*******************  Bit definition for I2C_STAR2 register  ********************/
+#define  I2C_STAR2_MSL                         ((uint16_t)0x0001)            /* Master/Slave */
+#define  I2C_STAR2_BUSY                        ((uint16_t)0x0002)            /* Bus Busy */
+#define  I2C_STAR2_TRA                         ((uint16_t)0x0004)            /* Transmitter/Receiver */
+#define  I2C_STAR2_GENCALL                     ((uint16_t)0x0010)            /* General Call Address (Slave mode) */
+#define  I2C_STAR2_SMBDEFAULT                  ((uint16_t)0x0020)            /* SMBus Device Default Address (Slave mode) */
+#define  I2C_STAR2_SMBHOST                     ((uint16_t)0x0040)            /* SMBus Host Header (Slave mode) */
+#define  I2C_STAR2_DUALF                       ((uint16_t)0x0080)            /* Dual Flag (Slave mode) */
+#define  I2C_STAR2_PEC                         ((uint16_t)0xFF00)            /* Packet Error Checking Register */
+
+/*******************  Bit definition for I2C_CKCFGR register  ********************/
+#define  I2C_CKCFGR_CCR                        ((uint16_t)0x0FFF)            /* Clock Control Register in Fast/Standard mode (Master mode) */
+#define  I2C_CKCFGR_DUTY                       ((uint16_t)0x4000)            /* Fast Mode Duty Cycle */
+#define  I2C_CKCFGR_FS                         ((uint16_t)0x8000)            /* I2C Master Mode Selection */
+
+/******************  Bit definition for I2C_RTR register  *******************/
+#define  I2C_RTR_TRISE                         ((uint8_t)0x3F)               /* Maximum Rise Time in Fast/Standard mode (Master mode) */
+
+
+/******************************************************************************/
+/*                             Power Control                                  */
+/******************************************************************************/
+
+/********************  Bit definition for PWR_CTLR register  ********************/
+#define  PWR_CTLR_LPDS                         ((uint16_t)0x0001)     /* Low-Power Deepsleep */
+#define  PWR_CTLR_PDDS                         ((uint16_t)0x0002)     /* Power Down Deepsleep */
+#define  PWR_CTLR_CWUF                         ((uint16_t)0x0004)     /* Clear Wakeup Flag */
+#define  PWR_CTLR_CSBF                         ((uint16_t)0x0008)     /* Clear Standby Flag */
+#define  PWR_CTLR_PVDE                         ((uint16_t)0x0010)     /* Power Voltage Detector Enable */
+
+#define  PWR_CTLR_PLS                          ((uint16_t)0x00E0)     /* PLS[2:0] bits (PVD Level Selection) */
+#define  PWR_CTLR_PLS_0                        ((uint16_t)0x0020)     /* Bit 0 */
+#define  PWR_CTLR_PLS_1                        ((uint16_t)0x0040)     /* Bit 1 */
+#define  PWR_CTLR_PLS_2                        ((uint16_t)0x0080)     /* Bit 2 */
+
+#define  PWR_CTLR_PLS_MODE0                    ((uint16_t)0x0000)     
+#define  PWR_CTLR_PLS_MODE1                    ((uint16_t)0x0020)     
+#define  PWR_CTLR_PLS_MODE2                    ((uint16_t)0x0040)     
+#define  PWR_CTLR_PLS_MODE3                    ((uint16_t)0x0060)     
+#define  PWR_CTLR_PLS_MODE4                    ((uint16_t)0x0080)     
+#define  PWR_CTLR_PLS_MODE5                    ((uint16_t)0x00A0)     
+#define  PWR_CTLR_PLS_MODE6                    ((uint16_t)0x00C0)     
+#define  PWR_CTLR_PLS_MODE7                    ((uint16_t)0x00E0)     
+
+#define  PWR_CTLR_PLS_2V2                      PWR_CTLR_PLS_MODE0     
+#define  PWR_CTLR_PLS_2V3                      PWR_CTLR_PLS_MODE1     
+#define  PWR_CTLR_PLS_2V4                      PWR_CTLR_PLS_MODE2     
+#define  PWR_CTLR_PLS_2V5                      PWR_CTLR_PLS_MODE3     
+#define  PWR_CTLR_PLS_2V6                      PWR_CTLR_PLS_MODE4     
+#define  PWR_CTLR_PLS_2V7                      PWR_CTLR_PLS_MODE5     
+#define  PWR_CTLR_PLS_2V8                      PWR_CTLR_PLS_MODE6     
+#define  PWR_CTLR_PLS_2V9                      PWR_CTLR_PLS_MODE7  
+
+#define  PWR_CTLR_DBP                          ((uint16_t)0x0100)     /* Disable Backup Domain write protection */
+
+#define  PWR_CTLR_R2KSTY                       ((uint32_t)0x10000)
+#define  PWR_CTLR_R30KSTY                      ((uint32_t)0x20000)
+#define  PWR_CTLR_R2KVBAT                      ((uint32_t)0x40000)
+#define  PWR_CTLR_R30KVBAT                     ((uint32_t)0x80000)
+#define  PWR_CTLR_RAMLV                        ((uint32_t)0x100000)
+
+/*******************  Bit definition for PWR_CSR register  ********************/
+#define  PWR_CSR_WUF                           ((uint16_t)0x0001)     /* Wakeup Flag */
+#define  PWR_CSR_SBF                           ((uint16_t)0x0002)     /* Standby Flag */
+#define  PWR_CSR_PVDO                          ((uint16_t)0x0004)     /* PVD Output */
+#define  PWR_CSR_EWUP                          ((uint16_t)0x0100)     /* Enable WKUP pin */
+
+
+
+/******************************************************************************/
+/*                         Reset and Clock Control                            */
+/******************************************************************************/
+
+/********************  Bit definition for RCC_CTLR register  ********************/
+#define  RCC_HSION                       ((uint32_t)0x00000001)        /* Internal High Speed clock enable */
+#define  RCC_HSIRDY                      ((uint32_t)0x00000002)        /* Internal High Speed clock ready flag */
+#define  RCC_HSITRIM                     ((uint32_t)0x000000F8)        /* Internal High Speed clock trimming */
+#define  RCC_HSICAL                      ((uint32_t)0x0000FF00)        /* Internal High Speed clock Calibration */
+#define  RCC_HSEON                       ((uint32_t)0x00010000)        /* External High Speed clock enable */
+#define  RCC_HSERDY                      ((uint32_t)0x00020000)        /* External High Speed clock ready flag */
+#define  RCC_HSEBYP                      ((uint32_t)0x00040000)        /* External High Speed clock Bypass */
+#define  RCC_CSSON                       ((uint32_t)0x00080000)        /* Clock Security System enable */
+#define  RCC_PLLON                       ((uint32_t)0x01000000)        /* PLL enable */
+#define  RCC_PLLRDY                      ((uint32_t)0x02000000)        /* PLL clock ready flag */
+#define  RCC_PLL2ON                      ((uint32_t)0x04000000)
+#define  RCC_PLL2RDY                     ((uint32_t)0x08000000)
+#define  RCC_PLL3ON                      ((uint32_t)0x10000000)
+#define  RCC_PLL3RDY                     ((uint32_t)0x20000000)
+
+/*******************  Bit definition for RCC_CFGR0 register  *******************/
+#define  RCC_SW                          ((uint32_t)0x00000003)        /* SW[1:0] bits (System clock Switch) */
+#define  RCC_SW_0                        ((uint32_t)0x00000001)        /* Bit 0 */
+#define  RCC_SW_1                        ((uint32_t)0x00000002)        /* Bit 1 */
+
+#define  RCC_SW_HSI                      ((uint32_t)0x00000000)        /* HSI selected as system clock */
+#define  RCC_SW_HSE                      ((uint32_t)0x00000001)        /* HSE selected as system clock */
+#define  RCC_SW_PLL                      ((uint32_t)0x00000002)        /* PLL selected as system clock */
+
+#define  RCC_SWS                         ((uint32_t)0x0000000C)        /* SWS[1:0] bits (System Clock Switch Status) */
+#define  RCC_SWS_0                       ((uint32_t)0x00000004)        /* Bit 0 */
+#define  RCC_SWS_1                       ((uint32_t)0x00000008)        /* Bit 1 */
+
+#define  RCC_SWS_HSI                     ((uint32_t)0x00000000)        /* HSI oscillator used as system clock */
+#define  RCC_SWS_HSE                     ((uint32_t)0x00000004)        /* HSE oscillator used as system clock */
+#define  RCC_SWS_PLL                     ((uint32_t)0x00000008)        /* PLL used as system clock */
+
+#define  RCC_HPRE                        ((uint32_t)0x000000F0)        /* HPRE[3:0] bits (AHB prescaler) */
+#define  RCC_HPRE_0                      ((uint32_t)0x00000010)        /* Bit 0 */
+#define  RCC_HPRE_1                      ((uint32_t)0x00000020)        /* Bit 1 */
+#define  RCC_HPRE_2                      ((uint32_t)0x00000040)        /* Bit 2 */
+#define  RCC_HPRE_3                      ((uint32_t)0x00000080)        /* Bit 3 */
+
+#define  RCC_HPRE_DIV1                   ((uint32_t)0x00000000)        /* SYSCLK not divided */
+#define  RCC_HPRE_DIV2                   ((uint32_t)0x00000080)        /* SYSCLK divided by 2 */
+#define  RCC_HPRE_DIV4                   ((uint32_t)0x00000090)        /* SYSCLK divided by 4 */
+#define  RCC_HPRE_DIV8                   ((uint32_t)0x000000A0)        /* SYSCLK divided by 8 */
+#define  RCC_HPRE_DIV16                  ((uint32_t)0x000000B0)        /* SYSCLK divided by 16 */
+#define  RCC_HPRE_DIV64                  ((uint32_t)0x000000C0)        /* SYSCLK divided by 64 */
+#define  RCC_HPRE_DIV128                 ((uint32_t)0x000000D0)        /* SYSCLK divided by 128 */
+#define  RCC_HPRE_DIV256                 ((uint32_t)0x000000E0)        /* SYSCLK divided by 256 */
+#define  RCC_HPRE_DIV512                 ((uint32_t)0x000000F0)        /* SYSCLK divided by 512 */
+
+#define  RCC_PPRE1                       ((uint32_t)0x00000700)        /* PRE1[2:0] bits (APB1 prescaler) */
+#define  RCC_PPRE1_0                     ((uint32_t)0x00000100)        /* Bit 0 */
+#define  RCC_PPRE1_1                     ((uint32_t)0x00000200)        /* Bit 1 */
+#define  RCC_PPRE1_2                     ((uint32_t)0x00000400)        /* Bit 2 */
+
+#define  RCC_PPRE1_DIV1                  ((uint32_t)0x00000000)        /* HCLK not divided */
+#define  RCC_PPRE1_DIV2                  ((uint32_t)0x00000400)        /* HCLK divided by 2 */
+#define  RCC_PPRE1_DIV4                  ((uint32_t)0x00000500)        /* HCLK divided by 4 */
+#define  RCC_PPRE1_DIV8                  ((uint32_t)0x00000600)        /* HCLK divided by 8 */
+#define  RCC_PPRE1_DIV16                 ((uint32_t)0x00000700)        /* HCLK divided by 16 */
+
+#define  RCC_PPRE2                       ((uint32_t)0x00003800)        /* PRE2[2:0] bits (APB2 prescaler) */
+#define  RCC_PPRE2_0                     ((uint32_t)0x00000800)        /* Bit 0 */
+#define  RCC_PPRE2_1                     ((uint32_t)0x00001000)        /* Bit 1 */
+#define  RCC_PPRE2_2                     ((uint32_t)0x00002000)        /* Bit 2 */
+
+#define  RCC_PPRE2_DIV1                  ((uint32_t)0x00000000)        /* HCLK not divided */
+#define  RCC_PPRE2_DIV2                  ((uint32_t)0x00002000)        /* HCLK divided by 2 */
+#define  RCC_PPRE2_DIV4                  ((uint32_t)0x00002800)        /* HCLK divided by 4 */
+#define  RCC_PPRE2_DIV8                  ((uint32_t)0x00003000)        /* HCLK divided by 8 */
+#define  RCC_PPRE2_DIV16                 ((uint32_t)0x00003800)        /* HCLK divided by 16 */
+
+#define  RCC_ADCPRE                      ((uint32_t)0x0000C000)        /* ADCPRE[1:0] bits (ADC prescaler) */
+#define  RCC_ADCPRE_0                    ((uint32_t)0x00004000)        /* Bit 0 */
+#define  RCC_ADCPRE_1                    ((uint32_t)0x00008000)        /* Bit 1 */
+
+#define  RCC_ADCPRE_DIV2                 ((uint32_t)0x00000000)        /* PCLK2 divided by 2 */
+#define  RCC_ADCPRE_DIV4                 ((uint32_t)0x00004000)        /* PCLK2 divided by 4 */
+#define  RCC_ADCPRE_DIV6                 ((uint32_t)0x00008000)        /* PCLK2 divided by 6 */
+#define  RCC_ADCPRE_DIV8                 ((uint32_t)0x0000C000)        /* PCLK2 divided by 8 */
+
+#define  RCC_PLLSRC                      ((uint32_t)0x00010000)        /* PLL entry clock source */
+
+#define  RCC_PLLXTPRE                    ((uint32_t)0x00020000)        /* HSE divider for PLL entry */
+
+#define  RCC_PLLMULL                     ((uint32_t)0x003C0000)        /* PLLMUL[3:0] bits (PLL multiplication factor) */
+#define  RCC_PLLMULL_0                   ((uint32_t)0x00040000)        /* Bit 0 */
+#define  RCC_PLLMULL_1                   ((uint32_t)0x00080000)        /* Bit 1 */
+#define  RCC_PLLMULL_2                   ((uint32_t)0x00100000)        /* Bit 2 */
+#define  RCC_PLLMULL_3                   ((uint32_t)0x00200000)        /* Bit 3 */
+ 
+#define  RCC_PLLSRC_HSI_Div2             ((uint32_t)0x00000000)        /* HSI clock divided by 2 selected as PLL entry clock source */
+#define  RCC_PLLSRC_HSE                  ((uint32_t)0x00010000)        /* HSE clock selected as PLL entry clock source */
+ 
+#define  RCC_PLLXTPRE_HSE                ((uint32_t)0x00000000)        /* HSE clock not divided for PLL entry */
+#define  RCC_PLLXTPRE_HSE_Div2           ((uint32_t)0x00020000)        /* HSE clock divided by 2 for PLL entry */
+
+/* CH32V303x */
+#define  RCC_PLLMULL2                    ((uint32_t)0x00000000)        /* PLL input clock*2 */
+#define  RCC_PLLMULL3                    ((uint32_t)0x00040000)        /* PLL input clock*3 */
+#define  RCC_PLLMULL4                    ((uint32_t)0x00080000)        /* PLL input clock*4 */
+#define  RCC_PLLMULL5                    ((uint32_t)0x000C0000)        /* PLL input clock*5 */
+#define  RCC_PLLMULL6                    ((uint32_t)0x00100000)        /* PLL input clock*6 */
+#define  RCC_PLLMULL7                    ((uint32_t)0x00140000)        /* PLL input clock*7 */
+#define  RCC_PLLMULL8                    ((uint32_t)0x00180000)        /* PLL input clock*8 */
+#define  RCC_PLLMULL9                    ((uint32_t)0x001C0000)        /* PLL input clock*9 */
+#define  RCC_PLLMULL10                   ((uint32_t)0x00200000)        /* PLL input clock10 */
+#define  RCC_PLLMULL11                   ((uint32_t)0x00240000)        /* PLL input clock*11 */
+#define  RCC_PLLMULL12                   ((uint32_t)0x00280000)        /* PLL input clock*12 */
+#define  RCC_PLLMULL13                   ((uint32_t)0x002C0000)        /* PLL input clock*13 */
+#define  RCC_PLLMULL14                   ((uint32_t)0x00300000)        /* PLL input clock*14 */
+#define  RCC_PLLMULL15                   ((uint32_t)0x00340000)        /* PLL input clock*15 */
+#define  RCC_PLLMULL16                   ((uint32_t)0x00380000)        /* PLL input clock*16 */
+#define  RCC_PLLMULL18                   ((uint32_t)0x003C0000)        /* PLL input clock*18 */
+/* CH32V307x-CH32V305x */
+#define  RCC_PLLMULL18_EXTEN             ((uint32_t)0x00000000)        /* PLL input clock*18 */
+#define  RCC_PLLMULL3_EXTEN              ((uint32_t)0x00040000)        /* PLL input clock*3 */
+#define  RCC_PLLMULL4_EXTEN              ((uint32_t)0x00080000)        /* PLL input clock*4 */
+#define  RCC_PLLMULL5_EXTEN              ((uint32_t)0x000C0000)        /* PLL input clock*5 */
+#define  RCC_PLLMULL6_EXTEN              ((uint32_t)0x00100000)        /* PLL input clock*6 */
+#define  RCC_PLLMULL7_EXTEN              ((uint32_t)0x00140000)        /* PLL input clock*7 */
+#define  RCC_PLLMULL8_EXTEN              ((uint32_t)0x00180000)        /* PLL input clock*8 */
+#define  RCC_PLLMULL9_EXTEN              ((uint32_t)0x001C0000)        /* PLL input clock*9 */
+#define  RCC_PLLMULL10_EXTEN             ((uint32_t)0x00200000)        /* PLL input clock10 */
+#define  RCC_PLLMULL11_EXTEN             ((uint32_t)0x00240000)        /* PLL input clock*11 */
+#define  RCC_PLLMULL12_EXTEN             ((uint32_t)0x00280000)        /* PLL input clock*12 */
+#define  RCC_PLLMULL13_EXTEN             ((uint32_t)0x002C0000)        /* PLL input clock*13 */
+#define  RCC_PLLMULL14_EXTEN             ((uint32_t)0x00300000)        /* PLL input clock*14 */
+#define  RCC_PLLMULL6_5_EXTEN            ((uint32_t)0x00340000)        /* PLL input clock*6.5 */
+#define  RCC_PLLMULL15_EXTEN             ((uint32_t)0x00380000)        /* PLL input clock*15 */
+#define  RCC_PLLMULL16_EXTEN             ((uint32_t)0x003C0000)        /* PLL input clock*16 */
+
+#define  RCC_USBPRE                      ((uint32_t)0x00400000)        /* USB Device prescaler */
+
+#define  RCC_CFGR0_MCO                   ((uint32_t)0x0F000000)        /* MCO[3:0] bits (Microcontroller Clock Output) */
+#define  RCC_MCO_0                       ((uint32_t)0x01000000)        /* Bit 0 */
+#define  RCC_MCO_1                       ((uint32_t)0x02000000)        /* Bit 1 */
+#define  RCC_MCO_2                       ((uint32_t)0x04000000)        /* Bit 2 */
+#define  RCC_MCO_3                       ((uint32_t)0x08000000)        /* Bit 3 */
+
+#define  RCC_MCO_NOCLOCK                 ((uint32_t)0x00000000)        /* No clock */
+#define  RCC_CFGR0_MCO_SYSCLK            ((uint32_t)0x04000000)        /* System clock selected as MCO source */
+#define  RCC_CFGR0_MCO_HSI               ((uint32_t)0x05000000)        /* HSI clock selected as MCO source */
+#define  RCC_CFGR0_MCO_HSE               ((uint32_t)0x06000000)        /* HSE clock selected as MCO source  */
+#define  RCC_CFGR0_MCO_PLL               ((uint32_t)0x07000000)        /* PLL clock divided by 2 selected as MCO source */
+#define  RCC_CFGR0_MCO_PLL2              ((uint32_t)0x08000000)
+#define  RCC_CFGR0_MCO_PLL3D2            ((uint32_t)0x09000000)        /* PLL3 clock divided by 2 selected as MCO source */
+#define  RCC_CFGR0_MCO_XT1               ((uint32_t)0x0A000000)
+#define  RCC_CFGR0_MCO_PLL3              ((uint32_t)0x0B000000)
+
+#define  RCC_CFGR0_ETHPRE                ((uint32_t)0x10000000)
+#define  RCC_CFGR0_ADCDUTY               ((uint32_t)0x80000000)
+#define  RCC_CFGR0_ADCDUTY_SEL           ((uint32_t)0x40000000)
+
+/*******************  Bit definition for RCC_INTR register  ********************/
+#define  RCC_LSIRDYF                     ((uint32_t)0x00000001)        /* LSI Ready Interrupt flag */
+#define  RCC_LSERDYF                     ((uint32_t)0x00000002)        /* LSE Ready Interrupt flag */
+#define  RCC_HSIRDYF                     ((uint32_t)0x00000004)        /* HSI Ready Interrupt flag */
+#define  RCC_HSERDYF                     ((uint32_t)0x00000008)        /* HSE Ready Interrupt flag */
+#define  RCC_PLLRDYF                     ((uint32_t)0x00000010)        /* PLL Ready Interrupt flag */
+#define  RCC_PLL2RDYF                    ((uint32_t)0x00000020)
+#define  RCC_PLL3RDYF                    ((uint32_t)0x00000040)
+#define  RCC_CSSF                        ((uint32_t)0x00000080)        /* Clock Security System Interrupt flag */
+#define  RCC_LSIRDYIE                    ((uint32_t)0x00000100)        /* LSI Ready Interrupt Enable */
+#define  RCC_LSERDYIE                    ((uint32_t)0x00000200)        /* LSE Ready Interrupt Enable */
+#define  RCC_HSIRDYIE                    ((uint32_t)0x00000400)        /* HSI Ready Interrupt Enable */
+#define  RCC_HSERDYIE                    ((uint32_t)0x00000800)        /* HSE Ready Interrupt Enable */
+#define  RCC_PLLRDYIE                    ((uint32_t)0x00001000)        /* PLL Ready Interrupt Enable */
+#define  RCC_PLL2RDYIE                   ((uint32_t)0x00002000)
+#define  RCC_PLL3RDYIE                   ((uint32_t)0x00004000)
+#define  RCC_LSIRDYC                     ((uint32_t)0x00010000)        /* LSI Ready Interrupt Clear */
+#define  RCC_LSERDYC                     ((uint32_t)0x00020000)        /* LSE Ready Interrupt Clear */
+#define  RCC_HSIRDYC                     ((uint32_t)0x00040000)        /* HSI Ready Interrupt Clear */
+#define  RCC_HSERDYC                     ((uint32_t)0x00080000)        /* HSE Ready Interrupt Clear */
+#define  RCC_PLLRDYC                     ((uint32_t)0x00100000)        /* PLL Ready Interrupt Clear */
+#define  RCC_PLL2RDYC                    ((uint32_t)0x00200000)
+#define  RCC_PLL3RDYC                    ((uint32_t)0x00400000)
+#define  RCC_CSSC                        ((uint32_t)0x00800000)        /* Clock Security System Interrupt Clear */
+
+/*****************  Bit definition for RCC_APB2PRSTR register  *****************/
+#define  RCC_AFIORST                     ((uint32_t)0x00000001)        /* Alternate Function I/O reset */
+#define  RCC_IOPARST                     ((uint32_t)0x00000004)        /* I/O port A reset */
+#define  RCC_IOPBRST                     ((uint32_t)0x00000008)        /* I/O port B reset */
+#define  RCC_IOPCRST                     ((uint32_t)0x00000010)        /* I/O port C reset */
+#define  RCC_IOPDRST                     ((uint32_t)0x00000020)        /* I/O port D reset */
+#define  RCC_IOPERST                     ((uint32_t)0x00000040)
+#define  RCC_ADC1RST                     ((uint32_t)0x00000200)        /* ADC 1 interface reset */
+#define  RCC_ADC2RST                     ((uint32_t)0x00000400)        /* ADC 2 interface reset */
+#define  RCC_TIM1RST                     ((uint32_t)0x00000800)        /* TIM1 Timer reset */
+#define  RCC_SPI1RST                     ((uint32_t)0x00001000)        /* SPI 1 reset */
+#define  RCC_TIM8RST                     ((uint32_t)0x00002000)
+#define  RCC_USART1RST                   ((uint32_t)0x00004000)        /* USART1 reset */
+#define  RCC_TIM9RST                     ((uint32_t)0x00080000)
+#define  RCC_TIM10RST                    ((uint32_t)0x00100000)
+
+/*****************  Bit definition for RCC_APB1PRSTR register  *****************/
+#define  RCC_TIM2RST                     ((uint32_t)0x00000001)        /* Timer 2 reset */
+#define  RCC_TIM3RST                     ((uint32_t)0x00000002)        /* Timer 3 reset */
+#define  RCC_TIM4RST                     ((uint32_t)0x00000004)        /* Timer 4 reset */
+#define  RCC_TIM5RST                     ((uint32_t)0x00000008)        /* Timer 5 reset */
+#define  RCC_TIM6RST                     ((uint32_t)0x00000010)        /* Timer 6 reset */
+#define  RCC_TIM7RST                     ((uint32_t)0x00000020)        /* Timer 7 reset */
+#define  RCC_USART6RST                   ((uint32_t)0x00000040)        /* USART 2 reset */
+#define  RCC_USART7RST                   ((uint32_t)0x00000080)        /* USART 2 reset */
+#define  RCC_USART8RST                   ((uint32_t)0x00000100)        /* USART 2 reset */
+#define  RCC_WWDGRST                     ((uint32_t)0x00000800)        /* Window Watchdog reset */
+#define  RCC_SPI2RST                     ((uint32_t)0x00004000)        /* SPI 2 reset */
+#define  RCC_SPI3RST                     ((uint32_t)0x00008000)        /* SPI 3 reset */
+#define  RCC_USART2RST                   ((uint32_t)0x00020000)        /* USART 2 reset */
+#define  RCC_USART3RST                   ((uint32_t)0x00040000)        /* USART 3 reset */
+#define  RCC_USART4RST                   ((uint32_t)0x00080000)        /* USART 4 reset */
+#define  RCC_USART5RST                   ((uint32_t)0x00100000)        /* USART 5 reset */
+#define  RCC_I2C1RST                     ((uint32_t)0x00200000)        /* I2C 1 reset */
+#define  RCC_I2C2RST                     ((uint32_t)0x00400000)        /* I2C 2 reset */ 
+#define  RCC_USBRST                      ((uint32_t)0x00800000)        /* USB Device reset */
+#define  RCC_CAN1RST                     ((uint32_t)0x02000000)        /* CAN1 reset */
+#define  RCC_CAN2RST                     ((uint32_t)0x04000000)        /* CAN2 reset */
+#define  RCC_BKPRST                      ((uint32_t)0x08000000)        /* Backup interface reset */
+#define  RCC_PWRRST                      ((uint32_t)0x10000000)        /* Power interface reset */
+#define  RCC_DACRST                      ((uint32_t)0x20000000)        /* DAC reset */
+
+/******************  Bit definition for RCC_AHBPCENR register  ******************/
+#define  RCC_DMA1EN                      ((uint16_t)0x0001)            /* DMA1 clock enable */
+#define  RCC_DMA2EN                      ((uint16_t)0x0002)
+#define  RCC_SRAMEN                      ((uint16_t)0x0004)            /* SRAM interface clock enable */
+#define  RCC_CRCEN                       ((uint16_t)0x0040)            /* CRC clock enable */
+#define  RCC_FSMCEN                      ((uint16_t)0x0100)
+#define  RCC_RNGEN                       ((uint16_t)0x0200)
+#define  RCC_SDIOEN                      ((uint16_t)0x0400)
+#define  RCC_USBHSEN                     ((uint16_t)0x0800)
+#define  RCC_OTGFSEN                     ((uint16_t)0x1000)
+#define  RCC_DVPEN                       ((uint16_t)0x2000)
+#define  RCC_ETHMACEN                    ((uint16_t)0x4000)
+#define  RCC_ETHMACTXEN                  ((uint16_t)0x8000)
+#define  RCC_ETHMACRXEN                  ((uint32_t)0x10000)
+#define  RCC_BLEC                        ((uint32_t)0x10000)
+#define  RCC_BLES                        ((uint32_t)0x20000)
+
+/******************  Bit definition for RCC_APB2PCENR register  *****************/
+#define  RCC_AFIOEN                      ((uint32_t)0x00000001)         /* Alternate Function I/O clock enable */
+#define  RCC_IOPAEN                      ((uint32_t)0x00000004)         /* I/O port A clock enable */
+#define  RCC_IOPBEN                      ((uint32_t)0x00000008)         /* I/O port B clock enable */
+#define  RCC_IOPCEN                      ((uint32_t)0x00000010)         /* I/O port C clock enable */
+#define  RCC_IOPDEN                      ((uint32_t)0x00000020)         /* I/O port D clock enable */
+#define  RCC_IOPEEN                      ((uint32_t)0x00000040)
+#define  RCC_ADC1EN                      ((uint32_t)0x00000200)         /* ADC 1 interface clock enable */
+#define  RCC_ADC2EN                      ((uint32_t)0x00000400)         /* ADC 2 interface clock enable */
+#define  RCC_TIM1EN                      ((uint32_t)0x00000800)         /* TIM1 Timer clock enable */
+#define  RCC_SPI1EN                      ((uint32_t)0x00001000)         /* SPI 1 clock enable */
+#define  RCC_TIM8EN                      ((uint32_t)0x00002000)
+#define  RCC_USART1EN                    ((uint32_t)0x00004000)         /* USART1 clock enable */
+#define  RCC_TIM9EN                      ((uint32_t)0x00080000)
+#define  RCC_TIM10EN                     ((uint32_t)0x00100000)
+
+/*****************  Bit definition for RCC_APB1PCENR register  ******************/
+#define  RCC_TIM2EN                      ((uint32_t)0x00000001)        /* Timer 2 clock enabled*/
+#define  RCC_TIM3EN                      ((uint32_t)0x00000002)        /* Timer 3 clock enable */
+#define  RCC_TIM4EN                      ((uint32_t)0x00000004)
+#define  RCC_TIM5EN                      ((uint32_t)0x00000008)
+#define  RCC_TIM6EN                      ((uint32_t)0x00000010)
+#define  RCC_TIM7EN                      ((uint32_t)0x00000020)
+#define  RCC_USART6EN                    ((uint32_t)0x00000040)
+#define  RCC_USART7EN                    ((uint32_t)0x00000080)
+#define  RCC_USART8EN                    ((uint32_t)0x00000100)
+#define  RCC_WWDGEN                      ((uint32_t)0x00000800)        /* Window Watchdog clock enable */
+#define  RCC_SPI2EN                      ((uint32_t)0x00004000)
+#define  RCC_SPI3EN                      ((uint32_t)0x00008000)
+#define  RCC_USART2EN                    ((uint32_t)0x00020000)        /* USART 2 clock enable */
+#define  RCC_USART3EN                    ((uint32_t)0x00040000)
+#define  RCC_USART4EN                    ((uint32_t)0x00080000)
+#define  RCC_USART5EN                    ((uint32_t)0x00100000)
+#define  RCC_I2C1EN                      ((uint32_t)0x00200000)        /* I2C 1 clock enable */
+#define  RCC_I2C2EN                      ((uint32_t)0x00400000)
+#define  RCC_USBEN                       ((uint32_t)0x00800000)        /* USB Device clock enable */
+#define  RCC_CAN1EN                      ((uint32_t)0x02000000)
+#define  RCC_CAN2EN                      ((uint32_t)0x04000000)
+#define  RCC_BKPEN                       ((uint32_t)0x08000000)        /* Backup interface clock enable */
+#define  RCC_PWREN                       ((uint32_t)0x10000000)        /* Power interface clock enable */
+#define  RCC_DACEN                       ((uint32_t)0x20000000)
+
+/*******************  Bit definition for RCC_BDCTLR register  *******************/
+#define  RCC_LSEON                       ((uint32_t)0x00000001)        /* External Low Speed oscillator enable */
+#define  RCC_LSERDY                      ((uint32_t)0x00000002)        /* External Low Speed oscillator Ready */
+#define  RCC_LSEBYP                      ((uint32_t)0x00000004)        /* External Low Speed oscillator Bypass */
+
+#define  RCC_RTCSEL                      ((uint32_t)0x00000300)        /* RTCSEL[1:0] bits (RTC clock source selection) */
+#define  RCC_RTCSEL_0                    ((uint32_t)0x00000100)        /* Bit 0 */
+#define  RCC_RTCSEL_1                    ((uint32_t)0x00000200)        /* Bit 1 */
+
+#define  RCC_RTCSEL_NOCLOCK              ((uint32_t)0x00000000)        /* No clock */
+#define  RCC_RTCSEL_LSE                  ((uint32_t)0x00000100)        /* LSE oscillator clock used as RTC clock */
+#define  RCC_RTCSEL_LSI                  ((uint32_t)0x00000200)        /* LSI oscillator clock used as RTC clock */
+#define  RCC_RTCSEL_HSE                  ((uint32_t)0x00000300)        
+
+#define  RCC_RTCEN                       ((uint32_t)0x00008000)        /* RTC clock enable */
+#define  RCC_BDRST                       ((uint32_t)0x00010000)        /* Backup domain software reset  */
+
+/*******************  Bit definition for RCC_RSTSCKR register  ********************/  
+#define  RCC_LSION                       ((uint32_t)0x00000001)        /* Internal Low Speed oscillator enable */
+#define  RCC_LSIRDY                      ((uint32_t)0x00000002)        /* Internal Low Speed oscillator Ready */
+#define  RCC_RMVF                        ((uint32_t)0x01000000)        /* Remove reset flag */
+#define  RCC_PINRSTF                     ((uint32_t)0x04000000)        /* PIN reset flag */
+#define  RCC_PORRSTF                     ((uint32_t)0x08000000)        /* POR/PDR reset flag */
+#define  RCC_SFTRSTF                     ((uint32_t)0x10000000)        /* Software Reset flag */
+#define  RCC_IWDGRSTF                    ((uint32_t)0x20000000)        /* Independent Watchdog reset flag */
+#define  RCC_WWDGRSTF                    ((uint32_t)0x40000000)        /* Window watchdog reset flag */
+#define  RCC_LPWRRSTF                    ((uint32_t)0x80000000)        /* Low-Power reset flag */
+
+/*******************  Bit definition for RCC_AHBRSTR register  ********************/  
+#define  RCC_OTGFSRST                    ((uint32_t)0x00001000)        
+#define  RCC_DVPRST                      ((uint32_t)0x00002000)        
+#define  RCC_ETHMACRST                   ((uint32_t)0x00004000)        
+
+/*******************  Bit definition for RCC_CFGR2 register  ********************/  
+#define  RCC_PREDIV1                    ((uint32_t)0x0000000F)        
+#define  RCC_PREDIV1_0                  ((uint32_t)0x00000001)        
+#define  RCC_PREDIV1_1                  ((uint32_t)0x00000002)        
+#define  RCC_PREDIV1_2                  ((uint32_t)0x00000004)        
+#define  RCC_PREDIV1_3                  ((uint32_t)0x00000008)        
+
+#define  RCC_PREDIV2                    ((uint32_t)0x000000F0)        
+#define  RCC_PREDIV2_0                  ((uint32_t)0x00000010)        
+#define  RCC_PREDIV2_1                  ((uint32_t)0x00000020)        
+#define  RCC_PREDIV2_2                  ((uint32_t)0x00000040)        
+#define  RCC_PREDIV2_3                  ((uint32_t)0x00000080)        
+
+#define  RCC_PLL2MUL                    ((uint32_t)0x00000F00)        
+#define  RCC_PLL2MUL_0                  ((uint32_t)0x00000100)        
+#define  RCC_PLL2MUL_1                  ((uint32_t)0x00000200)        
+#define  RCC_PLL2MUL_2                  ((uint32_t)0x00000400)        
+#define  RCC_PLL2MUL_3                  ((uint32_t)0x00000800)        
+
+#define  RCC_PLL3MUL                    ((uint32_t)0x0000F000)        
+#define  RCC_PLL3MUL_0                  ((uint32_t)0x00001000)        
+#define  RCC_PLL3MUL_1                  ((uint32_t)0x00002000)        
+#define  RCC_PLL3MUL_2                  ((uint32_t)0x00004000)        
+#define  RCC_PLL3MUL_3                  ((uint32_t)0x00008000)        
+
+#define  RCC_PREDIV1SRC                 ((uint32_t)0x00010000)        
+#define  RCC_I2S2SRC                    ((uint32_t)0x00020000)        
+#define  RCC_I2S3SRC                    ((uint32_t)0x00040000)        
+#define  RCC_RNGSRC                     ((uint32_t)0x00080000)        
+
+#define  RCC_ETH1GSRC                   ((uint32_t)0x00300000)        
+#define  RCC_ETH1GSRC_0                 ((uint32_t)0x00100000)        
+#define  RCC_ETH1GSRC_1                 ((uint32_t)0x00200000)        
+
+#define  RCC_ETH1GEN                    ((uint32_t)0x00400000)        
+
+#define  RCC_USBHSDIV                   ((uint32_t)0x07000000)        
+#define  RCC_USBHSDIV_0                 ((uint32_t)0x01000000)
+#define  RCC_USBHSDIV_1                 ((uint32_t)0x02000000)
+#define  RCC_USBHSDIV_2                 ((uint32_t)0x04000000)
+
+#define  RCC_USBHSPLLSRC                ((uint32_t)0x08000000)        
+
+#define  RCC_USBHSCLK                   ((uint32_t)0x30000000)        
+#define  RCC_USBHSCLK_0                 ((uint32_t)0x10000000)        
+#define  RCC_USBHSCLK_1                 ((uint32_t)0x20000000)        
+
+#define  RCC_USBHSPLL                   ((uint32_t)0x40000000)        
+#define  RCC_USBFSSRC                   ((uint32_t)0x80000000)        
+
+/*******************  Bit definition for RCC_HSE_CAL_CTRL register  ********************/  
+#define  RCC_HSEITRIM                   ((uint32_t)0x01000000)
+#define  RCC_HSEFAULT                   ((uint32_t)0x08000000)
+
+#define  RCC_HSEC                       ((uint32_t)0x70000000)
+#define  RCC_HSEC_0                     ((uint32_t)0x10000000)
+#define  RCC_HSEC_1                     ((uint32_t)0x20000000)
+#define  RCC_HSEC_2                     ((uint32_t)0x40000000)
+
+/*******************  Bit definition for RCC_LSI32K_TUNE register  ********************/  
+#define  RCC_HTUNE                      ((uint16_t)0x1000)
+#define  RCC_LTUNE                      ((uint16_t)0x0011)
+
+/*******************  Bit definition for RCC_LSI32K_CAL_CFG register  ********************/  
+#define  RCC_CNTVLU                     ((uint8_t)0x0F)
+#define  RCC_CNTVLU_0                   ((uint8_t)0x01)
+#define  RCC_CNTVLU_1                   ((uint8_t)0x02)
+#define  RCC_CNTVLU_2                   ((uint8_t)0x04)
+#define  RCC_CNTVLU_3                   ((uint8_t)0x08)
+#define  RCC_HALTMD                     ((uint8_t)0x10)
+#define  RCC_WKUPEN                     ((uint8_t)0x20)
+#define  RCC_LPEN                       ((uint8_t)0x40)
+
+/*******************  Bit definition for RCC_LSI32K_CAL_STATR register  ********************/  
+#define  RCC_CNTOV                     ((uint16_t)0x4000)
+#define  RCC_IFEND                     ((uint16_t)0x8000)
+
+/*******************  Bit definition for RCC_LSI32K_CAL_CTRL register  ********************/ 
+#define  RCC_CALINTEN                  ((uint8_t)0x01)
+#define  RCC_CALEN                     ((uint8_t)0x02)
+#define  RCC_HALT                      ((uint8_t)0x80)
+
+/******************************************************************************/
+/*                                    RNG                                     */
+/******************************************************************************/
+/********************  Bit definition for RNG_CR register  *******************/
+#define  RNG_CR_RNGEN                         ((uint32_t)0x00000004)
+#define  RNG_CR_IE                            ((uint32_t)0x00000008)
+
+/********************  Bit definition for RNG_SR register  *******************/
+#define  RNG_SR_DRDY                          ((uint32_t)0x00000001)
+#define  RNG_SR_CECS                          ((uint32_t)0x00000002)
+#define  RNG_SR_SECS                          ((uint32_t)0x00000004)
+#define  RNG_SR_CEIS                          ((uint32_t)0x00000020)
+#define  RNG_SR_SEIS                          ((uint32_t)0x00000040)
+
+/******************************************************************************/
+/*                             Real-Time Clock                                */
+/******************************************************************************/
+
+/*******************  Bit definition for RTC_CTLRH register  ********************/
+#define  RTC_CTLRH_SECIE                     ((uint8_t)0x01)               /* Second Interrupt Enable */
+#define  RTC_CTLRH_ALRIE                     ((uint8_t)0x02)               /* Alarm Interrupt Enable */
+#define  RTC_CTLRH_OWIE                      ((uint8_t)0x04)               /* OverfloW Interrupt Enable */
+
+/*******************  Bit definition for RTC_CTLRL register  ********************/
+#define  RTC_CTLRL_SECF                      ((uint8_t)0x01)               /* Second Flag */
+#define  RTC_CTLRL_ALRF                      ((uint8_t)0x02)               /* Alarm Flag */
+#define  RTC_CTLRL_OWF                       ((uint8_t)0x04)               /* OverfloW Flag */
+#define  RTC_CTLRL_RSF                       ((uint8_t)0x08)               /* Registers Synchronized Flag */
+#define  RTC_CTLRL_CNF                       ((uint8_t)0x10)               /* Configuration Flag */
+#define  RTC_CTLRL_RTOFF                     ((uint8_t)0x20)               /* RTC operation OFF */
+
+/*******************  Bit definition for RTC_PSCH register  *******************/
+#define  RTC_PSCH_PRL                        ((uint16_t)0x000F)            /* RTC Prescaler Reload Value High */
+
+/*******************  Bit definition for RTC_PRLL register  *******************/
+#define  RTC_PSCL_PRL                        ((uint16_t)0xFFFF)            /* RTC Prescaler Reload Value Low */
+
+/*******************  Bit definition for RTC_DIVH register  *******************/
+#define  RTC_DIVH_RTC_DIV                    ((uint16_t)0x000F)            /* RTC Clock Divider High */
+
+/*******************  Bit definition for RTC_DIVL register  *******************/
+#define  RTC_DIVL_RTC_DIV                    ((uint16_t)0xFFFF)            /* RTC Clock Divider Low */
+
+/*******************  Bit definition for RTC_CNTH register  *******************/
+#define  RTC_CNTH_RTC_CNT                    ((uint16_t)0xFFFF)            /* RTC Counter High */
+
+/*******************  Bit definition for RTC_CNTL register  *******************/
+#define  RTC_CNTL_RTC_CNT                    ((uint16_t)0xFFFF)            /* RTC Counter Low */
+
+/*******************  Bit definition for RTC_ALRMH register  *******************/
+#define  RTC_ALRMH_RTC_ALRM                  ((uint16_t)0xFFFF)            /* RTC Alarm High */
+
+/*******************  Bit definition for RTC_ALRML register  *******************/
+#define  RTC_ALRML_RTC_ALRM                  ((uint16_t)0xFFFF)            /* RTC Alarm Low */
+
+/******************************************************************************/
+/*                        Serial Peripheral Interface                         */
+/******************************************************************************/
+
+/*******************  Bit definition for SPI_CTLR1 register  ********************/
+#define  SPI_CTLR1_CPHA                      ((uint16_t)0x0001)            /* Clock Phase */
+#define  SPI_CTLR1_CPOL                      ((uint16_t)0x0002)            /* Clock Polarity */
+#define  SPI_CTLR1_MSTR                      ((uint16_t)0x0004)            /* Master Selection */
+
+#define  SPI_CTLR1_BR                        ((uint16_t)0x0038)            /* BR[2:0] bits (Baud Rate Control) */
+#define  SPI_CTLR1_BR_0                      ((uint16_t)0x0008)            /* Bit 0 */
+#define  SPI_CTLR1_BR_1                      ((uint16_t)0x0010)            /* Bit 1 */
+#define  SPI_CTLR1_BR_2                      ((uint16_t)0x0020)            /* Bit 2 */
+
+#define  SPI_CTLR1_SPE                       ((uint16_t)0x0040)            /* SPI Enable */
+#define  SPI_CTLR1_LSBFIRST                  ((uint16_t)0x0080)            /* Frame Format */
+#define  SPI_CTLR1_SSI                       ((uint16_t)0x0100)            /* Internal slave select */
+#define  SPI_CTLR1_SSM                       ((uint16_t)0x0200)            /* Software slave management */
+#define  SPI_CTLR1_RXONLY                    ((uint16_t)0x0400)            /* Receive only */
+#define  SPI_CTLR1_DFF                       ((uint16_t)0x0800)            /* Data Frame Format */
+#define  SPI_CTLR1_CRCNEXT                   ((uint16_t)0x1000)            /* Transmit CRC next */
+#define  SPI_CTLR1_CRCEN                     ((uint16_t)0x2000)            /* Hardware CRC calculation enable */
+#define  SPI_CTLR1_BIDIOE                    ((uint16_t)0x4000)            /* Output enable in bidirectional mode */
+#define  SPI_CTLR1_BIDIMODE                  ((uint16_t)0x8000)            /* Bidirectional data mode enable */
+
+/*******************  Bit definition for SPI_CTLR2 register  ********************/
+#define  SPI_CTLR2_RXDMAEN                   ((uint8_t)0x01)               /* Rx Buffer DMA Enable */
+#define  SPI_CTLR2_TXDMAEN                   ((uint8_t)0x02)               /* Tx Buffer DMA Enable */
+#define  SPI_CTLR2_SSOE                      ((uint8_t)0x04)               /* SS Output Enable */
+#define  SPI_CTLR2_ERRIE                     ((uint8_t)0x20)               /* Error Interrupt Enable */
+#define  SPI_CTLR2_RXNEIE                    ((uint8_t)0x40)               /* RX buffer Not Empty Interrupt Enable */
+#define  SPI_CTLR2_TXEIE                     ((uint8_t)0x80)               /* Tx buffer Empty Interrupt Enable */
+
+/********************  Bit definition for SPI_STATR register  ********************/
+#define  SPI_STATR_RXNE                      ((uint8_t)0x01)               /* Receive buffer Not Empty */
+#define  SPI_STATR_TXE                       ((uint8_t)0x02)               /* Transmit buffer Empty */
+#define  SPI_STATR_CHSIDE                    ((uint8_t)0x04)               /* Channel side */
+#define  SPI_STATR_UDR                       ((uint8_t)0x08)               /* Underrun flag */
+#define  SPI_STATR_CRCERR                    ((uint8_t)0x10)               /* CRC Error flag */
+#define  SPI_STATR_MODF                      ((uint8_t)0x20)               /* Mode fault */
+#define  SPI_STATR_OVR                       ((uint8_t)0x40)               /* Overrun flag */
+#define  SPI_STATR_BSY                       ((uint8_t)0x80)               /* Busy flag */
+
+/********************  Bit definition for SPI_DATAR register  ********************/
+#define  SPI_DATAR_DR                        ((uint16_t)0xFFFF)            /* Data Register */
+
+/*******************  Bit definition for SPI_CRCR register  ******************/
+#define  SPI_CRCR_CRCPOLY                    ((uint16_t)0xFFFF)            /* CRC polynomial register */
+
+/******************  Bit definition for SPI_RCRCR register  ******************/
+#define  SPI_RCRCR_RXCRC                     ((uint16_t)0xFFFF)            /* Rx CRC Register */
+
+/******************  Bit definition for SPI_TCRCR register  ******************/
+#define  SPI_TCRCR_TXCRC                     ((uint16_t)0xFFFF)            /* Tx CRC Register */
+
+/******************  Bit definition for SPI_I2SCFGR register  *****************/
+#define  SPI_I2SCFGR_CHLEN                   ((uint16_t)0x0001)            /* Channel length (number of bits per audio channel) */
+
+#define  SPI_I2SCFGR_DATLEN                  ((uint16_t)0x0006)            /* DATLEN[1:0] bits (Data length to be transferred) */
+#define  SPI_I2SCFGR_DATLEN_0                ((uint16_t)0x0002)            /* Bit 0 */
+#define  SPI_I2SCFGR_DATLEN_1                ((uint16_t)0x0004)            /* Bit 1 */
+
+#define  SPI_I2SCFGR_CKPOL                   ((uint16_t)0x0008)            /* steady state clock polarity */
+
+#define  SPI_I2SCFGR_I2SSTD                  ((uint16_t)0x0030)            /* I2SSTD[1:0] bits (I2S standard selection) */
+#define  SPI_I2SCFGR_I2SSTD_0                ((uint16_t)0x0010)            /* Bit 0 */
+#define  SPI_I2SCFGR_I2SSTD_1                ((uint16_t)0x0020)            /* Bit 1 */
+
+#define  SPI_I2SCFGR_PCMSYNC                 ((uint16_t)0x0080)            /* PCM frame synchronization */
+
+#define  SPI_I2SCFGR_I2SCFG                  ((uint16_t)0x0300)            /* I2SCFG[1:0] bits (I2S configuration mode) */
+#define  SPI_I2SCFGR_I2SCFG_0                ((uint16_t)0x0100)            /* Bit 0 */
+#define  SPI_I2SCFGR_I2SCFG_1                ((uint16_t)0x0200)            /* Bit 1 */
+
+#define  SPI_I2SCFGR_I2SE                    ((uint16_t)0x0400)            /* I2S Enable */
+#define  SPI_I2SCFGR_I2SMOD                  ((uint16_t)0x0800)            /* I2S mode selection */
+
+/******************  Bit definition for SPI_I2SPR register  *******************/
+#define  SPI_I2SPR_I2SDIV                    ((uint16_t)0x00FF)            /* I2S Linear prescaler */
+#define  SPI_I2SPR_ODD                       ((uint16_t)0x0100)            /* Odd factor for the prescaler */
+#define  SPI_I2SPR_MCKOE                     ((uint16_t)0x0200)            /* Master Clock Output Enable */
+
+/******************  Bit definition for SPI_HSCR register  *******************/
+#define  SPI_HSCR_HSRXEN                     ((uint16_t)0x0001)            
+#define  SPI_HSCR_HSRXEN2                    ((uint16_t)0x0004)            
+
+/******************************************************************************/
+/*                                    TIM                                     */
+/******************************************************************************/
+
+/*******************  Bit definition for TIM_CTLR1 register  ********************/
+#define  TIM_CEN                         ((uint16_t)0x0001)            /* Counter enable */
+#define  TIM_UDIS                        ((uint16_t)0x0002)            /* Update disable */
+#define  TIM_URS                         ((uint16_t)0x0004)            /* Update request source */
+#define  TIM_OPM                         ((uint16_t)0x0008)            /* One pulse mode */
+#define  TIM_DIR                         ((uint16_t)0x0010)            /* Direction */
+
+#define  TIM_CMS                         ((uint16_t)0x0060)            /* CMS[1:0] bits (Center-aligned mode selection) */
+#define  TIM_CMS_0                       ((uint16_t)0x0020)            /* Bit 0 */
+#define  TIM_CMS_1                       ((uint16_t)0x0040)            /* Bit 1 */
+
+#define  TIM_ARPE                        ((uint16_t)0x0080)            /* Auto-reload preload enable */
+
+#define  TIM_CTLR1_CKD                   ((uint16_t)0x0300)            /* CKD[1:0] bits (clock division) */
+#define  TIM_CKD_0                       ((uint16_t)0x0100)            /* Bit 0 */
+#define  TIM_CKD_1                       ((uint16_t)0x0200)            /* Bit 1 */
+
+/*******************  Bit definition for TIM_CTLR2 register  ********************/
+#define  TIM_CCPC                        ((uint16_t)0x0001)            /* Capture/Compare Preloaded Control */
+#define  TIM_CCUS                        ((uint16_t)0x0004)            /* Capture/Compare Control Update Selection */
+#define  TIM_CCDS                        ((uint16_t)0x0008)            /* Capture/Compare DMA Selection */
+
+#define  TIM_MMS                         ((uint16_t)0x0070)            /* MMS[2:0] bits (Master Mode Selection) */
+#define  TIM_MMS_0                       ((uint16_t)0x0010)            /* Bit 0 */
+#define  TIM_MMS_1                       ((uint16_t)0x0020)            /* Bit 1 */
+#define  TIM_MMS_2                       ((uint16_t)0x0040)            /* Bit 2 */
+
+#define  TIM_TI1S                        ((uint16_t)0x0080)            /* TI1 Selection */
+#define  TIM_OIS1                        ((uint16_t)0x0100)            /* Output Idle state 1 (OC1 output) */
+#define  TIM_OIS1N                       ((uint16_t)0x0200)            /* Output Idle state 1 (OC1N output) */
+#define  TIM_OIS2                        ((uint16_t)0x0400)            /* Output Idle state 2 (OC2 output) */
+#define  TIM_OIS2N                       ((uint16_t)0x0800)            /* Output Idle state 2 (OC2N output) */
+#define  TIM_OIS3                        ((uint16_t)0x1000)            /* Output Idle state 3 (OC3 output) */
+#define  TIM_OIS3N                       ((uint16_t)0x2000)            /* Output Idle state 3 (OC3N output) */
+#define  TIM_OIS4                        ((uint16_t)0x4000)            /* Output Idle state 4 (OC4 output) */
+
+/*******************  Bit definition for TIM_SMCFGR register  *******************/
+#define  TIM_SMS                         ((uint16_t)0x0007)            /* SMS[2:0] bits (Slave mode selection) */
+#define  TIM_SMS_0                       ((uint16_t)0x0001)            /* Bit 0 */
+#define  TIM_SMS_1                       ((uint16_t)0x0002)            /* Bit 1 */
+#define  TIM_SMS_2                       ((uint16_t)0x0004)            /* Bit 2 */
+
+#define  TIM_TS                          ((uint16_t)0x0070)            /* TS[2:0] bits (Trigger selection) */
+#define  TIM_TS_0                        ((uint16_t)0x0010)            /* Bit 0 */
+#define  TIM_TS_1                        ((uint16_t)0x0020)            /* Bit 1 */
+#define  TIM_TS_2                        ((uint16_t)0x0040)            /* Bit 2 */
+
+#define  TIM_MSM                         ((uint16_t)0x0080)            /* Master/slave mode */
+ 
+#define  TIM_ETF                         ((uint16_t)0x0F00)            /* ETF[3:0] bits (External trigger filter) */
+#define  TIM_ETF_0                       ((uint16_t)0x0100)            /* Bit 0 */
+#define  TIM_ETF_1                       ((uint16_t)0x0200)            /* Bit 1 */
+#define  TIM_ETF_2                       ((uint16_t)0x0400)            /* Bit 2 */
+#define  TIM_ETF_3                       ((uint16_t)0x0800)            /* Bit 3 */
+
+#define  TIM_ETPS                        ((uint16_t)0x3000)            /* ETPS[1:0] bits (External trigger prescaler) */
+#define  TIM_ETPS_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  TIM_ETPS_1                      ((uint16_t)0x2000)            /* Bit 1 */
+ 
+#define  TIM_ECE                         ((uint16_t)0x4000)            /* External clock enable */
+#define  TIM_ETP                         ((uint16_t)0x8000)            /* External trigger polarity */
+
+/*******************  Bit definition for TIM_DMAINTENR register  *******************/
+#define  TIM_UIE                         ((uint16_t)0x0001)            /* Update interrupt enable */
+#define  TIM_CC1IE                       ((uint16_t)0x0002)            /* Capture/Compare 1 interrupt enable */
+#define  TIM_CC2IE                       ((uint16_t)0x0004)            /* Capture/Compare 2 interrupt enable */
+#define  TIM_CC3IE                       ((uint16_t)0x0008)            /* Capture/Compare 3 interrupt enable */
+#define  TIM_CC4IE                       ((uint16_t)0x0010)            /* Capture/Compare 4 interrupt enable */
+#define  TIM_COMIE                       ((uint16_t)0x0020)            /* COM interrupt enable */
+#define  TIM_TIE                         ((uint16_t)0x0040)            /* Trigger interrupt enable */
+#define  TIM_BIE                         ((uint16_t)0x0080)            /* Break interrupt enable */
+#define  TIM_UDE                         ((uint16_t)0x0100)            /* Update DMA request enable */
+#define  TIM_CC1DE                       ((uint16_t)0x0200)            /* Capture/Compare 1 DMA request enable */
+#define  TIM_CC2DE                       ((uint16_t)0x0400)            /* Capture/Compare 2 DMA request enable */
+#define  TIM_CC3DE                       ((uint16_t)0x0800)            /* Capture/Compare 3 DMA request enable */
+#define  TIM_CC4DE                       ((uint16_t)0x1000)            /* Capture/Compare 4 DMA request enable */
+#define  TIM_COMDE                       ((uint16_t)0x2000)            /* COM DMA request enable */
+#define  TIM_TDE                         ((uint16_t)0x4000)            /* Trigger DMA request enable */
+
+/********************  Bit definition for TIM_INTFR register  ********************/
+#define  TIM_UIF                         ((uint16_t)0x0001)            /* Update interrupt Flag */
+#define  TIM_CC1IF                       ((uint16_t)0x0002)            /* Capture/Compare 1 interrupt Flag */
+#define  TIM_CC2IF                       ((uint16_t)0x0004)            /* Capture/Compare 2 interrupt Flag */
+#define  TIM_CC3IF                       ((uint16_t)0x0008)            /* Capture/Compare 3 interrupt Flag */
+#define  TIM_CC4IF                       ((uint16_t)0x0010)            /* Capture/Compare 4 interrupt Flag */
+#define  TIM_COMIF                       ((uint16_t)0x0020)            /* COM interrupt Flag */
+#define  TIM_TIF                         ((uint16_t)0x0040)            /* Trigger interrupt Flag */
+#define  TIM_BIF                         ((uint16_t)0x0080)            /* Break interrupt Flag */
+#define  TIM_CC1OF                       ((uint16_t)0x0200)            /* Capture/Compare 1 Overcapture Flag */
+#define  TIM_CC2OF                       ((uint16_t)0x0400)            /* Capture/Compare 2 Overcapture Flag */
+#define  TIM_CC3OF                       ((uint16_t)0x0800)            /* Capture/Compare 3 Overcapture Flag */
+#define  TIM_CC4OF                       ((uint16_t)0x1000)            /* Capture/Compare 4 Overcapture Flag */
+
+/*******************  Bit definition for TIM_SWEVGR register  ********************/
+#define  TIM_UG                          ((uint8_t)0x01)               /* Update Generation */
+#define  TIM_CC1G                        ((uint8_t)0x02)               /* Capture/Compare 1 Generation */
+#define  TIM_CC2G                        ((uint8_t)0x04)               /* Capture/Compare 2 Generation */
+#define  TIM_CC3G                        ((uint8_t)0x08)               /* Capture/Compare 3 Generation */
+#define  TIM_CC4G                        ((uint8_t)0x10)               /* Capture/Compare 4 Generation */
+#define  TIM_COMG                        ((uint8_t)0x20)               /* Capture/Compare Control Update Generation */
+#define  TIM_TG                          ((uint8_t)0x40)               /* Trigger Generation */
+#define  TIM_BG                          ((uint8_t)0x80)               /* Break Generation */
+
+/******************  Bit definition for TIM_CHCTLR1 register  *******************/
+#define  TIM_CC1S                        ((uint16_t)0x0003)            /* CC1S[1:0] bits (Capture/Compare 1 Selection) */
+#define  TIM_CC1S_0                      ((uint16_t)0x0001)            /* Bit 0 */
+#define  TIM_CC1S_1                      ((uint16_t)0x0002)            /* Bit 1 */
+
+#define  TIM_OC1FE                       ((uint16_t)0x0004)            /* Output Compare 1 Fast enable */
+#define  TIM_OC1PE                       ((uint16_t)0x0008)            /* Output Compare 1 Preload enable */
+
+#define  TIM_OC1M                        ((uint16_t)0x0070)            /* OC1M[2:0] bits (Output Compare 1 Mode) */
+#define  TIM_OC1M_0                      ((uint16_t)0x0010)            /* Bit 0 */
+#define  TIM_OC1M_1                      ((uint16_t)0x0020)            /* Bit 1 */
+#define  TIM_OC1M_2                      ((uint16_t)0x0040)            /* Bit 2 */
+
+#define  TIM_OC1CE                       ((uint16_t)0x0080)            /* Output Compare 1Clear Enable */
+
+#define  TIM_CC2S                        ((uint16_t)0x0300)            /* CC2S[1:0] bits (Capture/Compare 2 Selection) */
+#define  TIM_CC2S_0                      ((uint16_t)0x0100)            /* Bit 0 */
+#define  TIM_CC2S_1                      ((uint16_t)0x0200)            /* Bit 1 */
+
+#define  TIM_OC2FE                       ((uint16_t)0x0400)            /* Output Compare 2 Fast enable */
+#define  TIM_OC2PE                       ((uint16_t)0x0800)            /* Output Compare 2 Preload enable */
+
+#define  TIM_OC2M                        ((uint16_t)0x7000)            /* OC2M[2:0] bits (Output Compare 2 Mode) */
+#define  TIM_OC2M_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  TIM_OC2M_1                      ((uint16_t)0x2000)            /* Bit 1 */
+#define  TIM_OC2M_2                      ((uint16_t)0x4000)            /* Bit 2 */
+
+#define  TIM_OC2CE                       ((uint16_t)0x8000)            /* Output Compare 2 Clear Enable */
+
+
+#define  TIM_IC1PSC                      ((uint16_t)0x000C)            /* IC1PSC[1:0] bits (Input Capture 1 Prescaler) */
+#define  TIM_IC1PSC_0                    ((uint16_t)0x0004)            /* Bit 0 */
+#define  TIM_IC1PSC_1                    ((uint16_t)0x0008)            /* Bit 1 */
+
+#define  TIM_IC1F                        ((uint16_t)0x00F0)            /* IC1F[3:0] bits (Input Capture 1 Filter) */
+#define  TIM_IC1F_0                      ((uint16_t)0x0010)            /* Bit 0 */
+#define  TIM_IC1F_1                      ((uint16_t)0x0020)            /* Bit 1 */
+#define  TIM_IC1F_2                      ((uint16_t)0x0040)            /* Bit 2 */
+#define  TIM_IC1F_3                      ((uint16_t)0x0080)            /* Bit 3 */
+
+#define  TIM_IC2PSC                      ((uint16_t)0x0C00)            /* IC2PSC[1:0] bits (Input Capture 2 Prescaler) */
+#define  TIM_IC2PSC_0                    ((uint16_t)0x0400)            /* Bit 0 */
+#define  TIM_IC2PSC_1                    ((uint16_t)0x0800)            /* Bit 1 */
+
+#define  TIM_IC2F                        ((uint16_t)0xF000)            /* IC2F[3:0] bits (Input Capture 2 Filter) */
+#define  TIM_IC2F_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  TIM_IC2F_1                      ((uint16_t)0x2000)            /* Bit 1 */
+#define  TIM_IC2F_2                      ((uint16_t)0x4000)            /* Bit 2 */
+#define  TIM_IC2F_3                      ((uint16_t)0x8000)            /* Bit 3 */
+
+/******************  Bit definition for TIM_CHCTLR2 register  *******************/
+#define  TIM_CC3S                        ((uint16_t)0x0003)            /* CC3S[1:0] bits (Capture/Compare 3 Selection) */
+#define  TIM_CC3S_0                      ((uint16_t)0x0001)            /* Bit 0 */
+#define  TIM_CC3S_1                      ((uint16_t)0x0002)            /* Bit 1 */
+
+#define  TIM_OC3FE                       ((uint16_t)0x0004)            /* Output Compare 3 Fast enable */
+#define  TIM_OC3PE                       ((uint16_t)0x0008)            /* Output Compare 3 Preload enable */
+
+#define  TIM_OC3M                        ((uint16_t)0x0070)            /* OC3M[2:0] bits (Output Compare 3 Mode) */
+#define  TIM_OC3M_0                      ((uint16_t)0x0010)            /* Bit 0 */
+#define  TIM_OC3M_1                      ((uint16_t)0x0020)            /* Bit 1 */
+#define  TIM_OC3M_2                      ((uint16_t)0x0040)            /* Bit 2 */
+
+#define  TIM_OC3CE                       ((uint16_t)0x0080)            /* Output Compare 3 Clear Enable */
+
+#define  TIM_CC4S                        ((uint16_t)0x0300)            /* CC4S[1:0] bits (Capture/Compare 4 Selection) */
+#define  TIM_CC4S_0                      ((uint16_t)0x0100)            /* Bit 0 */
+#define  TIM_CC4S_1                      ((uint16_t)0x0200)            /* Bit 1 */
+
+#define  TIM_OC4FE                       ((uint16_t)0x0400)            /* Output Compare 4 Fast enable */
+#define  TIM_OC4PE                       ((uint16_t)0x0800)            /* Output Compare 4 Preload enable */
+
+#define  TIM_OC4M                        ((uint16_t)0x7000)            /* OC4M[2:0] bits (Output Compare 4 Mode) */
+#define  TIM_OC4M_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  TIM_OC4M_1                      ((uint16_t)0x2000)            /* Bit 1 */
+#define  TIM_OC4M_2                      ((uint16_t)0x4000)            /* Bit 2 */
+
+#define  TIM_OC4CE                       ((uint16_t)0x8000)            /* Output Compare 4 Clear Enable */
+
+
+#define  TIM_IC3PSC                      ((uint16_t)0x000C)            /* IC3PSC[1:0] bits (Input Capture 3 Prescaler) */
+#define  TIM_IC3PSC_0                    ((uint16_t)0x0004)            /* Bit 0 */
+#define  TIM_IC3PSC_1                    ((uint16_t)0x0008)            /* Bit 1 */
+
+#define  TIM_IC3F                        ((uint16_t)0x00F0)            /* IC3F[3:0] bits (Input Capture 3 Filter) */
+#define  TIM_IC3F_0                      ((uint16_t)0x0010)            /* Bit 0 */
+#define  TIM_IC3F_1                      ((uint16_t)0x0020)            /* Bit 1 */
+#define  TIM_IC3F_2                      ((uint16_t)0x0040)            /* Bit 2 */
+#define  TIM_IC3F_3                      ((uint16_t)0x0080)            /* Bit 3 */
+
+#define  TIM_IC4PSC                      ((uint16_t)0x0C00)            /* IC4PSC[1:0] bits (Input Capture 4 Prescaler) */
+#define  TIM_IC4PSC_0                    ((uint16_t)0x0400)            /* Bit 0 */
+#define  TIM_IC4PSC_1                    ((uint16_t)0x0800)            /* Bit 1 */
+
+#define  TIM_IC4F                        ((uint16_t)0xF000)            /* IC4F[3:0] bits (Input Capture 4 Filter) */
+#define  TIM_IC4F_0                      ((uint16_t)0x1000)            /* Bit 0 */
+#define  TIM_IC4F_1                      ((uint16_t)0x2000)            /* Bit 1 */
+#define  TIM_IC4F_2                      ((uint16_t)0x4000)            /* Bit 2 */
+#define  TIM_IC4F_3                      ((uint16_t)0x8000)            /* Bit 3 */
+
+/*******************  Bit definition for TIM_CCER register  *******************/
+#define  TIM_CC1E                        ((uint16_t)0x0001)            /* Capture/Compare 1 output enable */
+#define  TIM_CC1P                        ((uint16_t)0x0002)            /* Capture/Compare 1 output Polarity */
+#define  TIM_CC1NE                       ((uint16_t)0x0004)            /* Capture/Compare 1 Complementary output enable */
+#define  TIM_CC1NP                       ((uint16_t)0x0008)            /* Capture/Compare 1 Complementary output Polarity */
+#define  TIM_CC2E                        ((uint16_t)0x0010)            /* Capture/Compare 2 output enable */
+#define  TIM_CC2P                        ((uint16_t)0x0020)            /* Capture/Compare 2 output Polarity */
+#define  TIM_CC2NE                       ((uint16_t)0x0040)            /* Capture/Compare 2 Complementary output enable */
+#define  TIM_CC2NP                       ((uint16_t)0x0080)            /* Capture/Compare 2 Complementary output Polarity */
+#define  TIM_CC3E                        ((uint16_t)0x0100)            /* Capture/Compare 3 output enable */
+#define  TIM_CC3P                        ((uint16_t)0x0200)            /* Capture/Compare 3 output Polarity */
+#define  TIM_CC3NE                       ((uint16_t)0x0400)            /* Capture/Compare 3 Complementary output enable */
+#define  TIM_CC3NP                       ((uint16_t)0x0800)            /* Capture/Compare 3 Complementary output Polarity */
+#define  TIM_CC4E                        ((uint16_t)0x1000)            /* Capture/Compare 4 output enable */
+#define  TIM_CC4P                        ((uint16_t)0x2000)            /* Capture/Compare 4 output Polarity */
+
+/*******************  Bit definition for TIM_CNT register  ********************/
+#define  TIM_CNT                         ((uint16_t)0xFFFF)            /* Counter Value */
+
+/*******************  Bit definition for TIM_PSC register  ********************/
+#define  TIM_PSC                         ((uint16_t)0xFFFF)            /* Prescaler Value */
+
+/*******************  Bit definition for TIM_ATRLR register  ********************/
+#define  TIM_ARR                         ((uint16_t)0xFFFF)            /* actual auto-reload Value */
+
+/*******************  Bit definition for TIM_RPTCR register  ********************/
+#define  TIM_REP                         ((uint8_t)0xFF)               /* Repetition Counter Value */
+
+/*******************  Bit definition for TIM_CH1CVR register  *******************/
+#define  TIM_CCR1                        ((uint16_t)0xFFFF)            /* Capture/Compare 1 Value */
+
+/*******************  Bit definition for TIM_CH2CVR register  *******************/
+#define  TIM_CCR2                        ((uint16_t)0xFFFF)            /* Capture/Compare 2 Value */
+
+/*******************  Bit definition for TIM_CH3CVR register  *******************/
+#define  TIM_CCR3                        ((uint16_t)0xFFFF)            /* Capture/Compare 3 Value */
+
+/*******************  Bit definition for TIM_CH4CVR register  *******************/
+#define  TIM_CCR4                        ((uint16_t)0xFFFF)            /* Capture/Compare 4 Value */
+
+/*******************  Bit definition for TIM_BDTR register  *******************/
+#define  TIM_DTG                         ((uint16_t)0x00FF)            /* DTG[0:7] bits (Dead-Time Generator set-up) */
+#define  TIM_DTG_0                       ((uint16_t)0x0001)            /* Bit 0 */
+#define  TIM_DTG_1                       ((uint16_t)0x0002)            /* Bit 1 */
+#define  TIM_DTG_2                       ((uint16_t)0x0004)            /* Bit 2 */
+#define  TIM_DTG_3                       ((uint16_t)0x0008)            /* Bit 3 */
+#define  TIM_DTG_4                       ((uint16_t)0x0010)            /* Bit 4 */
+#define  TIM_DTG_5                       ((uint16_t)0x0020)            /* Bit 5 */
+#define  TIM_DTG_6                       ((uint16_t)0x0040)            /* Bit 6 */
+#define  TIM_DTG_7                       ((uint16_t)0x0080)            /* Bit 7 */
+
+#define  TIM_LOCK                        ((uint16_t)0x0300)            /* LOCK[1:0] bits (Lock Configuration) */
+#define  TIM_LOCK_0                      ((uint16_t)0x0100)            /* Bit 0 */
+#define  TIM_LOCK_1                      ((uint16_t)0x0200)            /* Bit 1 */
+ 
+#define  TIM_OSSI                        ((uint16_t)0x0400)            /* Off-State Selection for Idle mode */
+#define  TIM_OSSR                        ((uint16_t)0x0800)            /* Off-State Selection for Run mode */
+#define  TIM_BKE                         ((uint16_t)0x1000)            /* Break enable */
+#define  TIM_BKP                         ((uint16_t)0x2000)            /* Break Polarity */
+#define  TIM_AOE                         ((uint16_t)0x4000)            /* Automatic Output enable */
+#define  TIM_MOE                         ((uint16_t)0x8000)            /* Main Output enable */
+
+/*******************  Bit definition for TIM_DMACFGR register  ********************/
+#define  TIM_DBA                         ((uint16_t)0x001F)            /* DBA[4:0] bits (DMA Base Address) */
+#define  TIM_DBA_0                       ((uint16_t)0x0001)            /* Bit 0 */
+#define  TIM_DBA_1                       ((uint16_t)0x0002)            /* Bit 1 */
+#define  TIM_DBA_2                       ((uint16_t)0x0004)            /* Bit 2 */
+#define  TIM_DBA_3                       ((uint16_t)0x0008)            /* Bit 3 */
+#define  TIM_DBA_4                       ((uint16_t)0x0010)            /* Bit 4 */
+
+#define  TIM_DBL                         ((uint16_t)0x1F00)            /* DBL[4:0] bits (DMA Burst Length) */
+#define  TIM_DBL_0                       ((uint16_t)0x0100)            /* Bit 0 */
+#define  TIM_DBL_1                       ((uint16_t)0x0200)            /* Bit 1 */
+#define  TIM_DBL_2                       ((uint16_t)0x0400)            /* Bit 2 */
+#define  TIM_DBL_3                       ((uint16_t)0x0800)            /* Bit 3 */
+#define  TIM_DBL_4                       ((uint16_t)0x1000)            /* Bit 4 */
+
+/*******************  Bit definition for TIM_DMAADR register  *******************/
+#define  TIM_DMAR_DMAB                   ((uint16_t)0xFFFF)            /* DMA register for burst accesses */
+
+/*******************  Bit definition for TIM_AUX register  *******************/
+#define  TIM_AUX_CAPCH2_ED               ((uint16_t)0x0001)            
+#define  TIM_AUX_CAPCH3_ED               ((uint16_t)0x0002)            
+#define  TIM_AUX_CAPCH4_ED               ((uint16_t)0x0004)            
+
+/******************************************************************************/
+/*         Universal Synchronous Asynchronous Receiver Transmitter            */
+/******************************************************************************/
+
+/*******************  Bit definition for USART_STATR register  *******************/
+#define  USART_STATR_PE                        ((uint16_t)0x0001)            /* Parity Error */
+#define  USART_STATR_FE                        ((uint16_t)0x0002)            /* Framing Error */
+#define  USART_STATR_NE                        ((uint16_t)0x0004)            /* Noise Error Flag */
+#define  USART_STATR_ORE                       ((uint16_t)0x0008)            /* OverRun Error */
+#define  USART_STATR_IDLE                      ((uint16_t)0x0010)            /* IDLE line detected */
+#define  USART_STATR_RXNE                      ((uint16_t)0x0020)            /* Read Data Register Not Empty */
+#define  USART_STATR_TC                        ((uint16_t)0x0040)            /* Transmission Complete */
+#define  USART_STATR_TXE                       ((uint16_t)0x0080)            /* Transmit Data Register Empty */
+#define  USART_STATR_LBD                       ((uint16_t)0x0100)            /* LIN Break Detection Flag */
+#define  USART_STATR_CTS                       ((uint16_t)0x0200)            /* CTS Flag */
+#define  USART_STATR_RX_BUSY                   ((uint16_t)0x0400)
+#define  USART_STATR_MS_ERR                    ((uint16_t)0x0800)
+
+/*******************  Bit definition for USART_DATAR register  *******************/
+#define  USART_DATAR_DR                        ((uint16_t)0x01FF)            /* Data value */
+
+/******************  Bit definition for USART_BRR register  *******************/
+#define  USART_BRR_DIV_Fraction                ((uint16_t)0x000F)            /* Fraction of USARTDIV */
+#define  USART_BRR_DIV_Mantissa                ((uint16_t)0xFFF0)            /* Mantissa of USARTDIV */
+
+/******************  Bit definition for USART_CTLR1 register  *******************/
+#define  USART_CTLR1_SBK                       ((uint16_t)0x0001)            /* Send Break */
+#define  USART_CTLR1_RWU                       ((uint16_t)0x0002)            /* Receiver wakeup */
+#define  USART_CTLR1_RE                        ((uint16_t)0x0004)            /* Receiver Enable */
+#define  USART_CTLR1_TE                        ((uint16_t)0x0008)            /* Transmitter Enable */
+#define  USART_CTLR1_IDLEIE                    ((uint16_t)0x0010)            /* IDLE Interrupt Enable */
+#define  USART_CTLR1_RXNEIE                    ((uint16_t)0x0020)            /* RXNE Interrupt Enable */
+#define  USART_CTLR1_TCIE                      ((uint16_t)0x0040)            /* Transmission Complete Interrupt Enable */
+#define  USART_CTLR1_TXEIE                     ((uint16_t)0x0080)            /* PE Interrupt Enable */
+#define  USART_CTLR1_PEIE                      ((uint16_t)0x0100)            /* PE Interrupt Enable */
+#define  USART_CTLR1_PS                        ((uint16_t)0x0200)            /* Parity Selection */
+#define  USART_CTLR1_PCE                       ((uint16_t)0x0400)            /* Parity Control Enable */
+#define  USART_CTLR1_WAKE                      ((uint16_t)0x0800)            /* Wakeup method */
+#define  USART_CTLR1_M                         ((uint16_t)0x1000)            /* Word length */
+#define  USART_CTLR1_UE                        ((uint16_t)0x2000)            /* USART Enable */
+#define  USART_CTLR1_M_EXT_0                   ((uint16_t)0x4000)            
+#define  USART_CTLR1_M_EXT_1                   ((uint16_t)0x8000) 
+#define  USART_CTLR1_M_EXT5                    ((uint16_t)0xC000) 
+#define  USART_CTLR1_M_EXT6                    ((uint16_t)0x8000) 
+#define  USART_CTLR1_M_EXT7                    ((uint16_t)0x4000) 
+
+/******************  Bit definition for USART_CTLR2 register  *******************/
+#define  USART_CTLR2_ADD                       ((uint16_t)0x000F)            /* Address of the USART node */
+#define  USART_CTLR2_LBDL                      ((uint16_t)0x0020)            /* LIN Break Detection Length */
+#define  USART_CTLR2_LBDIE                     ((uint16_t)0x0040)            /* LIN Break Detection Interrupt Enable */
+#define  USART_CTLR2_LBCL                      ((uint16_t)0x0100)            /* Last Bit Clock pulse */
+#define  USART_CTLR2_CPHA                      ((uint16_t)0x0200)            /* Clock Phase */
+#define  USART_CTLR2_CPOL                      ((uint16_t)0x0400)            /* Clock Polarity */
+#define  USART_CTLR2_CLKEN                     ((uint16_t)0x0800)            /* Clock Enable */
+
+#define  USART_CTLR2_STOP                      ((uint16_t)0x3000)            /* STOP[1:0] bits (STOP bits) */
+#define  USART_CTLR2_STOP_0                    ((uint16_t)0x1000)            /* Bit 0 */
+#define  USART_CTLR2_STOP_1                    ((uint16_t)0x2000)            /* Bit 1 */
+
+#define  USART_CTLR2_LINEN                     ((uint16_t)0x4000)            /* LIN mode enable */
+
+/******************  Bit definition for USART_CTLR3 register  *******************/
+#define  USART_CTLR3_EIE                       ((uint16_t)0x0001)            /* Error Interrupt Enable */
+#define  USART_CTLR3_IREN                      ((uint16_t)0x0002)            /* IrDA mode Enable */
+#define  USART_CTLR3_IRLP                      ((uint16_t)0x0004)            /* IrDA Low-Power */
+#define  USART_CTLR3_HDSEL                     ((uint16_t)0x0008)            /* Half-Duplex Selection */
+#define  USART_CTLR3_NACK                      ((uint16_t)0x0010)            /* Smartcard NACK enable */
+#define  USART_CTLR3_SCEN                      ((uint16_t)0x0020)            /* Smartcard mode enable */
+#define  USART_CTLR3_DMAR                      ((uint16_t)0x0040)            /* DMA Enable Receiver */
+#define  USART_CTLR3_DMAT                      ((uint16_t)0x0080)            /* DMA Enable Transmitter */
+#define  USART_CTLR3_RTSE                      ((uint16_t)0x0100)            /* RTS Enable */
+#define  USART_CTLR3_CTSE                      ((uint16_t)0x0200)            /* CTS Enable */
+#define  USART_CTLR3_CTSIE                     ((uint16_t)0x0400)            /* CTS Interrupt Enable */
+#define  USART_CTLR3_ONEBIT                    ((uint16_t)0x0800)            /* One Bit method */
+
+/******************  Bit definition for USART_GPR register  ******************/
+#define  USART_GPR_PSC                         ((uint16_t)0x00FF)            /* PSC[7:0] bits (Prescaler value) */
+#define  USART_GPR_PSC_0                       ((uint16_t)0x0001)            /* Bit 0 */
+#define  USART_GPR_PSC_1                       ((uint16_t)0x0002)            /* Bit 1 */
+#define  USART_GPR_PSC_2                       ((uint16_t)0x0004)            /* Bit 2 */
+#define  USART_GPR_PSC_3                       ((uint16_t)0x0008)            /* Bit 3 */
+#define  USART_GPR_PSC_4                       ((uint16_t)0x0010)            /* Bit 4 */
+#define  USART_GPR_PSC_5                       ((uint16_t)0x0020)            /* Bit 5 */
+#define  USART_GPR_PSC_6                       ((uint16_t)0x0040)            /* Bit 6 */
+#define  USART_GPR_PSC_7                       ((uint16_t)0x0080)            /* Bit 7 */
+
+#define  USART_GPR_GT                          ((uint16_t)0xFF00)            /* Guard time value */
+
+/******************  Bit definition for USART_CTLR4 register  ******************/
+#define  USART_CTLR4_MS_ERRIE                  ((uint16_t)0x0002)            
+#define  USART_CTLR4_CHECK_SEL                 ((uint16_t)0x000C)            
+#define  USART_CTLR4_CHECK_MARKENABLE          ((uint16_t)0x0008)
+#define  USART_CTLR4_CHECK_APACEENABLE         ((uint16_t)0x000C)
+
+/******************************************************************************/
+/*                            OPA                                 */
+/******************************************************************************/
+
+/*******************  Bit definition for WWDG_CTLR register  ********************/
+#define  OPA_EN1                              ((uint32_t)0x0001)               
+#define  OPA_MODE1                            ((uint32_t)0x0002)               
+#define  OPA_NSEL1                            ((uint32_t)0x0004)               
+#define  OPA_PSEL1                            ((uint32_t)0x0008)               
+#define  OPA_EN2                              ((uint32_t)0x0010)               
+#define  OPA_MODE2                            ((uint32_t)0x0020)               
+#define  OPA_NSEL2                            ((uint32_t)0x0040)               
+#define  OPA_PSEL2                            ((uint32_t)0x0080)               
+#define  OPA_EN3                              ((uint32_t)0x0100)               
+#define  OPA_MODE3                            ((uint32_t)0x0200)               
+#define  OPA_NSEL3                            ((uint32_t)0x0400)               
+#define  OPA_PSEL3                            ((uint32_t)0x0800)               
+#define  OPA_EN4                              ((uint32_t)0x1000)               
+#define  OPA_MODE4                            ((uint32_t)0x2000)               
+#define  OPA_NSEL4                            ((uint32_t)0x4000)               
+#define  OPA_PSEL4                            ((uint32_t)0x8000)               
+
+/******************************************************************************/
+/*                            Window WATCHDOG                                 */
+/******************************************************************************/
+
+/*******************  Bit definition for WWDG_CTLR register  ********************/
+#define  WWDG_CTLR_T                           ((uint8_t)0x7F)               /* T[6:0] bits (7-Bit counter (MSB to LSB)) */
+#define  WWDG_CTLR_T0                          ((uint8_t)0x01)               /* Bit 0 */
+#define  WWDG_CTLR_T1                          ((uint8_t)0x02)               /* Bit 1 */
+#define  WWDG_CTLR_T2                          ((uint8_t)0x04)               /* Bit 2 */
+#define  WWDG_CTLR_T3                          ((uint8_t)0x08)               /* Bit 3 */
+#define  WWDG_CTLR_T4                          ((uint8_t)0x10)               /* Bit 4 */
+#define  WWDG_CTLR_T5                          ((uint8_t)0x20)               /* Bit 5 */
+#define  WWDG_CTLR_T6                          ((uint8_t)0x40)               /* Bit 6 */
+
+#define  WWDG_CTLR_WDGA                        ((uint8_t)0x80)               /* Activation bit */
+
+/*******************  Bit definition for WWDG_CFGR register  *******************/
+#define  WWDG_CFGR_W                           ((uint16_t)0x007F)            /* W[6:0] bits (7-bit window value) */
+#define  WWDG_CFGR_W0                          ((uint16_t)0x0001)            /* Bit 0 */
+#define  WWDG_CFGR_W1                          ((uint16_t)0x0002)            /* Bit 1 */
+#define  WWDG_CFGR_W2                          ((uint16_t)0x0004)            /* Bit 2 */
+#define  WWDG_CFGR_W3                          ((uint16_t)0x0008)            /* Bit 3 */
+#define  WWDG_CFGR_W4                          ((uint16_t)0x0010)            /* Bit 4 */
+#define  WWDG_CFGR_W5                          ((uint16_t)0x0020)            /* Bit 5 */
+#define  WWDG_CFGR_W6                          ((uint16_t)0x0040)            /* Bit 6 */
+
+#define  WWDG_CFGR_WDGTB                       ((uint16_t)0x0180)            /* WDGTB[1:0] bits (Timer Base) */
+#define  WWDG_CFGR_WDGTB0                      ((uint16_t)0x0080)            /* Bit 0 */
+#define  WWDG_CFGR_WDGTB1                      ((uint16_t)0x0100)            /* Bit 1 */
+
+#define  WWDG_CFGR_EWI                         ((uint16_t)0x0200)            /* Early Wakeup Interrupt */
+
+/*******************  Bit definition for WWDG_STATR register  ********************/
+#define  WWDG_STATR_EWIF                       ((uint8_t)0x01)               /* Early Wakeup Interrupt Flag */
+
+/******************************************************************************/
+/*                          ENHANCED FUNNCTION                                */
+/******************************************************************************/
+
+/****************************  Enhanced CTLR1 register  *****************************/
+#define  EXTEN_USBD_LS                         ((uint32_t)0x00000001)         /* Bit 0 */
+#define  EXTEN_USBD_PU_EN                      ((uint32_t)0x00000002)         /* Bit 1 */
+#define  EXTEN_ETH_10M_EN                      ((uint32_t)0x00000004)         /* Bit 2 */
+#define  EXTEN_ETH_RGMII_SEL                   ((uint32_t)0x00000008)         /* Bit 3 */
+#define  EXTEN_PLL_HSI_PRE                     ((uint32_t)0x00000010)         /* Bit 4 */
+#define  EXTEN_LOCKUP_EN                       ((uint32_t)0x00000040)         /* Bit 5 */
+#define  EXTEN_LOCKUP_RSTF                     ((uint32_t)0x00000080)         /* Bit 7 */
+
+#define  EXTEN_ULLDO_TRIM                      ((uint32_t)0x00000300)         /* ULLDO_TRIM[1:0] bits */
+#define  EXTEN_ULLDO_TRIM0                     ((uint32_t)0x00000100)         /* Bit 0 */
+#define  EXTEN_ULLDO_TRIM1                     ((uint32_t)0x00000200)         /* Bit 1 */
+
+#define  EXTEN_LDO_TRIM                        ((uint32_t)0x00000C00)         /* LDO_TRIM[1:0] bits */
+#define  EXTEN_LDO_TRIM0                       ((uint32_t)0x00000400)         /* Bit 0 */
+#define  EXTEN_LDO_TRIM1                       ((uint32_t)0x00000800)         /* Bit 1 */
+#define  EXTEN_HSEKPLP                         ((uint32_t)0x00001000)
+
+/****************************  Enhanced CTLR2 register  *****************************/
+#define  EXTEN_CTLR2_OPA1_HSMD                 ((uint32_t)0x00000001)         
+#define  EXTEN_CTLR2_OPA2_HSMD                 ((uint32_t)0x00000002)         
+#define  EXTEN_CTLR2_OPA3_HSMD                 ((uint32_t)0x00000004)         
+#define  EXTEN_CTLR2_OPA4_HSMD                 ((uint32_t)0x00000008)         
+
+/****************************  Enhanced FEATURE_SIGN register  *****************************/
+
+#define  FEATURE_SIGN_VLEVEL                   ((uint32_t)0x00000001)
+
+/******************************************************************************/
+/*                                  DVP                                       */
+/******************************************************************************/
+
+/*******************  Bit definition for DVP_CR0 register  ********************/
+#define RB_DVP_ENABLE			0x01					// RW, DVP enable
+#define RB_DVP_V_POLAR			0x02					// RW, DVP VSYNC polarity control: 1 = invert, 0 = not invert
+#define	RB_DVP_H_POLAR			0x04					// RW, DVP HSYNC polarity control: 1 = invert, 0 = not invert
+#define	RB_DVP_P_POLAR			0x08					// RW, DVP PCLK polarity control: 1 = invert, 0 = not invert
+#define RB_DVP_MSK_DAT_MOD		0x30					
+#define 	RB_DVP_D8_MOD			0x00				// RW, DVP 8bits data mode
+#define		RB_DVP_D10_MOD			0x10				// RW, DVP 10bits data mode
+#define		RB_DVP_D12_MOD			0x20				// RW, DVP 12bits data mode
+#define	RB_DVP_JPEG				0x40					// RW, DVP JPEG mode
+
+/*******************  Bit definition for DVP_CR1 register  ********************/
+#define RB_DVP_DMA_EN			0x01					// RW, DVP dma enable
+#define RB_DVP_ALL_CLR			0x02					// RW, DVP all clear, high action
+#define	RB_DVP_RCV_CLR			0x04					// RW, DVP receive logic clear, high action
+#define RB_DVP_BUF_TOG			0x08					// RW, DVP bug toggle by software, write 1 to toggle, ignored writing 0
+#define RB_DVP_CM				0x10					// RW, DVP capture mode
+#define	RB_DVP_CROP				0x20					// RW, DVP Crop feature enable
+#define RB_DVP_FCRC				0xC0					// RW, DVP frame capture rate control: 
+#define		DVP_RATE_100P		0x00					//00 = every frame captured (100%) 
+#define		DVP_RATE_50P		0x40					//01 = every alternate frame captured (50%)
+#define		DVP_RATE_25P		0x80					//10 = one frame in four frame captured (25%)
+
+/*******************  Bit definition for DVP_IER register  ********************/
+#define	RB_DVP_IE_STR_FRM		0x01					// RW, DVP frame start interrupt enable
+#define	RB_DVP_IE_ROW_DONE		0x02					// RW, DVP row received done interrupt enable
+#define RB_DVP_IE_FRM_DONE		0x04					// RW, DVP frame received done interrupt enable
+#define	RB_DVP_IE_FIFO_OV		0x08					// RW, DVP receive fifo overflow interrupt enable	
+#define RB_DVP_IE_STP_FRM		0x10					// RW, DVP frame stop interrupt enable				
+
+/*******************  Bit definition for DVP_IFR register  ********************/
+#define RB_DVP_IF_STR_FRM	    0x01				    // RW1, interrupt flag for DVP frame start
+#define RB_DVP_IF_ROW_DONE		0x02				    // RW1, interrupt flag for DVP row receive done
+#define RB_DVP_IF_FRM_DONE		0x04				    // RW1, interrupt flag for DVP frame receive done
+#define RB_DVP_IF_FIFO_OV		0x08				    // RW1, interrupt flag for DVP receive fifo overflow
+#define RB_DVP_IF_STP_FRM		0x10				    // RW1, interrupt flag for DVP frame stop
+
+/*******************  Bit definition for DVP_STATUS register  ********************/
+#define RB_DVP_FIFO_RDY			0x01					// RO, DVP receive fifo ready
+#define RB_DVP_FIFO_FULL		0x02					// RO, DVP receive fifo full
+#define RB_DVP_FIFO_OV			0x04					// RO, DVP receive fifo overflow
+#define RB_DVP_MSK_FIFO_CNT		0x70					// RO, DVP receive fifo count
+
+/*******************  Bit definition for DVP_ROW_CNT register  ********************/
+#define RB_DVP_ROW_CNT			((uint16_t)0xFF					
+
+/*******************  Bit definition for DVP_HOFFCNT register  ********************/
+#define RB_DVP_HOFFCNT			((uint16_t)0xFF					
+
+/*******************  Bit definition for DVP_VST register  ********************/
+#define RB_DVP_VST     			((uint16_t)0xFF				
+
+/*******************  Bit definition for DVP_CAPCNT register  ********************/
+#define RB_DVP_CAPCNT     	((uint16_t)0xFF				
+
+/*******************  Bit definition for DVP_VLINE register  ********************/
+#define RB_DVP_VLINE       	((uint16_t)0xFF				
+
+/*******************  Bit definition for DVP_DR register  ********************/
+#define RB_DVP_DR         	((uint16_t)0xFF				
+
+/******************************************************************************/
+/*                                  TKEY                                       */
+/******************************************************************************/
+
+/*******************  Bit definition for TKEY_CHARGE1 register  *******************/
+#define  TKEY_CHARGE1_TKCG10                          ((uint32_t)0x0007)            
+#define  TKEY_CHARGE1_TKCG10_1C5                      ((uint32_t)0x0000)
+#define  TKEY_CHARGE1_TKCG10_7C5                      ((uint32_t)0x0001)
+#define  TKEY_CHARGE1_TKCG10_13C5                     ((uint32_t)0x0002)
+#define  TKEY_CHARGE1_TKCG10_28C5                     ((uint32_t)0x0003)
+#define  TKEY_CHARGE1_TKCG10_41C5                     ((uint32_t)0x0004)
+#define  TKEY_CHARGE1_TKCG10_55C5                     ((uint32_t)0x0005)
+#define  TKEY_CHARGE1_TKCG10_71C5                     ((uint32_t)0x0006)
+#define  TKEY_CHARGE1_TKCG10_239C5                    ((uint32_t)0x0007)
+
+#define  TKEY_CHARGE1_TKCG11                          ((uint32_t)0x0038)            
+#define  TKEY_CHARGE1_TKCG11_1C5                      ((uint32_t)0x0000)
+#define  TKEY_CHARGE1_TKCG11_7C5                      ((uint32_t)0x0008)
+#define  TKEY_CHARGE1_TKCG11_13C5                     ((uint32_t)0x0010)
+#define  TKEY_CHARGE1_TKCG11_28C5                     ((uint32_t)0x0018)
+#define  TKEY_CHARGE1_TKCG11_41C5                     ((uint32_t)0x0020)
+#define  TKEY_CHARGE1_TKCG11_55C5                     ((uint32_t)0x0028)
+#define  TKEY_CHARGE1_TKCG11_71C5                     ((uint32_t)0x0030)
+#define  TKEY_CHARGE1_TKCG11_239C5                    ((uint32_t)0x0038)
+
+#define  TKEY_CHARGE1_TKCG12                          ((uint32_t)0x01C0)            
+#define  TKEY_CHARGE1_TKCG12_1C5                      ((uint32_t)0x0000)
+#define  TKEY_CHARGE1_TKCG12_7C5                      ((uint32_t)0x0040)
+#define  TKEY_CHARGE1_TKCG12_13C5                     ((uint32_t)0x0080)
+#define  TKEY_CHARGE1_TKCG12_28C5                     ((uint32_t)0x00C0)
+#define  TKEY_CHARGE1_TKCG12_41C5                     ((uint32_t)0x0100)
+#define  TKEY_CHARGE1_TKCG12_55C5                     ((uint32_t)0x0140)
+#define  TKEY_CHARGE1_TKCG12_71C5                     ((uint32_t)0x0180)
+#define  TKEY_CHARGE1_TKCG12_239C5                    ((uint32_t)0x01C0)
+
+#define  TKEY_CHARGE1_TKCG13                          ((uint32_t)0x0E00)            
+#define  TKEY_CHARGE1_TKCG13_1C5                      ((uint32_t)0x0000)
+#define  TKEY_CHARGE1_TKCG13_7C5                      ((uint32_t)0x0200)
+#define  TKEY_CHARGE1_TKCG13_13C5                     ((uint32_t)0x0400)
+#define  TKEY_CHARGE1_TKCG13_28C5                     ((uint32_t)0x0600)
+#define  TKEY_CHARGE1_TKCG13_41C5                     ((uint32_t)0x0800)
+#define  TKEY_CHARGE1_TKCG13_55C5                     ((uint32_t)0x0A00)
+#define  TKEY_CHARGE1_TKCG13_71C5                     ((uint32_t)0x0C00)
+#define  TKEY_CHARGE1_TKCG13_239C5                    ((uint32_t)0x0E00)
+
+#define  TKEY_CHARGE1_TKCG14                          ((uint32_t)0x7000)            
+
+#define  TKEY_CHARGE1_TKCG15                          ((uint32_t)0x38000)            
+#define  TKEY_CHARGE1_TKCG16                          ((uint32_t)0x1C0000)            
+#define  TKEY_CHARGE1_TKCG17                          ((uint32_t)0xE00000)            
+
+
+#include "ch32v30x_conf.h"
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+

+ 230 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_adc.h

@@ -0,0 +1,230 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_adc.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/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 __CH32V30x_ADC_H
+#define __CH32V30x_ADC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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_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_TIM8_TRGO     ((uint32_t)0x000C0000) 
+
+#define ADC_ExternalTrigConv_T1_CC3                 ((uint32_t)0x00040000) 
+#define ADC_ExternalTrigConv_None                   ((uint32_t)0x000E0000) 
+
+#define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x00000000) 
+#define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x00020000) 
+#define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x00060000) 
+#define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x00080000)
+#define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x000A0000) 
+#define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x000C0000) 
+
+
+/* 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_10                              ((uint8_t)0x0A)
+#define ADC_Channel_11                              ((uint8_t)0x0B)
+#define ADC_Channel_12                              ((uint8_t)0x0C)
+#define ADC_Channel_13                              ((uint8_t)0x0D)
+#define ADC_Channel_14                              ((uint8_t)0x0E)
+#define ADC_Channel_15                              ((uint8_t)0x0F)
+#define ADC_Channel_16                              ((uint8_t)0x10)
+#define ADC_Channel_17                              ((uint8_t)0x11)
+
+#define ADC_Channel_TempSensor                      ((uint8_t)ADC_Channel_16)
+#define ADC_Channel_Vrefint                         ((uint8_t)ADC_Channel_17)
+
+/*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_1Cycles5                     ((uint8_t)0x00)
+#define ADC_SampleTime_7Cycles5                     ((uint8_t)0x01)
+#define ADC_SampleTime_13Cycles5                    ((uint8_t)0x02)
+#define ADC_SampleTime_28Cycles5                    ((uint8_t)0x03)
+#define ADC_SampleTime_41Cycles5                    ((uint8_t)0x04)
+#define ADC_SampleTime_55Cycles5                    ((uint8_t)0x05)
+#define ADC_SampleTime_71Cycles5                    ((uint8_t)0x06)
+#define ADC_SampleTime_239Cycles5                   ((uint8_t)0x07)
+
+/* ADC_external_trigger_sources_for_injected_channels_conversion */
+#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_TIM8_CC4 ((uint32_t)0x00006000) 
+
+#define ADC_ExternalTrigInjecConv_T1_TRGO           ((uint32_t)0x00000000) 
+#define ADC_ExternalTrigInjecConv_T1_CC4            ((uint32_t)0x00001000) 
+#define ADC_ExternalTrigInjecConv_None              ((uint32_t)0x00007000) 
+
+#define ADC_ExternalTrigInjecConv_T4_CC3            ((uint32_t)0x00002000) 
+#define ADC_ExternalTrigInjecConv_T8_CC2            ((uint32_t)0x00003000) 
+#define ADC_ExternalTrigInjecConv_T8_CC4            ((uint32_t)0x00004000) 
+#define ADC_ExternalTrigInjecConv_T5_TRGO           ((uint32_t)0x00005000)
+#define ADC_ExternalTrigInjecConv_T5_CC4            ((uint32_t)0x00006000) 
+
+
+/* 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)
+
+
+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);
+int16_t Get_CalibrationValue(ADC_TypeDef* ADCx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+
+

+ 99 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_bkp.h

@@ -0,0 +1,99 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_bkp.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_BKP_H
+#define __CH32V30x_BKP_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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)
+#define BKP_DR14                          ((uint16_t)0x004C)
+#define BKP_DR15                          ((uint16_t)0x0050)
+#define BKP_DR16                          ((uint16_t)0x0054)
+#define BKP_DR17                          ((uint16_t)0x0058)
+#define BKP_DR18                          ((uint16_t)0x005C)
+#define BKP_DR19                          ((uint16_t)0x0060)
+#define BKP_DR20                          ((uint16_t)0x0064)
+#define BKP_DR21                          ((uint16_t)0x0068)
+#define BKP_DR22                          ((uint16_t)0x006C)
+#define BKP_DR23                          ((uint16_t)0x0070)
+#define BKP_DR24                          ((uint16_t)0x0074)
+#define BKP_DR25                          ((uint16_t)0x0078)
+#define BKP_DR26                          ((uint16_t)0x007C)
+#define BKP_DR27                          ((uint16_t)0x0080)
+#define BKP_DR28                          ((uint16_t)0x0084)
+#define BKP_DR29                          ((uint16_t)0x0088)
+#define BKP_DR30                          ((uint16_t)0x008C)
+#define BKP_DR31                          ((uint16_t)0x0090)
+#define BKP_DR32                          ((uint16_t)0x0094)
+#define BKP_DR33                          ((uint16_t)0x0098)
+#define BKP_DR34                          ((uint16_t)0x009C)
+#define BKP_DR35                          ((uint16_t)0x00A0)
+#define BKP_DR36                          ((uint16_t)0x00A4)
+#define BKP_DR37                          ((uint16_t)0x00A8)
+#define BKP_DR38                          ((uint16_t)0x00AC)
+#define BKP_DR39                          ((uint16_t)0x00B0)
+#define BKP_DR40                          ((uint16_t)0x00B4)
+#define BKP_DR41                          ((uint16_t)0x00B8)
+#define BKP_DR42                          ((uint16_t)0x00BC)
+
+
+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 
+
+
+
+
+

+ 376 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_can.h

@@ -0,0 +1,376 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_can.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_CAN_H
+#define __CH32V30x_CAN_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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;
+
+/* 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 */
+/* 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. 
+*/
+/* Transmit Flags */
+#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        
+
+
+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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+

+ 39 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_crc.h

@@ -0,0 +1,39 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_crc.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_CRC_H
+#define __CH32V30x_CRC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 
+
+
+
+
+

+ 122 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dac.h

@@ -0,0 +1,122 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dac.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file contains all the functions prototypes for the 
+*                      DAC 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 __CH32V30x_DAC_H
+#define __CH32V30x_DAC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* DAC Init structure definition */
+typedef struct
+{
+  uint32_t DAC_Trigger;                      /* Specifies the external trigger for the selected DAC channel.
+                                                This parameter can be a value of @ref DAC_trigger_selection */
+
+  uint32_t DAC_WaveGeneration;               /* Specifies whether DAC channel noise waves or triangle waves
+                                                are generated, or whether no wave is generated.
+                                                This parameter can be a value of @ref DAC_wave_generation */
+
+  uint32_t DAC_LFSRUnmask_TriangleAmplitude; /* Specifies the LFSR mask for noise wave generation or
+                                                the maximum amplitude triangle generation for the DAC channel. 
+                                                This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */
+
+  uint32_t DAC_OutputBuffer;                 /* Specifies whether the DAC channel output buffer is enabled or disabled.
+                                                This parameter can be a value of @ref DAC_output_buffer */
+}DAC_InitTypeDef;
+
+
+/* DAC_trigger_selection */
+#define DAC_Trigger_None                   ((uint32_t)0x00000000) /* Conversion is automatic once the DAC1_DHRxxxx register 
+                                                                     has been loaded, and not by external trigger */
+#define DAC_Trigger_T6_TRGO                ((uint32_t)0x00000004) /* TIM6 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_Trigger_T8_TRGO                ((uint32_t)0x0000000C) /* TIM8 TRGO selected as external conversion trigger for DAC channel
+                                                                     only in High-density devices*/
+#define DAC_Trigger_T7_TRGO                ((uint32_t)0x00000014) /* TIM7 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_Trigger_T5_TRGO                ((uint32_t)0x0000001C) /* TIM5 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_Trigger_T2_TRGO                ((uint32_t)0x00000024) /* TIM2 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_Trigger_T4_TRGO                ((uint32_t)0x0000002C) /* TIM4 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_Trigger_Ext_IT9                ((uint32_t)0x00000034) /* EXTI Line9 event selected as external conversion trigger for DAC channel */
+#define DAC_Trigger_Software               ((uint32_t)0x0000003C) /* Conversion started by software trigger for DAC channel */
+
+/* DAC_wave_generation */
+#define DAC_WaveGeneration_None            ((uint32_t)0x00000000)
+#define DAC_WaveGeneration_Noise           ((uint32_t)0x00000040)
+#define DAC_WaveGeneration_Triangle        ((uint32_t)0x00000080)
+
+
+/* DAC_lfsrunmask_triangleamplitude */
+#define DAC_LFSRUnmask_Bit0                ((uint32_t)0x00000000) /* Unmask DAC channel LFSR bit0 for noise wave generation */
+#define DAC_LFSRUnmask_Bits1_0             ((uint32_t)0x00000100) /* Unmask DAC channel LFSR bit[1:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits2_0             ((uint32_t)0x00000200) /* Unmask DAC channel LFSR bit[2:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits3_0             ((uint32_t)0x00000300) /* Unmask DAC channel LFSR bit[3:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits4_0             ((uint32_t)0x00000400) /* Unmask DAC channel LFSR bit[4:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits5_0             ((uint32_t)0x00000500) /* Unmask DAC channel LFSR bit[5:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits6_0             ((uint32_t)0x00000600) /* Unmask DAC channel LFSR bit[6:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits7_0             ((uint32_t)0x00000700) /* Unmask DAC channel LFSR bit[7:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits8_0             ((uint32_t)0x00000800) /* Unmask DAC channel LFSR bit[8:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits9_0             ((uint32_t)0x00000900) /* Unmask DAC channel LFSR bit[9:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits10_0            ((uint32_t)0x00000A00) /* Unmask DAC channel LFSR bit[10:0] for noise wave generation */
+#define DAC_LFSRUnmask_Bits11_0            ((uint32_t)0x00000B00) /* Unmask DAC channel LFSR bit[11:0] for noise wave generation */
+#define DAC_TriangleAmplitude_1            ((uint32_t)0x00000000) /* Select max triangle amplitude of 1 */
+#define DAC_TriangleAmplitude_3            ((uint32_t)0x00000100) /* Select max triangle amplitude of 3 */
+#define DAC_TriangleAmplitude_7            ((uint32_t)0x00000200) /* Select max triangle amplitude of 7 */
+#define DAC_TriangleAmplitude_15           ((uint32_t)0x00000300) /* Select max triangle amplitude of 15 */
+#define DAC_TriangleAmplitude_31           ((uint32_t)0x00000400) /* Select max triangle amplitude of 31 */
+#define DAC_TriangleAmplitude_63           ((uint32_t)0x00000500) /* Select max triangle amplitude of 63 */
+#define DAC_TriangleAmplitude_127          ((uint32_t)0x00000600) /* Select max triangle amplitude of 127 */
+#define DAC_TriangleAmplitude_255          ((uint32_t)0x00000700) /* Select max triangle amplitude of 255 */
+#define DAC_TriangleAmplitude_511          ((uint32_t)0x00000800) /* Select max triangle amplitude of 511 */
+#define DAC_TriangleAmplitude_1023         ((uint32_t)0x00000900) /* Select max triangle amplitude of 1023 */
+#define DAC_TriangleAmplitude_2047         ((uint32_t)0x00000A00) /* Select max triangle amplitude of 2047 */
+#define DAC_TriangleAmplitude_4095         ((uint32_t)0x00000B00) /* Select max triangle amplitude of 4095 */
+
+/* DAC_output_buffer */
+#define DAC_OutputBuffer_Enable            ((uint32_t)0x00000000)
+#define DAC_OutputBuffer_Disable           ((uint32_t)0x00000002)
+
+/* DAC_Channel_selection */
+#define DAC_Channel_1                      ((uint32_t)0x00000000)
+#define DAC_Channel_2                      ((uint32_t)0x00000010)
+																 
+/* DAC_data_alignment */
+#define DAC_Align_12b_R                    ((uint32_t)0x00000000)
+#define DAC_Align_12b_L                    ((uint32_t)0x00000004)
+#define DAC_Align_8b_R                     ((uint32_t)0x00000008)
+
+/* DAC_wave_generation */
+#define DAC_Wave_Noise                     ((uint32_t)0x00000040)
+#define DAC_Wave_Triangle                  ((uint32_t)0x00000080)
+
+
+void DAC_DeInit(void);
+void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
+void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct);
+void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
+void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState);
+void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState);
+void DAC_DualSoftwareTriggerCmd(FunctionalState NewState);
+void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState);
+void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);
+void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data);
+void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1);
+uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+

+ 60 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dbgmcu.h

@@ -0,0 +1,60 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dbgmcu.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_DBGMCU_H
+#define __CH32V30x_DBGMCU_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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_TIM5_STOP             ((uint32_t)0x00010000)
+#define DBGMCU_TIM6_STOP             ((uint32_t)0x00020000)
+#define DBGMCU_TIM7_STOP             ((uint32_t)0x00040000)
+#define DBGMCU_TIM8_STOP             ((uint32_t)0x00080000)
+#define DBGMCU_CAN1_STOP             ((uint32_t)0x00100000)
+#define DBGMCU_CAN2_STOP             ((uint32_t)0x00200000)
+#define DBGMCU_TIM9_STOP             ((uint32_t)0x00400000)
+#define DBGMCU_TIM10_STOP            ((uint32_t)0x00800000)
+
+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 
+
+
+
+
+
+
+

+ 270 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dma.h

@@ -0,0 +1,270 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dma.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_DMA_H
+#define __CH32V30x_DMA_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 DMA2_IT_GL1                        ((uint32_t)0x10000001)
+#define DMA2_IT_TC1                        ((uint32_t)0x10000002)
+#define DMA2_IT_HT1                        ((uint32_t)0x10000004)
+#define DMA2_IT_TE1                        ((uint32_t)0x10000008)
+#define DMA2_IT_GL2                        ((uint32_t)0x10000010)
+#define DMA2_IT_TC2                        ((uint32_t)0x10000020)
+#define DMA2_IT_HT2                        ((uint32_t)0x10000040)
+#define DMA2_IT_TE2                        ((uint32_t)0x10000080)
+#define DMA2_IT_GL3                        ((uint32_t)0x10000100)
+#define DMA2_IT_TC3                        ((uint32_t)0x10000200)
+#define DMA2_IT_HT3                        ((uint32_t)0x10000400)
+#define DMA2_IT_TE3                        ((uint32_t)0x10000800)
+#define DMA2_IT_GL4                        ((uint32_t)0x10001000)
+#define DMA2_IT_TC4                        ((uint32_t)0x10002000)
+#define DMA2_IT_HT4                        ((uint32_t)0x10004000)
+#define DMA2_IT_TE4                        ((uint32_t)0x10008000)
+#define DMA2_IT_GL5                        ((uint32_t)0x10010000)
+#define DMA2_IT_TC5                        ((uint32_t)0x10020000)
+#define DMA2_IT_HT5                        ((uint32_t)0x10040000)
+#define DMA2_IT_TE5                        ((uint32_t)0x10080000)
+#define DMA2_IT_GL6                        ((uint32_t)0x10100000)
+#define DMA2_IT_TC6                        ((uint32_t)0x10200000)
+#define DMA2_IT_HT6                        ((uint32_t)0x10400000)
+#define DMA2_IT_TE6                        ((uint32_t)0x10800000)
+#define DMA2_IT_GL7                        ((uint32_t)0x11000000)
+#define DMA2_IT_TC7                        ((uint32_t)0x12000000)
+#define DMA2_IT_HT7                        ((uint32_t)0x14000000)
+#define DMA2_IT_TE7                        ((uint32_t)0x18000000)
+
+#define DMA2_IT_GL8                        ((uint32_t)0x20000001)
+#define DMA2_IT_TC8                        ((uint32_t)0x20000002)
+#define DMA2_IT_HT8                        ((uint32_t)0x20000004)
+#define DMA2_IT_TE8                        ((uint32_t)0x20000008)
+#define DMA2_IT_GL9                        ((uint32_t)0x20000010)
+#define DMA2_IT_TC9                        ((uint32_t)0x20000020)
+#define DMA2_IT_HT9                        ((uint32_t)0x20000040)
+#define DMA2_IT_TE9                        ((uint32_t)0x20000080)
+#define DMA2_IT_GL10                       ((uint32_t)0x20000100)
+#define DMA2_IT_TC10                       ((uint32_t)0x20000200)
+#define DMA2_IT_HT10                       ((uint32_t)0x20000400)
+#define DMA2_IT_TE10                       ((uint32_t)0x20000800)
+#define DMA2_IT_GL11                       ((uint32_t)0x20001000)
+#define DMA2_IT_TC11                       ((uint32_t)0x20002000)
+#define DMA2_IT_HT11                       ((uint32_t)0x20004000)
+#define DMA2_IT_TE11                       ((uint32_t)0x20008000)
+
+/* 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 DMA2_FLAG_GL1                      ((uint32_t)0x10000001)
+#define DMA2_FLAG_TC1                      ((uint32_t)0x10000002)
+#define DMA2_FLAG_HT1                      ((uint32_t)0x10000004)
+#define DMA2_FLAG_TE1                      ((uint32_t)0x10000008)
+#define DMA2_FLAG_GL2                      ((uint32_t)0x10000010)
+#define DMA2_FLAG_TC2                      ((uint32_t)0x10000020)
+#define DMA2_FLAG_HT2                      ((uint32_t)0x10000040)
+#define DMA2_FLAG_TE2                      ((uint32_t)0x10000080)
+#define DMA2_FLAG_GL3                      ((uint32_t)0x10000100)
+#define DMA2_FLAG_TC3                      ((uint32_t)0x10000200)
+#define DMA2_FLAG_HT3                      ((uint32_t)0x10000400)
+#define DMA2_FLAG_TE3                      ((uint32_t)0x10000800)
+#define DMA2_FLAG_GL4                      ((uint32_t)0x10001000)
+#define DMA2_FLAG_TC4                      ((uint32_t)0x10002000)
+#define DMA2_FLAG_HT4                      ((uint32_t)0x10004000)
+#define DMA2_FLAG_TE4                      ((uint32_t)0x10008000)
+#define DMA2_FLAG_GL5                      ((uint32_t)0x10010000)
+#define DMA2_FLAG_TC5                      ((uint32_t)0x10020000)
+#define DMA2_FLAG_HT5                      ((uint32_t)0x10040000)
+#define DMA2_FLAG_TE5                      ((uint32_t)0x10080000)
+#define DMA2_FLAG_GL6                      ((uint32_t)0x10100000)
+#define DMA2_FLAG_TC6                      ((uint32_t)0x10200000)
+#define DMA2_FLAG_HT6                      ((uint32_t)0x10400000)
+#define DMA2_FLAG_TE6                      ((uint32_t)0x10800000)
+#define DMA2_FLAG_GL7                      ((uint32_t)0x11000000)
+#define DMA2_FLAG_TC7                      ((uint32_t)0x12000000)
+#define DMA2_FLAG_HT7                      ((uint32_t)0x14000000)
+#define DMA2_FLAG_TE7                      ((uint32_t)0x18000000)
+
+#define DMA2_FLAG_GL8                      ((uint32_t)0x20000001)
+#define DMA2_FLAG_TC8                      ((uint32_t)0x20000002)
+#define DMA2_FLAG_HT8                      ((uint32_t)0x20000004)
+#define DMA2_FLAG_TE8                      ((uint32_t)0x20000008)
+#define DMA2_FLAG_GL9                      ((uint32_t)0x20000010)
+#define DMA2_FLAG_TC9                      ((uint32_t)0x20000020)
+#define DMA2_FLAG_HT9                      ((uint32_t)0x20000040)
+#define DMA2_FLAG_TE9                      ((uint32_t)0x20000080)
+#define DMA2_FLAG_GL10                     ((uint32_t)0x20000100)
+#define DMA2_FLAG_TC10                     ((uint32_t)0x20000200)
+#define DMA2_FLAG_HT10                     ((uint32_t)0x20000400)
+#define DMA2_FLAG_TE10                     ((uint32_t)0x20000800)
+#define DMA2_FLAG_GL11                     ((uint32_t)0x20001000)
+#define DMA2_FLAG_TC11                     ((uint32_t)0x20002000)
+#define DMA2_FLAG_HT11                     ((uint32_t)0x20004000)
+#define DMA2_FLAG_TE11                     ((uint32_t)0x20008000)
+
+
+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 
+

+ 69 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_dvp.h

@@ -0,0 +1,69 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dvp.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file contains all the functions prototypes for the 
+*                      DVP 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 __CH32V30x_DVP_H
+#define __CH32V30x_DVP_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* DVP Data Mode */
+typedef enum
+{
+ Video_Mode = 0,
+ JPEG_Mode,
+}DVP_Data_ModeTypeDef;
+
+
+/* DVP DMA */
+typedef enum
+{
+ DVP_DMA_Disable = 0,
+ DVP_DMA_Enable,
+}DVP_DMATypeDef;
+
+/* DVP FLAG and FIFO Reset */
+typedef enum
+{
+ DVP_FLAG_FIFO_RESET_Disable = 0,
+ DVP_FLAG_FIFO_RESET_Enable,
+}DVP_FLAG_FIFO_RESETTypeDef;
+
+/* DVP RX Reset */
+typedef enum
+{
+ DVP_RX_RESET_Disable = 0,
+ DVP_RX_RESET_Enable,
+}DVP_RX_RESETTypeDef;
+
+
+
+void DVP_INTCfg( uint8_t s,  uint8_t i );
+void DVP_Mode( uint8_t s,  DVP_Data_ModeTypeDef i);
+void DVP_Cfg( DVP_DMATypeDef s,  DVP_FLAG_FIFO_RESETTypeDef i, DVP_RX_RESETTypeDef j);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+
+

+ 1338 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_eth.h

@@ -0,0 +1,1338 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_eth.h
+* Author             : WCH
+* Version            : V1.0.1
+* Date               : 2025/01/08
+* Description        : This file contains all the functions prototypes for the
+*                      ETH 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 __CH32V30x_ETH_H
+#define __CH32V30x_ETH_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+
+#define PHY_10BASE_T_LINKED   1
+#define PHY_10BASE_T_NOT_LINKED   0
+
+#define DMA_TPS_Mask      ((uint32_t)0x00700000) 	
+#define DMA_RPS_Mask      ((uint32_t)0x000E0000) 	
+
+/* ETH Init structure definition */
+typedef struct {
+    uint32_t             ETH_AutoNegotiation;             /* Selects or not the AutoNegotiation mode for the external PHY
+                                                             The AutoNegotiation allows an automatic setting of the Speed (10/100Mbps)
+                                                             and the mode (half/full-duplex).
+                                                             This parameter can be a value of @ref ETH_AutoNegotiation */
+
+    uint32_t             ETH_Watchdog;                    /* Selects or not the Watchdog timer
+                                                             When enabled, the MAC allows no more then 2048 bytes to be received.
+                                                             When disabled, the MAC can receive up to 16384 bytes.
+                                                             This parameter can be a value of @ref ETH_watchdog */
+
+    uint32_t             ETH_Jabber;                      /* Selects or not Jabber timer
+                                                             When enabled, the MAC allows no more then 2048 bytes to be sent.
+                                                             When disabled, the MAC can send up to 16384 bytes.
+                                                             This parameter can be a value of @ref ETH_Jabber */
+
+    uint32_t             ETH_InterFrameGap;               /* Selects the minimum IFG between frames during transmission
+                                                             This parameter can be a value of @ref ETH_Inter_Frame_Gap */
+
+    uint32_t             ETH_CarrierSense;                /* Selects or not the Carrier Sense
+                                                             This parameter can be a value of @ref ETH_Carrier_Sense */
+
+    uint32_t             ETH_Speed;                       /* Sets the Ethernet speed: 10/100 Mbps
+                                                             This parameter can be a value of @ref ETH_Speed */
+
+    uint32_t             ETH_ReceiveOwn;                  /* Selects or not the ReceiveOwn
+                                                             ReceiveOwn allows the reception of frames when the TX_EN signal is asserted
+                                                             in Half-Duplex mode
+                                                             This parameter can be a value of @ref ETH_Receive_Own */
+
+    uint32_t             ETH_LoopbackMode;                /* Selects or not the internal MAC MII Loopback mode
+                                                             This parameter can be a value of @ref ETH_Loop_Back_Mode */
+
+    uint32_t             ETH_Mode;                        /* Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode
+                                                             This parameter can be a value of @ref ETH_Duplex_Mode */
+
+    uint32_t             ETH_ChecksumOffload;             /* Selects or not the IPv4 checksum checking for received frame payloads' TCP/UDP/ICMP headers.
+                                                             This parameter can be a value of @ref ETH_Checksum_Offload */
+
+    uint32_t             ETH_RetryTransmission;           /* Selects or not the MAC attempt retries transmission, based on the settings of BL,
+                                                             when a colision occurs (Half-Duplex mode)
+                                                             This parameter can be a value of @ref ETH_Retry_Transmission */
+
+    uint32_t             ETH_AutomaticPadCRCStrip;        /* Selects or not the Automatic MAC Pad/CRC Stripping
+                                                             This parameter can be a value of @ref ETH_Automatic_Pad_CRC_Strip */
+
+    uint32_t             ETH_BackOffLimit;                /* Selects the BackOff limit value
+                                                             This parameter can be a value of @ref ETH_Back_Off_Limit */
+
+    uint32_t             ETH_DeferralCheck;               /* Selects or not the deferral check function (Half-Duplex mode)
+                                                             This parameter can be a value of @ref ETH_Deferral_Check */
+
+    uint32_t             ETH_ReceiveAll;                  /* Selects or not all frames reception by the MAC (No fitering)
+                                                             This parameter can be a value of @ref ETH_Receive_All */
+
+    uint32_t             ETH_SourceAddrFilter;            /* Selects the Source Address Filter mode
+                                                             This parameter can be a value of @ref ETH_Source_Addr_Filter */
+
+    uint32_t             ETH_PassControlFrames;           /* Sets the forwarding mode of the control frames (including unicast and multicast PAUSE frames)
+                                                             This parameter can be a value of @ref ETH_Pass_Control_Frames */
+
+    uint32_t             ETH_BroadcastFramesReception;    /* Selects or not the reception of Broadcast Frames
+                                                             This parameter can be a value of @ref ETH_Broadcast_Frames_Reception */
+
+    uint32_t             ETH_DestinationAddrFilter;       /* Sets the destination filter mode for both unicast and multicast frames
+                                                             This parameter can be a value of @ref ETH_Destination_Addr_Filter */
+
+    uint32_t             ETH_PromiscuousMode;             /* Selects or not the Promiscuous Mode
+                                                             This parameter can be a value of @ref ETH_Promiscuous_Mode */
+
+    uint32_t             ETH_MulticastFramesFilter;       /* Selects the Multicast Frames filter mode: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter
+                                                             This parameter can be a value of @ref ETH_Multicast_Frames_Filter */
+
+    uint32_t             ETH_UnicastFramesFilter;         /* Selects the Unicast Frames filter mode: HashTableFilter/PerfectFilter/PerfectHashTableFilter
+                                                             This parameter can be a value of @ref ETH_Unicast_Frames_Filter */
+
+    uint32_t             ETH_HashTableHigh;               /* This field holds the higher 32 bits of Hash table.  */
+
+    uint32_t             ETH_HashTableLow;                /* This field holds the lower 32 bits of Hash table.  */
+
+    uint32_t             ETH_PauseTime;                   /* This field holds the value to be used in the Pause Time field in the
+                                                             transmit control frame */
+
+    uint32_t             ETH_ZeroQuantaPause;             /* Selects or not the automatic generation of Zero-Quanta Pause Control frames
+                                                             This parameter can be a value of @ref ETH_Zero_Quanta_Pause */
+
+    uint32_t             ETH_PauseLowThreshold;           /* This field configures the threshold of the PAUSE to be checked for
+                                                             automatic retransmission of PAUSE Frame
+                                                             This parameter can be a value of @ref ETH_Pause_Low_Threshold */
+                                                           
+    uint32_t             ETH_UnicastPauseFrameDetect;     /* Selects or not the MAC detection of the Pause frames (with MAC Address0
+                                                             unicast address and unique multicast address)
+                                                             This parameter can be a value of @ref ETH_Unicast_Pause_Frame_Detect */
+
+    uint32_t             ETH_ReceiveFlowControl;          /* Enables or disables the MAC to decode the received Pause frame and
+                                                             disable its transmitter for a specified time (Pause Time)
+                                                             This parameter can be a value of @ref ETH_Receive_Flow_Control */
+
+    uint32_t             ETH_TransmitFlowControl;         /* Enables or disables the MAC to transmit Pause frames (Full-Duplex mode)
+                                                             or the MAC back-pressure operation (Half-Duplex mode)
+                                                             This parameter can be a value of @ref ETH_Transmit_Flow_Control */
+
+    uint32_t             ETH_VLANTagComparison;           /* Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for
+                                                             comparison and filtering
+                                                             This parameter can be a value of @ref ETH_VLAN_Tag_Comparison */
+
+    uint32_t             ETH_VLANTagIdentifier;           /* Holds the VLAN tag identifier for receive frames */
+
+    uint32_t             ETH_DropTCPIPChecksumErrorFrame; /* Selects or not the Dropping of TCP/IP Checksum Error Frames
+                                                             This parameter can be a value of @ref ETH_Drop_TCP_IP_Checksum_Error_Frame */ 
+
+    uint32_t             ETH_ReceiveStoreForward;         /* Enables or disables the Receive store and forward mode
+                                                             This parameter can be a value of @ref ETH_Receive_Store_Forward */ 
+
+    uint32_t             ETH_FlushReceivedFrame;          /* Enables or disables the flushing of received frames
+                                                             This parameter can be a value of @ref ETH_Flush_Received_Frame */ 
+
+    uint32_t             ETH_TransmitStoreForward;        /* Enables or disables Transmit store and forward mode
+                                                             This parameter can be a value of @ref ETH_Transmit_Store_Forward */ 
+
+    uint32_t             ETH_TransmitThresholdControl;    /* Selects or not the Transmit Threshold Control
+                                                             This parameter can be a value of @ref ETH_Transmit_Threshold_Control */
+
+    uint32_t             ETH_ForwardErrorFrames;          /* Selects or not the forward to the DMA of erroneous frames
+                                                             This parameter can be a value of @ref ETH_Forward_Error_Frames */
+
+    uint32_t             ETH_ForwardUndersizedGoodFrames; /* Enables or disables the Rx FIFO to forward Undersized frames (frames with no Error
+                                                             and length less than 64 bytes) including pad-bytes and CRC)
+                                                             This parameter can be a value of @ref ETH_Forward_Undersized_Good_Frames */
+
+    uint32_t             ETH_ReceiveThresholdControl;     /* Selects the threshold level of the Receive FIFO
+                                                             This parameter can be a value of @ref ETH_Receive_Threshold_Control */
+
+    uint32_t             ETH_SecondFrameOperate;          /* Selects or not the Operate on second frame mode, which allows the DMA to process a second
+                                                             frame of Transmit data even before obtaining the status for the first frame.
+                                                             This parameter can be a value of @ref ETH_Second_Frame_Operate */
+
+    uint32_t             ETH_AddressAlignedBeats;         /* Enables or disables the Address Aligned Beats
+                                                             This parameter can be a value of @ref ETH_Address_Aligned_Beats */
+
+    uint32_t             ETH_FixedBurst;                  /* Enables or disables the AHB Master interface fixed burst transfers
+                                                             This parameter can be a value of @ref ETH_Fixed_Burst */
+                       
+    uint32_t             ETH_RxDMABurstLength;            /* Indicates the maximum number of beats to be transferred in one Rx DMA transaction
+                                                             This parameter can be a value of @ref ETH_Rx_DMA_Burst_Length */ 
+
+    uint32_t             ETH_TxDMABurstLength;            /* Indicates sthe maximum number of beats to be transferred in one Tx DMA transaction
+                                                             This parameter can be a value of @ref ETH_Tx_DMA_Burst_Length */                                                   
+
+    uint32_t             ETH_DescriptorSkipLength;        /* Specifies the number of word to skip between two unchained descriptors (Ring mode) */
+
+    uint32_t             ETH_DMAArbitration;              /* Selects the DMA Tx/Rx arbitration
+                                                             This parameter can be a value of @ref ETH_DMA_Arbitration */  
+}ETH_InitTypeDef;
+
+
+
+/* ETH delay.Just for Ethernet */
+#define _eth_delay_    ETH_Delay       /* Default _eth_delay_ function with less precise timing */
+
+/* definition for Ethernet frame */
+#define ETH_MAX_PACKET_SIZE    1524    /* ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */
+#define ETH_HEADER               14    /* 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */
+#define ETH_CRC                   4    /* Ethernet CRC */
+#define ETH_EXTRA                 2    /* Extra bytes in some cases */
+#define VLAN_TAG                  4    /* optional 802.1q VLAN Tag */
+#define MIN_ETH_PAYLOAD          46    /* Minimum Ethernet payload size */
+#define MAX_ETH_PAYLOAD        1500    /* Maximum Ethernet payload size */
+#define JUMBO_FRAME_PAYLOAD    9000    /* Jumbo frame payload size */
+
+/* ETH DMA structure definition */
+typedef struct
+{
+  uint32_t   volatile Status;       /* Status */
+  uint32_t   ControlBufferSize;     /* Control and Buffer1, Buffer2 lengths */
+  uint32_t   Buffer1Addr;           /* Buffer1 address pointer */
+  uint32_t   Buffer2NextDescAddr;   /* Buffer2 or next descriptor address pointer */
+} ETH_DMADESCTypeDef;
+
+/**
+   DMA Tx Desciptor
+  -----------------------------------------------------------------------------------------------
+  TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] |
+  -----------------------------------------------------------------------------------------------
+  TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] |
+  -----------------------------------------------------------------------------------------------
+  TDES2 |                         Buffer1 Address [31:0]                                         |
+  -----------------------------------------------------------------------------------------------
+  TDES3 |                   Buffer2 Address [31:0] / Next Desciptor Address [31:0]               |
+  ------------------------------------------------------------------------------------------------
+*/
+
+
+/* Bit or field definition of TDES0 register (DMA Tx descriptor status register)*/
+#define ETH_DMATxDesc_OWN                     ((uint32_t)0x80000000)  /* OWN bit: descriptor is owned by DMA engine */
+#define ETH_DMATxDesc_IC                      ((uint32_t)0x40000000)  /* Interrupt on Completion */
+#define ETH_DMATxDesc_LS                      ((uint32_t)0x20000000)  /* Last Segment */
+#define ETH_DMATxDesc_FS                      ((uint32_t)0x10000000)  /* First Segment */
+#define ETH_DMATxDesc_DC                      ((uint32_t)0x08000000)  /* Disable CRC */
+#define ETH_DMATxDesc_DP                      ((uint32_t)0x04000000)  /* Disable Padding */
+#define ETH_DMATxDesc_TTSE                    ((uint32_t)0x02000000)  /* Transmit Time Stamp Enable */
+#define ETH_DMATxDesc_CIC                     ((uint32_t)0x00C00000)  /* Checksum Insertion Control: 4 cases */
+#define ETH_DMATxDesc_CIC_ByPass              ((uint32_t)0x00000000)  /* Do Nothing: Checksum Engine is bypassed */
+#define ETH_DMATxDesc_CIC_IPV4Header          ((uint32_t)0x00400000)  /* IPV4 header Checksum Insertion */
+#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment  ((uint32_t)0x00800000)  /* TCP/UDP/ICMP Checksum Insertion calculated over segment only */
+#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full     ((uint32_t)0x00C00000)  /* TCP/UDP/ICMP Checksum Insertion fully calculated */
+#define ETH_DMATxDesc_TER                     ((uint32_t)0x00200000)  /* Transmit End of Ring */
+#define ETH_DMATxDesc_TCH                     ((uint32_t)0x00100000)  /* Second Address Chained */
+#define ETH_DMATxDesc_TTSS                    ((uint32_t)0x00020000)  /* Tx Time Stamp Status */
+#define ETH_DMATxDesc_IHE                     ((uint32_t)0x00010000)  /* IP Header Error */
+#define ETH_DMATxDesc_ES                      ((uint32_t)0x00008000)  /* Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */
+#define ETH_DMATxDesc_JT                      ((uint32_t)0x00004000)  /* Jabber Timeout */
+#define ETH_DMATxDesc_FF                      ((uint32_t)0x00002000)  /* Frame Flushed: DMA/MTL flushed the frame due to SW flush */
+#define ETH_DMATxDesc_PCE                     ((uint32_t)0x00001000)  /* Payload Checksum Error */
+#define ETH_DMATxDesc_LCA                     ((uint32_t)0x00000800)  /* Loss of Carrier: carrier lost during tramsmission */
+#define ETH_DMATxDesc_NC                      ((uint32_t)0x00000400)  /* No Carrier: no carrier signal from the tranceiver */
+#define ETH_DMATxDesc_LCO                     ((uint32_t)0x00000200)  /* Late Collision: transmission aborted due to collision */
+#define ETH_DMATxDesc_EC                      ((uint32_t)0x00000100)  /* Excessive Collision: transmission aborted after 16 collisions */
+#define ETH_DMATxDesc_VF                      ((uint32_t)0x00000080)  /* VLAN Frame */
+#define ETH_DMATxDesc_CC                      ((uint32_t)0x00000078)  /* Collision Count */
+#define ETH_DMATxDesc_ED                      ((uint32_t)0x00000004)  /* Excessive Deferral */
+#define ETH_DMATxDesc_UF                      ((uint32_t)0x00000002)  /* Underflow Error: late data arrival from the memory */
+#define ETH_DMATxDesc_DB                      ((uint32_t)0x00000001)  /* Deferred Bit */
+
+/* Field definition of TDES1 register */
+#define ETH_DMATxDesc_TBS2  ((uint32_t)0x1FFF0000)  /* Transmit Buffer2 Size */
+#define ETH_DMATxDesc_TBS1  ((uint32_t)0x00001FFF)  /* Transmit Buffer1 Size */
+
+/* Field definition of TDES2 register */
+#define ETH_DMATxDesc_B1AP  ((uint32_t)0xFFFFFFFF)  /* Buffer1 Address Pointer */
+
+/* Field definition of TDES3 register */
+#define ETH_DMATxDesc_B2AP  ((uint32_t)0xFFFFFFFF)  /* Buffer2 Address Pointer */
+
+/**
+  DMA Rx Desciptor
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES0 | OWN(31) |                                             Status [30:0]                                          |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES2 |                                       Buffer1 Address [31:0]                                                 |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES3 |                          Buffer2 Address [31:0] / Next Desciptor Address [31:0]                              |
+  ----------------------------------------------------------------------------------------------------------------------
+*/
+
+/* Bit or field definition of RDES0 register (DMA Rx descriptor status register) */
+#define ETH_DMARxDesc_OWN         ((uint32_t)0x80000000)  /* OWN bit: descriptor is owned by DMA engine  */
+#define ETH_DMARxDesc_AFM         ((uint32_t)0x40000000)  /* DA Filter Fail for the rx frame  */
+#define ETH_DMARxDesc_FL          ((uint32_t)0x3FFF0000)  /* Receive descriptor frame length  */
+#define ETH_DMARxDesc_ES          ((uint32_t)0x00008000)  /* Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */
+#define ETH_DMARxDesc_DE          ((uint32_t)0x00004000)  /* Desciptor error: no more descriptors for receive frame  */
+#define ETH_DMARxDesc_SAF         ((uint32_t)0x00002000)  /* SA Filter Fail for the received frame */
+#define ETH_DMARxDesc_LE          ((uint32_t)0x00001000)  /* Frame size not matching with length field */
+#define ETH_DMARxDesc_OE          ((uint32_t)0x00000800)  /* Overflow Error: Frame was damaged due to buffer overflow */
+#define ETH_DMARxDesc_VLAN        ((uint32_t)0x00000400)  /* VLAN Tag: received frame is a VLAN frame */
+#define ETH_DMARxDesc_FS          ((uint32_t)0x00000200)  /* First descriptor of the frame  */
+#define ETH_DMARxDesc_LS          ((uint32_t)0x00000100)  /* Last descriptor of the frame  */
+#define ETH_DMARxDesc_IPV4HCE     ((uint32_t)0x00000080)  /* IPC Checksum Error: Rx Ipv4 header checksum error   */
+#define ETH_DMARxDesc_LC          ((uint32_t)0x00000040)  /* Late collision occurred during reception   */
+#define ETH_DMARxDesc_FT          ((uint32_t)0x00000020)  /* Frame type - Ethernet, otherwise 802.3    */
+#define ETH_DMARxDesc_RWT         ((uint32_t)0x00000010)  /* Receive Watchdog Timeout: watchdog timer expired during reception    */
+#define ETH_DMARxDesc_RE          ((uint32_t)0x00000008)  /* Receive error: error reported by MII interface  */
+#define ETH_DMARxDesc_DBE         ((uint32_t)0x00000004)  /* Dribble bit error: frame contains non int multiple of 8 bits  */
+#define ETH_DMARxDesc_CE          ((uint32_t)0x00000002)  /* CRC error */
+#define ETH_DMARxDesc_MAMPCE      ((uint32_t)0x00000001)  /* Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */
+
+/* Bit or field definition of RDES1 register */
+#define ETH_DMARxDesc_DIC   ((uint32_t)0x80000000)  /* Disable Interrupt on Completion */
+#define ETH_DMARxDesc_RBS2  ((uint32_t)0x1FFF0000)  /* Receive Buffer2 Size */
+#define ETH_DMARxDesc_RER   ((uint32_t)0x00008000)  /* Receive End of Ring */
+#define ETH_DMARxDesc_RCH   ((uint32_t)0x00004000)  /* Second Address Chained */
+#define ETH_DMARxDesc_RBS1  ((uint32_t)0x00001FFF)  /* Receive Buffer1 Size */
+
+/* Field definition of RDES2 register */
+#define ETH_DMARxDesc_B1AP  ((uint32_t)0xFFFFFFFF)  /* Buffer1 Address Pointer */
+
+/* Field definition of RDES3 register */
+#define ETH_DMARxDesc_B2AP  ((uint32_t)0xFFFFFFFF)  /* Buffer2 Address Pointer */
+
+/* Timeout threshold of Reading or writing PHY registers */
+#define PHY_READ_TO                     ((uint32_t)0x004FFFFF)
+#define PHY_WRITE_TO                    ((uint32_t)0x0004FFFF)
+
+/* Delay time after reset PHY */
+#define PHY_ResetDelay                  ((uint32_t)0x000FFFFF) 
+
+/* Delay time after configure PHY */
+#define PHY_ConfigDelay                 ((uint32_t)0x00FFFFFF)
+
+/* PHY basic register */
+#define PHY_BCR                          0x0           /*PHY transceiver Basic Control Register */
+#define PHY_BSR                          0x01          /*PHY transceiver Basic Status Register*/
+#define PHY_ANAR                         0x04          /* Auto-Negotiation Advertisement Register */
+#define PHY_ANLPAR                       0x05          /* Auto-Negotiation Link Partner Base  Page Ability Register*/
+#define PHY_ANER                         0x06          /* Auto-Negotiation Expansion Register */
+#define PHY_BMCR                         PHY_BCR
+#define PHY_BMSR                         PHY_BSR
+#define PHY_STATUS                       0x10
+#define PHY_MDIX                         0x1E
+
+/* Bit or field definition for PHY basic control register */
+#define PHY_Reset                       ((uint16_t)0x8000)      /* PHY Reset */
+#define PHY_Loopback                    ((uint16_t)0x4000)      /* Select loop-back mode */
+#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100)      /* Set the full-duplex mode at 100 Mb/s */
+#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)      /* Set the half-duplex mode at 100 Mb/s */
+#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)      /* Set the full-duplex mode at 10 Mb/s */
+#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)      /* Set the half-duplex mode at 10 Mb/s */
+#define PHY_AutoNegotiation             ((uint16_t)0x1000)      /* Enable auto-negotiation function */
+#define PHY_Restart_AutoNegotiation     ((uint16_t)0x0200)      /* Restart auto-negotiation function */
+#define PHY_Powerdown                   ((uint16_t)0x0800)      /* Select the power down mode */
+#define PHY_Isolate                     ((uint16_t)0x0400)      /* Isolate PHY from MII */
+
+/* Bit or field definition for PHY basic status register */
+#define PHY_AutoNego_Complete           ((uint16_t)0x0020)      /* Auto-Negotioation process completed */
+#define PHY_Linked_Status               ((uint16_t)0x0004)      /* Valid link established */
+#define PHY_Jabber_detection            ((uint16_t)0x0002)      /* Jabber condition detected */
+#define PHY_RMII_Mode                   ((uint16_t)0x0020)      /* RMII */
+
+
+/* Internal 10BASE-T PHY 50R*4 pull-up resistance enable or disable */
+#define ETH_Internal_Pull_Up_Res_Enable     ((uint32_t)0x00100000)
+#define ETH_Internal_Pull_Up_Res_Disable    ((uint32_t)0x00000000)
+
+/* MAC autoNegotiation enable or disable */
+#define ETH_AutoNegotiation_Enable     ((uint32_t)0x00000001)
+#define ETH_AutoNegotiation_Disable    ((uint32_t)0x00000000)
+
+/* MAC watchdog enable or disable */
+#define ETH_Watchdog_Enable       ((uint32_t)0x00000000)
+#define ETH_Watchdog_Disable      ((uint32_t)0x00800000)
+
+/* Bit description - MAC jabber enable or disable */
+#define ETH_Jabber_Enable    ((uint32_t)0x00000000)
+#define ETH_Jabber_Disable   ((uint32_t)0x00400000)
+
+/* Value of minimum IFG between frames during transmission */
+#define ETH_InterFrameGap_96Bit   ((uint32_t)0x00000000)  /* minimum IFG between frames during transmission is 96Bit */
+#define ETH_InterFrameGap_88Bit   ((uint32_t)0x00020000)  /* minimum IFG between frames during transmission is 88Bit */
+#define ETH_InterFrameGap_80Bit   ((uint32_t)0x00040000)  /* minimum IFG between frames during transmission is 80Bit */
+#define ETH_InterFrameGap_72Bit   ((uint32_t)0x00060000)  /* minimum IFG between frames during transmission is 72Bit */
+#define ETH_InterFrameGap_64Bit   ((uint32_t)0x00080000)  /* minimum IFG between frames during transmission is 64Bit */
+#define ETH_InterFrameGap_56Bit   ((uint32_t)0x000A0000)  /* minimum IFG between frames during transmission is 56Bit */
+#define ETH_InterFrameGap_48Bit   ((uint32_t)0x000C0000)  /* minimum IFG between frames during transmission is 48Bit */
+#define ETH_InterFrameGap_40Bit   ((uint32_t)0x000E0000)  /* minimum IFG between frames during transmission is 40Bit */
+
+/* MAC carrier sense enable or disable */
+#define ETH_CarrierSense_Enable   ((uint32_t)0x00000000)
+#define ETH_CarrierSense_Disable  ((uint32_t)0x00010000)
+
+/* MAC speed */
+#define ETH_Speed_10M        ((uint32_t)0x00000000)
+#define ETH_Speed_100M       ((uint32_t)0x00004000)
+#define ETH_Speed_1000M      ((uint32_t)0x00008000)
+
+/* MAC receive own enable or disable */
+#define ETH_ReceiveOwn_Enable     ((uint32_t)0x00000000)
+#define ETH_ReceiveOwn_Disable    ((uint32_t)0x00002000)
+
+/* MAC Loopback mode enable or disable */
+#define ETH_LoopbackMode_Enable        ((uint32_t)0x00001000)
+#define ETH_LoopbackMode_Disable       ((uint32_t)0x00000000)
+
+/* MAC fullDuplex or halfDuplex */
+#define ETH_Mode_FullDuplex       ((uint32_t)0x00000800)
+#define ETH_Mode_HalfDuplex       ((uint32_t)0x00000000)
+
+/* MAC offload checksum enable or disable */
+#define ETH_ChecksumOffload_Enable     ((uint32_t)0x00000400)
+#define ETH_ChecksumOffload_Disable    ((uint32_t)0x00000000)
+
+/* MAC transmission retry enable or disable */
+#define ETH_RetryTransmission_Enable   ((uint32_t)0x00000000)
+#define ETH_RetryTransmission_Disable  ((uint32_t)0x00000200)
+
+/* MAC automatic pad CRC strip enable or disable */
+#define ETH_AutomaticPadCRCStrip_Enable     ((uint32_t)0x00000080)
+#define ETH_AutomaticPadCRCStrip_Disable    ((uint32_t)0x00000000)
+
+/* MAC backoff limitation */
+#define ETH_BackOffLimit_10  ((uint32_t)0x00000000)
+#define ETH_BackOffLimit_8   ((uint32_t)0x00000020)
+#define ETH_BackOffLimit_4   ((uint32_t)0x00000040)
+#define ETH_BackOffLimit_1   ((uint32_t)0x00000060)
+
+/* MAC deferral check enable or disable */
+#define ETH_DeferralCheck_Enable       ((uint32_t)0x00000010)
+#define ETH_DeferralCheck_Disable      ((uint32_t)0x00000000)
+
+/* Bit description  : MAC receive all frame enable or disable */
+#define ETH_ReceiveAll_Enable     ((uint32_t)0x80000000)
+#define ETH_ReceiveAll_Disable    ((uint32_t)0x00000000)
+
+/* MAC backoff limitation */
+#define ETH_SourceAddrFilter_Normal_Enable       ((uint32_t)0x00000200)
+#define ETH_SourceAddrFilter_Inverse_Enable      ((uint32_t)0x00000300)
+#define ETH_SourceAddrFilter_Disable             ((uint32_t)0x00000000)
+
+/* MAC Pass control frames */
+#define ETH_PassControlFrames_BlockAll                ((uint32_t)0x00000040)  /* MAC filters all control frames from reaching the application */
+#define ETH_PassControlFrames_ForwardAll              ((uint32_t)0x00000080)  /* MAC forwards all control frames to application even if they fail the Address Filter */
+#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0)  /* MAC forwards control frames that pass the Address Filter. */
+
+/* MAC broadcast frames reception */
+#define ETH_BroadcastFramesReception_Enable      ((uint32_t)0x00000000)
+#define ETH_BroadcastFramesReception_Disable     ((uint32_t)0x00000020)
+
+/* MAC destination address filter */
+#define ETH_DestinationAddrFilter_Normal    ((uint32_t)0x00000000)
+#define ETH_DestinationAddrFilter_Inverse   ((uint32_t)0x00000008)
+
+/* MAC Promiscuous mode enable or disable */
+#define ETH_PromiscuousMode_Enable     ((uint32_t)0x00000001)
+#define ETH_PromiscuousMode_Disable    ((uint32_t)0x00000000)
+
+/* MAC multicast frames filter */
+#define ETH_MulticastFramesFilter_PerfectHashTable    ((uint32_t)0x00000404)
+#define ETH_MulticastFramesFilter_HashTable           ((uint32_t)0x00000004)
+#define ETH_MulticastFramesFilter_Perfect             ((uint32_t)0x00000000)
+#define ETH_MulticastFramesFilter_None                ((uint32_t)0x00000010)
+
+/* MAC unicast frames filter */
+#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402)
+#define ETH_UnicastFramesFilter_HashTable        ((uint32_t)0x00000002)
+#define ETH_UnicastFramesFilter_Perfect          ((uint32_t)0x00000000)
+
+/* Bit description  : MAC zero quanta pause */
+#define ETH_ZeroQuantaPause_Enable     ((uint32_t)0x00000000)
+#define ETH_ZeroQuantaPause_Disable    ((uint32_t)0x00000080)
+
+/* Field description  : MAC pause low threshold */
+#define ETH_PauseLowThreshold_Minus4        ((uint32_t)0x00000000)  /* Pause time minus 4 slot times */
+#define ETH_PauseLowThreshold_Minus28       ((uint32_t)0x00000010)  /* Pause time minus 28 slot times */
+#define ETH_PauseLowThreshold_Minus144      ((uint32_t)0x00000020)  /* Pause time minus 144 slot times */
+#define ETH_PauseLowThreshold_Minus256      ((uint32_t)0x00000030)  /* Pause time minus 256 slot times */
+
+/* MAC unicast pause frame detect enable or disable*/
+#define ETH_UnicastPauseFrameDetect_Enable  ((uint32_t)0x00000008)
+#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000)
+
+/* MAC receive flow control frame enable or disable */
+#define ETH_ReceiveFlowControl_Enable       ((uint32_t)0x00000004)
+#define ETH_ReceiveFlowControl_Disable      ((uint32_t)0x00000000)
+
+/* MAC transmit flow control enable or disable */
+#define ETH_TransmitFlowControl_Enable      ((uint32_t)0x00000002)
+#define ETH_TransmitFlowControl_Disable     ((uint32_t)0x00000000)
+
+/* MAC VLAN tag comparison */
+#define ETH_VLANTagComparison_12Bit    ((uint32_t)0x00010000)
+#define ETH_VLANTagComparison_16Bit    ((uint32_t)0x00000000)
+
+/* MAC flag */
+#define ETH_MAC_FLAG_TST     ((uint32_t)0x00000200)  /* Time stamp trigger flag (on MAC) */
+#define ETH_MAC_FLAG_MMCT    ((uint32_t)0x00000040)  /* MMC transmit flag  */
+#define ETH_MAC_FLAG_MMCR    ((uint32_t)0x00000020)  /* MMC receive flag */
+#define ETH_MAC_FLAG_MMC     ((uint32_t)0x00000010)  /* MMC flag (on MAC) */
+#define ETH_MAC_FLAG_PMT     ((uint32_t)0x00000008)  /* PMT flag (on MAC) */
+
+/* MAC interrupt */
+#define ETH_MAC_IT_TST       ((uint32_t)0x00000200)  /* Time stamp trigger interrupt (on MAC) */
+#define ETH_MAC_IT_MMCT      ((uint32_t)0x00000040)  /* MMC transmit interrupt */
+#define ETH_MAC_IT_MMCR      ((uint32_t)0x00000020)  /* MMC receive interrupt */
+#define ETH_MAC_IT_MMC       ((uint32_t)0x00000010)  /* MMC interrupt (on MAC) */
+#define ETH_MAC_IT_PMT       ((uint32_t)0x00000008)  /* PMT interrupt (on MAC) */
+
+/* MAC address */
+#define ETH_MAC_Address0     ((uint32_t)0x00000000)
+#define ETH_MAC_Address1     ((uint32_t)0x00000008)
+#define ETH_MAC_Address2     ((uint32_t)0x00000010)
+#define ETH_MAC_Address3     ((uint32_t)0x00000018)
+
+/* MAC address filter select */
+#define ETH_MAC_AddressFilter_SA       ((uint32_t)0x00000000)
+#define ETH_MAC_AddressFilter_DA       ((uint32_t)0x00000008)
+
+/* MAC address mask */
+#define ETH_MAC_AddressMask_Byte6      ((uint32_t)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+#define ETH_MAC_AddressMask_Byte5      ((uint32_t)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+#define ETH_MAC_AddressMask_Byte4      ((uint32_t)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+#define ETH_MAC_AddressMask_Byte3      ((uint32_t)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+#define ETH_MAC_AddressMask_Byte2      ((uint32_t)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+#define ETH_MAC_AddressMask_Byte1      ((uint32_t)0x01000000)  /* Mask MAC Address low reg bits [70] */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                          MAC Descriptor Register                                                                                                                                     */
+/*                                                                            */
+/******************************************************************************/
+
+/* DMA descriptor segment */
+#define ETH_DMATxDesc_LastSegment      ((uint32_t)0x40000000)  /* Last Segment */
+#define ETH_DMATxDesc_FirstSegment     ((uint32_t)0x20000000)  /* First Segment */
+
+/* DMA descriptor checksum setting */
+#define ETH_DMATxDesc_ChecksumByPass             ((uint32_t)0x00000000)   /* Checksum engine bypass */
+#define ETH_DMATxDesc_ChecksumIPV4Header         ((uint32_t)0x00400000)   /* IPv4 header checksum insertion  */
+#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment  ((uint32_t)0x00800000)   /* TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */
+#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull     ((uint32_t)0x00C00000)   /* TCP/UDP/ICMP checksum fully in hardware including pseudo header */
+
+/* DMA RX & TX buffer */
+#define ETH_DMARxDesc_Buffer1     ((uint32_t)0x00000000)  /* DMA Rx Desc Buffer1 */
+#define ETH_DMARxDesc_Buffer2     ((uint32_t)0x00000001)  /* DMA Rx Desc Buffer2 */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                          ETH DMA Register                                  */
+/*                                                                            */
+/******************************************************************************/
+
+/* DMA drop TCPIP checksum error frame enable or disable */
+#define ETH_DropTCPIPChecksumErrorFrame_Enable   ((uint32_t)0x00000000)
+#define ETH_DropTCPIPChecksumErrorFrame_Disable  ((uint32_t)0x04000000)
+
+/* DMA receive store forward enable or disable */
+#define ETH_ReceiveStoreForward_Enable      ((uint32_t)0x02000000)
+#define ETH_ReceiveStoreForward_Disable     ((uint32_t)0x00000000)
+
+/* DMA flush received frame enable or disable */
+#define ETH_FlushReceivedFrame_Enable       ((uint32_t)0x00000000)
+#define ETH_FlushReceivedFrame_Disable      ((uint32_t)0x01000000)
+
+/* DMA transmit store forward enable or disable */
+#define ETH_TransmitStoreForward_Enable     ((uint32_t)0x00200000)
+#define ETH_TransmitStoreForward_Disable    ((uint32_t)0x00000000)
+
+/* DMA transmit threshold control */
+#define ETH_TransmitThresholdControl_64Bytes     ((uint32_t)0x00000000)  /* threshold level of the MTL Transmit FIFO is 64 Bytes */
+#define ETH_TransmitThresholdControl_128Bytes    ((uint32_t)0x00004000)  /* threshold level of the MTL Transmit FIFO is 128 Bytes */
+#define ETH_TransmitThresholdControl_192Bytes    ((uint32_t)0x00008000)  /* threshold level of the MTL Transmit FIFO is 192 Bytes */
+#define ETH_TransmitThresholdControl_256Bytes    ((uint32_t)0x0000C000)  /* threshold level of the MTL Transmit FIFO is 256 Bytes */
+#define ETH_TransmitThresholdControl_40Bytes     ((uint32_t)0x00010000)  /* threshold level of the MTL Transmit FIFO is 40 Bytes */
+#define ETH_TransmitThresholdControl_32Bytes     ((uint32_t)0x00014000)  /* threshold level of the MTL Transmit FIFO is 32 Bytes */
+#define ETH_TransmitThresholdControl_24Bytes     ((uint32_t)0x00018000)  /* threshold level of the MTL Transmit FIFO is 24 Bytes */
+#define ETH_TransmitThresholdControl_16Bytes     ((uint32_t)0x0001C000)  /* threshold level of the MTL Transmit FIFO is 16 Bytes */
+
+/* DMA forward error frames */
+#define ETH_ForwardErrorFrames_Enable       ((uint32_t)0x00000080)
+#define ETH_ForwardErrorFrames_Disable      ((uint32_t)0x00000000)
+
+/* DMA forward undersized good frames enable or disable */
+#define ETH_ForwardUndersizedGoodFrames_Enable   ((uint32_t)0x00000040)
+#define ETH_ForwardUndersizedGoodFrames_Disable  ((uint32_t)0x00000000)     
+
+/* DMA receive threshold control */
+#define ETH_ReceiveThresholdControl_64Bytes      ((uint32_t)0x00000000)  /* threshold level of the MTL Receive FIFO is 64 Bytes */
+#define ETH_ReceiveThresholdControl_32Bytes      ((uint32_t)0x00000008)  /* threshold level of the MTL Receive FIFO is 32 Bytes */
+#define ETH_ReceiveThresholdControl_96Bytes      ((uint32_t)0x00000010)  /* threshold level of the MTL Receive FIFO is 96 Bytes */
+#define ETH_ReceiveThresholdControl_128Bytes     ((uint32_t)0x00000018)  /* threshold level of the MTL Receive FIFO is 128 Bytes */
+
+/* DMA second frame operate enable or disable */
+#define ETH_SecondFrameOperate_Enable       ((uint32_t)0x00000004)
+#define ETH_SecondFrameOperate_Disable      ((uint32_t)0x00000000)  
+
+/* Address aligned beats enable or disable */
+#define ETH_AddressAlignedBeats_Enable      ((uint32_t)0x02000000)
+#define ETH_AddressAlignedBeats_Disable     ((uint32_t)0x00000000) 
+
+/* DMA Fixed burst enable or disable */
+#define ETH_FixedBurst_Enable     ((uint32_t)0x00010000)
+#define ETH_FixedBurst_Disable    ((uint32_t)0x00000000) 
+
+
+/* RX DMA burst length */
+#define ETH_RxDMABurstLength_1Beat          ((uint32_t)0x00020000)  /* maximum number of beats to be transferred in one RxDMA transaction is 1 */
+#define ETH_RxDMABurstLength_2Beat          ((uint32_t)0x00040000)  /* maximum number of beats to be transferred in one RxDMA transaction is 2 */
+#define ETH_RxDMABurstLength_4Beat          ((uint32_t)0x00080000)  /* maximum number of beats to be transferred in one RxDMA transaction is 4 */
+#define ETH_RxDMABurstLength_8Beat          ((uint32_t)0x00100000)  /* maximum number of beats to be transferred in one RxDMA transaction is 8 */
+#define ETH_RxDMABurstLength_16Beat         ((uint32_t)0x00200000)  /* maximum number of beats to be transferred in one RxDMA transaction is 16 */
+#define ETH_RxDMABurstLength_32Beat         ((uint32_t)0x00400000)  /* maximum number of beats to be transferred in one RxDMA transaction is 32 */
+#define ETH_RxDMABurstLength_4xPBL_4Beat    ((uint32_t)0x01020000)  /* maximum number of beats to be transferred in one RxDMA transaction is 4 */
+#define ETH_RxDMABurstLength_4xPBL_8Beat    ((uint32_t)0x01040000)  /* maximum number of beats to be transferred in one RxDMA transaction is 8 */
+#define ETH_RxDMABurstLength_4xPBL_16Beat   ((uint32_t)0x01080000)  /* maximum number of beats to be transferred in one RxDMA transaction is 16 */
+#define ETH_RxDMABurstLength_4xPBL_32Beat   ((uint32_t)0x01100000)  /* maximum number of beats to be transferred in one RxDMA transaction is 32 */
+#define ETH_RxDMABurstLength_4xPBL_64Beat   ((uint32_t)0x01200000)  /* maximum number of beats to be transferred in one RxDMA transaction is 64 */
+#define ETH_RxDMABurstLength_4xPBL_128Beat  ((uint32_t)0x01400000)  /* maximum number of beats to be transferred in one RxDMA transaction is 128 */
+
+ 
+/* TX DMA burst length */
+#define ETH_TxDMABurstLength_1Beat          ((uint32_t)0x00000100)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */
+#define ETH_TxDMABurstLength_2Beat          ((uint32_t)0x00000200)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */
+#define ETH_TxDMABurstLength_4Beat          ((uint32_t)0x00000400)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+#define ETH_TxDMABurstLength_8Beat          ((uint32_t)0x00000800)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+#define ETH_TxDMABurstLength_16Beat         ((uint32_t)0x00001000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+#define ETH_TxDMABurstLength_32Beat         ((uint32_t)0x00002000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+#define ETH_TxDMABurstLength_4xPBL_4Beat    ((uint32_t)0x01000100)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+#define ETH_TxDMABurstLength_4xPBL_8Beat    ((uint32_t)0x01000200)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+#define ETH_TxDMABurstLength_4xPBL_16Beat   ((uint32_t)0x01000400)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+#define ETH_TxDMABurstLength_4xPBL_32Beat   ((uint32_t)0x01000800)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+#define ETH_TxDMABurstLength_4xPBL_64Beat   ((uint32_t)0x01001000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */
+#define ETH_TxDMABurstLength_4xPBL_128Beat  ((uint32_t)0x01002000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */
+
+/* DMA arbitration_round robin */
+#define ETH_DMAArbitration_RoundRobin_RxTx_1_1   ((uint32_t)0x00000000)
+#define ETH_DMAArbitration_RoundRobin_RxTx_2_1   ((uint32_t)0x00004000)
+#define ETH_DMAArbitration_RoundRobin_RxTx_3_1   ((uint32_t)0x00008000)
+#define ETH_DMAArbitration_RoundRobin_RxTx_4_1   ((uint32_t)0x0000C000)
+#define ETH_DMAArbitration_RxPriorTx             ((uint32_t)0x00000002)
+
+/* DMA interrupt FALG */
+#define ETH_DMA_FLAG_TST               ((uint32_t)0x20000000)  /* Time-stamp trigger interrupt (on DMA) */
+#define ETH_DMA_FLAG_PMT               ((uint32_t)0x10000000)  /* PMT interrupt (on DMA) */
+#define ETH_DMA_FLAG_MMC               ((uint32_t)0x08000000)  /* MMC interrupt (on DMA) */
+#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000)  /* Error bits 0-Rx DMA, 1-Tx DMA */
+#define ETH_DMA_FLAG_ReadWriteError    ((uint32_t)0x01000000)  /* Error bits 0-write trnsf, 1-read transfr */
+#define ETH_DMA_FLAG_AccessError       ((uint32_t)0x02000000)  /* Error bits 0-data buffer, 1-desc. access */
+#define ETH_DMA_FLAG_NIS               ((uint32_t)0x00010000)  /* Normal interrupt summary flag */
+#define ETH_DMA_FLAG_AIS               ((uint32_t)0x00008000)  /* Abnormal interrupt summary flag */
+#define ETH_DMA_FLAG_ER                ((uint32_t)0x00004000)  /* Early receive flag */
+#define ETH_DMA_FLAG_FBE               ((uint32_t)0x00002000)  /* Fatal bus error flag */
+#define ETH_DMA_FLAG_ET                ((uint32_t)0x00000400)  /* Early transmit flag */
+#define ETH_DMA_FLAG_RWT               ((uint32_t)0x00000200)  /* Receive watchdog timeout flag */
+#define ETH_DMA_FLAG_RPS               ((uint32_t)0x00000100)  /* Receive process stopped flag */
+#define ETH_DMA_FLAG_RBU               ((uint32_t)0x00000080)  /* Receive buffer unavailable flag */
+#define ETH_DMA_FLAG_R                 ((uint32_t)0x00000040)  /* Receive flag */
+#define ETH_DMA_FLAG_TU                ((uint32_t)0x00000020)  /* Underflow flag */
+#define ETH_DMA_FLAG_RO                ((uint32_t)0x00000010)  /* Overflow flag */
+#define ETH_DMA_FLAG_TJT               ((uint32_t)0x00000008)  /* Transmit jabber timeout flag */
+#define ETH_DMA_FLAG_TBU               ((uint32_t)0x00000004)  /* Transmit buffer unavailable flag */
+#define ETH_DMA_FLAG_TPS               ((uint32_t)0x00000002)  /* Transmit process stopped flag */
+#define ETH_DMA_FLAG_T                 ((uint32_t)0x00000001)  /* Transmit flag */
+
+/* DMA interrupt */
+#define ETH_DMA_IT_PHYLINK   ((uint32_t)0x80000000)  /* Internal PHY link status change interrupt */
+#define ETH_DMA_IT_TST       ((uint32_t)0x20000000)  /* Time-stamp trigger interrupt (on DMA) */
+#define ETH_DMA_IT_PMT       ((uint32_t)0x10000000)  /* PMT interrupt (on DMA) */
+#define ETH_DMA_IT_MMC       ((uint32_t)0x08000000)  /* MMC interrupt (on DMA) */
+#define ETH_DMA_IT_NIS       ((uint32_t)0x00010000)  /* Normal interrupt summary */
+#define ETH_DMA_IT_AIS       ((uint32_t)0x00008000)  /* Abnormal interrupt summary */
+#define ETH_DMA_IT_ER        ((uint32_t)0x00004000)  /* Early receive interrupt */
+#define ETH_DMA_IT_FBE       ((uint32_t)0x00002000)  /* Fatal bus error interrupt */
+#define ETH_DMA_IT_ET        ((uint32_t)0x00000400)  /* Early transmit interrupt */
+#define ETH_DMA_IT_RWT       ((uint32_t)0x00000200)  /* Receive watchdog timeout interrupt */
+#define ETH_DMA_IT_RPS       ((uint32_t)0x00000100)  /* Receive process stopped interrupt */
+#define ETH_DMA_IT_RBU       ((uint32_t)0x00000080)  /* Receive buffer unavailable interrupt */
+#define ETH_DMA_IT_R         ((uint32_t)0x00000040)  /* Receive interrupt */
+#define ETH_DMA_IT_TU        ((uint32_t)0x00000020)  /* Underflow interrupt */
+#define ETH_DMA_IT_RO        ((uint32_t)0x00000010)  /* Overflow interrupt */
+#define ETH_DMA_IT_TJT       ((uint32_t)0x00000008)  /* Transmit jabber timeout interrupt */
+#define ETH_DMA_IT_TBU       ((uint32_t)0x00000004)  /* Transmit buffer unavailable interrupt */
+#define ETH_DMA_IT_TPS       ((uint32_t)0x00000002)  /* Transmit process stopped interrupt */
+#define ETH_DMA_IT_T         ((uint32_t)0x00000001)  /* Transmit interrupt */
+
+/* DMA transmit process */
+#define ETH_DMA_TransmitProcess_Stopped     ((uint32_t)0x00000000)  /* Stopped - Reset or Stop Tx Command issued */
+#define ETH_DMA_TransmitProcess_Fetching    ((uint32_t)0x00100000)  /* Running - fetching the Tx descriptor */
+#define ETH_DMA_TransmitProcess_Waiting     ((uint32_t)0x00200000)  /* Running - waiting for status */
+#define ETH_DMA_TransmitProcess_Reading     ((uint32_t)0x00300000)  /* Running - reading the data from host memory */
+#define ETH_DMA_TransmitProcess_Suspended   ((uint32_t)0x00600000)  /* Suspended - Tx Desciptor unavailabe */
+#define ETH_DMA_TransmitProcess_Closing     ((uint32_t)0x00700000)  /* Running - closing Rx descriptor */
+
+/* DMA receive Process */
+#define ETH_DMA_ReceiveProcess_Stopped      ((uint32_t)0x00000000)  /* Stopped - Reset or Stop Rx Command issued */
+#define ETH_DMA_ReceiveProcess_Fetching     ((uint32_t)0x00020000)  /* Running - fetching the Rx descriptor */
+#define ETH_DMA_ReceiveProcess_Waiting      ((uint32_t)0x00060000)  /* Running - waiting for packet */
+#define ETH_DMA_ReceiveProcess_Suspended    ((uint32_t)0x00080000)  /* Suspended - Rx Desciptor unavailable */
+#define ETH_DMA_ReceiveProcess_Closing      ((uint32_t)0x000A0000)  /* Running - closing descriptor */
+#define ETH_DMA_ReceiveProcess_Queuing      ((uint32_t)0x000E0000)  /* Running - queuing the recieve frame into host memory */
+
+/* DMA overflow */
+#define ETH_DMA_Overflow_RxFIFOCounter      ((uint32_t)0x10000000)  /* Overflow bit for FIFO overflow counter */
+#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000)  /* Overflow bit for missed frame counter */
+
+
+/*********************************************************************************
+*                            Ethernet PMT defines
+**********************************************************************************/
+
+/* PMT flag */
+#define ETH_PMT_FLAG_WUFFRPR      ((uint32_t)0x80000000)  /* Wake-Up Frame Filter Register Poniter Reset */
+#define ETH_PMT_FLAG_WUFR         ((uint32_t)0x00000040)  /* Wake-Up Frame Received */
+#define ETH_PMT_FLAG_MPR          ((uint32_t)0x00000020)  /* Magic Packet Received */
+
+/*********************************************************************************
+*                            Ethernet MMC defines
+**********************************************************************************/
+
+/* MMC TX interrupt flag */
+#define ETH_MMC_IT_TGF       ((uint32_t)0x00200000)  /* When Tx good frame counter reaches half the maximum value */
+#define ETH_MMC_IT_TGFMSC    ((uint32_t)0x00008000)  /* When Tx good multi col counter reaches half the maximum value */
+#define ETH_MMC_IT_TGFSC     ((uint32_t)0x00004000)  /* When Tx good single col counter reaches half the maximum value */
+
+/* MMC RX interrupt flag */
+#define ETH_MMC_IT_RGUF      ((uint32_t)0x10020000)  /* When Rx good unicast frames counter reaches half the maximum value */
+#define ETH_MMC_IT_RFAE      ((uint32_t)0x10000040)  /* When Rx alignment error counter reaches half the maximum value */
+#define ETH_MMC_IT_RFCE      ((uint32_t)0x10000020)  /* When Rx crc error counter reaches half the maximum value */
+
+
+/* MMC description */
+#define ETH_MMCCR            ((uint32_t)0x00000100)  /* MMC CR register */
+#define ETH_MMCRIR           ((uint32_t)0x00000104)  /* MMC RIR register */
+#define ETH_MMCTIR           ((uint32_t)0x00000108)  /* MMC TIR register */
+#define ETH_MMCRIMR          ((uint32_t)0x0000010C)  /* MMC RIMR register */
+#define ETH_MMCTIMR          ((uint32_t)0x00000110)  /* MMC TIMR register */
+#define ETH_MMCTGFSCCR       ((uint32_t)0x0000014C)  /* MMC TGFSCCR register */
+#define ETH_MMCTGFMSCCR      ((uint32_t)0x00000150)  /* MMC TGFMSCCR register */
+#define ETH_MMCTGFCR         ((uint32_t)0x00000168)  /* MMC TGFCR register */
+#define ETH_MMCRFCECR        ((uint32_t)0x00000194)  /* MMC RFCECR register */
+#define ETH_MMCRFAECR        ((uint32_t)0x00000198)  /* MMC RFAECR register */
+#define ETH_MMCRGUFCR        ((uint32_t)0x000001C4)  /* MMC RGUFCR register */
+
+
+/*********************************************************************************
+*                            Ethernet PTP defines
+**********************************************************************************/
+
+/* PTP fine update method or coarse Update method */
+#define ETH_PTP_FineUpdate        ((uint32_t)0x00000001)  /* Fine Update method */
+#define ETH_PTP_CoarseUpdate      ((uint32_t)0x00000000)  /* Coarse Update method */
+
+
+/* PTP time stamp control */
+#define ETH_PTP_FLAG_TSARU        ((uint32_t)0x00000020)  /* Addend Register Update */
+#define ETH_PTP_FLAG_TSITE        ((uint32_t)0x00000010)  /* Time Stamp Interrupt Trigger */
+#define ETH_PTP_FLAG_TSSTU        ((uint32_t)0x00000008)  /* Time Stamp Update */
+#define ETH_PTP_FLAG_TSSTI        ((uint32_t)0x00000004)  /* Time Stamp Initialize */
+
+/* PTP positive/negative time value */
+#define ETH_PTP_PositiveTime      ((uint32_t)0x00000000)  /* Positive time value */
+#define ETH_PTP_NegativeTime      ((uint32_t)0x80000000)  /* Negative time value */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                                PTP Register                                */
+/*                                                                            */
+/******************************************************************************/
+#define ETH_PTPTSCR     ((uint32_t)0x00000700)  /* PTP TSCR register */
+#define ETH_PTPSSIR     ((uint32_t)0x00000704)  /* PTP SSIR register */
+#define ETH_PTPTSHR     ((uint32_t)0x00000708)  /* PTP TSHR register */
+#define ETH_PTPTSLR     ((uint32_t)0x0000070C)  /* PTP TSLR register */
+#define ETH_PTPTSHUR    ((uint32_t)0x00000710)  /* PTP TSHUR register */
+#define ETH_PTPTSLUR    ((uint32_t)0x00000714)  /* PTP TSLUR register */
+#define ETH_PTPTSAR     ((uint32_t)0x00000718)  /* PTP TSAR register */
+#define ETH_PTPTTHR     ((uint32_t)0x0000071C)  /* PTP TTHR register */
+#define ETH_PTPTTLR     ((uint32_t)0x00000720)  /* PTP TTLR register */
+
+#define ETH_DMASR_TSTS       ((unsigned int)0x20000000)  /* Time-stamp trigger status */
+#define ETH_DMASR_PMTS       ((unsigned int)0x10000000)  /* PMT status */
+#define ETH_DMASR_MMCS       ((unsigned int)0x08000000)  /* MMC status */
+#define ETH_DMASR_EBS        ((unsigned int)0x03800000)  /* Error bits status */
+  #define ETH_DMASR_EBS_DescAccess      ((unsigned int)0x02000000)  /* Error bits 0-data buffer, 1-desc. access */
+  #define ETH_DMASR_EBS_ReadTransf      ((unsigned int)0x01000000)  /* Error bits 0-write trnsf, 1-read transfr */
+  #define ETH_DMASR_EBS_DataTransfTx    ((unsigned int)0x00800000)  /* Error bits 0-Rx DMA, 1-Tx DMA */
+#define ETH_DMASR_TPS         ((unsigned int)0x00700000)  /* Transmit process state */
+  #define ETH_DMASR_TPS_Stopped         ((unsigned int)0x00000000)  /* Stopped - Reset or Stop Tx Command issued  */
+  #define ETH_DMASR_TPS_Fetching        ((unsigned int)0x00100000)  /* Running - fetching the Tx descriptor */
+  #define ETH_DMASR_TPS_Waiting         ((unsigned int)0x00200000)  /* Running - waiting for status */
+  #define ETH_DMASR_TPS_Reading         ((unsigned int)0x00300000)  /* Running - reading the data from host memory */
+  #define ETH_DMASR_TPS_Suspended       ((unsigned int)0x00600000)  /* Suspended - Tx Descriptor unavailabe */
+  #define ETH_DMASR_TPS_Closing         ((unsigned int)0x00700000)  /* Running - closing Rx descriptor */
+#define ETH_DMASR_RPS         ((unsigned int)0x000E0000)  /* Receive process state */
+  #define ETH_DMASR_RPS_Stopped         ((unsigned int)0x00000000)  /* Stopped - Reset or Stop Rx Command issued */
+  #define ETH_DMASR_RPS_Fetching        ((unsigned int)0x00020000)  /* Running - fetching the Rx descriptor */
+  #define ETH_DMASR_RPS_Waiting         ((unsigned int)0x00060000)  /* Running - waiting for packet */
+  #define ETH_DMASR_RPS_Suspended       ((unsigned int)0x00080000)  /* Suspended - Rx Descriptor unavailable */
+  #define ETH_DMASR_RPS_Closing         ((unsigned int)0x000A0000)  /* Running - closing descriptor */
+  #define ETH_DMASR_RPS_Queuing         ((unsigned int)0x000E0000)  /* Running - queuing the recieve frame into host memory */
+#define ETH_DMASR_NIS        ((unsigned int)0x00010000)  /* Normal interrupt summary */
+#define ETH_DMASR_AIS        ((unsigned int)0x00008000)  /* Abnormal interrupt summary */
+#define ETH_DMASR_ERS        ((unsigned int)0x00004000)  /* Early receive status */
+#define ETH_DMASR_FBES       ((unsigned int)0x00002000)  /* Fatal bus error status */
+#define ETH_DMASR_ETS        ((unsigned int)0x00000400)  /* Early transmit status */
+#define ETH_DMASR_RWTS       ((unsigned int)0x00000200)  /* Receive watchdog timeout status */
+#define ETH_DMASR_RPSS       ((unsigned int)0x00000100)  /* Receive process stopped status */
+#define ETH_DMASR_RBUS       ((unsigned int)0x00000080)  /* Receive buffer unavailable status */
+#define ETH_DMASR_RS         ((unsigned int)0x00000040)  /* Receive status */
+#define ETH_DMASR_TUS        ((unsigned int)0x00000020)  /* Transmit underflow status */
+#define ETH_DMASR_ROS        ((unsigned int)0x00000010)  /* Receive overflow status */
+#define ETH_DMASR_TJTS       ((unsigned int)0x00000008)  /* Transmit jabber timeout status */
+#define ETH_DMASR_TBUS       ((unsigned int)0x00000004)  /* Transmit buffer unavailable status */
+#define ETH_DMASR_TPSS       ((unsigned int)0x00000002)  /* Transmit process stopped status */
+#define ETH_DMASR_TS         ((unsigned int)0x00000001)  /* Transmit status */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                          ETH MAC Register                                  */
+/*                                                                            */
+/******************************************************************************/
+#define ETH_MACCR_WD      ((unsigned int)0x00800000)  /* Watchdog disable */
+#define ETH_MACCR_JD      ((unsigned int)0x00400000)  /* Jabber disable */
+#define ETH_MACCR_IFG     ((unsigned int)0x000E0000)  /* Inter-frame gap */
+#define ETH_MACCR_IFG_96Bit     ((unsigned int)0x00000000)  /* Minimum IFG between frames during transmission is 96Bit */
+   #define ETH_MACCR_IFG_88Bit     ((unsigned int)0x00020000)  /* Minimum IFG between frames during transmission is 88Bit */
+   #define ETH_MACCR_IFG_80Bit     ((unsigned int)0x00040000)  /* Minimum IFG between frames during transmission is 80Bit */
+   #define ETH_MACCR_IFG_72Bit     ((unsigned int)0x00060000)  /* Minimum IFG between frames during transmission is 72Bit */
+   #define ETH_MACCR_IFG_64Bit     ((unsigned int)0x00080000)  /* Minimum IFG between frames during transmission is 64Bit */
+   #define ETH_MACCR_IFG_56Bit     ((unsigned int)0x000A0000)  /* Minimum IFG between frames during transmission is 56Bit */
+   #define ETH_MACCR_IFG_48Bit     ((unsigned int)0x000C0000)  /* Minimum IFG between frames during transmission is 48Bit */
+   #define ETH_MACCR_IFG_40Bit     ((unsigned int)0x000E0000)  /* Minimum IFG between frames during transmission is 40Bit */
+#define ETH_MACCR_CSD     ((unsigned int)0x00010000)  /* Carrier sense disable (during transmission) */
+#define ETH_MACCR_FES     ((unsigned int)0x00004000)  /* Fast ethernet speed */
+#define ETH_MACCR_ROD     ((unsigned int)0x00002000)  /* Receive own disable */
+#define ETH_MACCR_LM      ((unsigned int)0x00001000)  /* loopback mode */
+#define ETH_MACCR_DM      ((unsigned int)0x00000800)  /* Duplex mode */
+#define ETH_MACCR_IPCO    ((unsigned int)0x00000400)  /* IP Checksum offload */
+#define ETH_MACCR_RD      ((unsigned int)0x00000200)  /* Retry disable */
+#define ETH_MACCR_APCS    ((unsigned int)0x00000080)  /* Automatic Pad/CRC stripping */
+#define ETH_MACCR_BL      ((unsigned int)0x00000060)  /* Back-off limit: random integer number (r) of slot time delays before reschedulinga transmission attempt during retries after a collision: 0 =< r <2^k */
+   #define ETH_MACCR_BL_10    ((unsigned int)0x00000000)  /* k = min (n, 10) */
+   #define ETH_MACCR_BL_8     ((unsigned int)0x00000020)  /* k = min (n, 8) */
+   #define ETH_MACCR_BL_4     ((unsigned int)0x00000040)  /* k = min (n, 4) */
+   #define ETH_MACCR_BL_1     ((unsigned int)0x00000060)  /* k = min (n, 1) */
+#define ETH_MACCR_DC      ((unsigned int)0x00000010)  /* Defferal check */
+#define ETH_MACCR_TE      ((unsigned int)0x00000008)  /* Transmitter enable */
+#define ETH_MACCR_RE      ((unsigned int)0x00000004)  /* Receiver enable */
+
+#define ETH_MACFFR_RA     ((unsigned int)0x80000000)  /* Receive all */
+#define ETH_MACFFR_HPF    ((unsigned int)0x00000400)  /* Hash or perfect filter */
+#define ETH_MACFFR_SAF    ((unsigned int)0x00000200)  /* Source address filter enable */
+#define ETH_MACFFR_SAIF   ((unsigned int)0x00000100)  /* SA inverse filtering */
+#define ETH_MACFFR_PCF    ((unsigned int)0x000000C0)  /* Pass control frames: 3 cases */
+   #define ETH_MACFFR_PCF_BlockAll                ((unsigned int)0x00000040)  /* MAC filters all control frames from reaching the application */
+   #define ETH_MACFFR_PCF_ForwardAll              ((unsigned int)0x00000080)  /* MAC forwards all control frames to application even if they fail the Address Filter */
+   #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((unsigned int)0x000000C0)  /* MAC forwards control frames that pass the Address Filter. */
+#define ETH_MACFFR_BFD    ((unsigned int)0x00000020)  /* Broadcast frame disable */
+#define ETH_MACFFR_PAM    ((unsigned int)0x00000010)  /* Pass all mutlicast */
+#define ETH_MACFFR_DAIF   ((unsigned int)0x00000008)  /* DA Inverse filtering */
+#define ETH_MACFFR_HM     ((unsigned int)0x00000004)  /* Hash multicast */
+#define ETH_MACFFR_HU     ((unsigned int)0x00000002)  /* Hash unicast */
+#define ETH_MACFFR_PM     ((unsigned int)0x00000001)  /* Promiscuous mode */
+
+#define ETH_MACHTHR_HTH   ((unsigned int)0xFFFFFFFF)  /* Hash table high */
+#define ETH_MACHTLR_HTL   ((unsigned int)0xFFFFFFFF)  /* Hash table low */
+
+#define ETH_MACMIIAR_PA   ((unsigned int)0x0000F800)  /* Physical layer address */
+#define ETH_MACMIIAR_MR   ((unsigned int)0x000007C0)  /* MII register in the selected PHY */
+#define ETH_MACMIIAR_CR   ((unsigned int)0x0000001C)  /* CR clock range: 6 cases */
+   #define ETH_MACMIIAR_CR_Div42   ((unsigned int)0x00000000)  /* HCLK:60-100 MHz; MDC clock= HCLK/42 */
+   #define ETH_MACMIIAR_CR_Div16   ((unsigned int)0x00000008)  /* HCLK:20-35 MHz; MDC clock= HCLK/16 */
+   #define ETH_MACMIIAR_CR_Div26   ((unsigned int)0x0000000C)  /* HCLK:35-60 MHz; MDC clock= HCLK/26 */
+#define ETH_MACMIIAR_MW   ((unsigned int)0x00000002)  /* MII write */
+#define ETH_MACMIIAR_MB   ((unsigned int)0x00000001)  /* MII busy */
+#define ETH_MACMIIDR_MD   ((unsigned int)0x0000FFFF)  /* MII data: read/write data from/to PHY */
+#define ETH_MACFCR_PT     ((unsigned int)0xFFFF0000)  /* Pause time */
+#define ETH_MACFCR_ZQPD   ((unsigned int)0x00000080)  /* Zero-quanta pause disable */
+#define ETH_MACFCR_PLT    ((unsigned int)0x00000030)  /* Pause low threshold: 4 cases */
+   #define ETH_MACFCR_PLT_Minus4   ((unsigned int)0x00000000)  /* Pause time minus 4 slot times */
+   #define ETH_MACFCR_PLT_Minus28  ((unsigned int)0x00000010)  /* Pause time minus 28 slot times */
+   #define ETH_MACFCR_PLT_Minus144 ((unsigned int)0x00000020)  /* Pause time minus 144 slot times */
+   #define ETH_MACFCR_PLT_Minus256 ((unsigned int)0x00000030)  /* Pause time minus 256 slot times */
+#define ETH_MACFCR_UPFD   ((unsigned int)0x00000008)  /* Unicast pause frame detect */
+#define ETH_MACFCR_RFCE   ((unsigned int)0x00000004)  /* Receive flow control enable */
+#define ETH_MACFCR_TFCE   ((unsigned int)0x00000002)  /* Transmit flow control enable */
+#define ETH_MACFCR_FCBBPA ((unsigned int)0x00000001)  /* Flow control busy/backpressure activate */
+
+#define ETH_MACVLANTR_VLANTC ((unsigned int)0x00010000)  /* 12-bit VLAN tag comparison */
+#define ETH_MACVLANTR_VLANTI ((unsigned int)0x0000FFFF)  /* VLAN tag identifier (for receive frames) */
+
+#define ETH_MACRWUFFR_D   ((unsigned int)0xFFFFFFFF)  /* Wake-up frame filter register data */
+/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers.
+Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */
+
+/*
+Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask
+Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask
+Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask
+Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask
+Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command -
+                           RSVD - Filter1 Command - RSVD - Filter0 Command
+Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset
+Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16
+Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */
+
+#define ETH_MACPMTCSR_WFFRPR ((unsigned int)0x80000000)  /* Wake-Up Frame Filter Register Pointer Reset */
+#define ETH_MACPMTCSR_GU     ((unsigned int)0x00000200)  /* Global Unicast */
+#define ETH_MACPMTCSR_WFR    ((unsigned int)0x00000040)  /* Wake-Up Frame Received */
+#define ETH_MACPMTCSR_MPR    ((unsigned int)0x00000020)  /* Magic Packet Received */
+#define ETH_MACPMTCSR_WFE    ((unsigned int)0x00000004)  /* Wake-Up Frame Enable */
+#define ETH_MACPMTCSR_MPE    ((unsigned int)0x00000002)  /* Magic Packet Enable */
+#define ETH_MACPMTCSR_PD     ((unsigned int)0x00000001)  /* Power Down */
+
+#define ETH_MACSR_TSTS      ((unsigned int)0x00000200)  /* Time stamp trigger status */
+#define ETH_MACSR_MMCTS     ((unsigned int)0x00000040)  /* MMC transmit status */
+#define ETH_MACSR_MMMCRS    ((unsigned int)0x00000020)  /* MMC receive status */
+#define ETH_MACSR_MMCS      ((unsigned int)0x00000010)  /* MMC status */
+#define ETH_MACSR_PMTS      ((unsigned int)0x00000008)  /* PMT status */
+
+#define ETH_MACIMR_TSTIM     ((unsigned int)0x00000200)  /* Time stamp trigger interrupt mask */
+#define ETH_MACIMR_PMTIM     ((unsigned int)0x00000008)  /* PMT interrupt mask */
+
+#define ETH_MACA0HR_MACA0H   ((unsigned int)0x0000FFFF)  /* MAC address0 high */
+
+#define ETH_MACA0LR_MACA0L   ((unsigned int)0xFFFFFFFF)  /* MAC address0 low */
+
+#define ETH_MACA1HR_AE       ((unsigned int)0x80000000)  /* Address enable */
+#define ETH_MACA1HR_SA       ((unsigned int)0x40000000)  /* Source address */
+#define ETH_MACA1HR_MBC      ((unsigned int)0x3F000000)  /* Mask byte control: bits to mask for comparison of the MAC Address bytes */
+   #define ETH_MACA1HR_MBC_HBits15_8    ((unsigned int)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+   #define ETH_MACA1HR_MBC_HBits7_0     ((unsigned int)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+   #define ETH_MACA1HR_MBC_LBits31_24   ((unsigned int)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+   #define ETH_MACA1HR_MBC_LBits23_16   ((unsigned int)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+   #define ETH_MACA1HR_MBC_LBits15_8    ((unsigned int)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+   #define ETH_MACA1HR_MBC_LBits7_0     ((unsigned int)0x01000000)  /* Mask MAC Address low reg bits [7:0] */
+#define ETH_MACA1HR_MACA1H   ((unsigned int)0x0000FFFF)  /* MAC address1 high */
+
+#define ETH_MACA1LR_MACA1L   ((unsigned int)0xFFFFFFFF)  /* MAC address1 low */
+
+#define ETH_MACA2HR_AE       ((unsigned int)0x80000000)  /* Address enable */
+#define ETH_MACA2HR_SA       ((unsigned int)0x40000000)  /* Source address */
+#define ETH_MACA2HR_MBC      ((unsigned int)0x3F000000)  /* Mask byte control */
+   #define ETH_MACA2HR_MBC_HBits15_8    ((unsigned int)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+   #define ETH_MACA2HR_MBC_HBits7_0     ((unsigned int)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+   #define ETH_MACA2HR_MBC_LBits31_24   ((unsigned int)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+   #define ETH_MACA2HR_MBC_LBits23_16   ((unsigned int)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+   #define ETH_MACA2HR_MBC_LBits15_8    ((unsigned int)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+   #define ETH_MACA2HR_MBC_LBits7_0     ((unsigned int)0x01000000)  /* Mask MAC Address low reg bits [70] */
+
+#define ETH_MACA2HR_MACA2H   ((unsigned int)0x0000FFFF)  /* MAC address1 high */
+#define ETH_MACA2LR_MACA2L   ((unsigned int)0xFFFFFFFF)  /* MAC address2 low */
+
+#define ETH_MACA3HR_AE       ((unsigned int)0x80000000)  /* Address enable */
+#define ETH_MACA3HR_SA       ((unsigned int)0x40000000)  /* Source address */
+#define ETH_MACA3HR_MBC      ((unsigned int)0x3F000000)  /* Mask byte control */
+   #define ETH_MACA3HR_MBC_HBits15_8    ((unsigned int)0x20000000)  /* Mask MAC Address high reg bits [15:8] */
+   #define ETH_MACA3HR_MBC_HBits7_0     ((unsigned int)0x10000000)  /* Mask MAC Address high reg bits [7:0] */
+   #define ETH_MACA3HR_MBC_LBits31_24   ((unsigned int)0x08000000)  /* Mask MAC Address low reg bits [31:24] */
+   #define ETH_MACA3HR_MBC_LBits23_16   ((unsigned int)0x04000000)  /* Mask MAC Address low reg bits [23:16] */
+   #define ETH_MACA3HR_MBC_LBits15_8    ((unsigned int)0x02000000)  /* Mask MAC Address low reg bits [15:8] */
+   #define ETH_MACA3HR_MBC_LBits7_0     ((unsigned int)0x01000000)  /* Mask MAC Address low reg bits [70] */
+#define ETH_MACA3HR_MACA3H   ((unsigned int)0x0000FFFF)  /* MAC address3 high */
+#define ETH_MACA3LR_MACA3L   ((unsigned int)0xFFFFFFFF)  /* MAC address3 low */
+
+/******************************************************************************/
+/*                                                                            */
+/*                          ETH MMC Register                                  */
+/*                                                                            */
+/******************************************************************************/
+#define ETH_MMCCR_MCFHP      ((unsigned int)0x00000020)  /* MMC counter Full-Half preset */
+#define ETH_MMCCR_MCP        ((unsigned int)0x00000010)  /* MMC counter preset */
+#define ETH_MMCCR_MCF        ((unsigned int)0x00000008)  /* MMC Counter Freeze */
+#define ETH_MMCCR_ROR        ((unsigned int)0x00000004)  /* Reset on Read */
+#define ETH_MMCCR_CSR        ((unsigned int)0x00000002)  /* Counter Stop Rollover */
+#define ETH_MMCCR_CR         ((unsigned int)0x00000001)  /* Counters Reset */
+
+#define ETH_MMCRIR_RGUFS     ((unsigned int)0x00020000)  /* Set when Rx good unicast frames counter reaches half the maximum value */
+#define ETH_MMCRIR_RFAES     ((unsigned int)0x00000040)  /* Set when Rx alignment error counter reaches half the maximum value */
+#define ETH_MMCRIR_RFCES     ((unsigned int)0x00000020)  /* Set when Rx crc error counter reaches half the maximum value */
+
+#define ETH_MMCTIR_TGFS      ((unsigned int)0x00200000)  /* Set when Tx good frame count counter reaches half the maximum value */
+#define ETH_MMCTIR_TGFMSCS   ((unsigned int)0x00008000)  /* Set when Tx good multi col counter reaches half the maximum value */
+#define ETH_MMCTIR_TGFSCS    ((unsigned int)0x00004000)  /* Set when Tx good single col counter reaches half the maximum value */
+
+#define ETH_MMCRIMR_RGUFM    ((unsigned int)0x00020000)  /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */
+#define ETH_MMCRIMR_RFAEM    ((unsigned int)0x00000040)  /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */
+#define ETH_MMCRIMR_RFCEM    ((unsigned int)0x00000020)  /* Mask the interrupt when Rx crc error counter reaches half the maximum value */
+
+#define ETH_MMCTIMR_TGFM     ((unsigned int)0x00200000)  /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */
+#define ETH_MMCTIMR_TGFMSCM  ((unsigned int)0x00008000)  /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */
+#define ETH_MMCTIMR_TGFSCM   ((unsigned int)0x00004000)  /* Mask the interrupt when Tx good single col counter reaches half the maximum value */
+
+#define ETH_MMCTGFSCCR_TGFSCC     ((unsigned int)0xFFFFFFFF)  /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */
+
+#define ETH_MMCTGFMSCCR_TGFMSCC   ((unsigned int)0xFFFFFFFF)  /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */
+
+#define ETH_MMCTGFCR_TGFC    ((unsigned int)0xFFFFFFFF)  /* Number of good frames transmitted. */
+
+#define ETH_MMCRFCECR_RFCEC  ((unsigned int)0xFFFFFFFF)  /* Number of frames received with CRC error. */
+
+#define ETH_MMCRFAECR_RFAEC  ((unsigned int)0xFFFFFFFF)  /* Number of frames received with alignment (dribble) error */
+
+#define ETH_MMCRGUFCR_RGUFC  ((unsigned int)0xFFFFFFFF)  /* Number of good unicast frames received. */
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                          ETH Precise Clock Protocol Register               */
+/*                                                                            */
+/******************************************************************************/
+#define ETH_PTPTSCR_TSCNT       ((unsigned int)0x00030000)  /* Time stamp clock node type */
+#define ETH_PTPTSSR_TSSMRME     ((unsigned int)0x00008000)  /* Time stamp snapshot for message relevant to master enable */
+#define ETH_PTPTSSR_TSSEME      ((unsigned int)0x00004000)  /* Time stamp snapshot for event message enable */
+#define ETH_PTPTSSR_TSSIPV4FE   ((unsigned int)0x00002000)  /* Time stamp snapshot for IPv4 frames enable */
+#define ETH_PTPTSSR_TSSIPV6FE   ((unsigned int)0x00001000)  /* Time stamp snapshot for IPv6 frames enable */
+#define ETH_PTPTSSR_TSSPTPOEFE  ((unsigned int)0x00000800)  /* Time stamp snapshot for PTP over ethernet frames enable */
+#define ETH_PTPTSSR_TSPTPPSV2E  ((unsigned int)0x00000400)  /* Time stamp PTP packet snooping for version2 format enable */
+#define ETH_PTPTSSR_TSSSR       ((unsigned int)0x00000200)  /* Time stamp Sub-seconds rollover */
+#define ETH_PTPTSSR_TSSARFE     ((unsigned int)0x00000100)  /* Time stamp snapshot for all received frames enable */
+
+#define ETH_PTPTSCR_TSARU    ((unsigned int)0x00000020)  /* Addend register update */
+#define ETH_PTPTSCR_TSITE    ((unsigned int)0x00000010)  /* Time stamp interrupt trigger enable */
+#define ETH_PTPTSCR_TSSTU    ((unsigned int)0x00000008)  /* Time stamp update */
+#define ETH_PTPTSCR_TSSTI    ((unsigned int)0x00000004)  /* Time stamp initialize */
+#define ETH_PTPTSCR_TSFCU    ((unsigned int)0x00000002)  /* Time stamp fine or coarse update */
+#define ETH_PTPTSCR_TSE      ((unsigned int)0x00000001)  /* Time stamp enable */
+
+#define ETH_PTPSSIR_STSSI    ((unsigned int)0x000000FF)  /* System time Sub-second increment value */
+
+#define ETH_PTPTSHR_STS      ((unsigned int)0xFFFFFFFF)  /* System Time second */
+
+#define ETH_PTPTSLR_STPNS    ((unsigned int)0x80000000)  /* System Time Positive or negative time */
+#define ETH_PTPTSLR_STSS     ((unsigned int)0x7FFFFFFF)  /* System Time sub-seconds */
+
+#define ETH_PTPTSHUR_TSUS    ((unsigned int)0xFFFFFFFF)  /* Time stamp update seconds */
+
+#define ETH_PTPTSLUR_TSUPNS  ((unsigned int)0x80000000)  /* Time stamp update Positive or negative time */
+#define ETH_PTPTSLUR_TSUSS   ((unsigned int)0x7FFFFFFF)  /* Time stamp update sub-seconds */
+
+#define ETH_PTPTSAR_TSA      ((unsigned int)0xFFFFFFFF)  /* Time stamp addend */
+
+#define ETH_PTPTTHR_TTSH     ((unsigned int)0xFFFFFFFF)  /* Target time stamp high */
+
+#define ETH_PTPTTLR_TTSL     ((unsigned int)0xFFFFFFFF)  /* Target time stamp low */
+
+#define ETH_PTPTSSR_TSTTR    ((unsigned int)0x00000020)  /* Time stamp target time reached */
+#define ETH_PTPTSSR_TSSO     ((unsigned int)0x00000010)  /* Time stamp seconds overflow */
+
+/******************************************************************************/
+/*                                                                            */
+/*                       ETH DMA Register                                     */
+/*                                                                            */
+/******************************************************************************/
+#define ETH_DMABMR_AAB       ((unsigned int)0x02000000)  /* Address-Aligned beats */
+#define ETH_DMABMR_FPM        ((unsigned int)0x01000000)  /* 4xPBL mode */
+#define ETH_DMABMR_USP       ((unsigned int)0x00800000)  /* Use separate PBL */
+#define ETH_DMABMR_RDP       ((unsigned int)0x007E0000)  /* RxDMA PBL */
+   #define ETH_DMABMR_RDP_1Beat    ((unsigned int)0x00020000)  /* maximum number of beats to be transferred in one RxDMA transaction is 1 */
+   #define ETH_DMABMR_RDP_2Beat    ((unsigned int)0x00040000)  /* maximum number of beats to be transferred in one RxDMA transaction is 2 */
+   #define ETH_DMABMR_RDP_4Beat    ((unsigned int)0x00080000)  /* maximum number of beats to be transferred in one RxDMA transaction is 4 */
+   #define ETH_DMABMR_RDP_8Beat    ((unsigned int)0x00100000)  /* maximum number of beats to be transferred in one RxDMA transaction is 8 */
+   #define ETH_DMABMR_RDP_16Beat   ((unsigned int)0x00200000)  /* maximum number of beats to be transferred in one RxDMA transaction is 16 */
+   #define ETH_DMABMR_RDP_32Beat   ((unsigned int)0x00400000)  /* maximum number of beats to be transferred in one RxDMA transaction is 32 */
+   #define ETH_DMABMR_RDP_4xPBL_4Beat   ((unsigned int)0x01020000)  /* maximum number of beats to be transferred in one RxDMA transaction is 4 */
+   #define ETH_DMABMR_RDP_4xPBL_8Beat   ((unsigned int)0x01040000)  /* maximum number of beats to be transferred in one RxDMA transaction is 8 */
+   #define ETH_DMABMR_RDP_4xPBL_16Beat  ((unsigned int)0x01080000)  /* maximum number of beats to be transferred in one RxDMA transaction is 16 */
+   #define ETH_DMABMR_RDP_4xPBL_32Beat  ((unsigned int)0x01100000)  /* maximum number of beats to be transferred in one RxDMA transaction is 32 */
+   #define ETH_DMABMR_RDP_4xPBL_64Beat  ((unsigned int)0x01200000)  /* maximum number of beats to be transferred in one RxDMA transaction is 64 */
+   #define ETH_DMABMR_RDP_4xPBL_128Beat ((unsigned int)0x01400000)  /* maximum number of beats to be transferred in one RxDMA transaction is 128 */
+#define ETH_DMABMR_FB        ((unsigned int)0x00010000)  /* Fixed Burst */
+#define ETH_DMABMR_RTPR      ((unsigned int)0x0000C000)  /* Rx Tx priority ratio */
+   #define ETH_DMABMR_RTPR_1_1     ((unsigned int)0x00000000)  /* Rx Tx priority ratio */
+   #define ETH_DMABMR_RTPR_2_1     ((unsigned int)0x00004000)  /* Rx Tx priority ratio */
+   #define ETH_DMABMR_RTPR_3_1     ((unsigned int)0x00008000)  /* Rx Tx priority ratio */
+   #define ETH_DMABMR_RTPR_4_1     ((unsigned int)0x0000C000)  /* Rx Tx priority ratio */
+#define ETH_DMABMR_PBL    ((unsigned int)0x00003F00)  /* Programmable burst length */
+   #define ETH_DMABMR_PBL_1Beat    ((unsigned int)0x00000100)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */
+   #define ETH_DMABMR_PBL_2Beat    ((unsigned int)0x00000200)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */
+   #define ETH_DMABMR_PBL_4Beat    ((unsigned int)0x00000400)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+   #define ETH_DMABMR_PBL_8Beat    ((unsigned int)0x00000800)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+   #define ETH_DMABMR_PBL_16Beat   ((unsigned int)0x00001000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+   #define ETH_DMABMR_PBL_32Beat   ((unsigned int)0x00002000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+   #define ETH_DMABMR_PBL_4xPBL_4Beat   ((unsigned int)0x01000100)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+   #define ETH_DMABMR_PBL_4xPBL_8Beat   ((unsigned int)0x01000200)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+   #define ETH_DMABMR_PBL_4xPBL_16Beat  ((unsigned int)0x01000400)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+   #define ETH_DMABMR_PBL_4xPBL_32Beat  ((unsigned int)0x01000800)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+   #define ETH_DMABMR_PBL_4xPBL_64Beat  ((unsigned int)0x01001000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */
+   #define ETH_DMABMR_PBL_4xPBL_128Beat ((unsigned int)0x01002000)  /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */
+#define ETH_DMABMR_EDE       ((unsigned int)0x00000080)  /* Enhanced Descriptor Enable */
+#define ETH_DMABMR_DSL       ((unsigned int)0x0000007C)  /* Descriptor Skip Length */
+#define ETH_DMABMR_DA        ((unsigned int)0x00000002)  /* DMA arbitration scheme */
+#define ETH_DMABMR_SR        ((unsigned int)0x00000001)  /* Software reset */
+
+#define ETH_DMATPDR_TPD      ((unsigned int)0xFFFFFFFF)  /* Transmit poll demand */
+
+#define ETH_DMARPDR_RPD      ((unsigned int)0xFFFFFFFF)  /* Receive poll demand  */
+
+#define ETH_DMARDLAR_SRL     ((unsigned int)0xFFFFFFFF)  /* Start of receive list */
+
+#define ETH_DMATDLAR_STL     ((unsigned int)0xFFFFFFFF)  /* Start of transmit list */
+
+#define ETH_DMASR_TSTS       ((unsigned int)0x20000000)  /* Time-stamp trigger status */
+#define ETH_DMASR_PMTS       ((unsigned int)0x10000000)  /* PMT status */
+#define ETH_DMASR_MMCS       ((unsigned int)0x08000000)  /* MMC status */
+#define ETH_DMASR_EBS        ((unsigned int)0x03800000)  /* Error bits status */
+   #define ETH_DMASR_EBS_DescAccess      ((unsigned int)0x02000000)  /* Error bits 0-data buffer, 1-desc. access */
+   #define ETH_DMASR_EBS_ReadTransf      ((unsigned int)0x01000000)  /* Error bits 0-write trnsf, 1-read transfr */
+   #define ETH_DMASR_EBS_DataTransfTx    ((unsigned int)0x00800000)  /* Error bits 0-Rx DMA, 1-Tx DMA */
+#define ETH_DMASR_TPS         ((unsigned int)0x00700000)  /* Transmit process state */
+   #define ETH_DMASR_TPS_Stopped         ((unsigned int)0x00000000)  /* Stopped - Reset or Stop Tx Command issued  */
+   #define ETH_DMASR_TPS_Fetching        ((unsigned int)0x00100000)  /* Running - fetching the Tx descriptor */
+   #define ETH_DMASR_TPS_Waiting         ((unsigned int)0x00200000)  /* Running - waiting for status */
+   #define ETH_DMASR_TPS_Reading         ((unsigned int)0x00300000)  /* Running - reading the data from host memory */
+   #define ETH_DMASR_TPS_Suspended       ((unsigned int)0x00600000)  /* Suspended - Tx Descriptor unavailabe */
+   #define ETH_DMASR_TPS_Closing         ((unsigned int)0x00700000)  /* Running - closing Rx descriptor */
+#define ETH_DMASR_RPS         ((unsigned int)0x000E0000)  /* Receive process state */
+   #define ETH_DMASR_RPS_Stopped         ((unsigned int)0x00000000)  /* Stopped - Reset or Stop Rx Command issued */
+   #define ETH_DMASR_RPS_Fetching        ((unsigned int)0x00020000)  /* Running - fetching the Rx descriptor */
+   #define ETH_DMASR_RPS_Waiting         ((unsigned int)0x00060000)  /* Running - waiting for packet */
+   #define ETH_DMASR_RPS_Suspended       ((unsigned int)0x00080000)  /* Suspended - Rx Descriptor unavailable */
+   #define ETH_DMASR_RPS_Closing         ((unsigned int)0x000A0000)  /* Running - closing descriptor */
+   #define ETH_DMASR_RPS_Queuing         ((unsigned int)0x000E0000)  /* Running - queuing the recieve frame into host memory */
+#define ETH_DMASR_NIS        ((unsigned int)0x00010000)  /* Normal interrupt summary */
+#define ETH_DMASR_AIS        ((unsigned int)0x00008000)  /* Abnormal interrupt summary */
+#define ETH_DMASR_ERS        ((unsigned int)0x00004000)  /* Early receive status */
+#define ETH_DMASR_FBES       ((unsigned int)0x00002000)  /* Fatal bus error status */
+#define ETH_DMASR_ETS        ((unsigned int)0x00000400)  /* Early transmit status */
+#define ETH_DMASR_RWTS       ((unsigned int)0x00000200)  /* Receive watchdog timeout status */
+#define ETH_DMASR_RPSS       ((unsigned int)0x00000100)  /* Receive process stopped status */
+#define ETH_DMASR_RBUS       ((unsigned int)0x00000080)  /* Receive buffer unavailable status */
+#define ETH_DMASR_RS         ((unsigned int)0x00000040)  /* Receive status */
+#define ETH_DMASR_TUS        ((unsigned int)0x00000020)  /* Transmit underflow status */
+#define ETH_DMASR_ROS        ((unsigned int)0x00000010)  /* Receive overflow status */
+#define ETH_DMASR_TJTS       ((unsigned int)0x00000008)  /* Transmit jabber timeout status */
+#define ETH_DMASR_TBUS       ((unsigned int)0x00000004)  /* Transmit buffer unavailable status */
+#define ETH_DMASR_TPSS       ((unsigned int)0x00000002)  /* Transmit process stopped status */
+#define ETH_DMASR_TS         ((unsigned int)0x00000001)  /* Transmit status */
+
+#define ETH_DMAOMR_DTCEFD    ((unsigned int)0x04000000)  /* Disable Dropping of TCP/IP checksum error frames */
+#define ETH_DMAOMR_RSF       ((unsigned int)0x02000000)  /* Receive store and forward */
+#define ETH_DMAOMR_DFRF      ((unsigned int)0x01000000)  /* Disable flushing of received frames */
+#define ETH_DMAOMR_TSF       ((unsigned int)0x00200000)  /* Transmit store and forward */
+#define ETH_DMAOMR_FTF       ((unsigned int)0x00100000)  /* Flush transmit FIFO */
+#define ETH_DMAOMR_TTC       ((unsigned int)0x0001C000)  /* Transmit threshold control */
+   #define ETH_DMAOMR_TTC_64Bytes       ((unsigned int)0x00000000)  /* threshold level of the MTL Transmit FIFO is 64 Bytes */
+   #define ETH_DMAOMR_TTC_128Bytes      ((unsigned int)0x00004000)  /* threshold level of the MTL Transmit FIFO is 128 Bytes */
+   #define ETH_DMAOMR_TTC_192Bytes      ((unsigned int)0x00008000)  /* threshold level of the MTL Transmit FIFO is 192 Bytes */
+   #define ETH_DMAOMR_TTC_256Bytes      ((unsigned int)0x0000C000)  /* threshold level of the MTL Transmit FIFO is 256 Bytes */
+   #define ETH_DMAOMR_TTC_40Bytes       ((unsigned int)0x00010000)  /* threshold level of the MTL Transmit FIFO is 40 Bytes */
+   #define ETH_DMAOMR_TTC_32Bytes       ((unsigned int)0x00014000)  /* threshold level of the MTL Transmit FIFO is 32 Bytes */
+   #define ETH_DMAOMR_TTC_24Bytes       ((unsigned int)0x00018000)  /* threshold level of the MTL Transmit FIFO is 24 Bytes */
+   #define ETH_DMAOMR_TTC_16Bytes       ((unsigned int)0x0001C000)  /* threshold level of the MTL Transmit FIFO is 16 Bytes */
+#define ETH_DMAOMR_ST        ((unsigned int)0x00002000)  /* Start/stop transmission command */
+#define ETH_DMAOMR_FEF       ((unsigned int)0x00000080)  /* Forward error frames */
+#define ETH_DMAOMR_FUGF      ((unsigned int)0x00000040)  /* Forward undersized good frames */
+#define ETH_DMAOMR_RTC       ((unsigned int)0x00000018)  /* receive threshold control */
+   #define ETH_DMAOMR_RTC_64Bytes       ((unsigned int)0x00000000)  /* threshold level of the MTL Receive FIFO is 64 Bytes */
+   #define ETH_DMAOMR_RTC_32Bytes       ((unsigned int)0x00000008)  /* threshold level of the MTL Receive FIFO is 32 Bytes */
+   #define ETH_DMAOMR_RTC_96Bytes       ((unsigned int)0x00000010)  /* threshold level of the MTL Receive FIFO is 96 Bytes */
+   #define ETH_DMAOMR_RTC_128Bytes      ((unsigned int)0x00000018)  /* threshold level of the MTL Receive FIFO is 128 Bytes */
+#define ETH_DMAOMR_OSF       ((unsigned int)0x00000004)  /* operate on second frame */
+#define ETH_DMAOMR_SR        ((unsigned int)0x00000002)  /* Start/stop receive */
+
+#define ETH_DMAIER_NISE      ((unsigned int)0x00010000)  /* Normal interrupt summary enable */
+#define ETH_DMAIER_AISE      ((unsigned int)0x00008000)  /* Abnormal interrupt summary enable */
+#define ETH_DMAIER_ERIE      ((unsigned int)0x00004000)  /* Early receive interrupt enable */
+#define ETH_DMAIER_FBEIE     ((unsigned int)0x00002000)  /* Fatal bus error interrupt enable */
+#define ETH_DMAIER_ETIE      ((unsigned int)0x00000400)  /* Early transmit interrupt enable */
+#define ETH_DMAIER_RWTIE     ((unsigned int)0x00000200)  /* Receive watchdog timeout interrupt enable */
+#define ETH_DMAIER_RPSIE     ((unsigned int)0x00000100)  /* Receive process stopped interrupt enable */
+#define ETH_DMAIER_RBUIE     ((unsigned int)0x00000080)  /* Receive buffer unavailable interrupt enable */
+#define ETH_DMAIER_RIE       ((unsigned int)0x00000040)  /* Receive interrupt enable */
+#define ETH_DMAIER_TUIE      ((unsigned int)0x00000020)  /* Transmit Underflow interrupt enable */
+#define ETH_DMAIER_ROIE      ((unsigned int)0x00000010)  /* Receive Overflow interrupt enable */
+#define ETH_DMAIER_TJTIE     ((unsigned int)0x00000008)  /* Transmit jabber timeout interrupt enable */
+#define ETH_DMAIER_TBUIE     ((unsigned int)0x00000004)  /* Transmit buffer unavailable interrupt enable */
+#define ETH_DMAIER_TPSIE     ((unsigned int)0x00000002)  /* Transmit process stopped interrupt enable */
+#define ETH_DMAIER_TIE       ((unsigned int)0x00000001)  /* Transmit interrupt enable */
+
+#define ETH_DMAMFBOCR_OFOC   ((unsigned int)0x10000000)  /* Overflow bit for FIFO overflow counter */
+#define ETH_DMAMFBOCR_MFA    ((unsigned int)0x0FFE0000)  /* Number of frames missed by the application */
+#define ETH_DMAMFBOCR_OMFC   ((unsigned int)0x00010000)  /* Overflow bit for missed frame counter */
+#define ETH_DMAMFBOCR_MFC    ((unsigned int)0x0000FFFF)  /* Number of frames missed by the controller */
+
+#define ETH_DMACHTDR_HTDAP   ((unsigned int)0xFFFFFFFF)  /* Host transmit descriptor address pointer */
+#define ETH_DMACHRDR_HRDAP   ((unsigned int)0xFFFFFFFF)  /* Host receive descriptor address pointer */
+#define ETH_DMACHTBAR_HTBAP  ((unsigned int)0xFFFFFFFF)  /* Host transmit buffer address pointer */
+#define ETH_DMACHRBAR_HRBAP  ((unsigned int)0xFFFFFFFF)  /* Host receive buffer address pointer */
+
+
+#define ETH_MAC_ADDR_HBASE   (ETH_MAC_BASE + 0x40)   /* ETHERNET MAC address high offset */
+#define ETH_MAC_ADDR_LBASE    (ETH_MAC_BASE + 0x44)  /* ETHERNET MAC address low offset */
+
+/* ETHERNET MACMIIAR register Mask */
+#define MACMIIAR_CR_MASK    ((uint32_t)0xFFFFFFE3)
+
+/* ETHERNET MACCR register Mask */
+#define MACCR_CLEAR_MASK    ((uint32_t)0xFF20810F)
+
+/* ETHERNET MACFCR register Mask */
+#define MACFCR_CLEAR_MASK   ((uint32_t)0x0000FF41)
+
+/* ETHERNET DMAOMR register Mask */
+#define DMAOMR_CLEAR_MASK   ((uint32_t)0xF8DE3F23)
+
+/* ETHERNET Remote Wake-up frame register length */
+#define ETH_WAKEUP_REGISTER_LENGTH      8
+
+/* ETHERNET Missed frames counter Shift */
+#define  ETH_DMA_RX_OVERFLOW_MISSEDFRAMES_COUNTERSHIFT     17
+
+/* ETHERNET DMA Tx descriptors Collision Count Shift */
+#define  ETH_DMATXDESC_COLLISION_COUNTSHIFT        3
+
+/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */
+#define  ETH_DMATXDESC_BUFFER2_SIZESHIFT           16
+
+/* ETHERNET DMA Rx descriptors Frame Length Shift */
+#define  ETH_DMARXDESC_FRAME_LENGTHSHIFT           16
+
+/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */
+#define  ETH_DMARXDESC_BUFFER2_SIZESHIFT           16
+
+/* ETHERNET errors */
+#define  ETH_ERROR              ((uint32_t)0)
+#define  ETH_SUCCESS            ((uint32_t)1)
+
+
+void ETH_DeInit(void);
+void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct);
+void ETH_SoftwareReset(void);
+FlagStatus ETH_GetSoftwareResetStatus(void);
+FlagStatus ETH_GetlinkStaus (void);
+void  ETH_Start(void);
+uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength);
+void delay_clk (uint32_t nCount);
+void printf_dmasr (void);
+void print_dmasr_tbus(void);
+void print_dmasr_rps(void);
+void print_dmasr_tps(void);
+uint32_t ETH_HandleRxPkt(uint8_t *ppkt);
+uint32_t ETH_GetRxPktSize(void);
+void ETH_DropRxPkt(void);
+uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg);
+uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue);
+uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState);
+
+void ETH_MACTransmissionCmd(FunctionalState NewState);
+void ETH_MACReceptionCmd(FunctionalState NewState);
+FlagStatus ETH_GetFlowControlBusyStatus(void);
+void ETH_InitiatePauseControlFrame(void);  
+void ETH_BackPressureActivationCmd(FunctionalState NewState); 
+FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG);  
+ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT);
+void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState);
+void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr);
+void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr);
+void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState);
+void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter);
+void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte);
+
+void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount);
+void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount);
+FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag);
+uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc);
+void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc);
+void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment);
+void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum);
+void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2);
+void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount);
+void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount);
+FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag);
+void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc);
+uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc);
+void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState);
+void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState);
+void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState);
+uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer);
+
+FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG);
+void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG);
+ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT);
+void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT);
+uint32_t ETH_GetTransmitProcessState(void);
+uint32_t ETH_GetReceiveProcessState(void);
+void ETH_FlushTransmitFIFO(void);
+FlagStatus ETH_GetFlushTransmitFIFOStatus(void);
+void ETH_DMATransmissionCmd(FunctionalState NewState);
+void ETH_DMAReceptionCmd(FunctionalState NewState);
+void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState);
+FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow);
+uint32_t ETH_GetRxOverflowMissedFrameCounter(void);
+uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void);
+uint32_t ETH_GetCurrentTxDescStartAddress(void);
+uint32_t ETH_GetCurrentRxDescStartAddress(void);
+uint32_t ETH_GetCurrentTxBufferAddress(void);
+uint32_t ETH_GetCurrentRxBufferAddress(void);
+void ETH_ResumeDMATransmission(void);
+void ETH_ResumeDMAReception(void);
+
+void ETH_ResetWakeUpFrameFilterRegisterPointer(void);
+void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer);
+void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState);
+FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG);
+void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState);
+void ETH_MagicPacketDetectionCmd(FunctionalState NewState);
+void ETH_PowerDownCmd(FunctionalState NewState);
+
+void ETH_MMCCounterFreezeCmd(FunctionalState NewState);
+void ETH_MMCResetOnReadCmd(FunctionalState NewState);
+void ETH_MMCCounterRolloverCmd(FunctionalState NewState);
+void ETH_MMCCountersReset(void);
+void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState);
+ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT);
+uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg);
+
+uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab);
+uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab);
+void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount);
+void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount);
+void ETH_EnablePTPTimeStampAddend(void);
+void ETH_EnablePTPTimeStampInterruptTrigger(void);
+void ETH_EnablePTPTimeStampUpdate(void);
+void ETH_InitializePTPTimeStamp(void);
+void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod);
+void ETH_PTPTimeStampCmd(FunctionalState NewState);
+FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG);
+void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue);
+void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue);
+void ETH_SetPTPTimeStampAddend(uint32_t Value);
+void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue);
+uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg);
+void RGMII_TXC_Delay(uint8_t clock_polarity,uint8_t delay_time);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+

+ 92 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_exti.h

@@ -0,0 +1,92 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_exti.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/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 __CH32V30x_EXTI_H
+#define __CH32V30x_EXTI_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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_Line18      ((uint32_t)0x40000)  /* External interrupt line 18 Connected to the USBD/USBFS OTG
+                                                 Wakeup from suspend event */                                    
+#define EXTI_Line19      ((uint32_t)0x80000)  /* External interrupt line 19 Connected to the Ethernet Wakeup event */
+#define EXTI_Line20      ((uint32_t)0x100000) /* External interrupt line 20 Connected to the USBHS 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 
+

+ 148 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_flash.h

@@ -0,0 +1,148 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_flash.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/05/24
+* 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 __CH32V30x_FLASH_H
+#define __CH32V30x_FLASH_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* FLASH Status */
+typedef enum
+{ 
+  FLASH_BUSY = 1,
+  FLASH_ERROR_PG,
+  FLASH_ERROR_WRP,
+  FLASH_COMPLETE,
+  FLASH_TIMEOUT,
+  FLASH_OP_RANGE_ERROR = 0xFD,
+  FLASH_ALIGN_ERROR = 0xFE,
+  FLASH_ADR_RANGE_ERROR = 0xFF,
+}FLASH_Status;
+
+
+/* Write Protect */
+#define FLASH_WRProt_Sectors0        ((uint32_t)0x00000001) /* Write protection of setor 0 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors1        ((uint32_t)0x00000002) /* Write protection of setor 1 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors2        ((uint32_t)0x00000004) /* Write protection of setor 2 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors3        ((uint32_t)0x00000008) /* Write protection of setor 3 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors4        ((uint32_t)0x00000010) /* Write protection of setor 4 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors5        ((uint32_t)0x00000020) /* Write protection of setor 5 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors6        ((uint32_t)0x00000040) /* Write protection of setor 6 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors7        ((uint32_t)0x00000080) /* Write protection of setor 7 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors8        ((uint32_t)0x00000100) /* Write protection of setor 8 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors9        ((uint32_t)0x00000200) /* Write protection of setor 9 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors10       ((uint32_t)0x00000400) /* Write protection of setor 10 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors11       ((uint32_t)0x00000800) /* Write protection of setor 11 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors12       ((uint32_t)0x00001000) /* Write protection of setor 12 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors13       ((uint32_t)0x00002000) /* Write protection of setor 13 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors14       ((uint32_t)0x00004000) /* Write protection of setor 14 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors15       ((uint32_t)0x00008000) /* Write protection of setor 15 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors16       ((uint32_t)0x00010000) /* Write protection of setor 16 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors17       ((uint32_t)0x00020000) /* Write protection of setor 17 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors18       ((uint32_t)0x00040000) /* Write protection of setor 18 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors19       ((uint32_t)0x00080000) /* Write protection of setor 19 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors20       ((uint32_t)0x00100000) /* Write protection of setor 20 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors21       ((uint32_t)0x00200000) /* Write protection of setor 21 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors22       ((uint32_t)0x00400000) /* Write protection of setor 22 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors23       ((uint32_t)0x00800000) /* Write protection of setor 23 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors24       ((uint32_t)0x01000000) /* Write protection of setor 24 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors25       ((uint32_t)0x02000000) /* Write protection of setor 25 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors26       ((uint32_t)0x04000000) /* Write protection of setor 26 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors27       ((uint32_t)0x08000000) /* Write protection of setor 27 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors28       ((uint32_t)0x10000000) /* Write protection of setor 28 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors29       ((uint32_t)0x20000000) /* Write protection of setor 29 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors30       ((uint32_t)0x40000000) /* Write protection of setor 30 ,4K bytes/sector */
+#define FLASH_WRProt_Sectors31to127  ((uint32_t)0x80000000) /* Write protection of page 31 to 127 */
+
+#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 */
+
+/* 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_EOP                 ((uint32_t)0x00000020)  /* FLASH End of Operation flag */
+#define FLASH_FLAG_WRPRTERR            ((uint32_t)0x00000010)  /* FLASH Write protected error flag */
+#define FLASH_FLAG_OPTERR              ((uint32_t)0x80000001)  /* 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 */
+
+/* FLASH_Access_CLK */
+#define FLASH_Access_SYSTEM_HALF      ((uint32_t)0x00000000)   /* FLASH Access Clock = SYSTEM/2 */
+#define FLASH_Access_SYSTEM           ((uint32_t)0x02000000)   /* FLASH Access Clock = SYSTEM */
+ 
+ 
+/*Functions used for all devices*/
+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_ProgramWord(uint32_t Address, uint32_t Data);
+FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
+FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
+FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Sectors);
+FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState);
+FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY);
+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_ErasePage_Fast(uint32_t Page_Address);
+void FLASH_EraseBlock_32K_Fast(uint32_t Block_Address);
+void FLASH_ProgramPage_Fast(uint32_t Page_Address, uint32_t* pbuf);
+void FLASH_Access_Clock_Cfg(uint32_t FLASH_Access_CLK);
+void FLASH_Enhance_Mode(FunctionalState NewState);
+
+/* New function used for all devices */
+void FLASH_UnlockBank1(void);
+void FLASH_LockBank1(void);
+FLASH_Status FLASH_EraseAllBank1Pages(void);
+FLASH_Status FLASH_GetBank1Status(void);
+FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout);
+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 
+

+ 268 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_fsmc.h

@@ -0,0 +1,268 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_fsmc.h
+* Author             : WCH
+* Version            : V1.0.1
+* Date               : 2025/03/06
+* Description        : This file contains all the functions prototypes for the FSMC
+*                      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 __CH32V30x_FSMC_H
+#define __CH32V30x_FSMC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+#include "ch32v30x.h"
+
+
+/* FSMC Init structure definition */
+typedef struct
+{
+  uint32_t FSMC_AddressSetupTime;       /* Defines the number of HCLK cycles to configure
+                                           the duration of the address setup time.
+                                           This parameter can be a value between 0 and 0xF.
+                                           @note: It is not used with synchronous NOR Flash memories. */
+
+  uint32_t FSMC_AddressHoldTime;        /* Defines the number of HCLK cycles to configure
+                                           the duration of the address hold time.
+                                           This parameter can be a value between 0 and 0xF.
+                                           @note: It is not used with synchronous NOR Flash memories.*/
+
+  uint32_t FSMC_DataSetupTime;          /* Defines the number of HCLK cycles to configure
+                                           the duration of the data setup time.
+                                           This parameter can be a value between 0 and 0xFF.
+                                           @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */
+
+  uint32_t FSMC_BusTurnAroundDuration;  /* Defines the number of HCLK cycles to configure
+                                           the duration of the bus turnaround.
+                                           This parameter can be a value between 0 and 0xF.
+                                           @note: It is only used for multiplexed NOR Flash memories. */
+
+  uint32_t FSMC_CLKDivision;            /* Defines the period of CLK clock output signal, expressed in number of HCLK cycles.
+                                           This parameter can be a value between 1 and 0xF.
+                                           @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */
+
+  uint32_t FSMC_DataLatency;            /* Defines the number of memory clock cycles to issue
+                                           to the memory before getting the first data.
+                                           The value of this parameter depends on the memory type as shown below:
+                                              - It must be set to 0 in case of a CRAM
+                                              - It is don't care in asynchronous NOR, SRAM or ROM accesses
+                                              - It may assume a value between 0 and 0xF in NOR Flash memories
+                                                with synchronous burst mode enable */
+
+  uint32_t FSMC_AccessMode;             /* Specifies the asynchronous access mode.
+                                            This parameter can be a value of @ref FSMC_Access_Mode */
+}FSMC_NORSRAMTimingInitTypeDef;
+
+
+typedef struct
+{
+  uint32_t FSMC_Bank;                /* Specifies the NOR/SRAM memory bank that will be used.
+                                        This parameter can be a value of @ref FSMC_NORSRAM_Bank */
+
+  uint32_t FSMC_DataAddressMux;      /* Specifies whether the address and data values are
+                                        multiplexed on the databus or not.
+                                        This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */
+
+  uint32_t FSMC_MemoryType;          /* Specifies the type of external memory attached to
+                                        the corresponding memory bank.
+                                        This parameter can be a value of @ref FSMC_Memory_Type */
+
+  uint32_t FSMC_MemoryDataWidth;     /* Specifies the external memory device width.
+                                        This parameter can be a value of @ref FSMC_Data_Width */
+
+  uint32_t FSMC_BurstAccessMode;     /* Enables or disables the burst access mode for Flash memory,
+                                        valid only with synchronous burst Flash memories.
+                                        This parameter can be a value of @ref FSMC_Burst_Access_Mode */
+                                       
+  uint32_t FSMC_AsynchronousWait;    /* Enables or disables wait signal during asynchronous transfers,
+                                        valid only with asynchronous Flash memories.
+                                        This parameter can be a value of @ref FSMC_AsynchronousWait */
+
+  uint32_t FSMC_WaitSignalPolarity;  /* Specifies the wait signal polarity, valid only when accessing
+                                        the Flash memory in burst mode.
+                                        This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */
+
+  uint32_t FSMC_WaitSignalActive;    /* Specifies if the wait signal is asserted by the memory one
+                                        clock cycle before the wait state or during the wait state,
+                                        valid only when accessing memories in burst mode.
+                                        This parameter can be a value of @ref FSMC_Wait_Timing */
+
+  uint32_t FSMC_WriteOperation;      /* Enables or disables the write operation in the selected bank by the FSMC.
+                                        This parameter can be a value of @ref FSMC_Write_Operation */
+
+  uint32_t FSMC_WaitSignal;          /* Enables or disables the wait-state insertion via wait
+                                        signal, valid for Flash memory access in burst mode.
+                                        This parameter can be a value of @ref FSMC_Wait_Signal */
+
+  uint32_t FSMC_ExtendedMode;        /* Enables or disables the extended mode.
+                                        This parameter can be a value of @ref FSMC_Extended_Mode */
+
+  uint32_t FSMC_WriteBurst;          /* Enables or disables the write burst operation.
+                                        This parameter can be a value of @ref FSMC_Write_Burst */
+
+  FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /* Timing Parameters for write and read access if the  ExtendedMode is not used*/
+
+  FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;     /* Timing Parameters for write access if the  ExtendedMode is used*/
+}FSMC_NORSRAMInitTypeDef;
+
+
+typedef struct
+{
+  uint32_t FSMC_SetupTime;      /* Defines the number of HCLK cycles to setup address before
+                                   the command assertion for NAND-Flash read or write access
+                                   to common/Attribute or I/O memory space (depending on
+                                   the memory space timing to be configured).
+                                   This parameter can be a value between 0 and 0xFF.*/
+
+  uint32_t FSMC_WaitSetupTime;  /* Defines the minimum number of HCLK cycles to assert the
+                                   command for NAND-Flash read or write access to
+                                   common/Attribute or I/O memory space (depending on the
+                                   memory space timing to be configured).
+                                   This parameter can be a number between 0x00 and 0xFF */
+
+  uint32_t FSMC_HoldSetupTime;  /* Defines the number of HCLK clock cycles to hold address
+                                   (and data for write access) after the command deassertion
+                                   for NAND-Flash read or write access to common/Attribute
+                                   or I/O memory space (depending on the memory space timing
+                                   to be configured).
+                                   This parameter can be a number between 0x00 and 0xFF */
+
+  uint32_t FSMC_HiZSetupTime;   /* Defines the number of HCLK clock cycles during which the
+                                   databus is kept in HiZ after the start of a NAND-Flash
+                                   write access to common/Attribute or I/O memory space (depending
+                                   on the memory space timing to be configured).
+                                   This parameter can be a number between 0x00 and 0xFF */
+}FSMC_NAND_PCCARDTimingInitTypeDef;
+
+
+typedef struct
+{
+  uint32_t FSMC_Bank;             /* Specifies the NAND memory bank that will be used.
+                                     This parameter can be a value of @ref FSMC_NAND_Bank */
+
+  uint32_t FSMC_Waitfeature;      /* Enables or disables the Wait feature for the NAND Memory Bank.
+                                     This parameter can be any value of @ref FSMC_Wait_feature */
+
+  uint32_t FSMC_MemoryDataWidth;  /* Specifies the external memory device width.
+                                     This parameter can be any value of @ref FSMC_Data_Width */
+
+  uint32_t FSMC_ECC;              /* Enables or disables the ECC computation.
+                                     This parameter can be any value of @ref FSMC_ECC */
+
+  uint32_t FSMC_ECCPageSize;      /* Defines the page size for the extended ECC.
+                                     This parameter can be any value of @ref FSMC_ECC_Page_Size */
+
+  uint32_t FSMC_TCLRSetupTime;    /* Defines the number of HCLK cycles to configure the
+                                     delay between CLE low and RE low.
+                                     This parameter can be a value between 0 and 0xFF. */
+
+  uint32_t FSMC_TARSetupTime;     /* Defines the number of HCLK cycles to configure the
+                                     delay between ALE low and RE low.
+                                     This parameter can be a number between 0x0 and 0xFF */
+
+  FSMC_NAND_PCCARDTimingInitTypeDef*  FSMC_CommonSpaceTimingStruct;   /* FSMC Common Space Timing */
+
+  FSMC_NAND_PCCARDTimingInitTypeDef*  FSMC_AttributeSpaceTimingStruct; /* FSMC Attribute Space Timing */
+}FSMC_NANDInitTypeDef;
+
+
+/* FSMC_NORSRAM_Bank */
+#define FSMC_Bank1_NORSRAM1                             ((uint32_t)0x00000000)
+
+/* FSMC_NAND_Bank */
+#define FSMC_Bank2_NAND                                 ((uint32_t)0x00000010)
+
+/* FSMC_Data_Address_Bus_Multiplexing */
+#define FSMC_DataAddressMux_Disable                     ((uint32_t)0x00000000)
+#define FSMC_DataAddressMux_Enable                      ((uint32_t)0x00000002)
+
+/* FSMC_Memory_Type */
+#define FSMC_MemoryType_SRAM                            ((uint32_t)0x00000000)
+#define FSMC_MemoryType_PSRAM                           ((uint32_t)0x00000004)
+#define FSMC_MemoryType_NOR                             ((uint32_t)0x00000008)
+
+/* FSMC_Data_Width */
+#define FSMC_MemoryDataWidth_8b                         ((uint32_t)0x00000000)
+#define FSMC_MemoryDataWidth_16b                        ((uint32_t)0x00000010)
+
+/* FSMC_Burst_Access_Mode */
+#define FSMC_BurstAccessMode_Disable                    ((uint32_t)0x00000000) 
+#define FSMC_BurstAccessMode_Enable                     ((uint32_t)0x00000100)
+
+/* FSMC_AsynchronousWait */
+#define FSMC_AsynchronousWait_Disable                   ((uint32_t)0x00000000)
+#define FSMC_AsynchronousWait_Enable                    ((uint32_t)0x00008000)
+
+/* FSMC_Wait_Signal_Polarity */
+#define FSMC_WaitSignalPolarity_Low                     ((uint32_t)0x00000000)
+#define FSMC_WaitSignalPolarity_High                    ((uint32_t)0x00000200)
+
+/* FSMC_Wait_Timing */
+#define FSMC_WaitSignalActive_BeforeWaitState           ((uint32_t)0x00000000)
+#define FSMC_WaitSignalActive_DuringWaitState           ((uint32_t)0x00000800) 
+
+/* FSMC_Write_Operation */
+#define FSMC_WriteOperation_Disable                     ((uint32_t)0x00000000)
+#define FSMC_WriteOperation_Enable                      ((uint32_t)0x00001000)
+
+/* FSMC_Wait_Signal */
+#define FSMC_WaitSignal_Disable                         ((uint32_t)0x00000000)
+#define FSMC_WaitSignal_Enable                          ((uint32_t)0x00002000) 
+
+/* FSMC_Extended_Mode */
+#define FSMC_ExtendedMode_Disable                       ((uint32_t)0x00000000)
+#define FSMC_ExtendedMode_Enable                        ((uint32_t)0x00004000)
+
+/* FSMC_Write_Burst */
+#define FSMC_WriteBurst_Disable                         ((uint32_t)0x00000000)
+#define FSMC_WriteBurst_Enable                          ((uint32_t)0x00080000) 
+
+/* FSMC_Access_Mode */
+#define FSMC_AccessMode_A                               ((uint32_t)0x00000000)
+#define FSMC_AccessMode_B                               ((uint32_t)0x10000000) 
+#define FSMC_AccessMode_C                               ((uint32_t)0x20000000)
+#define FSMC_AccessMode_D                               ((uint32_t)0x30000000)
+
+/* FSMC_Wait_feature */
+#define FSMC_Waitfeature_Disable                        ((uint32_t)0x00000000)
+#define FSMC_Waitfeature_Enable                         ((uint32_t)0x00000002)
+
+/* FSMC_ECC */
+#define FSMC_ECC_Disable                                ((uint32_t)0x00000000)
+#define FSMC_ECC_Enable                                 ((uint32_t)0x00000040)
+
+/* FSMC_ECC_Page_Size */
+#define FSMC_ECCPageSize_256Bytes                       ((uint32_t)0x00000000)
+#define FSMC_ECCPageSize_512Bytes                       ((uint32_t)0x00020000)
+#define FSMC_ECCPageSize_1024Bytes                      ((uint32_t)0x00040000)
+#define FSMC_ECCPageSize_2048Bytes                      ((uint32_t)0x00060000)
+#define FSMC_ECCPageSize_4096Bytes                      ((uint32_t)0x00080000)
+#define FSMC_ECCPageSize_8192Bytes                      ((uint32_t)0x000A0000)
+
+#define FSMC_FLAG_FEMPT                                 ((uint32_t)0x00000040)
+
+
+void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank);
+void FSMC_NANDDeInit(uint32_t FSMC_Bank);
+void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct);
+void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct);
+void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct);
+void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct);
+void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);
+void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState);
+void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState);
+uint32_t FSMC_GetECC(uint32_t FSMC_Bank);
+FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 

+ 196 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_gpio.h

@@ -0,0 +1,196 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_gpio.h
+* Author             : WCH
+* Version            : V1.0.1
+* Date               : 2025/04/09
+* 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 __CH32V30x_GPIO_H
+#define __CH32V30x_GPIO_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 */
+/* PCFR1 */
+#define GPIO_Remap_SPI1             ((uint32_t)0x00000001)  /* SPI1 Alternate Function mapping */
+#define GPIO_Remap_I2C1             ((uint32_t)0x00000002)  /* I2C1 Alternate Function mapping */
+#define GPIO_Remap_USART1           ((uint32_t)0x00000004)  /* USART1 Alternate Function mapping low bit */
+#define GPIO_Remap_USART2           ((uint32_t)0x00000008)  /* USART2 Alternate Function mapping */
+#define GPIO_PartialRemap_USART3    ((uint32_t)0x00140010)  /* USART3 Partial Alternate Function mapping */
+#define GPIO_PartialRemap1_USART3   ((uint32_t)0x00140020)  /* USART3 Partial1 Alternate Function mapping */
+#define GPIO_FullRemap_USART3       ((uint32_t)0x00140030)  /* USART3 Full Alternate Function mapping */
+#define GPIO_PartialRemap_TIM1      ((uint32_t)0x00160040)  /* TIM1 Partial Alternate Function mapping */
+#define GPIO_FullRemap_TIM1         ((uint32_t)0x001600C0)  /* TIM1 Full Alternate Function mapping */
+#define GPIO_PartialRemap1_TIM2     ((uint32_t)0x00180100)  /* TIM2 Partial1 Alternate Function mapping */
+#define GPIO_PartialRemap2_TIM2     ((uint32_t)0x00180200)  /* TIM2 Partial2 Alternate Function mapping */
+#define GPIO_FullRemap_TIM2         ((uint32_t)0x00180300)  /* TIM2 Full Alternate Function mapping */
+#define GPIO_PartialRemap_TIM3      ((uint32_t)0x001A0800)  /* TIM3 Partial Alternate Function mapping */
+#define GPIO_FullRemap_TIM3         ((uint32_t)0x001A0C00)  /* TIM3 Full 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_PD0PD1           ((uint32_t)0x00008000)  /* PD0 and PD1 Alternate Function mapping */
+#define GPIO_Remap_TIM5CH4_LSI      ((uint32_t)0x00200001)  /* LSI connected to TIM5 Channel4 input capture for calibration */
+#define GPIO_Remap_ADC1_ETRGINJ     ((uint32_t)0x00200002)  /* ADC1 External Trigger Injected Conversion remapping */
+#define GPIO_Remap_ADC1_ETRGREG     ((uint32_t)0x00200004)  /* ADC1 External Trigger Regular Conversion remapping */
+#define GPIO_Remap_ADC2_ETRGINJ     ((uint32_t)0x00200008)  /* ADC2 External Trigger Injected Conversion remapping */
+#define GPIO_Remap_ADC2_ETRGREG     ((uint32_t)0x00200010)  /* ADC2 External Trigger Regular Conversion remapping */
+#define GPIO_Remap_ETH              ((uint32_t)0x00200020)  /* Ethernet remapping (only for Connectivity line devices) */
+#define GPIO_Remap_CAN2             ((uint32_t)0x00200040)  /* CAN2 remapping (only for Connectivity line devices) */
+#define GPIO_Remap_MII_RMII_SEL     ((uint32_t)0x00200080)  /* MII or RMII selection */
+#define GPIO_Remap_SWJ_Disable      ((uint32_t)0x00300400)  /* Full SWJ Disabled */
+#define GPIO_Remap_SPI3             ((uint32_t)0x00201000)  /* SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) */
+#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000)  /* Ethernet PTP output or USB OTG SOF (Start of Frame) connected
+                                                               to TIM2 Internal Trigger 1 for calibration
+                                                               (only for Connectivity line devices) */
+#define GPIO_Remap_PTP_PPS          ((uint32_t)0x00204000)  /* Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */
+#define GPIO_Remap_PD01             GPIO_Remap_PD0PD1
+
+/* PCFR2 */
+#define GPIO_Remap_TIM8             ((uint32_t)0x80000004)  /* TIM8 Alternate Function mapping */
+#define GPIO_PartialRemap_TIM9      ((uint32_t)0x80130008)  /* TIM9 Partial Alternate Function mapping */
+#define GPIO_FullRemap_TIM9         ((uint32_t)0x80130010)  /* TIM9 Full Alternate Function mapping */
+#define GPIO_PartialRemap_TIM10     ((uint32_t)0x80150020)  /* TIM10 Partial Alternate Function mapping */
+#define GPIO_FullRemap_TIM10        ((uint32_t)0x80150040)  /* TIM10 Full Alternate Function mapping */
+#define GPIO_Remap_FSMC_NADV        ((uint32_t)0x80000400)  /* FSMC_NADV Alternate Function mapping */
+#define GPIO_PartialRemap_USART4    ((uint32_t)0x80300001)  /* USART4 Partial Alternate Function mapping */
+#define GPIO_FullRemap_USART4       ((uint32_t)0x80300002)  /* USART4 Full Alternate Function mapping */
+#define GPIO_PartialRemap_USART5    ((uint32_t)0x80320004)  /* USART5 Partial Alternate Function mapping */
+#define GPIO_FullRemap_USART5       ((uint32_t)0x80320008)  /* USART5 Full Alternate Function mapping */
+#define GPIO_PartialRemap_USART6    ((uint32_t)0x80340010)  /* USART6 Partial Alternate Function mapping */
+#define GPIO_FullRemap_USART6       ((uint32_t)0x80340020)  /* USART6 Full Alternate Function mapping */
+#define GPIO_PartialRemap_USART7    ((uint32_t)0x80360040)  /* USART7 Partial Alternate Function mapping */
+#define GPIO_FullRemap_USART7       ((uint32_t)0x80360080)  /* USART7 Full Alternate Function mapping */
+#define GPIO_PartialRemap_USART8    ((uint32_t)0x80380100)  /* USART8 Partial Alternate Function mapping */
+#define GPIO_FullRemap_USART8       ((uint32_t)0x80380200)  /* USART8 Full Alternate Function mapping */
+#define GPIO_Remap_USART1_HighBit   ((uint32_t)0x80200400)  /* USART1 Alternate Function mapping high bit */
+
+
+/* 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)
+#define GPIO_PortSourceGPIOE        ((uint8_t)0x04)
+
+/* 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)
+
+/* Ethernet_Media_Interface */
+#define GPIO_ETH_MediaInterface_MII    ((u32)0x00000000)
+#define GPIO_ETH_MediaInterface_RMII   ((u32)0x00000001)
+
+
+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_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+
+
+

+ 439 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_i2c.h

@@ -0,0 +1,439 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_i2c.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_I2C_H
+#define __CH32V30x_I2C_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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)
+
+/* SR2 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)
+
+/* SR1 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 (CH32V30x_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 
+
+
+
+
+
+
+
+

+ 58 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_iwdg.h

@@ -0,0 +1,58 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_iwdg.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_IWDG_H
+#define __CH32V30x_IWDG_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 
+
+
+
+
+
+
+

+ 93 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_misc.h

@@ -0,0 +1,93 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_misc.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/03/06
+* 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 __CH32V30X_MISC_H
+#define __CH32V30X_MISC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* CSR_INTSYSCR_INEST_definition */
+#define INTSYSCR_INEST_NoEN        0x00   /* interrupt nesting disable(CSR-0x804 bit1 = 0) */
+#define INTSYSCR_INEST_EN_2Level   0x01   /* interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) */
+#define INTSYSCR_INEST_EN_4Level   0x02   /* interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) */
+#define INTSYSCR_INEST_EN_8Level   0x03   /* interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) */
+
+/* Check the configuration of CSR(0x804) in the startup file(.S)
+ *   interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3)
+ *     priority - bit[7:5] - Preemption Priority
+ *                bit[4:0] - Reserve
+ *   interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2)
+ *     priority - bit[7:6] - Preemption Priority
+ *                bit[5] - Sub priority
+ *                bit[4:0] - Reserve
+ *   interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 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_4Level
+#endif
+
+/* NVIC Init Structure definition
+ *   interrupt nesting disable(CSR-0x804 bit1 = 0)
+ *     NVIC_IRQChannelPreemptionPriority - range is 0.
+ *     NVIC_IRQChannelSubPriority - range from 0 to 7.
+ *
+ *   interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1)
+ *     NVIC_IRQChannelPreemptionPriority - range from 0 to 1.
+ *     NVIC_IRQChannelSubPriority - range from 0 to 3.
+ *
+ *   interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2)
+ *     NVIC_IRQChannelPreemptionPriority - range from 0 to 3.
+ *     NVIC_IRQChannelSubPriority - range from 0 to 1.
+ *
+ *   interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3)
+ *     NVIC_IRQChannelPreemptionPriority - range from 0 to 7.
+ *     NVIC_IRQChannelSubPriority - range range is 0.
+ */
+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) */
+#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_2Level)
+#define NVIC_PriorityGroup_1           ((uint32_t)0x01) /* interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) */
+#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_8Level)
+#define NVIC_PriorityGroup_3           ((uint32_t)0x03) /* interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) */
+#else
+#define NVIC_PriorityGroup_2           ((uint32_t)0x02) /* interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) */
+#endif
+
+void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
+void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+

+ 77 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_opa.h

@@ -0,0 +1,77 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_opa.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_OPA_H
+#define __CH32V30x_OPA_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+#define OPA_PSEL_OFFSET 3
+#define OPA_NSEL_OFFSET 2
+#define OPA_MODE_OFFSET 1
+
+
+/* OPA member enumeration */
+typedef enum
+{
+   OPA1=0,
+   OPA2,
+   OPA3,
+   OPA4
+}OPA_Num_TypeDef;
+
+/* OPA PSEL enumeration */
+typedef enum
+{
+   CHP0=0,
+   CHP1
+}OPA_PSEL_TypeDef;
+
+/* OPA NSEL enumeration */
+typedef enum
+{
+   CHN0=0,
+   CHN1
+}OPA_NSEL_TypeDef;
+
+/* OPA out channel enumeration */
+typedef enum
+{
+   OUT_IO_OUT0=0,
+   OUT_IO_OUT1
+}OPA_Mode_TypeDef;
+
+/* OPA Init Structure definition */
+typedef struct
+{
+  OPA_Num_TypeDef   OPA_NUM;      /* Specifies the members of OPA */
+  OPA_PSEL_TypeDef  PSEL;         /* Specifies the positive channel of OPA */
+  OPA_NSEL_TypeDef  NSEL;         /* Specifies the negative channel of OPA */
+  OPA_Mode_TypeDef  Mode;         /* Specifies the mode of OPA */
+}OPA_InitTypeDef;
+
+
+void OPA_DeInit(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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+

+ 77 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_pwr.h

@@ -0,0 +1,77 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_pwr.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_PWR_H
+#define __CH32V30x_PWR_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* PVD_detection_level  */
+#define PWR_PVDLevel_MODE0          ((uint32_t)0x00000000)
+#define PWR_PVDLevel_MODE1          ((uint32_t)0x00000020)
+#define PWR_PVDLevel_MODE2          ((uint32_t)0x00000040)
+#define PWR_PVDLevel_MODE3          ((uint32_t)0x00000060)
+#define PWR_PVDLevel_MODE4          ((uint32_t)0x00000080)
+#define PWR_PVDLevel_MODE5          ((uint32_t)0x000000A0)
+#define PWR_PVDLevel_MODE6          ((uint32_t)0x000000C0)
+#define PWR_PVDLevel_MODE7          ((uint32_t)0x000000E0)
+
+
+
+#define PWR_PVDLevel_2V2            PWR_PVDLevel_MODE0
+#define PWR_PVDLevel_2V3            PWR_PVDLevel_MODE1
+#define PWR_PVDLevel_2V4            PWR_PVDLevel_MODE2
+#define PWR_PVDLevel_2V5            PWR_PVDLevel_MODE3
+#define PWR_PVDLevel_2V6            PWR_PVDLevel_MODE4
+#define PWR_PVDLevel_2V7            PWR_PVDLevel_MODE5
+#define PWR_PVDLevel_2V8            PWR_PVDLevel_MODE6
+#define PWR_PVDLevel_2V9            PWR_PVDLevel_MODE7
+	 
+/* 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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+

+ 464 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_rcc.h

@@ -0,0 +1,464 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_rcc.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/03/06
+* 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 __CH32V30x_RCC_H
+#define __CH32V30x_RCC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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)
+
+#ifdef CH32V30x_D8
+#define RCC_PLLSource_HSE_Div1           ((uint32_t)0x00010000)
+#define RCC_PLLSource_HSE_Div2           ((uint32_t)0x00030000)
+
+#else
+#define RCC_PLLSource_PREDIV1            ((uint32_t)0x00010000)
+
+#endif
+
+/* PLL_multiplication_factor */
+#ifdef CH32V30x_D8
+#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)
+
+#else
+#define RCC_PLLMul_18_EXTEN              ((uint32_t)0x00000000)
+#define RCC_PLLMul_3_EXTEN               ((uint32_t)0x00040000)
+#define RCC_PLLMul_4_EXTEN               ((uint32_t)0x00080000)
+#define RCC_PLLMul_5_EXTEN               ((uint32_t)0x000C0000)
+#define RCC_PLLMul_6_EXTEN               ((uint32_t)0x00100000)
+#define RCC_PLLMul_7_EXTEN               ((uint32_t)0x00140000)
+#define RCC_PLLMul_8_EXTEN               ((uint32_t)0x00180000)
+#define RCC_PLLMul_9_EXTEN               ((uint32_t)0x001C0000)
+#define RCC_PLLMul_10_EXTEN              ((uint32_t)0x00200000)
+#define RCC_PLLMul_11_EXTEN              ((uint32_t)0x00240000)
+#define RCC_PLLMul_12_EXTEN              ((uint32_t)0x00280000)
+#define RCC_PLLMul_13_EXTEN              ((uint32_t)0x002C0000)
+#define RCC_PLLMul_14_EXTEN              ((uint32_t)0x00300000)
+#define RCC_PLLMul_6_5_EXTEN             ((uint32_t)0x00340000)
+#define RCC_PLLMul_15_EXTEN              ((uint32_t)0x00380000)
+#define RCC_PLLMul_16_EXTEN              ((uint32_t)0x003C0000)
+
+#endif
+
+/* PREDIV1_division_factor */
+#ifdef CH32V30x_D8C
+#define RCC_PREDIV1_Div1                 ((uint32_t)0x00000000)
+#define RCC_PREDIV1_Div2                 ((uint32_t)0x00000001)
+#define RCC_PREDIV1_Div3                 ((uint32_t)0x00000002)
+#define RCC_PREDIV1_Div4                 ((uint32_t)0x00000003)
+#define RCC_PREDIV1_Div5                 ((uint32_t)0x00000004)
+#define RCC_PREDIV1_Div6                 ((uint32_t)0x00000005)
+#define RCC_PREDIV1_Div7                 ((uint32_t)0x00000006)
+#define RCC_PREDIV1_Div8                 ((uint32_t)0x00000007)
+#define RCC_PREDIV1_Div9                 ((uint32_t)0x00000008)
+#define RCC_PREDIV1_Div10                ((uint32_t)0x00000009)
+#define RCC_PREDIV1_Div11                ((uint32_t)0x0000000A)
+#define RCC_PREDIV1_Div12                ((uint32_t)0x0000000B)
+#define RCC_PREDIV1_Div13                ((uint32_t)0x0000000C)
+#define RCC_PREDIV1_Div14                ((uint32_t)0x0000000D)
+#define RCC_PREDIV1_Div15                ((uint32_t)0x0000000E)
+#define RCC_PREDIV1_Div16                ((uint32_t)0x0000000F)
+
+#endif
+
+/* PREDIV1_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_PREDIV1_Source_HSE           ((uint32_t)0x00000000)
+#define RCC_PREDIV1_Source_PLL2          ((uint32_t)0x00010000)
+
+#endif
+
+/* PREDIV2_division_factor */
+#ifdef CH32V30x_D8C
+#define RCC_PREDIV2_Div1                 ((uint32_t)0x00000000)
+#define RCC_PREDIV2_Div2                 ((uint32_t)0x00000010)
+#define RCC_PREDIV2_Div3                 ((uint32_t)0x00000020)
+#define RCC_PREDIV2_Div4                 ((uint32_t)0x00000030)
+#define RCC_PREDIV2_Div5                 ((uint32_t)0x00000040)
+#define RCC_PREDIV2_Div6                 ((uint32_t)0x00000050)
+#define RCC_PREDIV2_Div7                 ((uint32_t)0x00000060)
+#define RCC_PREDIV2_Div8                 ((uint32_t)0x00000070)
+#define RCC_PREDIV2_Div9                 ((uint32_t)0x00000080)
+#define RCC_PREDIV2_Div10                ((uint32_t)0x00000090)
+#define RCC_PREDIV2_Div11                ((uint32_t)0x000000A0)
+#define RCC_PREDIV2_Div12                ((uint32_t)0x000000B0)
+#define RCC_PREDIV2_Div13                ((uint32_t)0x000000C0)
+#define RCC_PREDIV2_Div14                ((uint32_t)0x000000D0)
+#define RCC_PREDIV2_Div15                ((uint32_t)0x000000E0)
+#define RCC_PREDIV2_Div16                ((uint32_t)0x000000F0)
+
+#endif
+
+/* PLL2_multiplication_factor */
+#ifdef CH32V30x_D8C
+#define RCC_PLL2Mul_2_5                  ((uint32_t)0x00000000)
+#define RCC_PLL2Mul_12_5                 ((uint32_t)0x00000100)
+#define RCC_PLL2Mul_4                    ((uint32_t)0x00000200)
+#define RCC_PLL2Mul_5                    ((uint32_t)0x00000300)
+#define RCC_PLL2Mul_6                    ((uint32_t)0x00000400)
+#define RCC_PLL2Mul_7                    ((uint32_t)0x00000500)
+#define RCC_PLL2Mul_8                    ((uint32_t)0x00000600)
+#define RCC_PLL2Mul_9                    ((uint32_t)0x00000700)
+#define RCC_PLL2Mul_10                   ((uint32_t)0x00000800)
+#define RCC_PLL2Mul_11                   ((uint32_t)0x00000900)
+#define RCC_PLL2Mul_12                   ((uint32_t)0x00000A00)
+#define RCC_PLL2Mul_13                   ((uint32_t)0x00000B00)
+#define RCC_PLL2Mul_14                   ((uint32_t)0x00000C00)
+#define RCC_PLL2Mul_15                   ((uint32_t)0x00000D00)
+#define RCC_PLL2Mul_16                   ((uint32_t)0x00000E00)
+#define RCC_PLL2Mul_20                   ((uint32_t)0x00000F00)
+
+#endif
+
+/* PLL3_multiplication_factor */
+#ifdef CH32V30x_D8C
+#define RCC_PLL3Mul_2_5                  ((uint32_t)0x00000000)
+#define RCC_PLL3Mul_12_5                 ((uint32_t)0x00001000)
+#define RCC_PLL3Mul_4                    ((uint32_t)0x00002000)
+#define RCC_PLL3Mul_5                    ((uint32_t)0x00003000)
+#define RCC_PLL3Mul_6                    ((uint32_t)0x00004000)
+#define RCC_PLL3Mul_7                    ((uint32_t)0x00005000)
+#define RCC_PLL3Mul_8                    ((uint32_t)0x00006000)
+#define RCC_PLL3Mul_9                    ((uint32_t)0x00007000)
+#define RCC_PLL3Mul_10                   ((uint32_t)0x00008000)
+#define RCC_PLL3Mul_11                   ((uint32_t)0x00009000)
+#define RCC_PLL3Mul_12                   ((uint32_t)0x0000A000)
+#define RCC_PLL3Mul_13                   ((uint32_t)0x0000B000)
+#define RCC_PLL3Mul_14                   ((uint32_t)0x0000C000)
+#define RCC_PLL3Mul_15                   ((uint32_t)0x0000D000)
+#define RCC_PLL3Mul_16                   ((uint32_t)0x0000E000)
+#define RCC_PLL3Mul_20                   ((uint32_t)0x0000F000)
+
+#endif
+
+/* System_clock_source */
+#define RCC_SYSCLKSource_HSI             ((uint32_t)0x00000000)
+#define RCC_SYSCLKSource_HSE             ((uint32_t)0x00000001)
+#define RCC_SYSCLKSource_PLLCLK          ((uint32_t)0x00000002)
+
+/* AHB_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)
+
+/* APB1_APB2_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)
+
+#ifdef CH32V30x_D8C
+#define RCC_IT_PLL2RDY                   ((uint8_t)0x20)
+#define RCC_IT_PLL3RDY                   ((uint8_t)0x40)
+
+#endif
+
+/* USBFS_clock_source */
+#define RCC_USBFSCLKSource_PLLCLK_Div1   ((uint8_t)0x00)
+#define RCC_USBFSCLKSource_PLLCLK_Div2   ((uint8_t)0x01)
+#define RCC_USBFSCLKSource_PLLCLK_Div3   ((uint8_t)0x02)
+
+#define RCC_OTGFSCLKSource_PLLCLK_Div1   RCC_USBFSCLKSource_PLLCLK_Div1
+#define RCC_OTGFSCLKSource_PLLCLK_Div2   RCC_USBFSCLKSource_PLLCLK_Div2
+#define RCC_OTGFSCLKSource_PLLCLK_Div3   RCC_USBFSCLKSource_PLLCLK_Div3
+
+/* I2S2_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_I2S2CLKSource_SYSCLK         ((uint8_t)0x00)
+#define RCC_I2S2CLKSource_PLL3_VCO       ((uint8_t)0x01)
+
+#endif
+
+/* I2S3_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_I2S3CLKSource_SYSCLK         ((uint8_t)0x00)
+#define RCC_I2S3CLKSource_PLL3_VCO       ((uint8_t)0x01)
+
+#endif
+
+/* 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)
+
+/* 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)
+
+/* AHB_peripheral */
+#define RCC_AHBPeriph_DMA1               ((uint32_t)0x00000001)
+#define RCC_AHBPeriph_DMA2               ((uint32_t)0x00000002)
+#define RCC_AHBPeriph_SRAM               ((uint32_t)0x00000004)
+#define RCC_AHBPeriph_CRC                ((uint32_t)0x00000040)
+#define RCC_AHBPeriph_FSMC               ((uint32_t)0x00000100)
+#define RCC_AHBPeriph_RNG                ((uint32_t)0x00000200)
+#define RCC_AHBPeriph_SDIO               ((uint32_t)0x00000400)
+#define RCC_AHBPeriph_USBHS              ((uint32_t)0x00000800)
+#define RCC_AHBPeriph_USBFS              ((uint32_t)0x00001000)
+#define RCC_AHBPeriph_DVP                ((uint32_t)0x00002000)
+#define RCC_AHBPeriph_ETH_MAC            ((uint32_t)0x00004000)
+#define RCC_AHBPeriph_ETH_MAC_Tx         ((uint32_t)0x00008000)
+#define RCC_AHBPeriph_ETH_MAC_Rx         ((uint32_t)0x00010000)
+#define RCC_AHBPeriph_OTG_FS             RCC_AHBPeriph_USBFS
+
+/* APB2_peripheral */
+#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
+#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
+#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
+#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
+#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
+#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
+#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
+#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
+#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
+#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
+#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
+#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
+#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
+#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
+
+/* APB1_peripheral */
+#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
+#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
+#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
+#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
+#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
+#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
+#define RCC_APB1Periph_UART6             ((uint32_t)0x00000040)
+#define RCC_APB1Periph_UART7             ((uint32_t)0x00000080)
+#define RCC_APB1Periph_UART8             ((uint32_t)0x00000100)
+#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
+#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
+#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
+#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
+#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
+#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
+#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
+#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
+#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)
+#define RCC_APB1Periph_USB               ((uint32_t)0x00800000)
+#define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)
+#define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)
+#define RCC_APB1Periph_BKP               ((uint32_t)0x08000000)
+#define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)
+#define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)
+
+/* 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)
+
+#ifdef CH32V30x_D8C
+#define RCC_MCO_PLL2CLK                  ((uint8_t)0x08)
+#define RCC_MCO_PLL3CLK_Div2             ((uint8_t)0x09)
+#define RCC_MCO_XT1                      ((uint8_t)0x0A)
+#define RCC_MCO_PLL3CLK                  ((uint8_t)0x0B)
+
+#endif
+
+/* 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)
+
+#ifdef CH32V30x_D8C
+#define RCC_FLAG_PLL2RDY                 ((uint8_t)0x3B)
+#define RCC_FLAG_PLL3RDY                 ((uint8_t)0x3D)
+
+#endif
+
+/* SysTick_clock_source */
+#define SysTick_CLKSource_HCLK_Div8      ((uint32_t)0xFFFFFFFB)
+#define SysTick_CLKSource_HCLK           ((uint32_t)0x00000004)
+
+/* RNG_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_RNGCLKSource_SYSCLK          ((uint32_t)0x00)
+#define RCC_RNGCLKSource_PLL3_VCO        ((uint32_t)0x01)
+
+#endif
+
+/* ETH1G_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_ETH1GCLKSource_PLL2_VCO      ((uint32_t)0x00)
+#define RCC_ETH1GCLKSource_PLL3_VCO      ((uint32_t)0x01)
+#define RCC_ETH1GCLKSource_PB1_IN        ((uint32_t)0x02)
+
+#endif
+
+/* USBFS_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_USBPLL_Div1                  ((uint32_t)0x00)
+#define RCC_USBPLL_Div2                  ((uint32_t)0x01)
+#define RCC_USBPLL_Div3                  ((uint32_t)0x02)
+#define RCC_USBPLL_Div4                  ((uint32_t)0x03)
+#define RCC_USBPLL_Div5                  ((uint32_t)0x04)
+#define RCC_USBPLL_Div6                  ((uint32_t)0x05)
+#define RCC_USBPLL_Div7                  ((uint32_t)0x06)
+#define RCC_USBPLL_Div8                  ((uint32_t)0x07)
+
+#endif
+
+/* USBHSPLL_clock_source */
+#ifdef CH32V30x_D8C
+#define RCC_HSBHSPLLCLKSource_HSE        ((uint32_t)0x00)
+#define RCC_HSBHSPLLCLKSource_HSI        ((uint32_t)0x01)
+
+#endif
+
+/* USBHSPLLCKREF_clock_select */
+#ifdef CH32V30x_D8C
+#define RCC_USBHSPLLCKREFCLK_3M          ((uint32_t)0x00)
+#define RCC_USBHSPLLCKREFCLK_4M          ((uint32_t)0x01)
+#define RCC_USBHSPLLCKREFCLK_8M          ((uint32_t)0x02)
+#define RCC_USBHSPLLCKREFCLK_5M          ((uint32_t)0x03)
+
+#endif
+
+/* OTGUSBCLK48M_clock_source */
+#define RCC_USBCLK48MCLKSource_PLLCLK    ((uint32_t)0x00)
+#define RCC_USBCLK48MCLKSource_USBPHY    ((uint32_t)0x01)
+
+
+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_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_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
+void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
+void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); 
+void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
+void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, 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_ADCCLKADJcmd(FunctionalState NewState);
+void RCC_USBFSCLKConfig(uint32_t RCC_USBFSCLKSource);
+void RCC_USBCLK48MConfig(uint32_t RCC_USBCLK48MSource);
+#define RCC_OTGFSCLKConfig  RCC_USBFSCLKConfig
+
+#ifdef CH32V30x_D8C
+void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div);
+void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div);
+void RCC_PLL2Config(uint32_t RCC_PLL2Mul);
+void RCC_PLL2Cmd(FunctionalState NewState);
+void RCC_PLL3Config(uint32_t RCC_PLL3Mul);
+void RCC_PLL3Cmd(FunctionalState NewState);
+void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource);
+void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource);
+void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
+void RCC_RNGCLKConfig(uint32_t RCC_RNGCLKSource);
+void RCC_ETH1GCLKConfig(uint32_t RCC_ETH1GCLKSource);
+void RCC_ETH1G_125Mcmd(FunctionalState NewState);
+void RCC_USBHSConfig(uint32_t RCC_USBHS);
+void RCC_USBHSPLLCLKConfig(uint32_t RCC_USBHSPLLCLKSource);
+void RCC_USBHSPLLCKREFCLKConfig(uint32_t RCC_USBHSPLLCKREFCLKSource);
+void RCC_USBHSPHYPLLALIVEcmd(FunctionalState NewState);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+

+ 43 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_rng.h

@@ -0,0 +1,43 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_rng.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file contains all the functions prototypes for the
+*                      RNG 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 __CH32V30x_RNG_H
+#define __CH32V30x_RNG_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+#include "ch32v30x.h"
+
+ /* RNG_flags_definition*/
+#define RNG_FLAG_DRDY               ((uint8_t)0x0001) /* Data ready */
+#define RNG_FLAG_CECS               ((uint8_t)0x0002) /* Clock error current status */
+#define RNG_FLAG_SECS               ((uint8_t)0x0004) /* Seed error current status */
+
+/* RNG_interrupts_definition */
+#define RNG_IT_CEI                  ((uint8_t)0x20) /* Clock error interrupt */
+#define RNG_IT_SEI                  ((uint8_t)0x40) /* Seed error interrupt */
+
+
+void RNG_Cmd(FunctionalState NewState);
+uint32_t RNG_GetRandomNumber(void);
+void RNG_ITConfig(FunctionalState NewState);
+FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);
+void RNG_ClearFlag(uint8_t RNG_FLAG);
+ITStatus RNG_GetITStatus(uint8_t RNG_IT);
+void RNG_ClearITPendingBit(uint8_t RNG_IT);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 56 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_rtc.h

@@ -0,0 +1,56 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_rtc.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_RTC_H
+#define __CH32V30x_RTC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 
+

+ 266 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_sdio.h

@@ -0,0 +1,266 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_sdio.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file contains all the functions prototypes for the SDIO
+*                      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 __CH32V30x_SDIO_H
+#define __CH32V30x_SDIO_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* SDIO Init structure definition */
+typedef struct
+{
+  uint32_t SDIO_ClockEdge;            /* Specifies the clock transition on which the bit capture is made.
+                                         This parameter can be a value of @ref SDIO_Clock_Edge */
+
+  uint32_t SDIO_ClockBypass;          /* Specifies whether the SDIO Clock divider bypass is
+                                         enabled or disabled.
+                                         This parameter can be a value of @ref SDIO_Clock_Bypass */
+
+  uint32_t SDIO_ClockPowerSave;       /* Specifies whether SDIO Clock output is enabled or
+                                         disabled when the bus is idle.
+                                         This parameter can be a value of @ref SDIO_Clock_Power_Save */
+
+  uint32_t SDIO_BusWide;              /* Specifies the SDIO bus width.
+                                         This parameter can be a value of @ref SDIO_Bus_Wide */
+
+  uint32_t SDIO_HardwareFlowControl;  /* Specifies whether the SDIO hardware flow control is enabled or disabled.
+                                         This parameter can be a value of @ref SDIO_Hardware_Flow_Control */
+
+  uint8_t SDIO_ClockDiv;              /* Specifies the clock frequency of the SDIO controller.
+                                         This parameter can be a value between 0x00 and 0xFF. */
+                                           
+} SDIO_InitTypeDef;
+
+
+typedef struct
+{
+  uint32_t SDIO_Argument;  /* Specifies the SDIO command argument which is sent
+                              to a card as part of a command message. If a command
+                              contains an argument, it must be loaded into this register
+                              before writing the command to the command register */
+
+  uint32_t SDIO_CmdIndex;  /* Specifies the SDIO command index. It must be lower than 0x40. */
+
+  uint32_t SDIO_Response;  /* Specifies the SDIO response type.
+                              This parameter can be a value of @ref SDIO_Response_Type */
+
+  uint32_t SDIO_Wait;      /* Specifies whether SDIO wait-for-interrupt request is enabled or disabled.
+                              This parameter can be a value of @ref SDIO_Wait_Interrupt_State */
+
+  uint32_t SDIO_CPSM;      /* Specifies whether SDIO Command path state machine (CPSM)
+                              is enabled or disabled.
+                              This parameter can be a value of @ref SDIO_CPSM_State */
+} SDIO_CmdInitTypeDef;
+
+typedef struct
+{
+  uint32_t SDIO_DataTimeOut;    /* Specifies the data timeout period in card bus clock periods. */
+
+  uint32_t SDIO_DataLength;     /* Specifies the number of data bytes to be transferred. */
+ 
+  uint32_t SDIO_DataBlockSize;  /* Specifies the data block size for block transfer.
+                                   This parameter can be a value of @ref SDIO_Data_Block_Size */
+ 
+  uint32_t SDIO_TransferDir;    /* Specifies the data transfer direction, whether the transfer
+                                   is a read or write.
+                                   This parameter can be a value of @ref SDIO_Transfer_Direction */
+ 
+  uint32_t SDIO_TransferMode;   /* Specifies whether data transfer is in stream or block mode.
+                                   This parameter can be a value of @ref SDIO_Transfer_Type */
+ 
+  uint32_t SDIO_DPSM;           /* Specifies whether SDIO Data path state machine (DPSM)
+                                   is enabled or disabled.
+                                   This parameter can be a value of @ref SDIO_DPSM_State */
+} SDIO_DataInitTypeDef;
+
+
+/* SDIO_Clock_Edge */
+#define SDIO_ClockEdge_Rising               ((uint32_t)0x00000000)
+#define SDIO_ClockEdge_Falling              ((uint32_t)0x00002000)
+
+/* SDIO_Clock_Bypass */
+#define SDIO_ClockBypass_Disable             ((uint32_t)0x00000000)
+#define SDIO_ClockBypass_Enable              ((uint32_t)0x00000400)    
+
+/* SDIO_Clock_Power_Save */
+#define SDIO_ClockPowerSave_Disable         ((uint32_t)0x00000000)
+#define SDIO_ClockPowerSave_Enable          ((uint32_t)0x00000200) 
+
+/* SDIO_Bus_Wide */
+#define SDIO_BusWide_1b                     ((uint32_t)0x00000000)
+#define SDIO_BusWide_4b                     ((uint32_t)0x00000800)
+#define SDIO_BusWide_8b                     ((uint32_t)0x00001000)
+
+/* SDIO_Hardware_Flow_Control */
+#define SDIO_HardwareFlowControl_Disable    ((uint32_t)0x00000000)
+#define SDIO_HardwareFlowControl_Enable     ((uint32_t)0x00004000)
+
+/* SDIO_Power_State */
+#define SDIO_PowerState_OFF                 ((uint32_t)0x00000000)
+#define SDIO_PowerState_ON                  ((uint32_t)0x00000003)
+
+/* SDIO_Interrupt_sources */
+#define SDIO_IT_CCRCFAIL                    ((uint32_t)0x00000001)
+#define SDIO_IT_DCRCFAIL                    ((uint32_t)0x00000002)
+#define SDIO_IT_CTIMEOUT                    ((uint32_t)0x00000004)
+#define SDIO_IT_DTIMEOUT                    ((uint32_t)0x00000008)
+#define SDIO_IT_TXUNDERR                    ((uint32_t)0x00000010)
+#define SDIO_IT_RXOVERR                     ((uint32_t)0x00000020)
+#define SDIO_IT_CMDREND                     ((uint32_t)0x00000040)
+#define SDIO_IT_CMDSENT                     ((uint32_t)0x00000080)
+#define SDIO_IT_DATAEND                     ((uint32_t)0x00000100)
+#define SDIO_IT_STBITERR                    ((uint32_t)0x00000200)
+#define SDIO_IT_DBCKEND                     ((uint32_t)0x00000400)
+#define SDIO_IT_CMDACT                      ((uint32_t)0x00000800)
+#define SDIO_IT_TXACT                       ((uint32_t)0x00001000)
+#define SDIO_IT_RXACT                       ((uint32_t)0x00002000)
+#define SDIO_IT_TXFIFOHE                    ((uint32_t)0x00004000)
+#define SDIO_IT_RXFIFOHF                    ((uint32_t)0x00008000)
+#define SDIO_IT_TXFIFOF                     ((uint32_t)0x00010000)
+#define SDIO_IT_RXFIFOF                     ((uint32_t)0x00020000)
+#define SDIO_IT_TXFIFOE                     ((uint32_t)0x00040000)
+#define SDIO_IT_RXFIFOE                     ((uint32_t)0x00080000)
+#define SDIO_IT_TXDAVL                      ((uint32_t)0x00100000)
+#define SDIO_IT_RXDAVL                      ((uint32_t)0x00200000)
+#define SDIO_IT_SDIOIT                      ((uint32_t)0x00400000)
+#define SDIO_IT_CEATAEND                    ((uint32_t)0x00800000)
+
+/* SDIO_Response_Type */
+#define SDIO_Response_No                    ((uint32_t)0x00000000)
+#define SDIO_Response_Short                 ((uint32_t)0x00000040)
+#define SDIO_Response_Long                  ((uint32_t)0x000000C0)
+
+/* SDIO_Wait_Interrupt_State */
+#define SDIO_Wait_No                        ((uint32_t)0x00000000)
+#define SDIO_Wait_IT                        ((uint32_t)0x00000100)
+#define SDIO_Wait_Pend                      ((uint32_t)0x00000200)
+
+/* SDIO_CPSM_State */
+#define SDIO_CPSM_Disable                    ((uint32_t)0x00000000)
+#define SDIO_CPSM_Enable                     ((uint32_t)0x00000400)
+
+/* SDIO_Response_Registers */
+#define SDIO_RESP1                          ((uint32_t)0x00000000)
+#define SDIO_RESP2                          ((uint32_t)0x00000004)
+#define SDIO_RESP3                          ((uint32_t)0x00000008)
+#define SDIO_RESP4                          ((uint32_t)0x0000000C)
+
+/* SDIO_Data_Block_Size */
+#define SDIO_DataBlockSize_1b               ((uint32_t)0x00000000)
+#define SDIO_DataBlockSize_2b               ((uint32_t)0x00000010)
+#define SDIO_DataBlockSize_4b               ((uint32_t)0x00000020)
+#define SDIO_DataBlockSize_8b               ((uint32_t)0x00000030)
+#define SDIO_DataBlockSize_16b              ((uint32_t)0x00000040)
+#define SDIO_DataBlockSize_32b              ((uint32_t)0x00000050)
+#define SDIO_DataBlockSize_64b              ((uint32_t)0x00000060)
+#define SDIO_DataBlockSize_128b             ((uint32_t)0x00000070)
+#define SDIO_DataBlockSize_256b             ((uint32_t)0x00000080)
+#define SDIO_DataBlockSize_512b             ((uint32_t)0x00000090)
+#define SDIO_DataBlockSize_1024b            ((uint32_t)0x000000A0)
+#define SDIO_DataBlockSize_2048b            ((uint32_t)0x000000B0)
+#define SDIO_DataBlockSize_4096b            ((uint32_t)0x000000C0)
+#define SDIO_DataBlockSize_8192b            ((uint32_t)0x000000D0)
+#define SDIO_DataBlockSize_16384b           ((uint32_t)0x000000E0)
+
+/* SDIO_Transfer_Direction */
+#define SDIO_TransferDir_ToCard             ((uint32_t)0x00000000)
+#define SDIO_TransferDir_ToSDIO             ((uint32_t)0x00000002)
+
+/* SDIO_Transfer_Type */
+#define SDIO_TransferMode_Block             ((uint32_t)0x00000000)
+#define SDIO_TransferMode_Stream            ((uint32_t)0x00000004)
+
+/* SDIO_DPSM_State */
+#define SDIO_DPSM_Disable                    ((uint32_t)0x00000000)
+#define SDIO_DPSM_Enable                     ((uint32_t)0x00000001)
+
+/* SDIO_Flags */
+#define SDIO_FLAG_CCRCFAIL                  ((uint32_t)0x00000001)
+#define SDIO_FLAG_DCRCFAIL                  ((uint32_t)0x00000002)
+#define SDIO_FLAG_CTIMEOUT                  ((uint32_t)0x00000004)
+#define SDIO_FLAG_DTIMEOUT                  ((uint32_t)0x00000008)
+#define SDIO_FLAG_TXUNDERR                  ((uint32_t)0x00000010)
+#define SDIO_FLAG_RXOVERR                   ((uint32_t)0x00000020)
+#define SDIO_FLAG_CMDREND                   ((uint32_t)0x00000040)
+#define SDIO_FLAG_CMDSENT                   ((uint32_t)0x00000080)
+#define SDIO_FLAG_DATAEND                   ((uint32_t)0x00000100)
+#define SDIO_FLAG_STBITERR                  ((uint32_t)0x00000200)
+#define SDIO_FLAG_DBCKEND                   ((uint32_t)0x00000400)
+#define SDIO_FLAG_CMDACT                    ((uint32_t)0x00000800)
+#define SDIO_FLAG_TXACT                     ((uint32_t)0x00001000)
+#define SDIO_FLAG_RXACT                     ((uint32_t)0x00002000)
+#define SDIO_FLAG_TXFIFOHE                  ((uint32_t)0x00004000)
+#define SDIO_FLAG_RXFIFOHF                  ((uint32_t)0x00008000)
+#define SDIO_FLAG_TXFIFOF                   ((uint32_t)0x00010000)
+#define SDIO_FLAG_RXFIFOF                   ((uint32_t)0x00020000)
+#define SDIO_FLAG_TXFIFOE                   ((uint32_t)0x00040000)
+#define SDIO_FLAG_RXFIFOE                   ((uint32_t)0x00080000)
+#define SDIO_FLAG_TXDAVL                    ((uint32_t)0x00100000)
+#define SDIO_FLAG_RXDAVL                    ((uint32_t)0x00200000)
+#define SDIO_FLAG_SDIOIT                    ((uint32_t)0x00400000)
+#define SDIO_FLAG_CEATAEND                  ((uint32_t)0x00800000)
+
+/* SDIO_Read_Wait_Mode */
+#define SDIO_ReadWaitMode_CLK               ((uint32_t)0x00000001)
+#define SDIO_ReadWaitMode_DATA2             ((uint32_t)0x00000000)
+
+#define SDIO_DataControl_DTEN               ((uint32_t)0x00000001)
+#define SDIO_DataControl_DTDIR              ((uint32_t)0x00000002)
+#define SDIO_DataControl_DTMODE             ((uint32_t)0x00000004)
+#define SDIO_DataControl_DMAEN              ((uint32_t)0x00000008)
+#define SDIO_DataControl_DBLOCKSIZE         ((uint32_t)0x000000F0)
+#define SDIO_DataControl_RWSTART            ((uint32_t)0x00000100)
+#define SDIO_DataControl_RWSTOP             ((uint32_t)0x00000200)
+#define SDIO_DataControl_RWMOD              ((uint32_t)0x00000400)
+#define SDIO_DataControl_SDIOEN             ((uint32_t)0x00000800)
+
+
+void SDIO_DeInit(void);
+void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct);
+void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct);
+void SDIO_ClockCmd(FunctionalState NewState);
+void SDIO_SetPowerState(uint32_t SDIO_PowerState);
+uint32_t SDIO_GetPowerState(void);
+void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState);
+void SDIO_DMACmd(FunctionalState NewState);
+void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct);
+void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct);
+uint8_t SDIO_GetCommandResponse(void);
+uint32_t SDIO_GetResponse(uint32_t SDIO_RESP);
+void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct);
+void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct);
+uint32_t SDIO_GetDataCounter(void);
+uint32_t SDIO_ReadData(void);
+void SDIO_WriteData(uint32_t Data);
+uint32_t SDIO_GetFIFOCount(void);
+void SDIO_StartSDIOReadWait(FunctionalState NewState);
+void SDIO_StopSDIOReadWait(FunctionalState NewState);
+void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode);
+void SDIO_SetSDIOOperation(FunctionalState NewState);
+void SDIO_SendSDIOSuspendCmd(FunctionalState NewState);
+void SDIO_CommandCompletionCmd(FunctionalState NewState);
+void SDIO_CEATAITCmd(FunctionalState NewState);
+void SDIO_SendCEATACmd(FunctionalState NewState);
+FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG);
+void SDIO_ClearFlag(uint32_t SDIO_FLAG);
+ITStatus SDIO_GetITStatus(uint32_t SDIO_IT);
+void SDIO_ClearITPendingBit(uint32_t SDIO_IT);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 

+ 231 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_spi.h

@@ -0,0 +1,231 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_spi.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_SPI_H
+#define __CH32V30x_SPI_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 */
+
+  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;
+
+/* I2S Init structure definition */
+typedef struct
+{
+
+  uint16_t I2S_Mode;         /* Specifies the I2S operating mode.
+                                This parameter can be a value of @ref I2S_Mode */
+
+  uint16_t I2S_Standard;     /* Specifies the standard used for the I2S communication.
+                                This parameter can be a value of @ref I2S_Standard */
+
+  uint16_t I2S_DataFormat;   /* Specifies the data format for the I2S communication.
+                                This parameter can be a value of @ref I2S_Data_Format */
+
+  uint16_t I2S_MCLKOutput;   /* Specifies whether the I2S MCLK output is enabled or not.
+                                This parameter can be a value of @ref I2S_MCLK_Output */
+
+  uint32_t I2S_AudioFreq;    /* Specifies the frequency selected for the I2S communication.
+                                This parameter can be a value of @ref I2S_Audio_Frequency */
+
+  uint16_t I2S_CPOL;         /* Specifies the idle state of the I2S clock.
+                                This parameter can be a value of @ref I2S_Clock_Polarity */
+}I2S_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)
+
+/* 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)
+
+/* I2S_Mode */
+#define I2S_Mode_SlaveTx                ((uint16_t)0x0000)
+#define I2S_Mode_SlaveRx                ((uint16_t)0x0100)
+#define I2S_Mode_MasterTx               ((uint16_t)0x0200)
+#define I2S_Mode_MasterRx               ((uint16_t)0x0300)
+
+/* I2S_Standard */
+#define I2S_Standard_Phillips           ((uint16_t)0x0000)
+#define I2S_Standard_MSB                ((uint16_t)0x0010)
+#define I2S_Standard_LSB                ((uint16_t)0x0020)
+#define I2S_Standard_PCMShort           ((uint16_t)0x0030)
+#define I2S_Standard_PCMLong            ((uint16_t)0x00B0)
+
+/* I2S_Data_Format */
+#define I2S_DataFormat_16b              ((uint16_t)0x0000)
+#define I2S_DataFormat_16bextended      ((uint16_t)0x0001)
+#define I2S_DataFormat_24b              ((uint16_t)0x0003)
+#define I2S_DataFormat_32b              ((uint16_t)0x0005)
+
+/* I2S_MCLK_Output */
+#define I2S_MCLKOutput_Enable           ((uint16_t)0x0200)
+#define I2S_MCLKOutput_Disable          ((uint16_t)0x0000)
+
+/* I2S_Audio_Frequency */
+#define I2S_AudioFreq_192k              ((uint32_t)192000)
+#define I2S_AudioFreq_96k               ((uint32_t)96000)
+#define I2S_AudioFreq_48k               ((uint32_t)48000)
+#define I2S_AudioFreq_44k               ((uint32_t)44100)
+#define I2S_AudioFreq_32k               ((uint32_t)32000)
+#define I2S_AudioFreq_22k               ((uint32_t)22050)
+#define I2S_AudioFreq_16k               ((uint32_t)16000)
+#define I2S_AudioFreq_11k               ((uint32_t)11025)
+#define I2S_AudioFreq_8k                ((uint32_t)8000)
+#define I2S_AudioFreq_Default           ((uint32_t)2)
+
+/* I2S_Clock_Polarity */
+#define I2S_CPOL_Low                    ((uint16_t)0x0000)
+#define I2S_CPOL_High                   ((uint16_t)0x0008)
+
+/* SPI_I2S_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_I2S_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)
+#define I2S_IT_UDR                      ((uint8_t)0x53)
+
+/* SPI_I2S_flags_definition */
+#define SPI_I2S_FLAG_RXNE               ((uint16_t)0x0001)
+#define SPI_I2S_FLAG_TXE                ((uint16_t)0x0002)
+#define I2S_FLAG_CHSIDE                 ((uint16_t)0x0004)
+#define I2S_FLAG_UDR                    ((uint16_t)0x0008)
+#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 I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct);
+void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct);
+void I2S_StructInit(I2S_InitTypeDef* I2S_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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+
+
+
+
+

+ 517 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_tim.h

@@ -0,0 +1,517 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_tim.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_TIM_H
+#define __CH32V30x_TIM_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.h"
+
+/* TIM Time Base Init structure definition */
+typedef struct
+{
+  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_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.  */ 
+
+  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
+{
+  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_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 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
+
+
+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, uint16_t Counter);
+void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
+void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
+void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
+void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
+void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_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);
+uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
+uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
+uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
+uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
+uint16_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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
+
+
+
+
+
+
+
+

+ 195 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_usart.h

@@ -0,0 +1,195 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_usart.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/03/06
+* 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 __CH32V30x_USART_H
+#define __CH32V30x_USART_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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_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_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 
+
+
+
+
+
+
+

+ 834 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_usb.h

@@ -0,0 +1,834 @@
+/********************************** (C) COPYRIGHT *******************************
+* File Name          : system_ch32v30x.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/05/22
+* Description        : CH32V30x 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 __CH32V30x_USB_H
+#define __CH32V30x_USB_H
+
+#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          // default maximum packet size for endpoint 0
+#endif
+#ifndef MAX_PACKET_SIZE
+#define MAX_PACKET_SIZE             64         // maximum packet size
+#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_DATA2               0x07
+#define USB_PID_MDATA               0x0F
+#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
+
+/* 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
+
+/* 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 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
+
+
+/******************************************************************************/
+/* USBHS Clock Configuration Related Macro Definition */
+#define USB_CLK_SRC                 0x80000000
+#define USBHS_PLL_ALIVE             0x40000000
+#define USBHS_PLL_CKREF_MASK        0x30000000
+#define USBHS_PLL_CKREF_3M          0x00000000
+#define USBHS_PLL_CKREF_4M          0x10000000
+#define USBHS_PLL_CKREF_8M          0x20000000
+#define USBHS_PLL_CKREF_5M          0x30000000
+#define USBHS_PLL_SRC               0x08000000
+#define USBHS_PLL_SRC_PRE_MASK      0x07000000
+#define USBHS_PLL_SRC_PRE_DIV1      0x00000000
+#define USBHS_PLL_SRC_PRE_DIV2      0x01000000
+#define USBHS_PLL_SRC_PRE_DIV3      0x02000000
+#define USBHS_PLL_SRC_PRE_DIV4      0x03000000
+#define USBHS_PLL_SRC_PRE_DIV5      0x04000000
+#define USBHS_PLL_SRC_PRE_DIV6      0x05000000
+#define USBHS_PLL_SRC_PRE_DIV7      0x06000000
+#define USBHS_PLL_SRC_PRE_DIV8      0x07000000
+
+
+/*******************************************************************************/
+/* USBHS Related Register Macro Definition */
+
+/* R8_USB_CTRL */
+#define USBHS_UC_HOST_MODE          0x80
+#define USBHS_UC_SPEED_TYPE         0x60
+#define USBHS_UC_SPEED_LOW          0x40
+#define USBHS_UC_SPEED_FULL         0x00
+#define USBHS_UC_SPEED_HIGH         0x20
+#define USBHS_UC_DEV_PU_EN          0x10
+#define USBHS_UC_INT_BUSY           0x08
+#define USBHS_UC_RESET_SIE          0x04
+#define USBHS_UC_CLR_ALL            0x02
+#define USBHS_UC_DMA_EN             0x01
+
+/* R8_USB_INT_EN */
+#define USBHS_UIE_DEV_NAK           0x80
+#define USBHS_UIE_ISO_ACT           0x40
+#define USBHS_UIE_SETUP_ACT         0x20
+#define USBHS_UIE_FIFO_OV           0x10
+#define USBHS_UIE_SOF_ACT           0x08
+#define USBHS_UIE_SUSPEND           0x04
+#define USBHS_UIE_TRANSFER          0x02
+#define USBHS_UIE_DETECT            0x01
+#define USBHS_UIE_BUS_RST           0x01
+
+/* R16_USB_DEV_AD */
+#define USBHS_MASK_USB_ADDR         0x7F
+
+/* R16_USB_FRAME_NO */
+#define USBHS_MICRO_FRAME_NUM       0xE000
+#define USBHS_SOF_FRAME_NUM         0x07FF
+
+/* R8_USB_SUSPEND */
+#define USBHS_USB_LINESTATE         0x30
+#define USBHS_USB_WAKEUP_ST         0x04
+#define USBHS_USB_SYS_MOD           0x03
+
+/* R8_USB_SPEED_TYPE */
+#define USBHS_USB_SPEED_TYPE        0x03
+#define USBHS_USB_SPEED_LOW         0x02
+#define USBHS_USB_SPEED_FULL        0x00
+#define USBHS_USB_SPEED_HIGH        0x01
+
+/* R8_USB_MIS_ST */
+#define USBHS_UMS_SOF_PRES          0x80
+#define USBHS_UMS_SOF_ACT           0x40
+#define USBHS_UMS_SIE_FREE          0x20
+#define USBHS_UMS_R_FIFO_RDY        0x10
+#define USBHS_UMS_BUS_RESET         0x08
+#define USBHS_UMS_SUSPEND           0x04
+#define USBHS_UMS_DEV_ATTACH        0x02
+#define USBHS_UMS_SPLIT_CAN         0x01
+
+/* R8_USB_INT_FG */
+#define USBHS_UIF_ISO_ACT           0x40
+#define USBHS_UIF_SETUP_ACT         0x20
+#define USBHS_UIF_FIFO_OV           0x10
+#define USBHS_UIF_HST_SOF           0x08
+#define USBHS_UIF_SUSPEND           0x04
+#define USBHS_UIF_TRANSFER          0x02
+#define USBHS_UIF_DETECT            0x01
+#define USBHS_UIF_BUS_RST           0x01
+
+/* R8_USB_INT_ST */
+#define USBHS_UIS_IS_NAK            0x80
+#define USBHS_UIS_TOG_OK            0x40
+#define USBHS_UIS_TOKEN_MASK        0x30
+#define USBHS_UIS_TOKEN_OUT         0x00
+#define USBHS_UIS_TOKEN_SOF         0x10
+#define USBHS_UIS_TOKEN_IN          0x20
+#define USBHS_UIS_TOKEN_SETUP       0x30
+#define USBHS_UIS_ENDP_MASK         0x0F
+#define USBHS_UIS_H_RES_MASK        0x0F
+
+/* R16_USB_RX_LEN */
+#define USBHS_USB_RX_LEN            0xFFFF
+
+/* R32_UEP_CONFIG */
+#define USBHS_UEP15_R_EN            0x80000000
+#define USBHS_UEP14_R_EN            0x40000000
+#define USBHS_UEP13_R_EN            0x20000000
+#define USBHS_UEP12_R_EN            0x10000000
+#define USBHS_UEP11_R_EN            0x08000000
+#define USBHS_UEP10_R_EN            0x04000000
+#define USBHS_UEP9_R_EN             0x02000000
+#define USBHS_UEP8_R_EN             0x01000000
+#define USBHS_UEP7_R_EN             0x00800000
+#define USBHS_UEP6_R_EN             0x00400000
+#define USBHS_UEP5_R_EN             0x00200000
+#define USBHS_UEP4_R_EN             0x00100000
+#define USBHS_UEP3_R_EN             0x00080000
+#define USBHS_UEP2_R_EN             0x00040000
+#define USBHS_UEP1_R_EN             0x00020000
+#define USBHS_UEP0_R_EN             0x00010000
+#define USBHS_UEP15_T_EN            0x00008000
+#define USBHS_UEP14_T_EN            0x00004000
+#define USBHS_UEP13_T_EN            0x00002000
+#define USBHS_UEP12_T_EN            0x00001000
+#define USBHS_UEP11_T_EN            0x00000800
+#define USBHS_UEP10_T_EN            0x00000400
+#define USBHS_UEP9_T_EN             0x00000200
+#define USBHS_UEP8_T_EN             0x00000100
+#define USBHS_UEP7_T_EN             0x00000080
+#define USBHS_UEP6_T_EN             0x00000040
+#define USBHS_UEP5_T_EN             0x00000020
+#define USBHS_UEP4_T_EN             0x00000010
+#define USBHS_UEP3_T_EN             0x00000008
+#define USBHS_UEP2_T_EN             0x00000004
+#define USBHS_UEP1_T_EN             0x00000002
+#define USBHS_UEP0_T_EN             0x00000001
+
+/* R32_UEP_TYPE */
+#define USBHS_UEP15_R_TYPE          0x80000000
+#define USBHS_UEP14_R_TYPE          0x40000000
+#define USBHS_UEP13_R_TYPE          0x20000000
+#define USBHS_UEP12_R_TYPE          0x10000000
+#define USBHS_UEP11_R_TYPE          0x08000000
+#define USBHS_UEP10_R_TYPE          0x04000000
+#define USBHS_UEP9_R_TYPE           0x02000000
+#define USBHS_UEP8_R_TYPE           0x01000000
+#define USBHS_UEP7_R_TYPE           0x00800000
+#define USBHS_UEP6_R_TYPE           0x00400000
+#define USBHS_UEP5_R_TYPE           0x00200000
+#define USBHS_UEP4_R_TYPE           0x00100000
+#define USBHS_UEP3_R_TYPE           0x00080000
+#define USBHS_UEP2_R_TYPE           0x00040000
+#define USBHS_UEP1_R_TYPE           0x00020000
+#define USBHS_UEP0_R_TYPE           0x00010000
+#define USBHS_UEP15_T_TYPE          0x00008000
+#define USBHS_UEP14_T_TYPE          0x00004000
+#define USBHS_UEP13_T_TYPE          0x00002000
+#define USBHS_UEP12_T_TYPE          0x00001000
+#define USBHS_UEP11_T_TYPE          0x00000800
+#define USBHS_UEP10_T_TYPE          0x00000400
+#define USBHS_UEP9_T_TYPE           0x00000200
+#define USBHS_UEP8_T_TYPE           0x00000100
+#define USBHS_UEP7_T_TYPE           0x00000080
+#define USBHS_UEP6_T_TYPE           0x00000040
+#define USBHS_UEP5_T_TYPE           0x00000020
+#define USBHS_UEP4_T_TYPE           0x00000010
+#define USBHS_UEP3_T_TYPE           0x00000008
+#define USBHS_UEP2_T_TYPE           0x00000004
+#define USBHS_UEP1_T_TYPE           0x00000002
+#define USBHS_UEP0_T_TYPE           0x00000001
+
+/* R32_UEP_BUF_MOD */
+#define USBHS_UEP15_ISO_BUF_MOD     0x80000000
+#define USBHS_UEP14_ISO_BUF_MOD     0x40000000
+#define USBHS_UEP13_ISO_BUF_MOD     0x20000000
+#define USBHS_UEP12_ISO_BUF_MOD     0x10000000
+#define USBHS_UEP11_ISO_BUF_MOD     0x08000000
+#define USBHS_UEP10_ISO_BUF_MOD     0x04000000
+#define USBHS_UEP9_ISO_BUF_MOD      0x02000000
+#define USBHS_UEP8_ISO_BUF_MOD      0x01000000
+#define USBHS_UEP7_ISO_BUF_MOD      0x00800000
+#define USBHS_UEP6_ISO_BUF_MOD      0x00400000
+#define USBHS_UEP5_ISO_BUF_MOD      0x00200000
+#define USBHS_UEP4_ISO_BUF_MOD      0x00100000
+#define USBHS_UEP3_ISO_BUF_MOD      0x00080000
+#define USBHS_UEP2_ISO_BUF_MOD      0x00040000
+#define USBHS_UEP1_ISO_BUF_MOD      0x00020000
+#define USBHS_UEP0_ISO_BUF_MOD      0x00010000
+#define USBHS_UEP15_BUF_MOD         0x00008000
+#define USBHS_UEP14_BUF_MOD         0x00004000
+#define USBHS_UEP13_BUF_MOD         0x00002000
+#define USBHS_UEP12_BUF_MOD         0x00001000
+#define USBHS_UEP11_BUF_MOD         0x00000800
+#define USBHS_UEP10_BUF_MOD         0x00000400
+#define USBHS_UEP9_BUF_MOD          0x00000200
+#define USBHS_UEP8_BUF_MOD          0x00000100
+#define USBHS_UEP7_BUF_MOD          0x00000080
+#define USBHS_UEP6_BUF_MOD          0x00000040
+#define USBHS_UEP5_BUF_MOD          0x00000020
+#define USBHS_UEP4_BUF_MOD          0x00000010
+#define USBHS_UEP3_BUF_MOD          0x00000008
+#define USBHS_UEP2_BUF_MOD          0x00000004
+#define USBHS_UEP1_BUF_MOD          0x00000002
+#define USBHS_UEP0_BUF_MOD          0x00000001
+
+/* R32_UEP0_DMA */
+#define USBHS_UEP0_DMA              0x0000FFFF
+
+/* R32_UEPn_TX_DMA, n=1-15 */
+#define USBHS_UEPn_TX_DMA           0x0000FFFF
+
+/* R32_UEPn_RX_DMA, n=1-15 */
+#define USBHS_UEPn_RX_DMA           0x0000FFFF
+
+/* R16_UEPn_MAX_LEN, n=0-15 */
+#define USBHS_UEPn_MAX_LEN          0x07FF
+
+/* R16_UEPn_T_LEN, n=0-15 */
+#define USBHS_UEPn_T_LEN            0x07FF
+
+/* R8_UEPn_TX_CTRL, n=0-15 */
+#define USBHS_UEP_T_TOG_AUTO        0x20
+#define USBHS_UEP_T_TOG_MASK        0x18
+#define USBHS_UEP_T_TOG_DATA0       0x00
+#define USBHS_UEP_T_TOG_DATA1       0x08
+#define USBHS_UEP_T_TOG_DATA2       0x10
+#define USBHS_UEP_T_TOG_MDATA       0x18
+#define USBHS_UEP_T_RES_MASK        0x03
+#define USBHS_UEP_T_RES_ACK         0x00
+#define USBHS_UEP_T_RES_NYET        0x01
+#define USBHS_UEP_T_RES_NAK         0x02
+#define USBHS_UEP_T_RES_STALL       0x03
+
+/* R8_UEPn_TX_CTRL, n=0-15 */
+#define USBHS_UEP_R_TOG_AUTO        0x20
+#define USBHS_UEP_R_TOG_MASK        0x18
+#define USBHS_UEP_R_TOG_DATA0       0x00
+#define USBHS_UEP_R_TOG_DATA1       0x08
+#define USBHS_UEP_R_TOG_DATA2       0x10
+#define USBHS_UEP_R_TOG_MDATA       0x18
+#define USBHS_UEP_R_RES_MASK        0x03
+#define USBHS_UEP_R_RES_ACK         0x00
+#define USBHS_UEP_R_RES_NYET        0x01
+#define USBHS_UEP_R_RES_NAK         0x02
+#define USBHS_UEP_R_RES_STALL       0x03
+
+/* R8_UHOST_CTRL */
+#define USBHS_UH_SOF_EN             0x80
+#define USBHS_UH_SOF_FREE           0x40
+#define USBHS_UH_PHY_SUSPENDM       0x10
+#define USBHS_UH_REMOTE_WKUP        0x08
+#define USBHS_UH_TX_BUS_RESUME      0x04
+#define USBHS_UH_TX_BUS_SUSPEND     0x02
+#define USBHS_UH_TX_BUS_RESET       0x01
+
+/* R32_UH_CONFIG */
+#define USBHS_UH_EP_RX_EN           0x00040000
+#define USBHS_UH_EP_TX_EN           0x00000008
+
+/* R32_UH_EP_TYPE */
+#define USBHS_UH_EP_RX_TYPE         0x00040000
+#define USBHS_UH_EP_TX_TYPE         0x00000008
+
+/* R32_UH_RX_DMA */
+#define USBHS_UH_RX_DMA             0x0000FFFC
+
+/* R32_UH_TX_DMA */
+#define USBHS_UH_TX_DMA             0x0000FFFF
+
+/* R16_UH_RX_MAX_LEN */
+#define USBHS_UH_RX_MAX_LEN         0x07FF
+
+/* R8_UH_EP_PID */
+#define USBHS_UH_TOKEN_MASK         0xF0
+#define USBHS_UH_ENDP_MASK          0x0F
+
+/* R8_UH_RX_CTRL */
+#define USBHS_UH_R_DATA_NO          0x40
+#define USBHS_UH_R_TOG_AUTO         0x20
+#define USBHS_UH_R_TOG_MASK         0x18
+#define USBHS_UH_R_TOG_DATA0        0x00
+#define USBHS_UH_R_TOG_DATA1        0x08
+#define USBHS_UH_R_TOG_DATA2        0x10
+#define USBHS_UH_R_TOG_MDATA        0x18
+#define USBHS_UH_R_RES_NO           0x04
+#define USBHS_UH_R_RES_MASK         0x03
+#define USBHS_UH_R_RES_ACK          0x00
+#define USBHS_UH_R_RES_NYET         0x01
+#define USBHS_UH_R_RES_NAK          0x02
+#define USBHS_UH_R_RES_STALL        0x03
+
+/* R16_UH_TX_LEN */
+#define USBHS_UH_TX_LEN             0x07FF
+
+/* R8_UH_TX_CTRL */
+#define USBHS_UH_T_DATA_NO          0x40
+#define USBHS_UH_T_AUTO_TOG         0x20
+#define USBHS_UH_T_TOG_MASK         0x18
+#define USBHS_UH_T_TOG_DATA0        0x00
+#define USBHS_UH_T_TOG_DATA1        0x08
+#define USBHS_UH_T_TOG_DATA2        0x10
+#define USBHS_UH_T_TOG_MDATA        0x18
+#define USBHS_UH_T_RES_NO           0x04
+#define USBHS_UH_T_RES_MASK         0x03
+#define USBHS_UH_T_RES_ACK          0x00
+#define USBHS_UH_T_RES_NYET         0x01
+#define USBHS_UH_T_RES_NAK          0x02
+#define USBHS_UH_T_RES_STALL        0x03
+
+/* R16_UH_SPLIT_DATA */
+#define USBHS_UH_SPLIT_DATA         0x0FFF
+
+
+/*******************************************************************************/
+/* USBFS Related Register Macro Definition */
+
+/* R8_USB_CTRL */
+#define USBFS_UC_HOST_MODE          0x80
+#define USBFS_UC_LOW_SPEED          0x40
+#define USBFS_UC_DEV_PU_EN          0x20
+#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_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_SOF           0x80
+#define USBFS_UIE_DEV_NAK           0x40
+#define USBFS_1WIRE_MODE            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_UIS_IS_NAK            0x80      // RO, indicate current USB transfer is NAK received for USB device mode
+#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_SOF         0x10
+#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
+//   01: SOF 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
+
+/* R32_USB_OTG_CR */
+#define USBFS_CR_SESS_VTH           0x20
+#define USBFS_CR_VBUS_VTH           0x10
+#define USBFS_CR_OTG_EN             0x08
+#define USBFS_CR_IDPU               0x04
+#define USBFS_CR_CHARGE_VBUS        0x02
+#define USBFS_CR_DISCHAR_VBUS       0x01
+
+/* R32_USB_OTG_SR */
+#define USBFS_SR_ID_DIG             0x08
+#define USBFS_SR_SESS_END           0x04
+#define USBFS_SR_SESS_VLD           0x02
+#define USBFS_SR_VBUS_VLD           0x01
+
+/* 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
+// bUH_EP_TX_EN & bUH_EP_TBUF_MOD: USB host OUT endpoint buffer mode, buffer start address is UH_TX_DMA
+//   0 x:  disable endpoint and disable buffer
+//   1 0:  64 bytes buffer for transmittal (OUT endpoint)
+//   1 1:  dual 64 bytes buffer by toggle bit bUH_T_TOG selection for transmittal (OUT endpoint), total=128bytes
+#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
+// bUH_EP_RX_EN & bUH_EP_RBUF_MOD: USB host IN endpoint buffer mode, buffer start address is UH_RX_DMA
+//   0 x:  disable endpoint and disable buffer
+//   1 0:  64 bytes buffer for receiving (IN endpoint)
+//   1 1:  dual 64 bytes buffer by toggle bit bUH_R_TOG selection for receiving (IN endpoint), total=128bytes
+
+/* 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 /* __CH32V30x_USB_H */

+ 44 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32v30x_wwdg.h

@@ -0,0 +1,44 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_wwdg.h
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 __CH32V30x_WWDG_H
+#define __CH32V30x_WWDG_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v30x.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 
+

+ 127 - 0
EVT/EXAM/SRC/Peripheral/inc/ch32x035_usbpd.h

@@ -0,0 +1,127 @@
+/********************************** (C) COPYRIGHT  *******************************
+ * File Name          : ch32x035_usbpd.h
+ * Author             : WCH
+ * Version            : V1.0.0
+ * Date               : 2023/04/06
+ * Description        : This file contains all the functions prototypes for the USBPD
+ *                      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 __CH32X035_USBPD_H
+#define __CH32X035_USBPD_H
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//#include "ch32x035.h"
+//#include "ch32x035.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
+
+#ifndef TRUE
+  #define TRUE                          1
+#endif
+#ifndef FALSE
+  #define FALSE                         0
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

+ 1182 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_adc.c

@@ -0,0 +1,1182 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_adc.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file provides all the ADC 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 "ch32v30x_adc.h"
+#include "ch32v30x_rcc.h"
+
+/* ADC DISCNUM mask */
+#define CTLR1_DISCNUM_Reset              ((uint32_t)0xFFFF1FFF)
+
+/* ADC DISCEN mask */
+#define CTLR1_DISCEN_Set                 ((uint32_t)0x00000800)
+#define CTLR1_DISCEN_Reset               ((uint32_t)0xFFFFF7FF)
+
+/* ADC JAUTO mask */
+#define CTLR1_JAUTO_Set                  ((uint32_t)0x00000400)
+#define CTLR1_JAUTO_Reset                ((uint32_t)0xFFFFFBFF)
+
+/* ADC JDISCEN mask */
+#define CTLR1_JDISCEN_Set                ((uint32_t)0x00001000)
+#define CTLR1_JDISCEN_Reset              ((uint32_t)0xFFFFEFFF)
+
+/* ADC AWDCH mask */
+#define CTLR1_AWDCH_Reset                ((uint32_t)0xFFFFFFE0)
+
+/* ADC Analog watchdog enable mode mask */
+#define CTLR1_AWDMode_Reset              ((uint32_t)0xFF3FFDFF)
+
+/* CTLR1 register Mask */
+#define CTLR1_CLEAR_Mask                 ((uint32_t)0xE0F0FEFF)
+
+/* ADC ADON mask */
+#define CTLR2_ADON_Set                   ((uint32_t)0x00000001)
+#define CTLR2_ADON_Reset                 ((uint32_t)0xFFFFFFFE)
+
+/* ADC DMA mask */
+#define CTLR2_DMA_Set                    ((uint32_t)0x00000100)
+#define CTLR2_DMA_Reset                  ((uint32_t)0xFFFFFEFF)
+
+/* ADC RSTCAL mask */
+#define CTLR2_RSTCAL_Set                 ((uint32_t)0x00000008)
+
+/* ADC CAL mask */
+#define CTLR2_CAL_Set                    ((uint32_t)0x00000004)
+
+/* ADC SWSTART mask */
+#define CTLR2_SWSTART_Set                ((uint32_t)0x00400000)
+
+/* ADC EXTTRIG mask */
+#define CTLR2_EXTTRIG_Set                ((uint32_t)0x00100000)
+#define CTLR2_EXTTRIG_Reset              ((uint32_t)0xFFEFFFFF)
+
+/* ADC Software start mask */
+#define CTLR2_EXTTRIG_SWSTART_Set        ((uint32_t)0x00500000)
+#define CTLR2_EXTTRIG_SWSTART_Reset      ((uint32_t)0xFFAFFFFF)
+
+/* ADC JEXTSEL mask */
+#define CTLR2_JEXTSEL_Reset              ((uint32_t)0xFFFF8FFF)
+
+/* ADC JEXTTRIG mask */
+#define CTLR2_JEXTTRIG_Set               ((uint32_t)0x00008000)
+#define CTLR2_JEXTTRIG_Reset             ((uint32_t)0xFFFF7FFF)
+
+/* ADC JSWSTART mask */
+#define CTLR2_JSWSTART_Set               ((uint32_t)0x00200000)
+
+/* ADC injected software start mask */
+#define CTLR2_JEXTTRIG_JSWSTART_Set      ((uint32_t)0x00208000)
+#define CTLR2_JEXTTRIG_JSWSTART_Reset    ((uint32_t)0xFFDF7FFF)
+
+/* ADC TSPD mask */
+#define CTLR2_TSVREFE_Set                ((uint32_t)0x00800000)
+#define CTLR2_TSVREFE_Reset              ((uint32_t)0xFF7FFFFF)
+
+/* CTLR2 register Mask */
+#define CTLR2_CLEAR_Mask                 ((uint32_t)0xFFF1F7FD)
+
+/* ADC SQx mask */
+#define RSQR3_SQ_Set                     ((uint32_t)0x0000001F)
+#define RSQR2_SQ_Set                     ((uint32_t)0x0000001F)
+#define RSQR1_SQ_Set                     ((uint32_t)0x0000001F)
+
+/* RSQR1 register Mask */
+#define RSQR1_CLEAR_Mask                 ((uint32_t)0xFF0FFFFF)
+
+/* ADC JSQx mask */
+#define ISQR_JSQ_Set                     ((uint32_t)0x0000001F)
+
+/* ADC JL mask */
+#define ISQR_JL_Set                      ((uint32_t)0x00300000)
+#define ISQR_JL_Reset                    ((uint32_t)0xFFCFFFFF)
+
+/* ADC SMPx mask */
+#define SAMPTR1_SMP_Set                  ((uint32_t)0x00000007)
+#define SAMPTR2_SMP_Set                  ((uint32_t)0x00000007)
+
+/* ADC IDATARx registers offset */
+#define IDATAR_Offset                    ((uint8_t)0x28)
+
+/* ADC1 RDATAR register base address */
+#define RDATAR_ADDRESS                   ((uint32_t)0x4001244C)
+
+/*********************************************************************
+ * @fn      ADC_DeInit
+ *
+ * @brief   Deinitializes the ADCx peripheral registers to their default
+ *        reset values.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  none
+ */
+void ADC_DeInit(ADC_TypeDef *ADCx)
+{
+    if(ADCx == ADC1)
+    {
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE);
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE);
+    }
+    else if(ADCx == ADC2)
+    {
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE);
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE);
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_Init
+ *
+ * @brief   Initializes the ADCx peripheral according to the specified
+ *        parameters in the ADC_InitStruct.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_InitStruct - pointer to an ADC_InitTypeDef structure that
+ *        contains the configuration information for the specified ADC
+ *        peripheral.
+ *
+ * @return  none
+ */
+void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct)
+{
+    uint32_t tmpreg1 = 0;
+    uint8_t  tmpreg2 = 0;
+
+    tmpreg1 = ADCx->CTLR1;
+    tmpreg1 &= CTLR1_CLEAR_Mask;
+    tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | (uint32_t)ADC_InitStruct->ADC_OutputBuffer |
+                          (uint32_t)ADC_InitStruct->ADC_Pga | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8));
+    ADCx->CTLR1 = tmpreg1;
+
+    tmpreg1 = ADCx->CTLR2;
+    tmpreg1 &= CTLR2_CLEAR_Mask;
+    tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv |
+                          ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1));
+    ADCx->CTLR2 = tmpreg1;
+
+    tmpreg1 = ADCx->RSQR1;
+    tmpreg1 &= RSQR1_CLEAR_Mask;
+    tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1);
+    tmpreg1 |= (uint32_t)tmpreg2 << 20;
+    ADCx->RSQR1 = tmpreg1;
+}
+
+/*********************************************************************
+ * @fn      ADC_StructInit
+ *
+ * @brief   Fills each ADC_InitStruct member with its default value.
+ *
+ * @param   ADC_InitStruct - pointer to an ADC_InitTypeDef structure that
+ *        contains the configuration information for the specified ADC
+ *        peripheral.
+ *
+ * @return  none
+ */
+void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct)
+{
+    ADC_InitStruct->ADC_Mode = ADC_Mode_Independent;
+    ADC_InitStruct->ADC_ScanConvMode = DISABLE;
+    ADC_InitStruct->ADC_ContinuousConvMode = DISABLE;
+    ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
+    ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right;
+    ADC_InitStruct->ADC_NbrOfChannel = 1;
+}
+
+/*********************************************************************
+ * @fn      ADC_Cmd
+ *
+ * @brief   Enables or disables the specified ADC peripheral.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  none
+ */
+void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR2 |= CTLR2_ADON_Set;
+    }
+    else
+    {
+        ADCx->CTLR2 &= CTLR2_ADON_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_DMACmd
+ *
+ * @brief   Enables or disables the specified ADC DMA request.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  none
+ */
+void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR2 |= CTLR2_DMA_Set;
+    }
+    else
+    {
+        ADCx->CTLR2 &= CTLR2_DMA_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_ITConfig
+ *
+ * @brief   Enables or disables the specified ADC interrupts.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_IT - specifies the ADC interrupt sources to be enabled or disabled.
+ *            ADC_IT_EOC - End of conversion interrupt mask.
+ *            ADC_IT_AWD - Analog watchdog interrupt mask.
+ *            ADC_IT_JEOC - End of injected conversion interrupt mask.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  none
+ */
+void ADC_ITConfig(ADC_TypeDef *ADCx, uint16_t ADC_IT, FunctionalState NewState)
+{
+    uint8_t itmask = 0;
+
+    itmask = (uint8_t)ADC_IT;
+
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR1 |= itmask;
+    }
+    else
+    {
+        ADCx->CTLR1 &= (~(uint32_t)itmask);
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_ResetCalibration
+ *
+ * @brief   Resets the selected ADC calibration registers.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  none
+ */
+void ADC_ResetCalibration(ADC_TypeDef *ADCx)
+{
+    ADCx->CTLR2 |= CTLR2_RSTCAL_Set;
+}
+
+/*********************************************************************
+ * @fn      ADC_GetResetCalibrationStatus
+ *
+ * @brief   Gets the selected ADC reset calibration registers status.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  FlagStatus: SET or RESET.
+ */
+FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef *ADCx)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((ADCx->CTLR2 & CTLR2_RSTCAL_Set) != (uint32_t)RESET)
+    {
+        bitstatus = SET;
+    }
+    else
+    {
+        bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      ADC_StartCalibration
+ *
+ * @brief   Starts the selected ADC calibration process.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  None
+ */
+void ADC_StartCalibration(ADC_TypeDef *ADCx)
+{
+    ADCx->CTLR2 |= CTLR2_CAL_Set;
+}
+
+/*********************************************************************
+ * @fn      ADC_GetCalibrationStatus
+ *
+ * @brief   Gets the selected ADC calibration status.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  FlagStatus: SET or RESET.
+ */
+FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef *ADCx)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((ADCx->CTLR2 & CTLR2_CAL_Set) != (uint32_t)RESET)
+    {
+        bitstatus = SET;
+    }
+    else
+    {
+        bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      ADC_SoftwareStartConvCmd
+ *
+ * @brief   Enables or disables the selected ADC software start conversion.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_SoftwareStartConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR2 |= CTLR2_EXTTRIG_SWSTART_Set;
+    }
+    else
+    {
+        ADCx->CTLR2 &= CTLR2_EXTTRIG_SWSTART_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_GetSoftwareStartConvStatus
+ *
+ * @brief   Gets the selected ADC Software start conversion Status.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  FlagStatus - SET or RESET.
+ */
+FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef *ADCx)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((ADCx->CTLR2 & CTLR2_SWSTART_Set) != (uint32_t)RESET)
+    {
+        bitstatus = SET;
+    }
+    else
+    {
+        bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      ADC_DiscModeChannelCountConfig
+ *
+ * @brief   Configures the discontinuous mode for the selected ADC regular
+ *        group channel.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          Number - specifies the discontinuous mode regular channel
+ *            count value(1-8).
+ *
+ * @return  None
+ */
+void ADC_DiscModeChannelCountConfig(ADC_TypeDef *ADCx, uint8_t Number)
+{
+    uint32_t tmpreg1 = 0;
+    uint32_t tmpreg2 = 0;
+
+    tmpreg1 = ADCx->CTLR1;
+    tmpreg1 &= CTLR1_DISCNUM_Reset;
+    tmpreg2 = Number - 1;
+    tmpreg1 |= tmpreg2 << 13;
+    ADCx->CTLR1 = tmpreg1;
+}
+
+/*********************************************************************
+ * @fn      ADC_DiscModeCmd
+ *
+ * @brief   Enables or disables the discontinuous mode on regular group
+ *        channel for the specified ADC.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_DiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR1 |= CTLR1_DISCEN_Set;
+    }
+    else
+    {
+        ADCx->CTLR1 &= CTLR1_DISCEN_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_RegularChannelConfig
+ *
+ * @brief   Configures for the selected ADC regular channel its corresponding
+ *        rank in the sequencer and its sample time.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_Channel - the ADC channel to configure.
+ *            ADC_Channel_0 - ADC Channel0 selected.
+ *            ADC_Channel_1 - ADC Channel1 selected.
+ *            ADC_Channel_2 - ADC Channel2 selected.
+ *            ADC_Channel_3 - ADC Channel3 selected.
+ *            ADC_Channel_4 - ADC Channel4 selected.
+ *            ADC_Channel_5 - ADC Channel5 selected.
+ *            ADC_Channel_6 - ADC Channel6 selected.
+ *            ADC_Channel_7 - ADC Channel7 selected.
+ *            ADC_Channel_8 - ADC Channel8 selected.
+ *            ADC_Channel_9 - ADC Channel9 selected.
+ *            ADC_Channel_10 - ADC Channel10 selected.
+ *            ADC_Channel_11 - ADC Channel11 selected.
+ *            ADC_Channel_12 - ADC Channel12 selected.
+ *            ADC_Channel_13 - ADC Channel13 selected.
+ *            ADC_Channel_14 - ADC Channel14 selected.
+ *            ADC_Channel_15 - ADC Channel15 selected.
+ *            ADC_Channel_16 - ADC Channel16 selected.
+ *            ADC_Channel_17 - ADC Channel17 selected.
+ *          Rank - The rank in the regular group sequencer.
+ *            This parameter must be between 1 to 16.
+ *          ADC_SampleTime - The sample time value to be set for the selected channel.
+ *            ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles.
+ *            ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles.
+ *            ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles.
+ *            ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles.
+ *            ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles.
+ *            ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles.
+ *            ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles.
+ *            ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles.
+ *
+ * @return  None
+ */
+void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
+{
+    uint32_t tmpreg1 = 0, tmpreg2 = 0;
+
+    if(ADC_Channel > ADC_Channel_9)
+    {
+        tmpreg1 = ADCx->SAMPTR1;
+        tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10));
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10));
+        tmpreg1 |= tmpreg2;
+        ADCx->SAMPTR1 = tmpreg1;
+    }
+    else
+    {
+        tmpreg1 = ADCx->SAMPTR2;
+        tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel);
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
+        tmpreg1 |= tmpreg2;
+        ADCx->SAMPTR2 = tmpreg1;
+    }
+
+    if(Rank < 7)
+    {
+        tmpreg1 = ADCx->RSQR3;
+        tmpreg2 = RSQR3_SQ_Set << (5 * (Rank - 1));
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1));
+        tmpreg1 |= tmpreg2;
+        ADCx->RSQR3 = tmpreg1;
+    }
+    else if(Rank < 13)
+    {
+        tmpreg1 = ADCx->RSQR2;
+        tmpreg2 = RSQR2_SQ_Set << (5 * (Rank - 7));
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7));
+        tmpreg1 |= tmpreg2;
+        ADCx->RSQR2 = tmpreg1;
+    }
+    else
+    {
+        tmpreg1 = ADCx->RSQR1;
+        tmpreg2 = RSQR1_SQ_Set << (5 * (Rank - 13));
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13));
+        tmpreg1 |= tmpreg2;
+        ADCx->RSQR1 = tmpreg1;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_ExternalTrigConvCmd
+ *
+ * @brief   Enables or disables the ADCx conversion through external trigger.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_ExternalTrigConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR2 |= CTLR2_EXTTRIG_Set;
+    }
+    else
+    {
+        ADCx->CTLR2 &= CTLR2_EXTTRIG_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_GetConversionValue
+ *
+ * @brief   Returns the last ADCx conversion result data for regular channel.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  ADCx->RDATAR - The Data conversion value.
+ */
+uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx)
+{
+    return (uint16_t)ADCx->RDATAR;
+}
+
+/*********************************************************************
+ * @fn      ADC_GetDualModeConversionValue
+ *
+ * @brief   Returns the last ADC1 and ADC2 conversion result data in dual mode.
+ *
+ * @return  RDATAR_ADDRESS - The Data conversion value.
+ */
+uint32_t ADC_GetDualModeConversionValue(void)
+{
+    return (*(__IO uint32_t *)RDATAR_ADDRESS);
+}
+
+/*********************************************************************
+ * @fn      ADC_AutoInjectedConvCmd
+ *
+ * @brief   Enables or disables the selected ADC automatic injected group
+ *        conversion after regular one.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_AutoInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR1 |= CTLR1_JAUTO_Set;
+    }
+    else
+    {
+        ADCx->CTLR1 &= CTLR1_JAUTO_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_InjectedDiscModeCmd
+ *
+ * @brief   Enables or disables the discontinuous mode for injected group
+ *        channel for the specified ADC.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_InjectedDiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR1 |= CTLR1_JDISCEN_Set;
+    }
+    else
+    {
+        ADCx->CTLR1 &= CTLR1_JDISCEN_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_ExternalTrigInjectedConvConfig
+ *
+ * @brief   Configures the ADCx external trigger for injected channels conversion.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_ExternalTrigInjecConv - specifies the ADC trigger to start
+ *        injected conversion.
+ *            ADC_ExternalTrigInjecConv_T1_TRGO - Timer1 TRGO event selected.
+ *            ADC_ExternalTrigInjecConv_T1_CC4 - Timer1 capture compare4 selected.
+ *            ADC_ExternalTrigInjecConv_T2_TRGO - Timer2 TRGO event selected.
+ *            ADC_ExternalTrigInjecConv_T2_CC1 - Timer2 capture compare1 selected.
+ *            ADC_ExternalTrigInjecConv_T3_CC4 - Timer3 capture compare4 selected.
+ *            ADC_ExternalTrigInjecConv_T4_TRGO - Timer4 TRGO event selected.
+ *            ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 - External interrupt
+ *        line 15 event selected.
+ *            ADC_ExternalTrigInjecConv_None: Injected conversion started
+ *        by software and not by external trigger.
+ *
+ * @return  None
+ */
+void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef *ADCx, uint32_t ADC_ExternalTrigInjecConv)
+{
+    uint32_t tmpreg = 0;
+
+    tmpreg = ADCx->CTLR2;
+    tmpreg &= CTLR2_JEXTSEL_Reset;
+    tmpreg |= ADC_ExternalTrigInjecConv;
+    ADCx->CTLR2 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn      ADC_ExternalTrigInjectedConvCmd
+ *
+ * @brief   Enables or disables the ADCx injected channels conversion through
+ *        external trigger.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR2 |= CTLR2_JEXTTRIG_Set;
+    }
+    else
+    {
+        ADCx->CTLR2 &= CTLR2_JEXTTRIG_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_SoftwareStartInjectedConvCmd
+ *
+ * @brief   Enables or disables the selected ADC start of the injected
+ *        channels conversion.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  None
+ */
+void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR2 |= CTLR2_JEXTTRIG_JSWSTART_Set;
+    }
+    else
+    {
+        ADCx->CTLR2 &= CTLR2_JEXTTRIG_JSWSTART_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_GetSoftwareStartInjectedConvCmdStatus
+ *
+ * @brief   Gets the selected ADC Software start injected conversion Status.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  FlagStatus: SET or RESET.
+ */
+FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef *ADCx)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((ADCx->CTLR2 & CTLR2_JSWSTART_Set) != (uint32_t)RESET)
+    {
+        bitstatus = SET;
+    }
+    else
+    {
+        bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      ADC_InjectedChannelConfig
+ *
+ * @brief   Configures for the selected ADC injected channel its corresponding
+ *        rank in the sequencer and its sample time.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_Channel - the ADC channel to configure.
+ *            ADC_Channel_0 - ADC Channel0 selected.
+ *            ADC_Channel_1 - ADC Channel1 selected.
+ *            ADC_Channel_2 - ADC Channel2 selected.
+ *            ADC_Channel_3 - ADC Channel3 selected.
+ *            ADC_Channel_4 - ADC Channel4 selected.
+ *            ADC_Channel_5 - ADC Channel5 selected.
+ *            ADC_Channel_6 - ADC Channel6 selected.
+ *            ADC_Channel_7 - ADC Channel7 selected.
+ *            ADC_Channel_8 - ADC Channel8 selected.
+ *            ADC_Channel_9 - ADC Channel9 selected.
+ *            ADC_Channel_10 - ADC Channel10 selected.
+ *            ADC_Channel_11 - ADC Channel11 selected.
+ *            ADC_Channel_12 - ADC Channel12 selected.
+ *            ADC_Channel_13 - ADC Channel13 selected.
+ *            ADC_Channel_14 - ADC Channel14 selected.
+ *            ADC_Channel_15 - ADC Channel15 selected.
+ *            ADC_Channel_16 - ADC Channel16 selected.
+ *            ADC_Channel_17 - ADC Channel17 selected.
+ *          Rank - The rank in the regular group sequencer.
+ *            This parameter must be between 1 to 4.
+ *          ADC_SampleTime - The sample time value to be set for the selected channel.
+ *            ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles.
+ *            ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles.
+ *            ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles.
+ *            ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles.
+ *            ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles.
+ *            ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles.
+ *            ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles.
+ *            ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles.
+ *
+ * @return  None
+ */
+void ADC_InjectedChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
+{
+    uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0;
+
+    if(ADC_Channel > ADC_Channel_9)
+    {
+        tmpreg1 = ADCx->SAMPTR1;
+        tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10));
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10));
+        tmpreg1 |= tmpreg2;
+        ADCx->SAMPTR1 = tmpreg1;
+    }
+    else
+    {
+        tmpreg1 = ADCx->SAMPTR2;
+        tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel);
+        tmpreg1 &= ~tmpreg2;
+        tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
+        tmpreg1 |= tmpreg2;
+        ADCx->SAMPTR2 = tmpreg1;
+    }
+
+    tmpreg1 = ADCx->ISQR;
+    tmpreg3 = (tmpreg1 & ISQR_JL_Set) >> 20;
+    tmpreg2 = ISQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)));
+    tmpreg1 &= ~tmpreg2;
+    tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1)));
+    tmpreg1 |= tmpreg2;
+    ADCx->ISQR = tmpreg1;
+}
+
+/*********************************************************************
+ * @fn      ADC_InjectedSequencerLengthConfig
+ *
+ * @brief   Configures the sequencer length for injected channels.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          Length - The sequencer length.
+ *            This parameter must be a number between 1 to 4.
+ *
+ * @return  None
+ */
+void ADC_InjectedSequencerLengthConfig(ADC_TypeDef *ADCx, uint8_t Length)
+{
+    uint32_t tmpreg1 = 0;
+    uint32_t tmpreg2 = 0;
+
+    tmpreg1 = ADCx->ISQR;
+    tmpreg1 &= ISQR_JL_Reset;
+    tmpreg2 = Length - 1;
+    tmpreg1 |= tmpreg2 << 20;
+    ADCx->ISQR = tmpreg1;
+}
+
+/*********************************************************************
+ * @fn      ADC_SetInjectedOffset
+ *
+ * @brief   Set the injected channels conversion value offset.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_InjectedChannel: the ADC injected channel to set its offset.
+ *            ADC_InjectedChannel_1 - Injected Channel1 selected.
+ *            ADC_InjectedChannel_2 - Injected Channel2 selected.
+ *            ADC_InjectedChannel_3 - Injected Channel3 selected.
+ *            ADC_InjectedChannel_4 - Injected Channel4 selected.
+ *          Offset - the offset value for the selected ADC injected channel.
+ *            This parameter must be a 12bit value.
+ *
+ * @return  None
+ */
+void ADC_SetInjectedOffset(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset)
+{
+    __IO uint32_t tmp = 0;
+
+    tmp = (uint32_t)ADCx;
+    tmp += ADC_InjectedChannel;
+
+    *(__IO uint32_t *)tmp = (uint32_t)Offset;
+}
+
+/*********************************************************************
+ * @fn      ADC_GetInjectedConversionValue
+ *
+ * @brief   Returns the ADC injected channel conversion result.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_InjectedChannel - the ADC injected channel to set its offset.
+ *            ADC_InjectedChannel_1 - Injected Channel1 selected.
+ *            ADC_InjectedChannel_2 - Injected Channel2 selected.
+ *            ADC_InjectedChannel_3 - Injected Channel3 selected.
+ *            ADC_InjectedChannel_4 - Injected Channel4 selected.
+ *
+ * @return  tmp - The Data conversion value.
+ */
+uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel)
+{
+    __IO uint32_t tmp = 0;
+
+    tmp = (uint32_t)ADCx;
+    tmp += ADC_InjectedChannel + IDATAR_Offset;
+
+    return (uint16_t)(*(__IO uint32_t *)tmp);
+}
+
+/*********************************************************************
+ * @fn      ADC_AnalogWatchdogCmd
+ *
+ * @brief   Enables or disables the analog watchdog on single/all regular
+ *        or injected channels.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_AnalogWatchdog - the ADC analog watchdog configuration.
+ *            ADC_AnalogWatchdog_SingleRegEnable - Analog watchdog on a
+ *        single regular channel.
+ *            ADC_AnalogWatchdog_SingleInjecEnable - Analog watchdog on a
+ *        single injected channel.
+ *            ADC_AnalogWatchdog_SingleRegOrInjecEnable - Analog watchdog
+ *        on a single regular or injected channel.
+ *            ADC_AnalogWatchdog_AllRegEnable - Analog watchdog on  all
+ *        regular channel.
+ *            ADC_AnalogWatchdog_AllInjecEnable - Analog watchdog on  all
+ *        injected channel.
+ *            ADC_AnalogWatchdog_AllRegAllInjecEnable - Analog watchdog on
+ *        all regular and injected channels.
+ *            ADC_AnalogWatchdog_None - No channel guarded by the analog
+ *        watchdog.
+ *
+ * @return  none
+ */
+void ADC_AnalogWatchdogCmd(ADC_TypeDef *ADCx, uint32_t ADC_AnalogWatchdog)
+{
+    uint32_t tmpreg = 0;
+
+    tmpreg = ADCx->CTLR1;
+    tmpreg &= CTLR1_AWDMode_Reset;
+    tmpreg |= ADC_AnalogWatchdog;
+    ADCx->CTLR1 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn      ADC_AnalogWatchdogThresholdsConfig
+ *
+ * @brief   Configures the high and low thresholds of the analog watchdog.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          HighThreshold - the ADC analog watchdog High threshold value.
+ *            This parameter must be a 12bit value.
+ *          LowThreshold - the ADC analog watchdog Low threshold value.
+ *            This parameter must be a 12bit value.
+ *
+ * @return  none
+ */
+void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef *ADCx, uint16_t HighThreshold,
+                                        uint16_t LowThreshold)
+{
+    ADCx->WDHTR = HighThreshold;
+    ADCx->WDLTR = LowThreshold;
+}
+
+/*********************************************************************
+ * @fn      ADC_AnalogWatchdogSingleChannelConfig
+ *
+ * @brief   Configures the analog watchdog guarded single channel.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_Channel - the ADC channel to configure.
+ *            ADC_Channel_0 - ADC Channel0 selected.
+ *            ADC_Channel_1 - ADC Channel1 selected.
+ *            ADC_Channel_2 - ADC Channel2 selected.
+ *            ADC_Channel_3 - ADC Channel3 selected.
+ *            ADC_Channel_4 - ADC Channel4 selected.
+ *            ADC_Channel_5 - ADC Channel5 selected.
+ *            ADC_Channel_6 - ADC Channel6 selected.
+ *            ADC_Channel_7 - ADC Channel7 selected.
+ *            ADC_Channel_8 - ADC Channel8 selected.
+ *            ADC_Channel_9 - ADC Channel9 selected.
+ *            ADC_Channel_10 - ADC Channel10 selected.
+ *            ADC_Channel_11 - ADC Channel11 selected.
+ *            ADC_Channel_12 - ADC Channel12 selected.
+ *            ADC_Channel_13 - ADC Channel13 selected.
+ *            ADC_Channel_14 - ADC Channel14 selected.
+ *            ADC_Channel_15 - ADC Channel15 selected.
+ *            ADC_Channel_16 - ADC Channel16 selected.
+ *            ADC_Channel_17 - ADC Channel17 selected.
+ *
+ * @return  None
+ */
+void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel)
+{
+    uint32_t tmpreg = 0;
+
+    tmpreg = ADCx->CTLR1;
+    tmpreg &= CTLR1_AWDCH_Reset;
+    tmpreg |= ADC_Channel;
+    ADCx->CTLR1 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn      ADC_TempSensorVrefintCmd
+ *
+ * @brief   Enables or disables the temperature sensor and Vrefint channel.
+ *
+ * @param   NewState - ENABLE or DISABLE.
+ *
+ * @return  none
+ */
+void ADC_TempSensorVrefintCmd(FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADC1->CTLR2 |= CTLR2_TSVREFE_Set;
+    }
+    else
+    {
+        ADC1->CTLR2 &= CTLR2_TSVREFE_Reset;
+    }
+}
+
+/*********************************************************************
+ * @fn      ADC_GetFlagStatus
+ *
+ * @brief   Checks whether the specified ADC flag is set or not.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_FLAG - specifies the flag to check.
+ *            ADC_FLAG_AWD - Analog watchdog flag.
+ *            ADC_FLAG_EOC - End of conversion flag.
+ *            ADC_FLAG_JEOC - End of injected group conversion flag.
+ *            ADC_FLAG_JSTRT - Start of injected group conversion flag.
+ *            ADC_FLAG_STRT - Start of regular group conversion flag.
+ *
+ * @return  FlagStatus: SET or RESET.
+ */
+FlagStatus ADC_GetFlagStatus(ADC_TypeDef *ADCx, uint8_t ADC_FLAG)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((ADCx->STATR & ADC_FLAG) != (uint8_t)RESET)
+    {
+        bitstatus = SET;
+    }
+    else
+    {
+        bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      ADC_ClearFlag
+ *
+ * @brief   Clears the ADCx's pending flags.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_FLAG - specifies the flag to clear.
+ *            ADC_FLAG_AWD - Analog watchdog flag.
+ *            ADC_FLAG_EOC - End of conversion flag.
+ *            ADC_FLAG_JEOC - End of injected group conversion flag.
+ *            ADC_FLAG_JSTRT - Start of injected group conversion flag.
+ *            ADC_FLAG_STRT - Start of regular group conversion flag.
+ *
+ * @return  none
+ */
+void ADC_ClearFlag(ADC_TypeDef *ADCx, uint8_t ADC_FLAG)
+{
+    ADCx->STATR = ~(uint32_t)ADC_FLAG;
+}
+
+/*********************************************************************
+ * @fn      ADC_GetITStatus
+ *
+ * @brief   Checks whether the specified ADC interrupt has occurred or not.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_IT - specifies the ADC interrupt source to check.
+ *            ADC_IT_EOC - End of conversion interrupt mask.
+ *            ADC_IT_AWD - Analog watchdog interrupt mask.
+ *            ADC_IT_JEOC - End of injected conversion interrupt mask.
+ *
+ * @return  FlagStatus: SET or RESET.
+ */
+ITStatus ADC_GetITStatus(ADC_TypeDef *ADCx, uint16_t ADC_IT)
+{
+    ITStatus bitstatus = RESET;
+    uint32_t itmask = 0, enablestatus = 0;
+
+    itmask = ADC_IT >> 8;
+    enablestatus = (ADCx->CTLR1 & (uint8_t)ADC_IT);
+
+    if(((ADCx->STATR & itmask) != (uint32_t)RESET) && enablestatus)
+    {
+        bitstatus = SET;
+    }
+    else
+    {
+        bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      ADC_ClearITPendingBit
+ *
+ * @brief   Clears the ADCx's interrupt pending bits.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          ADC_IT - specifies the ADC interrupt pending bit to clear.
+ *            ADC_IT_EOC - End of conversion interrupt mask.
+ *            ADC_IT_AWD - Analog watchdog interrupt mask.
+ *            ADC_IT_JEOC - End of injected conversion interrupt mask.
+ *
+ * @return  none
+ */
+void ADC_ClearITPendingBit(ADC_TypeDef *ADCx, uint16_t ADC_IT)
+{
+    uint8_t itmask = 0;
+
+    itmask = (uint8_t)(ADC_IT >> 8);
+    ADCx->STATR = ~(uint32_t)itmask;
+}
+
+/*********************************************************************
+ * @fn      TempSensor_Volt_To_Temper
+ *
+ * @brief   Internal Temperature Sensor Voltage to temperature.
+ *
+ * @param   Value - Voltage Value(mv).
+ *
+ * @return  Temper - Temperature Value.
+ */
+s32 TempSensor_Volt_To_Temper(s32 Value)
+{
+    s32 Temper, Refer_Volt, Refer_Temper;
+    s32 k = 43;
+
+    Refer_Volt = (s32)((*(u32 *)0x1FFFF720) & 0x0000FFFF);
+    Refer_Temper = (s32)(((*(u32 *)0x1FFFF720) >> 16) & 0x0000FFFF);
+
+    Temper = Refer_Temper - ((Value - Refer_Volt) * 10 + (k >> 1)) / k;
+
+    return Temper;
+}
+
+/*********************************************************************
+ * @fn      ADC_BufferCmd
+ *
+ * @brief   Enables or disables the ADCx buffer.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  none
+ */
+void ADC_BufferCmd(ADC_TypeDef *ADCx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        ADCx->CTLR1 |= (1 << 26);
+    }
+    else
+    {
+        ADCx->CTLR1 &= ~(1 << 26);
+    }
+}
+
+/*********************************************************************
+ * @fn      Get_CalibrationValue
+ *
+ * @brief   Get ADCx Calibration Value.
+ *
+ * @param   ADCx - where x can be 1 or 2 to select the ADC peripheral.
+ *
+ * @return  CalibrationValue
+ */
+int16_t Get_CalibrationValue(ADC_TypeDef *ADCx)
+{
+    __IO uint8_t  i, j;
+    uint16_t      buf[10];
+    __IO uint16_t t;
+
+    for(i = 0; i < 10; i++)
+    {
+        ADC_ResetCalibration(ADCx);
+        while(ADC_GetResetCalibrationStatus(ADCx))
+            ;
+        ADC_StartCalibration(ADCx);
+        while(ADC_GetCalibrationStatus(ADCx))
+            ;
+        buf[i] = ADCx->RDATAR;
+    }
+
+    for(i = 0; i < 10; i++)
+    {
+        for(j = 0; j < 9; j++)
+        {
+            if(buf[j] > buf[j + 1])
+            {
+                t = buf[j];
+                buf[j] = buf[j + 1];
+                buf[j + 1] = t;
+            }
+        }
+    }
+
+    t = 0;
+    for(i = 0; i < 6; i++)
+    {
+        t += buf[i + 2];
+    }
+
+    t = (t / 6) + ((t % 6) / 3);
+
+    return (int16_t)(2048 - (int16_t)t);
+}

+ 244 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_bkp.c

@@ -0,0 +1,244 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_bkp.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/03/06
+* 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 "ch32v30x_bkp.h"
+#include "ch32v30x_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 0x7F.
+ *
+ * @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;
+}

+ 1297 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_can.c

@@ -0,0 +1,1297 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_can.c
+* Author             : WCH
+* Version            : V1.0.1
+* Date               : 2025/04/06
+* Description        : This file provides all the CAN 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 "ch32v30x_can.h"
+#include "ch32v30x_rcc.h"
+
+/* CAN CTLR Register bits */
+#define CTLR_DBF            ((uint32_t)0x00010000)
+
+/* CAN Mailbox Transmit Request */
+#define TMIDxR_TXRQ         ((uint32_t)0x00000001)
+
+/* CAN FCTLR Register bits */
+#define FCTLR_FINIT         ((uint32_t)0x00000001)
+
+/* Time out for INAK bit */
+#define INAK_TIMEOUT        ((uint32_t)0x0000FFFF)
+/* Time out for SLAK bit */
+#define SLAK_TIMEOUT        ((uint32_t)0x0000FFFF)
+
+/* Flags in TSTATR register */
+#define CAN_FLAGS_TSTATR    ((uint32_t)0x08000000)
+/* Flags in RFIFO1 register */
+#define CAN_FLAGS_RFIFO1    ((uint32_t)0x04000000)
+/* Flags in RFIFO0 register */
+#define CAN_FLAGS_RFIFO0    ((uint32_t)0x02000000)
+/* Flags in STATR register */
+#define CAN_FLAGS_STATR     ((uint32_t)0x01000000)
+/* Flags in ERRSR register */
+#define CAN_FLAGS_ERRSR     ((uint32_t)0x00F00000)
+
+/* Mailboxes definition */
+#define CAN_TXMAILBOX_0     ((uint8_t)0x00)
+#define CAN_TXMAILBOX_1     ((uint8_t)0x01)
+#define CAN_TXMAILBOX_2     ((uint8_t)0x02)
+
+#define CAN_MODE_MASK       ((uint32_t)0x00000003)
+
+static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit);
+
+/*********************************************************************
+ * @fn      CAN_DeInit
+ *
+ * @brief   Deinitializes the CAN peripheral registers to their default reset
+ *        values.
+ *
+ * @param   CANx - where x can be 1 or 2 to select the CAN peripheral.
+ *
+ * @return  none
+ */
+void CAN_DeInit(CAN_TypeDef *CANx)
+{
+    if(CANx == CAN1)
+    {
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE);
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE);
+    }
+    else
+    {
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE);
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE);
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_Init
+ *
+ * @brief   Initializes the CAN peripheral according to the specified
+ *        parameters in the CAN_InitStruct.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_InitStruct - pointer to a CAN_InitTypeDef structure that
+ *        contains the configuration information for the CAN peripheral.
+ *
+ * @return  InitStatus - CAN InitStatus state.
+ *             CAN_InitStatus_Failed.
+ *             CAN_InitStatus_Success.
+ */
+uint8_t CAN_Init(CAN_TypeDef *CANx, CAN_InitTypeDef *CAN_InitStruct)
+{
+    uint8_t  InitStatus = CAN_InitStatus_Failed;
+    uint32_t wait_ack = 0x00000000;
+	uint32_t chipid = DBGMCU_GetCHIPID();
+	uint32_t chippackid = (chipid >> 4) & 0xf;
+    if(chippackid >= 4 && chippackid <= 7)
+	{
+        if(CAN1 == CANx)
+        {
+            (*(__IO uint32_t *)(0x40021010)) |= 0x2000000;
+            (*(__IO uint32_t *)(0x40021010)) &= ~(0x2000000);
+        }else if(CAN2 == CANx)
+        {
+            (*(__IO uint32_t *)(0x40021010)) |= 0x4000000;
+            (*(__IO uint32_t *)(0x40021010)) &= ~(0x4000000);
+        }
+        
+        CANx->CTLR &= ~0x2;
+        CANx->CTLR |= 0x1;
+        
+        while(!(CANx->STATR & 0x1) && (wait_ack != 0x0000FFFF))
+        {
+            wait_ack++;
+        }
+
+        if((CANx->STATR & 0x1))
+        {
+            CANx->BTIMR = ( uint32_t)0xC1100000| \
+                                    ((uint32_t)SystemCoreClock/(((((*(__IO uint32_t *)(0x40021004)) >> 8) & 0x7) < 0x4) ? 1 : (uint32_t)0x2<<(((*(__IO uint32_t *)(0x40021004)) >> 8) & 0x3))/4000000 - 1);
+        }
+        else
+        {
+            return CAN_InitStatus_Failed;
+        }
+        CANx->CTLR &= ~0x1;
+        wait_ack = 0;
+        while((CANx->STATR & 0x1) && (wait_ack != 0x0000FFFF))
+        {
+            wait_ack++;
+        }
+
+        if((CANx->STATR & 0x1)){
+            return CAN_InitStatus_Failed;
+        }
+
+        (*(__IO uint32_t *)(0x4000660C)) |= 0x3;
+        (*(__IO uint32_t *)(0x40006640)) = 0x0;
+        (*(__IO uint32_t *)(0x40006644)) = 0x0;
+        (*(__IO uint32_t *)(0x40006648)) = 0x0;
+        (*(__IO uint32_t *)(0x4000664C)) = 0x0;
+        (*(__IO uint32_t *)(0x4000661C)) |= 0x3;	
+        (*(__IO uint32_t *)(0x40006600)) &= ~0x1; 	
+        CAN_SlaveStartBank(1);
+        if(CAN1 == CANx)
+        {
+            (*(__IO uint32_t *)(0x40006580)) |= 0x3;
+            while(!((*(__IO uint32_t *)(0x4000640C)) & 0x3));
+            (*(__IO uint32_t *)(0x4000640C)) = 0x38;
+        }else if (CAN2 == CANx)
+        {
+            (*(__IO uint32_t *)(0x40006980)) |= 0x3;
+            while(!((*(__IO uint32_t *)(0x4000680C)) & 0x3));
+            (*(__IO uint32_t *)(0x4000680C)) = 0x38;
+        }
+        
+        if(CAN1 == CANx)
+        {
+            (*(__IO uint32_t *)(0x40021010)) |= 0x2000000;
+            (*(__IO uint32_t *)(0x40021010)) &= ~(0x2000000);
+        }else if(CAN2 == CANx)
+        {
+            (*(__IO uint32_t *)(0x40021010)) |= 0x4000000;
+            (*(__IO uint32_t *)(0x40021010)) &= ~(0x4000000);
+        }
+
+        (*(__IO uint32_t *)(0x40006600)) |= 0x1; 	
+        (*(__IO uint32_t *)(0x4000660C)) |= 0x3;	
+        (*(__IO uint32_t *)(0x4000661C)) |= 0x3;	
+        (*(__IO uint32_t *)(0x40006600)) &= ~0x1; 	
+        CAN_SlaveStartBank(1);
+        wait_ack = 0;
+	}
+
+    CANx->CTLR &= (~(uint32_t)CAN_CTLR_SLEEP);
+    CANx->CTLR |= CAN_CTLR_INRQ;
+
+    while(((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT))
+    {
+        wait_ack++;
+    }
+
+    if((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK)
+    {
+        InitStatus = CAN_InitStatus_Failed;
+    }
+    else
+    {
+        if(CAN_InitStruct->CAN_TTCM == ENABLE)
+        {
+            CANx->CTLR |= CAN_CTLR_TTCM;
+        }
+        else
+        {
+            CANx->CTLR &= ~(uint32_t)CAN_CTLR_TTCM;
+        }
+
+        if(CAN_InitStruct->CAN_ABOM == ENABLE)
+        {
+            CANx->CTLR |= CAN_CTLR_ABOM;
+        }
+        else
+        {
+            CANx->CTLR &= ~(uint32_t)CAN_CTLR_ABOM;
+        }
+
+        if(CAN_InitStruct->CAN_AWUM == ENABLE)
+        {
+            CANx->CTLR |= CAN_CTLR_AWUM;
+        }
+        else
+        {
+            CANx->CTLR &= ~(uint32_t)CAN_CTLR_AWUM;
+        }
+
+        if(CAN_InitStruct->CAN_NART == ENABLE)
+        {
+            CANx->CTLR |= CAN_CTLR_NART;
+        }
+        else
+        {
+            CANx->CTLR &= ~(uint32_t)CAN_CTLR_NART;
+        }
+
+        if(CAN_InitStruct->CAN_RFLM == ENABLE)
+        {
+            CANx->CTLR |= CAN_CTLR_RFLM;
+        }
+        else
+        {
+            CANx->CTLR &= ~(uint32_t)CAN_CTLR_RFLM;
+        }
+
+        if(CAN_InitStruct->CAN_TXFP == ENABLE)
+        {
+            CANx->CTLR |= CAN_CTLR_TXFP;
+        }
+        else
+        {
+            CANx->CTLR &= ~(uint32_t)CAN_CTLR_TXFP;
+        }
+
+        CANx->BTIMR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) |
+                      ((uint32_t)CAN_InitStruct->CAN_SJW << 24) |
+                      ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) |
+                      ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) |
+                      ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1);
+        CANx->CTLR &= ~(uint32_t)CAN_CTLR_INRQ;
+        wait_ack = 0;
+
+        while(((CANx->STATR & CAN_STATR_INAK) == CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT))
+        {
+            wait_ack++;
+        }
+
+        if((CANx->STATR & CAN_STATR_INAK) == CAN_STATR_INAK)
+        {
+            InitStatus = CAN_InitStatus_Failed;
+        }
+        else
+        {
+            InitStatus = CAN_InitStatus_Success;
+        }
+    }
+
+    return InitStatus;
+}
+
+/*********************************************************************
+ * @fn      CAN_FilterInit
+ *
+ * @brief   Initializes the CAN peripheral according to the specified
+ *        parameters in the CAN_FilterInitStruct.
+ *
+ * @param   CAN_FilterInitStruct - pointer to a CAN_FilterInitTypeDef
+ *        structure that contains the configuration information.
+ *
+ * @return  none
+ */
+void CAN_FilterInit(CAN_FilterInitTypeDef *CAN_FilterInitStruct)
+{
+    uint32_t filter_number_bit_pos = 0;
+
+    filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber;
+    CAN1->FCTLR |= FCTLR_FINIT;
+    CAN1->FWR &= ~(uint32_t)filter_number_bit_pos;
+
+    if(CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit)
+    {
+        CAN1->FSCFGR &= ~(uint32_t)filter_number_bit_pos;
+
+        CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 =
+            ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) |
+            (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow);
+
+        CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 =
+            ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) |
+            (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh);
+    }
+
+    if(CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit)
+    {
+        CAN1->FSCFGR |= filter_number_bit_pos;
+
+        CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 =
+            ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) |
+            (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow);
+
+        CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 =
+            ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) |
+            (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow);
+    }
+
+    if(CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask)
+    {
+        CAN1->FMCFGR &= ~(uint32_t)filter_number_bit_pos;
+    }
+    else
+    {
+        CAN1->FMCFGR |= (uint32_t)filter_number_bit_pos;
+    }
+
+    if(CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0)
+    {
+        CAN1->FAFIFOR &= ~(uint32_t)filter_number_bit_pos;
+    }
+
+    if(CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1)
+    {
+        CAN1->FAFIFOR |= (uint32_t)filter_number_bit_pos;
+    }
+
+    if(CAN_FilterInitStruct->CAN_FilterActivation == ENABLE)
+    {
+        CAN1->FWR |= filter_number_bit_pos;
+    }
+
+    CAN1->FCTLR &= ~FCTLR_FINIT;
+}
+
+/*********************************************************************
+ * @fn      CAN_StructInit
+ *
+ * @brief   Fills each CAN_InitStruct member with its default value.
+ *
+ * @param   CAN_InitStruct - pointer to a CAN_InitTypeDef structure which
+ *        will be initialized.
+ *
+ * @return  none
+ */
+void CAN_StructInit(CAN_InitTypeDef *CAN_InitStruct)
+{
+    CAN_InitStruct->CAN_TTCM = DISABLE;
+    CAN_InitStruct->CAN_ABOM = DISABLE;
+    CAN_InitStruct->CAN_AWUM = DISABLE;
+    CAN_InitStruct->CAN_NART = DISABLE;
+    CAN_InitStruct->CAN_RFLM = DISABLE;
+    CAN_InitStruct->CAN_TXFP = DISABLE;
+    CAN_InitStruct->CAN_Mode = CAN_Mode_Normal;
+    CAN_InitStruct->CAN_SJW = CAN_SJW_1tq;
+    CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq;
+    CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq;
+    CAN_InitStruct->CAN_Prescaler = 1;
+}
+
+/*********************************************************************
+ * @fn      CAN_SlaveStartBank
+ *
+ * @brief   This function applies only to CH32 Connectivity line devices.
+ *
+ * @param   CAN_BankNumber - Select the start slave bank filter from 1..27.
+ *
+ * @return  none
+ */
+void CAN_SlaveStartBank(uint8_t CAN_BankNumber)
+{
+    CAN1->FCTLR |= FCTLR_FINIT;
+    CAN1->FCTLR &= (uint32_t)0xFFFFC0F1;
+    CAN1->FCTLR |= (uint32_t)(CAN_BankNumber) << 8;
+    CAN1->FCTLR &= ~FCTLR_FINIT;
+}
+
+/*********************************************************************
+ * @fn      CAN_DBGFreeze
+ *
+ * @brief   Enables or disables the DBG Freeze for CAN.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  none
+ */
+void CAN_DBGFreeze(CAN_TypeDef *CANx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        CANx->CTLR |= CTLR_DBF;
+    }
+    else
+    {
+        CANx->CTLR &= ~CTLR_DBF;
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_TTComModeCmd
+ *
+ * @brief   Enables or disabes the CAN Time TriggerOperation communication mode.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          NewState - ENABLE or DISABLE.
+ *          Note-
+ *          DLC must be programmed as 8 in order Time Stamp (2 bytes) to be 
+ *          sent over the CAN bus. 
+ *
+ * @return  none
+ */
+void CAN_TTComModeCmd(CAN_TypeDef *CANx, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        CANx->CTLR |= CAN_CTLR_TTCM;
+
+        CANx->sTxMailBox[0].TXMDTR |= ((uint32_t)CAN_TXMDT0R_TGT);
+        CANx->sTxMailBox[1].TXMDTR |= ((uint32_t)CAN_TXMDT1R_TGT);
+        CANx->sTxMailBox[2].TXMDTR |= ((uint32_t)CAN_TXMDT2R_TGT);
+    }
+    else
+    {
+        CANx->CTLR &= (uint32_t)(~(uint32_t)CAN_CTLR_TTCM);
+
+        CANx->sTxMailBox[0].TXMDTR &= ((uint32_t)~CAN_TXMDT0R_TGT);
+        CANx->sTxMailBox[1].TXMDTR &= ((uint32_t)~CAN_TXMDT1R_TGT);
+        CANx->sTxMailBox[2].TXMDTR &= ((uint32_t)~CAN_TXMDT2R_TGT);
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_Transmit
+ *
+ * @brief   Initiates the transmission of a message.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          TxMessage - pointer to a structure which contains CAN Id, CAN
+ *        DLC and CAN data.
+ *
+ * @return  transmit_mailbox - The number of the mailbox that is used for
+ *        transmission or CAN_TxStatus_NoMailBox if there is no empty mailbox.
+ */
+uint8_t CAN_Transmit(CAN_TypeDef *CANx, CanTxMsg *TxMessage)
+{
+    uint8_t transmit_mailbox = 0;
+
+    if((CANx->TSTATR & CAN_TSTATR_TME0) == CAN_TSTATR_TME0)
+    {
+        transmit_mailbox = 0;
+    }
+    else if((CANx->TSTATR & CAN_TSTATR_TME1) == CAN_TSTATR_TME1)
+    {
+        transmit_mailbox = 1;
+    }
+    else if((CANx->TSTATR & CAN_TSTATR_TME2) == CAN_TSTATR_TME2)
+    {
+        transmit_mailbox = 2;
+    }
+    else
+    {
+        transmit_mailbox = CAN_TxStatus_NoMailBox;
+    }
+
+    if(transmit_mailbox != CAN_TxStatus_NoMailBox)
+    {
+        CANx->sTxMailBox[transmit_mailbox].TXMIR &= TMIDxR_TXRQ;
+        if(TxMessage->IDE == CAN_Id_Standard)
+        {
+            CANx->sTxMailBox[transmit_mailbox].TXMIR |= ((TxMessage->StdId << 21) |
+                                                         TxMessage->RTR);
+        }
+        else
+        {
+            CANx->sTxMailBox[transmit_mailbox].TXMIR |= ((TxMessage->ExtId << 3) |
+                                                         TxMessage->IDE |
+                                                         TxMessage->RTR);
+        }
+
+        TxMessage->DLC &= (uint8_t)0x0000000F;
+        CANx->sTxMailBox[transmit_mailbox].TXMDTR &= (uint32_t)0xFFFFFFF0;
+        CANx->sTxMailBox[transmit_mailbox].TXMDTR |= TxMessage->DLC;
+
+        CANx->sTxMailBox[transmit_mailbox].TXMDLR = (((uint32_t)TxMessage->Data[3] << 24) |
+                                                     ((uint32_t)TxMessage->Data[2] << 16) |
+                                                     ((uint32_t)TxMessage->Data[1] << 8) |
+                                                     ((uint32_t)TxMessage->Data[0]));
+        CANx->sTxMailBox[transmit_mailbox].TXMDHR = (((uint32_t)TxMessage->Data[7] << 24) |
+                                                     ((uint32_t)TxMessage->Data[6] << 16) |
+                                                     ((uint32_t)TxMessage->Data[5] << 8) |
+                                                     ((uint32_t)TxMessage->Data[4]));
+        CANx->sTxMailBox[transmit_mailbox].TXMIR |= TMIDxR_TXRQ;
+    }
+
+    return transmit_mailbox;
+}
+
+/*********************************************************************
+ * @fn      CAN_TransmitStatus
+ *
+ * @brief   Checks the transmission of a message.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          TransmitMailbox - the number of the mailbox that is used for
+ *        transmission.
+ *
+ * @return  state -
+ *            CAN_TxStatus_Ok.
+ *            CAN_TxStatus_Failed.
+ */
+uint8_t CAN_TransmitStatus(CAN_TypeDef *CANx, uint8_t TransmitMailbox)
+{
+    uint32_t state = 0;
+
+    switch(TransmitMailbox)
+    {
+        case(CAN_TXMAILBOX_0):
+            state = CANx->TSTATR & (CAN_TSTATR_RQCP0 | CAN_TSTATR_TXOK0 | CAN_TSTATR_TME0);
+            break;
+
+        case(CAN_TXMAILBOX_1):
+            state = CANx->TSTATR & (CAN_TSTATR_RQCP1 | CAN_TSTATR_TXOK1 | CAN_TSTATR_TME1);
+            break;
+
+        case(CAN_TXMAILBOX_2):
+            state = CANx->TSTATR & (CAN_TSTATR_RQCP2 | CAN_TSTATR_TXOK2 | CAN_TSTATR_TME2);
+            break;
+
+        default:
+            state = CAN_TxStatus_Failed;
+            break;
+    }
+
+    switch(state)
+    {
+        case(0x0):
+            state = CAN_TxStatus_Pending;
+            break;
+
+        case(CAN_TSTATR_RQCP0 | CAN_TSTATR_TME0):
+            state = CAN_TxStatus_Failed;
+            break;
+
+        case(CAN_TSTATR_RQCP1 | CAN_TSTATR_TME1):
+            state = CAN_TxStatus_Failed;
+            break;
+
+        case(CAN_TSTATR_RQCP2 | CAN_TSTATR_TME2):
+            state = CAN_TxStatus_Failed;
+            break;
+
+        case(CAN_TSTATR_RQCP0 | CAN_TSTATR_TXOK0 | CAN_TSTATR_TME0):
+            state = CAN_TxStatus_Ok;
+            break;
+
+        case(CAN_TSTATR_RQCP1 | CAN_TSTATR_TXOK1 | CAN_TSTATR_TME1):
+            state = CAN_TxStatus_Ok;
+            break;
+
+        case(CAN_TSTATR_RQCP2 | CAN_TSTATR_TXOK2 | CAN_TSTATR_TME2):
+            state = CAN_TxStatus_Ok;
+            break;
+
+        default:
+            state = CAN_TxStatus_Failed;
+            break;
+    }
+
+    return (uint8_t)state;
+}
+
+/*********************************************************************
+ * @fn      CAN_CancelTransmit
+ *
+ * @brief   Cancels a transmit request.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          Mailbox -  Mailbox number.
+ *            CAN_TXMAILBOX_0.
+ *            CAN_TXMAILBOX_1.
+ *            CAN_TXMAILBOX_2.
+ *
+ * @return  none
+ */
+void CAN_CancelTransmit(CAN_TypeDef *CANx, uint8_t Mailbox)
+{
+    switch(Mailbox)
+    {
+        case(CAN_TXMAILBOX_0):
+            CANx->TSTATR |= CAN_TSTATR_ABRQ0;
+            break;
+
+        case(CAN_TXMAILBOX_1):
+            CANx->TSTATR |= CAN_TSTATR_ABRQ1;
+            break;
+
+        case(CAN_TXMAILBOX_2):
+            CANx->TSTATR |= CAN_TSTATR_ABRQ2;
+            break;
+
+        default:
+            break;
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_Receive
+ *
+ * @brief   Receives a message.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          FIFONumber - Receive FIFO number.
+ *            CAN_FIFO0.
+ *            CAN_FIFO1.
+ *          RxMessage -  pointer to a structure receive message which contains
+ *        CAN Id, CAN DLC, CAN datas and FMI number.
+ *
+ * @return  none
+ */
+void CAN_Receive(CAN_TypeDef *CANx, uint8_t FIFONumber, CanRxMsg *RxMessage)
+{
+    RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RXMIR;
+
+    if(RxMessage->IDE == CAN_Id_Standard)
+    {
+        RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RXMIR >> 21);
+    }
+    else
+    {
+        RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RXMIR >> 3);
+    }
+
+    RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RXMIR;
+    RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RXMDTR;
+    RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDTR >> 8);
+    RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RXMDLR;
+    RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 8);
+    RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 16);
+    RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 24);
+    RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RXMDHR;
+    RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 8);
+    RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 16);
+    RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 24);
+
+    if(FIFONumber == CAN_FIFO0)
+    {
+        CANx->RFIFO0 |= CAN_RFIFO0_RFOM0;
+    }
+    else
+    {
+        CANx->RFIFO1 |= CAN_RFIFO1_RFOM1;
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_FIFORelease
+ *
+ * @brief   Releases the specified FIFO.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          FIFONumber - Receive FIFO number.
+ *            CAN_FIFO0.
+ *            CAN_FIFO1.
+ *
+ * @return  none
+ */
+void CAN_FIFORelease(CAN_TypeDef *CANx, uint8_t FIFONumber)
+{
+    if(FIFONumber == CAN_FIFO0)
+    {
+        CANx->RFIFO0 |= CAN_RFIFO0_RFOM0;
+    }
+    else
+    {
+        CANx->RFIFO1 |= CAN_RFIFO1_RFOM1;
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_MessagePending
+ *
+ * @brief   Returns the number of pending messages.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          FIFONumber - Receive FIFO number.
+ *            CAN_FIFO0.
+ *            CAN_FIFO1.
+ *
+ * @return  message_pending: which is the number of pending message.
+ */
+uint8_t CAN_MessagePending(CAN_TypeDef *CANx, uint8_t FIFONumber)
+{
+    uint8_t message_pending = 0;
+
+    if(FIFONumber == CAN_FIFO0)
+    {
+        message_pending = (uint8_t)(CANx->RFIFO0 & (uint32_t)0x03);
+    }
+    else if(FIFONumber == CAN_FIFO1)
+    {
+        message_pending = (uint8_t)(CANx->RFIFO1 & (uint32_t)0x03);
+    }
+    else
+    {
+        message_pending = 0;
+    }
+
+    return message_pending;
+}
+
+/*********************************************************************
+ * @fn      CAN_OperatingModeRequest
+ *
+ * @brief   Select the CAN Operation mode.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_OperatingMode - CAN Operating Mode.
+ *            CAN_OperatingMode_Initialization.
+ *            CAN_OperatingMode_Normal.
+ *            CAN_OperatingMode_Sleep.
+ *
+ * @return  status -
+ *          CAN_ModeStatus_Failed - CAN failed entering the specific mode.
+ *          CAN_ModeStatus_Success - CAN Succeed entering the specific mode.
+ */
+uint8_t CAN_OperatingModeRequest(CAN_TypeDef *CANx, uint8_t CAN_OperatingMode)
+{
+    uint8_t  status = CAN_ModeStatus_Failed;
+    uint32_t timeout = INAK_TIMEOUT;
+
+    if(CAN_OperatingMode == CAN_OperatingMode_Initialization)
+    {
+        CANx->CTLR = (uint32_t)((CANx->CTLR & (uint32_t)(~(uint32_t)CAN_CTLR_SLEEP)) | CAN_CTLR_INRQ);
+
+        while(((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_INAK) && (timeout != 0))
+        {
+            timeout--;
+        }
+        if((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_INAK)
+        {
+            status = CAN_ModeStatus_Failed;
+        }
+        else
+        {
+            status = CAN_ModeStatus_Success;
+        }
+    }
+    else if(CAN_OperatingMode == CAN_OperatingMode_Normal)
+    {
+        CANx->CTLR &= (uint32_t)(~(CAN_CTLR_SLEEP | CAN_CTLR_INRQ));
+
+        while(((CANx->STATR & CAN_MODE_MASK) != 0) && (timeout != 0))
+        {
+            timeout--;
+        }
+        if((CANx->STATR & CAN_MODE_MASK) != 0)
+        {
+            status = CAN_ModeStatus_Failed;
+        }
+        else
+        {
+            status = CAN_ModeStatus_Success;
+        }
+    }
+    else if(CAN_OperatingMode == CAN_OperatingMode_Sleep)
+    {
+        CANx->CTLR = (uint32_t)((CANx->CTLR & (uint32_t)(~(uint32_t)CAN_CTLR_INRQ)) | CAN_CTLR_SLEEP);
+
+        while(((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_SLAK) && (timeout != 0))
+        {
+            timeout--;
+        }
+        if((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_SLAK)
+        {
+            status = CAN_ModeStatus_Failed;
+        }
+        else
+        {
+            status = CAN_ModeStatus_Success;
+        }
+    }
+    else
+    {
+        status = CAN_ModeStatus_Failed;
+    }
+
+    return (uint8_t)status;
+}
+
+/*********************************************************************
+ * @fn      CAN_Sleep
+ *
+ * @brief   Enters the low power mode.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *
+ * @return  sleepstatus -
+ *            CAN_Sleep_Ok.
+ *            CAN_Sleep_Failed.
+ */
+uint8_t CAN_Sleep(CAN_TypeDef *CANx)
+{
+    uint8_t sleepstatus = CAN_Sleep_Failed;
+
+    CANx->CTLR = (((CANx->CTLR) & (uint32_t)(~(uint32_t)CAN_CTLR_INRQ)) | CAN_CTLR_SLEEP);
+
+    if((CANx->STATR & (CAN_STATR_SLAK | CAN_STATR_INAK)) == CAN_STATR_SLAK)
+    {
+        sleepstatus = CAN_Sleep_Ok;
+    }
+
+    return (uint8_t)sleepstatus;
+}
+
+/*********************************************************************
+ * @fn      CAN_WakeUp
+ *
+ * @brief   Wakes the CAN up.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *
+ * @return  wakeupstatus -
+ *            CAN_WakeUp_Ok.
+ *            CAN_WakeUp_Failed.
+ */
+uint8_t CAN_WakeUp(CAN_TypeDef *CANx)
+{
+    uint32_t wait_slak = SLAK_TIMEOUT;
+    uint8_t  wakeupstatus = CAN_WakeUp_Failed;
+
+    CANx->CTLR &= ~(uint32_t)CAN_CTLR_SLEEP;
+
+    while(((CANx->STATR & CAN_STATR_SLAK) == CAN_STATR_SLAK) && (wait_slak != 0x00))
+    {
+        wait_slak--;
+    }
+    if((CANx->STATR & CAN_STATR_SLAK) != CAN_STATR_SLAK)
+    {
+        wakeupstatus = CAN_WakeUp_Ok;
+    }
+
+    return (uint8_t)wakeupstatus;
+}
+
+/*********************************************************************
+ * @fn      CAN_GetLastErrorCode
+ *
+ * @brief   Returns the CANx's last error code (LEC).
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *
+ * @return  errorcode - specifies the Error code.
+ *            CAN_ErrorCode_NoErr - No Error.
+ *            CAN_ErrorCode_StuffErr - Stuff Error.
+ *            CAN_ErrorCode_FormErr - Form Error.
+ *            CAN_ErrorCode_ACKErr - Acknowledgment Error.
+ *            CAN_ErrorCode_BitRecessiveErr - Bit Recessive Error.
+ *            CAN_ErrorCode_BitDominantErr - Bit Dominant Error.
+ *            CAN_ErrorCode_CRCErr - CRC Error.
+ *            CAN_ErrorCode_SoftwareSetErr - Software Set Error.
+ */
+uint8_t CAN_GetLastErrorCode(CAN_TypeDef *CANx)
+{
+    uint8_t errorcode = 0;
+
+    errorcode = (((uint8_t)CANx->ERRSR) & (uint8_t)CAN_ERRSR_LEC);
+
+    return errorcode;
+}
+
+/*********************************************************************
+ * @fn      CAN_GetReceiveErrorCounter
+ *
+ * @brief   Returns the CANx Receive Error Counter (REC).
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *         Note-   
+ *         In case of an error during reception, this counter is incremented 
+ *         by 1 or by 8 depending on the error condition as defined by the CAN 
+ *         standard. After every successful reception, the counter is 
+ *         decremented by 1 or reset to 120 if its value was higher than 128. 
+ *         When the counter value exceeds 127, the CAN controller enters the 
+ *         error passive state.  
+ * @return  counter - CAN Receive Error Counter.
+ */
+uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef *CANx)
+{
+    uint8_t counter = 0;
+
+    counter = (uint8_t)((CANx->ERRSR & CAN_ERRSR_REC) >> 24);
+
+    return counter;
+}
+
+/*********************************************************************
+ * @fn      CAN_GetLSBTransmitErrorCounter
+ *
+ * @brief   Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC).
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *
+ * @return  counter - LSB of the 9-bit CAN Transmit Error Counter.
+ */
+uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef *CANx)
+{
+    uint8_t counter = 0;
+
+    counter = (uint8_t)((CANx->ERRSR & CAN_ERRSR_TEC) >> 16);
+
+    return counter;
+}
+
+/*********************************************************************
+ * @fn      CAN_ITConfig
+ *
+ * @brief   Enables or disables the specified CANx interrupts.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_IT - specifies the CAN interrupt sources to be enabled or disabled.
+ *            CAN_IT_TME.
+ *            CAN_IT_FMP0.
+ *            CAN_IT_FF0.
+ *            CAN_IT_FOV0.
+ *            CAN_IT_FMP1.
+ *            CAN_IT_FF1.
+ *            CAN_IT_FOV1.
+ *            CAN_IT_EWG.
+ *            CAN_IT_EPV.
+ *            CAN_IT_LEC.
+ *            CAN_IT_ERR.
+ *            CAN_IT_WKU.
+ *            CAN_IT_SLK.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  counter - LSB of the 9-bit CAN Transmit Error Counter.
+ */
+void CAN_ITConfig(CAN_TypeDef *CANx, uint32_t CAN_IT, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        CANx->INTENR |= CAN_IT;
+    }
+    else
+    {
+        CANx->INTENR &= ~CAN_IT;
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_GetFlagStatus
+ *
+ * @brief   Checks whether the specified CAN flag is set or not.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_FLAG - specifies the flag to check.
+ *            CAN_FLAG_EWG.
+ *            CAN_FLAG_EPV.
+ *            CAN_FLAG_BOF.
+ *            CAN_FLAG_RQCP0.
+ *            CAN_FLAG_RQCP1.
+ *            CAN_FLAG_RQCP2.
+ *            CAN_FLAG_FMP1.
+ *            CAN_FLAG_FF1.
+ *            CAN_FLAG_FOV1.
+ *            CAN_FLAG_FMP0.
+ *            CAN_FLAG_FF0.
+ *            CAN_FLAG_FOV0.
+ *            CAN_FLAG_WKU.
+ *            CAN_FLAG_SLAK.
+ *            CAN_FLAG_LEC.
+ *          NewState - ENABLE or DISABLE.
+ *
+ * @return  FlagStatus - SET or RESET.
+ */
+FlagStatus CAN_GetFlagStatus(CAN_TypeDef *CANx, uint32_t CAN_FLAG)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((CAN_FLAG & CAN_FLAGS_ERRSR) != (uint32_t)RESET)
+    {
+        if((CANx->ERRSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
+        {
+            bitstatus = SET;
+        }
+        else
+        {
+            bitstatus = RESET;
+        }
+    }
+    else if((CAN_FLAG & CAN_FLAGS_STATR) != (uint32_t)RESET)
+    {
+        if((CANx->STATR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
+        {
+            bitstatus = SET;
+        }
+        else
+        {
+            bitstatus = RESET;
+        }
+    }
+    else if((CAN_FLAG & CAN_FLAGS_TSTATR) != (uint32_t)RESET)
+    {
+        if((CANx->TSTATR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
+        {
+            bitstatus = SET;
+        }
+        else
+        {
+            bitstatus = RESET;
+        }
+    }
+    else if((CAN_FLAG & CAN_FLAGS_RFIFO0) != (uint32_t)RESET)
+    {
+        if((CANx->RFIFO0 & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
+        {
+            bitstatus = SET;
+        }
+        else
+        {
+            bitstatus = RESET;
+        }
+    }
+    else
+    {
+        if((uint32_t)(CANx->RFIFO1 & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET)
+        {
+            bitstatus = SET;
+        }
+        else
+        {
+            bitstatus = RESET;
+        }
+    }
+
+    return bitstatus;
+}
+
+/*********************************************************************
+ * @fn      CAN_ClearFlag
+ *
+ * @brief   Clears the CAN's pending flags.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_FLAG - specifies the flag to clear.
+ *            CAN_FLAG_RQCP0.
+ *            CAN_FLAG_RQCP1.
+ *            CAN_FLAG_RQCP2.
+ *            CAN_FLAG_FF1.
+ *            CAN_FLAG_FOV1.
+ *            CAN_FLAG_FF0.
+ *            CAN_FLAG_FOV0.
+ *            CAN_FLAG_WKU.
+ *            CAN_FLAG_SLAK.
+ *            CAN_FLAG_LEC.
+ *
+ * @return  none
+ */
+void CAN_ClearFlag(CAN_TypeDef *CANx, uint32_t CAN_FLAG)
+{
+    uint32_t flagtmp = 0;
+
+    if(CAN_FLAG == CAN_FLAG_LEC)
+    {
+        CANx->ERRSR = (uint32_t)RESET;
+    }
+    else
+    {
+        flagtmp = CAN_FLAG & 0x000FFFFF;
+
+        if((CAN_FLAG & CAN_FLAGS_RFIFO0) != (uint32_t)RESET)
+        {
+            CANx->RFIFO0 = (uint32_t)(flagtmp);
+        }
+        else if((CAN_FLAG & CAN_FLAGS_RFIFO1) != (uint32_t)RESET)
+        {
+            CANx->RFIFO1 = (uint32_t)(flagtmp);
+        }
+        else if((CAN_FLAG & CAN_FLAGS_TSTATR) != (uint32_t)RESET)
+        {
+            CANx->TSTATR = (uint32_t)(flagtmp);
+        }
+        else
+        {
+            CANx->STATR = (uint32_t)(flagtmp);
+        }
+    }
+}
+
+/*********************************************************************
+ * @fn      CAN_GetITStatus
+ *
+ * @brief   Checks whether the specified CANx interrupt has occurred or not.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_IT -  specifies the CAN interrupt source to check.
+ *            CAN_IT_TME.
+ *            CAN_IT_FMP0.
+ *            CAN_IT_FF0.
+ *            CAN_IT_FOV0.
+ *            CAN_IT_FMP1.
+ *            CAN_IT_FF1.
+ *            CAN_IT_FOV1.
+ *            CAN_IT_WKU.
+ *            CAN_IT_SLK.
+ *            CAN_IT_EWG.
+ *            CAN_IT_EPV.
+ *            CAN_IT_BOF.
+ *            CAN_IT_LEC.
+ *            CAN_IT_ERR.
+ *
+ * @return  ITStatus - SET or RESET.
+ */
+ITStatus CAN_GetITStatus(CAN_TypeDef *CANx, uint32_t CAN_IT)
+{
+    ITStatus itstatus = RESET;
+
+    if((CANx->INTENR & CAN_IT) != RESET)
+    {
+        switch(CAN_IT)
+        {
+            case CAN_IT_TME:
+                itstatus = CheckITStatus(CANx->TSTATR, CAN_TSTATR_RQCP0 | CAN_TSTATR_RQCP1 | CAN_TSTATR_RQCP2);
+                break;
+
+            case CAN_IT_FMP0:
+                itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FMP0);
+                break;
+
+            case CAN_IT_FF0:
+                itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FULL0);
+                break;
+
+            case CAN_IT_FOV0:
+                itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FOVR0);
+                break;
+
+            case CAN_IT_FMP1:
+                itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FMP1);
+                break;
+
+            case CAN_IT_FF1:
+                itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FULL1);
+                break;
+
+            case CAN_IT_FOV1:
+                itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FOVR1);
+                break;
+
+            case CAN_IT_WKU:
+                itstatus = CheckITStatus(CANx->STATR, CAN_STATR_WKUI);
+                break;
+
+            case CAN_IT_SLK:
+                itstatus = CheckITStatus(CANx->STATR, CAN_STATR_SLAKI);
+                break;
+
+            case CAN_IT_EWG:
+                itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_EWGF);
+                break;
+
+            case CAN_IT_EPV:
+                itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_EPVF);
+                break;
+
+            case CAN_IT_BOF:
+                itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_BOFF);
+                break;
+
+            case CAN_IT_LEC:
+                itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_LEC);
+                break;
+
+            case CAN_IT_ERR:
+                itstatus = CheckITStatus(CANx->STATR, CAN_STATR_ERRI);
+                break;
+
+            default:
+                itstatus = RESET;
+                break;
+        }
+    }
+    else
+    {
+        itstatus = RESET;
+    }
+
+    return itstatus;
+}
+
+/*********************************************************************
+ * @fn      CAN_ClearITPendingBit
+ *
+ * @brief   Clears the CANx's interrupt pending bits.
+ *
+ * @param   CANx - where x can be 1 to select the CAN peripheral.
+ *          CAN_IT - specifies the interrupt pending bit to clear.
+ *            CAN_IT_TME.
+ *            CAN_IT_FF0.
+ *            CAN_IT_FOV0.
+ *            CAN_IT_FF1.
+ *            CAN_IT_FOV1.
+ *            CAN_IT_WKU.
+ *            CAN_IT_SLK.
+ *            CAN_IT_EWG.
+ *            CAN_IT_EPV.
+ *            CAN_IT_BOF.
+ *            CAN_IT_LEC.
+ *            CAN_IT_ERR.
+ *
+ * @return  none
+ */
+void CAN_ClearITPendingBit(CAN_TypeDef *CANx, uint32_t CAN_IT)
+{
+    switch(CAN_IT)
+    {
+        case CAN_IT_TME:
+            CANx->TSTATR = CAN_TSTATR_RQCP0 | CAN_TSTATR_RQCP1 | CAN_TSTATR_RQCP2;
+            break;
+
+        case CAN_IT_FF0:
+            CANx->RFIFO0 = CAN_RFIFO0_FULL0;
+            break;
+
+        case CAN_IT_FOV0:
+            CANx->RFIFO0 = CAN_RFIFO0_FOVR0;
+            break;
+
+        case CAN_IT_FF1:
+            CANx->RFIFO1 = CAN_RFIFO1_FULL1;
+            break;
+
+        case CAN_IT_FOV1:
+            CANx->RFIFO1 = CAN_RFIFO1_FOVR1;
+            break;
+
+        case CAN_IT_WKU:
+            CANx->STATR = CAN_STATR_WKUI;
+            break;
+
+        case CAN_IT_SLK:
+            CANx->STATR = CAN_STATR_SLAKI;
+            break;
+
+        case CAN_IT_EWG:
+            CANx->STATR = CAN_STATR_ERRI;
+            break;
+
+        case CAN_IT_EPV:
+            CANx->STATR = CAN_STATR_ERRI;
+            break;
+
+        case CAN_IT_BOF:
+            CANx->STATR = CAN_STATR_ERRI;
+            break;
+
+        case CAN_IT_LEC:
+            CANx->ERRSR = RESET;
+            CANx->STATR = CAN_STATR_ERRI;
+            break;
+
+        case CAN_IT_ERR:
+            CANx->ERRSR = RESET;
+            CANx->STATR = CAN_STATR_ERRI;
+            break;
+
+        default:
+            break;
+    }
+}
+
+/*********************************************************************
+ * @fn      CheckITStatus
+ *
+ * @brief   Checks whether the CAN interrupt has occurred or not.
+ *
+ * @param   CAN_Reg - specifies the CAN interrupt register to check
+ *          It_Bit - specifies the interrupt source bit to check.
+ *
+ * @return  ITStatus - SET or RESET.
+ */
+static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit)
+{
+    ITStatus pendingbitstatus = RESET;
+
+    if((CAN_Reg & It_Bit) != (uint32_t)RESET)
+    {
+        pendingbitstatus = SET;
+    }
+    else
+    {
+        pendingbitstatus = RESET;
+    }
+
+    return pendingbitstatus;
+}

+ 100 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_crc.c

@@ -0,0 +1,100 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_crc.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 "ch32v30x_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);
+}

+ 304 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_dac.c

@@ -0,0 +1,304 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dac.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file provides all the DAC 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 "ch32v30x_dac.h"
+#include "ch32v30x_rcc.h"
+
+/* CTLR register Mask */
+#define CTLR_CLEAR_MASK    ((uint32_t)0x00000FFE)
+
+/* DAC Dual Channels SWTR masks */
+#define DUAL_SWTR_SET      ((uint32_t)0x00000003)
+#define DUAL_SWTR_RESET    ((uint32_t)0xFFFFFFFC)
+
+/* DHR registers offsets */
+#define DHR12R1_OFFSET     ((uint32_t)0x00000008)
+#define DHR12R2_OFFSET     ((uint32_t)0x00000014)
+#define DHR12RD_OFFSET     ((uint32_t)0x00000020)
+
+/* DOR register offset */
+#define DOR_OFFSET         ((uint32_t)0x0000002C)
+
+/*********************************************************************
+ * @fn      DAC_DeInit
+ *
+ * @brief   Deinitializes the DAC peripheral registers to their default reset values.
+ *
+ * @return  none
+ */
+void DAC_DeInit(void)
+{
+    RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE);
+    RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE);
+}
+
+/*********************************************************************
+ * @fn      DAC_Init
+ *
+ * @brief   Initializes the DAC peripheral according to the specified parameters in
+ *        the DAC_InitStruct.
+ *
+ * @param   DAC_Channel - the selected DAC channel.
+ *            DAC_Channel_1 - DAC Channel1 selected
+ *            DAC_Channel_2 - DAC Channel2 selected
+ *          DAC_InitStruct - pointer to a DAC_InitTypeDef structure.
+ *
+ * @return  none
+ */
+void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef *DAC_InitStruct)
+{
+    uint32_t tmpreg1 = 0, tmpreg2 = 0;
+
+    tmpreg1 = DAC->CTLR;
+    tmpreg1 &= ~(CTLR_CLEAR_MASK << DAC_Channel);
+    tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration |
+               DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer);
+    tmpreg1 |= tmpreg2 << DAC_Channel;
+    DAC->CTLR = tmpreg1;
+}
+
+/*********************************************************************
+ * @fn      DAC_StructInit
+ *
+ * @brief   Fills each DAC_InitStruct member with its default value.
+ *
+ * @param   DAC_InitStruct - pointer to a DAC_InitTypeDef structure which will be initialized.
+ *
+ * @return  none
+ */
+void DAC_StructInit(DAC_InitTypeDef *DAC_InitStruct)
+{
+    DAC_InitStruct->DAC_Trigger = DAC_Trigger_None;
+    DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None;
+    DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
+    DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable;
+}
+
+/*********************************************************************
+ * @fn      DAC_Cmd
+ *
+ * @brief   Enables or disables the specified DAC channel.
+ *
+ * @param   DAC_Channel - the selected DAC channel.
+ *            DAC_Channel_1 - DAC Channel1 selected
+ *            DAC_Channel_2 - DAC Channel2 selected
+ *          NewState - new state of the DAC channel(ENABLE or DISABLE).
+ *
+ * @return  none
+ */
+void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        DAC->CTLR |= (DAC_EN1 << DAC_Channel);
+    }
+    else
+    {
+        DAC->CTLR &= ~(DAC_EN1 << DAC_Channel);
+    }
+}
+
+/*********************************************************************
+ * @fn      DAC_DMACmd
+ *
+ * @brief   Enables or disables the specified DAC channel DMA request.
+ *
+ * @param   DAC_Channel - the selected DAC channel.
+ *            DAC_Channel_1 - DAC Channel1 selected
+ *            DAC_Channel_2 - DAC Channel2 selected
+ *          NewState - new state of the DAC channel(ENABLE or DISABLE).
+ *
+ * @return  none
+ */
+void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        DAC->CTLR |= (DAC_DMAEN1 << DAC_Channel);
+    }
+    else
+    {
+        DAC->CTLR &= ~(DAC_DMAEN1 << DAC_Channel);
+    }
+}
+
+/*********************************************************************
+ * @fn      DAC_SoftwareTriggerCmd
+ *
+ * @brief   Enables or disables the selected DAC channel software trigger.
+ *
+ * @param   DAC_Channel - the selected DAC channel.
+ *            DAC_Channel_1 - DAC Channel1 selected
+ *            DAC_Channel_2 - DAC Channel2 selected
+ *          NewState - new state of the DAC channel(ENABLE or DISABLE).
+ *
+ * @return  none
+ */
+void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        DAC->SWTR |= (uint32_t)DAC_SWTRIG1 << (DAC_Channel >> 4);
+    }
+    else
+    {
+        DAC->SWTR &= ~((uint32_t)DAC_SWTRIG1 << (DAC_Channel >> 4));
+    }
+}
+
+/*********************************************************************
+ * @fn      DAC_DualSoftwareTriggerCmd
+ *
+ * @brief   Enables or disables the two DAC channel software trigger.
+ *
+ * @param   NewState - new state of the DAC channel(ENABLE or DISABLE).
+ *
+ * @return  none
+ */
+void DAC_DualSoftwareTriggerCmd(FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        DAC->SWTR |= DUAL_SWTR_SET;
+    }
+    else
+    {
+        DAC->SWTR &= DUAL_SWTR_RESET;
+    }
+}
+
+/*********************************************************************
+ * @fn      DAC_WaveGenerationCmd
+ *
+ * @brief   Enables or disables the selected DAC channel wave generation.
+ *
+ * @param   DAC_Channel - the selected DAC channel.
+ *            DAC_Channel_1 - DAC Channel1 selected
+ *            DAC_Channel_2 - DAC Channel2 selected
+ *          DAC_Wave - Specifies the wave type to enable or disable.
+ *            DAC_Wave_Noise - noise wave generation
+ *            DAC_Wave_Triangle - triangle wave generation
+ *          NewState - new state of the DAC channel(ENABLE or DISABLE).
+ *
+ * @return  none
+ */
+void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState)
+{
+    if(NewState != DISABLE)
+    {
+        DAC->CTLR |= DAC_Wave << DAC_Channel;
+    }
+    else
+    {
+        DAC->CTLR &= ~(DAC_Wave << DAC_Channel);
+    }
+}
+
+/*********************************************************************
+ * @fn      DAC_SetChannel1Data
+ *
+ * @brief   Set the specified data holding register value for DAC channel1.
+ *
+ * @param   DAC_Align - Specifies the data alignment for DAC channel1.
+ *            DAC_Align_8b_R - 8bit right data alignment selected
+ *            DAC_Align_12b_L - 12bit left data alignment selected
+ *            DAC_Align_12b_R - 12bit right data alignment selected
+ *          Data - Data to be loaded in the selected data holding register.
+ *
+ * @return  none
+ */
+void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)
+{
+    __IO uint32_t tmp = 0;
+
+    tmp = (uint32_t)DAC_BASE;
+    tmp += DHR12R1_OFFSET + DAC_Align;
+
+    *(__IO uint32_t *)tmp = Data;
+}
+
+/*********************************************************************
+ * @fn      DAC_SetChannel2Data
+ *
+ * @brief   Set the specified data holding register value for DAC channel2.
+ *
+ * @param   DAC_Align - Specifies the data alignment for DAC channel1.
+ *            DAC_Align_8b_R - 8bit right data alignment selected
+ *            DAC_Align_12b_L - 12bit left data alignment selected
+ *            DAC_Align_12b_R - 12bit right data alignment selected
+ *            Data - Data to be loaded in the selected data holding register.
+ *
+ * @return  none
+ */
+void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data)
+{
+    __IO uint32_t tmp = 0;
+
+    tmp = (uint32_t)DAC_BASE;
+    tmp += DHR12R2_OFFSET + DAC_Align;
+
+    *(__IO uint32_t *)tmp = Data;
+}
+
+/*********************************************************************
+ * @fn      DAC_SetDualChannelData
+ *
+ * @brief   Set the specified data holding register value for two DAC.
+ *
+ * @param   DAC_Align - Specifies the data alignment for DAC channel1.
+ *            DAC_Align_8b_R - 8bit right data alignment selected
+ *            DAC_Align_12b_L - 12bit left data alignment selected
+ *            DAC_Align_12b_R - 12bit right data alignment selected
+ *            Data - Data to be loaded in the selected data holding register.
+ *          Data1 - Data for DAC Channel1.
+ *          Data2 - Data for DAC Channel2
+ *
+ * @return  none
+ */
+void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)
+{
+    uint32_t data = 0, tmp = 0;
+
+    if(DAC_Align == DAC_Align_8b_R)
+    {
+        data = ((uint32_t)Data2 << 8) | Data1;
+    }
+    else
+    {
+        data = ((uint32_t)Data2 << 16) | Data1;
+    }
+
+    tmp = (uint32_t)DAC_BASE;
+    tmp += DHR12RD_OFFSET + DAC_Align;
+
+    *(__IO uint32_t *)tmp = data;
+}
+
+/*********************************************************************
+ * @fn      DAC_GetDataOutputValue
+ *
+ * @brief   Returns the last data output value of the selected DAC channel.
+ *
+ * @param   DAC_Channel - the selected DAC channel.
+ *            DAC_Channel_1 - DAC Channel1 selected
+ *            DAC_Channel_2 - DAC Channel2 selected
+ *
+ * @return  none
+ */
+uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel)
+{
+    __IO uint32_t tmp = 0;
+
+    tmp = (uint32_t)DAC_BASE;
+    tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2);
+
+    return (uint16_t)(*(__IO uint32_t *)tmp);
+}

+ 129 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_dbgmcu.c

@@ -0,0 +1,129 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dbgmcu.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2024/05/28
+* 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 "ch32v30x_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 ((*(uint32_t *)0x1FFFF704) & IDCODE_DEVID_MASK);
+}
+
+/*********************************************************************
+ * @fn      DBGMCU_GetDEVID
+ *
+ * @brief   Returns the device identifier.
+ *
+ * @return  Device identifier.
+ */
+uint32_t DBGMCU_GetDEVID(void)
+{
+    return ((*(uint32_t *)0x1FFFF704) >> 16);
+}
+
+/*********************************************************************
+ * @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_IWDG_STOP - Debug IWDG stopped when Core is halted
+ *            DBGMCU_WWDG_STOP - Debug WWDG stopped when Core is halted
+ *            DBGMCU_TIM1_STOP - TIM1 counter stopped when Core is halted
+ *            DBGMCU_TIM2_STOP - TIM2 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-
+ *          CH32V303CBT6-0x303305x4
+ *          CH32V303RBT6-0x303205x4
+ *          CH32V303RCT6-0x303105x4
+ *          CH32V303VCT6-0x303005x4
+ *          CH32V305FBP6-0x305205x8
+ *          CH32V305RBT6-0x305005x8
+ *          CH32V305GBU6-0x305B05x8
+ *          CH32V305CCT6-0x305C05x8
+ *          CH32V307WCU6-0x307305x8
+ *          CH32V307FBP6-0x307205x8
+ *          CH32V307RCT6-0x307105x8
+ *          CH32V307VCT6-0x307005x8
+ *          CH32V317VCT6-0x3170B5X8
+ *          CH32V317WCU6-0x3173B5X8
+ *          CH32V317TCU6-0x3175B5X8
+ */
+uint32_t DBGMCU_GetCHIPID( void )
+{
+    return( *( uint32_t * )0x1FFFF704 );
+}
+

+ 692 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_dma.c

@@ -0,0 +1,692 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dma.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* 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 "ch32v30x_dma.h"
+#include "ch32v30x_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))
+
+/* DMA2 Channelx interrupt pending bit masks */
+#define DMA2_Channel1_IT_Mask     ((uint32_t)(DMA_GIF1 | DMA_TCIF1 | DMA_HTIF1 | DMA_TEIF1))
+#define DMA2_Channel2_IT_Mask     ((uint32_t)(DMA_GIF2 | DMA_TCIF2 | DMA_HTIF2 | DMA_TEIF2))
+#define DMA2_Channel3_IT_Mask     ((uint32_t)(DMA_GIF3 | DMA_TCIF3 | DMA_HTIF3 | DMA_TEIF3))
+#define DMA2_Channel4_IT_Mask     ((uint32_t)(DMA_GIF4 | DMA_TCIF4 | DMA_HTIF4 | DMA_TEIF4))
+#define DMA2_Channel5_IT_Mask     ((uint32_t)(DMA_GIF5 | DMA_TCIF5 | DMA_HTIF5 | DMA_TEIF5))
+#define DMA2_Channel6_IT_Mask     ((uint32_t)(DMA_GIF6 | DMA_TCIF6 | DMA_HTIF6 | DMA_TEIF6))
+#define DMA2_Channel7_IT_Mask     ((uint32_t)(DMA_GIF7 | DMA_TCIF7 | DMA_HTIF7 | DMA_TEIF7))
+#define DMA2_Channel8_IT_Mask     ((uint32_t)(DMA_GIF8 | DMA_TCIF8 | DMA_HTIF8 | DMA_TEIF8))
+#define DMA2_Channel9_IT_Mask     ((uint32_t)(DMA_GIF9 | DMA_TCIF9 | DMA_HTIF9 | DMA_TEIF9))
+#define DMA2_Channel10_IT_Mask    ((uint32_t)(DMA_GIF10 | DMA_TCIF10 | DMA_HTIF10 | DMA_TEIF10))
+#define DMA2_Channel11_IT_Mask    ((uint32_t)(DMA_GIF11 | DMA_TCIF11 | DMA_HTIF11 | DMA_TEIF11))
+
+/* DMA2 FLAG mask */
+#define FLAG_Mask                 ((uint32_t)0x10000000)
+#define DMA2_EXTEN_FLAG_Mask      ((uint32_t)0x20000000)
+
+/* 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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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 == DMA2_Channel1)
+    {
+        DMA2->INTFCR |= DMA2_Channel1_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel2)
+    {
+        DMA2->INTFCR |= DMA2_Channel2_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel3)
+    {
+        DMA2->INTFCR |= DMA2_Channel3_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel4)
+    {
+        DMA2->INTFCR |= DMA2_Channel4_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel5)
+    {
+        DMA2->INTFCR |= DMA2_Channel5_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel6)
+    {
+        DMA2->INTFCR |= DMA2_Channel6_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel7)
+    {
+        DMA2->INTFCR |= DMA2_Channel7_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel8)
+    {
+        DMA2_EXTEN->INTFCR |= DMA2_Channel8_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel9)
+    {
+        DMA2_EXTEN->INTFCR |= DMA2_Channel9_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel10)
+    {
+        DMA2_EXTEN->INTFCR |= DMA2_Channel10_IT_Mask;
+    }
+    else if(DMAy_Channelx == DMA2_Channel11)
+    {
+        DMA2_EXTEN->INTFCR |= DMA2_Channel11_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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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 or 2 to select the DMA and x can be
+ *        1 to 7 for DMA1 and 1 to 11 for DMA2 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.
+ *            DMA2_FLAG_GL1 - DMA2 Channel1 global flag.
+ *            DMA2_FLAG_TC1 - DMA2 Channel1 transfer complete flag.
+ *            DMA2_FLAG_HT1 - DMA2 Channel1 half transfer flag.
+ *            DMA2_FLAG_TE1 - DMA2 Channel1 transfer error flag.
+ *            DMA2_FLAG_GL2 - DMA2 Channel2 global flag.
+ *            DMA2_FLAG_TC2 - DMA2 Channel2 transfer complete flag.
+ *            DMA2_FLAG_HT2 - DMA2 Channel2 half transfer flag.
+ *            DMA2_FLAG_TE2 - DMA2 Channel2 transfer error flag.
+ *            DMA2_FLAG_GL3 - DMA2 Channel3 global flag.
+ *            DMA2_FLAG_TC3 - DMA2 Channel3 transfer complete flag.
+ *            DMA2_FLAG_HT3 - DMA2 Channel3 half transfer flag.
+ *            DMA2_FLAG_TE3 - DMA2 Channel3 transfer error flag.
+ *            DMA2_FLAG_GL4 - DMA2 Channel4 global flag.
+ *            DMA2_FLAG_TC4 - DMA2 Channel4 transfer complete flag.
+ *            DMA2_FLAG_HT4 - DMA2 Channel4 half transfer flag.
+ *            DMA2_FLAG_TE4 - DMA2 Channel4 transfer error flag.
+ *            DMA2_FLAG_GL5 - DMA2 Channel5 global flag.
+ *            DMA2_FLAG_TC5 - DMA2 Channel5 transfer complete flag.
+ *            DMA2_FLAG_HT5 - DMA2 Channel5 half transfer flag.
+ *            DMA2_FLAG_TE5 - DMA2 Channel5 transfer error flag.
+ *            DMA2_FLAG_GL6 - DMA2 Channel6 global flag.
+ *            DMA2_FLAG_TC6 - DMA2 Channel6 transfer complete flag.
+ *            DMA2_FLAG_HT6 - DMA2 Channel6 half transfer flag.
+ *            DMA2_FLAG_TE6 - DMA2 Channel6 transfer error flag.
+ *            DMA2_FLAG_GL7 - DMA2 Channel7 global flag.
+ *            DMA2_FLAG_TC7 - DMA2 Channel7 transfer complete flag.
+ *            DMA2_FLAG_HT7 - DMA2 Channel7 half transfer flag.
+ *            DMA2_FLAG_TE7 - DMA2 Channel7 transfer error flag.
+ *            DMA2_FLAG_GL8 - DMA2 Channel8 global flag.
+ *            DMA2_FLAG_TC8 - DMA2 Channel8 transfer complete flag.
+ *            DMA2_FLAG_HT8 - DMA2 Channel8 half transfer flag.
+ *            DMA2_FLAG_TE8 - DMA2 Channel8 transfer error flag.
+ *            DMA2_FLAG_GL9 - DMA2 Channel9 global flag.
+ *            DMA2_FLAG_TC9 - DMA2 Channel9 transfer complete flag.
+ *            DMA2_FLAG_HT9 - DMA2 Channel9 half transfer flag.
+ *            DMA2_FLAG_TE9 - DMA2 Channel9 transfer error flag.
+ *            DMA2_FLAG_GL10 - DMA2 Channel10 global flag.
+ *            DMA2_FLAG_TC10 - DMA2 Channel10 transfer complete flag.
+ *            DMA2_FLAG_HT10 - DMA2 Channel10 half transfer flag.
+ *            DMA2_FLAG_TE10 - DMA2 Channel10 transfer error flag.
+ *            DMA2_FLAG_GL11 - DMA2 Channel11 global flag.
+ *            DMA2_FLAG_TC11 - DMA2 Channel11 transfer complete flag.
+ *            DMA2_FLAG_HT11 - DMA2 Channel11 half transfer flag.
+ *            DMA2_FLAG_TE11 - DMA2 Channel11 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;
+
+    if((DMAy_FLAG & FLAG_Mask) == FLAG_Mask)
+    {
+        tmpreg = DMA2->INTFR;
+    }
+    else if((DMAy_FLAG & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask)
+    {
+        tmpreg = DMA2_EXTEN->INTFR;
+    }
+    else
+    {
+        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.
+ *            DMA2_FLAG_GL1 - DMA2 Channel1 global flag.
+ *            DMA2_FLAG_TC1 - DMA2 Channel1 transfer complete flag.
+ *            DMA2_FLAG_HT1 - DMA2 Channel1 half transfer flag.
+ *            DMA2_FLAG_TE1 - DMA2 Channel1 transfer error flag.
+ *            DMA2_FLAG_GL2 - DMA2 Channel2 global flag.
+ *            DMA2_FLAG_TC2 - DMA2 Channel2 transfer complete flag.
+ *            DMA2_FLAG_HT2 - DMA2 Channel2 half transfer flag.
+ *            DMA2_FLAG_TE2 - DMA2 Channel2 transfer error flag.
+ *            DMA2_FLAG_GL3 - DMA2 Channel3 global flag.
+ *            DMA2_FLAG_TC3 - DMA2 Channel3 transfer complete flag.
+ *            DMA2_FLAG_HT3 - DMA2 Channel3 half transfer flag.
+ *            DMA2_FLAG_TE3 - DMA2 Channel3 transfer error flag.
+ *            DMA2_FLAG_GL4 - DMA2 Channel4 global flag.
+ *            DMA2_FLAG_TC4 - DMA2 Channel4 transfer complete flag.
+ *            DMA2_FLAG_HT4 - DMA2 Channel4 half transfer flag.
+ *            DMA2_FLAG_TE4 - DMA2 Channel4 transfer error flag.
+ *            DMA2_FLAG_GL5 - DMA2 Channel5 global flag.
+ *            DMA2_FLAG_TC5 - DMA2 Channel5 transfer complete flag.
+ *            DMA2_FLAG_HT5 - DMA2 Channel5 half transfer flag.
+ *            DMA2_FLAG_TE5 - DMA2 Channel5 transfer error flag.
+ *            DMA2_FLAG_GL6 - DMA2 Channel6 global flag.
+ *            DMA2_FLAG_TC6 - DMA2 Channel6 transfer complete flag.
+ *            DMA2_FLAG_HT6 - DMA2 Channel6 half transfer flag.
+ *            DMA2_FLAG_TE6 - DMA2 Channel6 transfer error flag.
+ *            DMA2_FLAG_GL7 - DMA2 Channel7 global flag.
+ *            DMA2_FLAG_TC7 - DMA2 Channel7 transfer complete flag.
+ *            DMA2_FLAG_HT7 - DMA2 Channel7 half transfer flag.
+ *            DMA2_FLAG_TE7 - DMA2 Channel7 transfer error flag.
+ *            DMA2_FLAG_GL8 - DMA2 Channel8 global flag.
+ *            DMA2_FLAG_TC8 - DMA2 Channel8 transfer complete flag.
+ *            DMA2_FLAG_HT8 - DMA2 Channel8 half transfer flag.
+ *            DMA2_FLAG_TE8 - DMA2 Channel8 transfer error flag.
+ *            DMA2_FLAG_GL9 - DMA2 Channel9 global flag.
+ *            DMA2_FLAG_TC9 - DMA2 Channel9 transfer complete flag.
+ *            DMA2_FLAG_HT9 - DMA2 Channel9 half transfer flag.
+ *            DMA2_FLAG_TE9 - DMA2 Channel9 transfer error flag.
+ *            DMA2_FLAG_GL10 - DMA2 Channel10 global flag.
+ *            DMA2_FLAG_TC10 - DMA2 Channel10 transfer complete flag.
+ *            DMA2_FLAG_HT10 - DMA2 Channel10 half transfer flag.
+ *            DMA2_FLAG_TE10 - DMA2 Channel10 transfer error flag.
+ *            DMA2_FLAG_GL11 - DMA2 Channel11 global flag.
+ *            DMA2_FLAG_TC11 - DMA2 Channel11 transfer complete flag.
+ *            DMA2_FLAG_HT11 - DMA2 Channel11 half transfer flag.
+ *            DMA2_FLAG_TE11 - DMA2 Channel11 transfer error flag.
+ *
+ * @return  none
+ */
+void DMA_ClearFlag(uint32_t DMAy_FLAG)
+{
+    if((DMAy_FLAG & FLAG_Mask) == FLAG_Mask)
+    {
+        DMA2->INTFCR = DMAy_FLAG;
+    }
+    else if((DMAy_FLAG & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask)
+    {
+        DMA2_EXTEN->INTFCR = DMAy_FLAG;
+    }
+    else
+    {
+        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.
+ *            DMA2_IT_GL1 - DMA2 Channel1 global flag.
+ *            DMA2_IT_TC1 - DMA2 Channel1 transfer complete flag.
+ *            DMA2_IT_HT1 - DMA2 Channel1 half transfer flag.
+ *            DMA2_IT_TE1 - DMA2 Channel1 transfer error flag.
+ *            DMA2_IT_GL2 - DMA2 Channel2 global flag.
+ *            DMA2_IT_TC2 - DMA2 Channel2 transfer complete flag.
+ *            DMA2_IT_HT2 - DMA2 Channel2 half transfer flag.
+ *            DMA2_IT_TE2 - DMA2 Channel2 transfer error flag.
+ *            DMA2_IT_GL3 - DMA2 Channel3 global flag.
+ *            DMA2_IT_TC3 - DMA2 Channel3 transfer complete flag.
+ *            DMA2_IT_HT3 - DMA2 Channel3 half transfer flag.
+ *            DMA2_IT_TE3 - DMA2 Channel3 transfer error flag.
+ *            DMA2_IT_GL4 - DMA2 Channel4 global flag.
+ *            DMA2_IT_TC4 - DMA2 Channel4 transfer complete flag.
+ *            DMA2_IT_HT4 - DMA2 Channel4 half transfer flag.
+ *            DMA2_IT_TE4 - DMA2 Channel4 transfer error flag.
+ *            DMA2_IT_GL5 - DMA2 Channel5 global flag.
+ *            DMA2_IT_TC5 - DMA2 Channel5 transfer complete flag.
+ *            DMA2_IT_HT5 - DMA2 Channel5 half transfer flag.
+ *            DMA2_IT_TE5 - DMA2 Channel5 transfer error flag.
+ *            DMA2_IT_GL6 - DMA2 Channel6 global flag.
+ *            DMA2_IT_TC6 - DMA2 Channel6 transfer complete flag.
+ *            DMA2_IT_HT6 - DMA2 Channel6 half transfer flag.
+ *            DMA2_IT_TE6 - DMA2 Channel6 transfer error flag.
+ *            DMA2_IT_GL7 - DMA2 Channel7 global flag.
+ *            DMA2_IT_TC7 - DMA2 Channel7 transfer complete flag.
+ *            DMA2_IT_HT7 - DMA2 Channel7 half transfer flag.
+ *            DMA2_IT_TE7 - DMA2 Channel7 transfer error flag.
+ *            DMA2_IT_GL8 - DMA2 Channel8 global flag.
+ *            DMA2_IT_TC8 - DMA2 Channel8 transfer complete flag.
+ *            DMA2_IT_HT8 - DMA2 Channel8 half transfer flag.
+ *            DMA2_IT_TE8 - DMA2 Channel8 transfer error flag.
+ *            DMA2_IT_GL9 - DMA2 Channel9 global flag.
+ *            DMA2_IT_TC9 - DMA2 Channel9 transfer complete flag.
+ *            DMA2_IT_HT9 - DMA2 Channel9 half transfer flag.
+ *            DMA2_IT_TE9 - DMA2 Channel9 transfer error flag.
+ *            DMA2_IT_GL10 - DMA2 Channel10 global flag.
+ *            DMA2_IT_TC10 - DMA2 Channel10 transfer complete flag.
+ *            DMA2_IT_HT10 - DMA2 Channel10 half transfer flag.
+ *            DMA2_IT_TE10 - DMA2 Channel10 transfer error flag.
+ *            DMA2_IT_GL11 - DMA2 Channel11 global flag.
+ *            DMA2_IT_TC11 - DMA2 Channel11 transfer complete flag.
+ *            DMA2_IT_HT11 - DMA2 Channel11 half transfer flag.
+ *            DMA2_IT_TE11 - DMA2 Channel11 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;
+
+    if((DMAy_IT & FLAG_Mask) == FLAG_Mask)
+    {
+        tmpreg = DMA2->INTFR;
+    }
+    else if((DMAy_IT & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask)
+    {
+        tmpreg = DMA2_EXTEN->INTFR;
+    }
+    else
+    {
+        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.
+ *            DMA2_IT_GL1 - DMA2 Channel1 global flag.
+ *            DMA2_IT_TC1 - DMA2 Channel1 transfer complete flag.
+ *            DMA2_IT_HT1 - DMA2 Channel1 half transfer flag.
+ *            DMA2_IT_TE1 - DMA2 Channel1 transfer error flag.
+ *            DMA2_IT_GL2 - DMA2 Channel2 global flag.
+ *            DMA2_IT_TC2 - DMA2 Channel2 transfer complete flag.
+ *            DMA2_IT_HT2 - DMA2 Channel2 half transfer flag.
+ *            DMA2_IT_TE2 - DMA2 Channel2 transfer error flag.
+ *            DMA2_IT_GL3 - DMA2 Channel3 global flag.
+ *            DMA2_IT_TC3 - DMA2 Channel3 transfer complete flag.
+ *            DMA2_IT_HT3 - DMA2 Channel3 half transfer flag.
+ *            DMA2_IT_TE3 - DMA2 Channel3 transfer error flag.
+ *            DMA2_IT_GL4 - DMA2 Channel4 global flag.
+ *            DMA2_IT_TC4 - DMA2 Channel4 transfer complete flag.
+ *            DMA2_IT_HT4 - DMA2 Channel4 half transfer flag.
+ *            DMA2_IT_TE4 - DMA2 Channel4 transfer error flag.
+ *            DMA2_IT_GL5 - DMA2 Channel5 global flag.
+ *            DMA2_IT_TC5 - DMA2 Channel5 transfer complete flag.
+ *            DMA2_IT_HT5 - DMA2 Channel5 half transfer flag.
+ *            DMA2_IT_TE5 - DMA2 Channel5 transfer error flag.
+ *            DMA2_IT_GL6 - DMA2 Channel6 global flag.
+ *            DMA2_IT_TC6 - DMA2 Channel6 transfer complete flag.
+ *            DMA2_IT_HT6 - DMA2 Channel6 half transfer flag.
+ *            DMA2_IT_TE6 - DMA2 Channel6 transfer error flag.
+ *            DMA2_IT_GL7 - DMA2 Channel7 global flag.
+ *            DMA2_IT_TC7 - DMA2 Channel7 transfer complete flag.
+ *            DMA2_IT_HT7 - DMA2 Channel7 half transfer flag.
+ *            DMA2_IT_TE7 - DMA2 Channel7 transfer error flag.
+ *            DMA2_IT_GL8 - DMA2 Channel8 global flag.
+ *            DMA2_IT_TC8 - DMA2 Channel8 transfer complete flag.
+ *            DMA2_IT_HT8 - DMA2 Channel8 half transfer flag.
+ *            DMA2_IT_TE8 - DMA2 Channel8 transfer error flag.
+ *            DMA2_IT_GL9 - DMA2 Channel9 global flag.
+ *            DMA2_IT_TC9 - DMA2 Channel9 transfer complete flag.
+ *            DMA2_IT_HT9 - DMA2 Channel9 half transfer flag.
+ *            DMA2_IT_TE9 - DMA2 Channel9 transfer error flag.
+ *            DMA2_IT_GL10 - DMA2 Channel10 global flag.
+ *            DMA2_IT_TC10 - DMA2 Channel10 transfer complete flag.
+ *            DMA2_IT_HT10 - DMA2 Channel10 half transfer flag.
+ *            DMA2_IT_TE10 - DMA2 Channel10 transfer error flag.
+ *            DMA2_IT_GL11 - DMA2 Channel11 global flag.
+ *            DMA2_IT_TC11 - DMA2 Channel11 transfer complete flag.
+ *            DMA2_IT_HT11 - DMA2 Channel11 half transfer flag.
+ *            DMA2_IT_TE11 - DMA2 Channel11 transfer error flag.
+ *
+ * @return  none
+ */
+void DMA_ClearITPendingBit(uint32_t DMAy_IT)
+{
+    if((DMAy_IT & FLAG_Mask) == FLAG_Mask)
+    {
+        DMA2->INTFCR = DMAy_IT;
+    }
+    else if((DMAy_IT & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask)
+    {
+        DMA2_EXTEN->INTFCR = DMAy_IT;
+    }
+    else
+    {
+        DMA1->INTFCR = DMAy_IT;
+    }
+}

+ 135 - 0
EVT/EXAM/SRC/Peripheral/src/ch32v30x_dvp.c

@@ -0,0 +1,135 @@
+/********************************** (C) COPYRIGHT  *******************************
+* File Name          : ch32v30x_dvp.c
+* Author             : WCH
+* Version            : V1.0.0
+* Date               : 2021/06/06
+* Description        : This file provides all the DVP 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 "ch32v30x_dvp.h"
+
+/*********************************************************************
+ * @fn      DVP_INTCfg
+ *
+ * @brief   DVP interrupt configuration
+ *
+ * @param   s - interrupt enable
+ *             ENABLE
+ *             DISABLE
+ *          i - interrupt type
+ *             RB_DVP_IE_STP_FRM
+ *             RB_DVP_IE_FIFO_OV
+ *             RB_DVP_IE_FRM_DONE
+ *             RB_DVP_IE_ROW_DONE
+ *             RB_DVP_IE_STR_FRM
+ *
+ * @return  none
+ */
+void DVP_INTCfg(uint8_t s, uint8_t i)
+{
+    if(s)
+    {
+        DVP->IER |= i;
+    }
+    else
+    {
+        DVP->IER &= ~i;
+    }
+}
+
+/*********************************************************************
+ * @fn      DVP_Mode
+ *
+ * @brief   DVP mode
+ *
+ * @param   s - data bit width
+ *             RB_DVP_D8_MOD
+ *             RB_DVP_D10_MOD
+ *             RB_DVP_D12_MOD
+ *          i - interrupt type
+ *             Video_Mode
+ *             JPEG_Mode
+ *
+ * @return  none
+ */
+void DVP_Mode(uint8_t s, DVP_Data_ModeTypeDef i)
+{
+    DVP->CR0 &= ~RB_DVP_MSK_DAT_MOD;
+
+    if(s)
+    {
+        DVP->CR0 |= s;
+    }
+    else
+    {
+        DVP->CR0 &= ~(3 << 4);
+    }
+
+    if(i)
+    {
+        DVP->CR0 |= RB_DVP_JPEG;
+    }
+    else
+    {
+        DVP->CR0 &= ~RB_DVP_JPEG;
+    }
+}
+
+/*********************************************************************
+ * @fn      DVP_Cfg
+ *
+ * @brief   DVP configuration
+ *
+ * @param   s - DMA enable control
+ *            DVP_DMA_Enable
+ *            DVP_DMA_Disable
+ *          i - DVP all clear
+ *            DVP_FLAG_FIFO_RESET_Enable
+ *            DVP_FLAG_FIFO_RESET_Disable
+ *          j - receive reset enable
+ *            DVP_RX_RESET_Enable
+ *            DVP_RX_RESET_Disable
+ *
+ * @return  none
+ */
+void DVP_Cfg(DVP_DMATypeDef s, DVP_FLAG_FIFO_RESETTypeDef i, DVP_RX_RESETTypeDef j)
+{
+    switch(s)
+    {
+        case DVP_DMA_Enable:
+            DVP->CR1 |= RB_DVP_DMA_EN;
+            break;
+        case DVP_DMA_Disable:
+            DVP->CR1 &= ~RB_DVP_DMA_EN;
+            break;
+        default:
+            break;
+    }
+
+    switch(i)
+    {
+        case DVP_RX_RESET_Enable:
+            DVP->CR1 |= RB_DVP_ALL_CLR;
+            break;
+        case DVP_RX_RESET_Disable:
+            DVP->CR1 &= ~RB_DVP_ALL_CLR;
+            break;
+        default:
+            break;
+    }
+
+    switch(j)
+    {
+        case DVP_RX_RESET_Enable:
+            DVP->CR1 |= RB_DVP_RCV_CLR;
+            break;
+        case DVP_RX_RESET_Disable:
+            DVP->CR1 &= ~RB_DVP_RCV_CLR;
+            break;
+        default:
+            break;
+    }
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно