diff --git a/.gitignore b/.gitignore
index ef6c9e4..ea7006a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ build/
.vscode
# MRS IDE files
*.launch
+.mrs/
diff --git a/mijia_haier_bridge/.cproject b/mijia_haier_bridge/.cproject
new file mode 100644
index 0000000..3f6af52
--- /dev/null
+++ b/mijia_haier_bridge/.cproject
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mijia_haier_bridge/.project b/mijia_haier_bridge/.project
new file mode 100644
index 0000000..8bf305a
--- /dev/null
+++ b/mijia_haier_bridge/.project
@@ -0,0 +1,34 @@
+
+
+ mijia_haier_bridge
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
+
+
+
+ 6
+
+ org.eclipse.ui.ide.multiFilter
+ 1.0-name-matches-false-false-*.wvproj
+
+
+
+
\ No newline at end of file
diff --git a/mijia_haier_bridge/.template b/mijia_haier_bridge/.template
new file mode 100644
index 0000000..cf9a9fa
--- /dev/null
+++ b/mijia_haier_bridge/.template
@@ -0,0 +1,25 @@
+Vendor=WCH
+Toolchain=RISC-V
+Series=CH32V103
+RTOS=NoneOS
+CalibrateSupport=false
+CalibrateCommand=
+MCU=CH32V103C8T6
+Link=WCH-Link
+PeripheralVersion====1.0
+Description====
+Mcu Type=CH32V10x
+Address=0x08000000
+Target Path=build\mijia_haier_bridge.hex
+Exe Path=
+Exe Arguments=
+CLKSpeed=1
+DebugInterfaceMode=0
+Erase All=true
+Program=true
+Verify=false
+Reset=true
+SDIPrintf=false
+Disable Power Output=false
+Clear CodeFlash=false
+Disable Code-Protect=false
\ No newline at end of file
diff --git a/mijia_haier_bridge/mijia_haier_bridge.wvproj b/mijia_haier_bridge/mijia_haier_bridge.wvproj
new file mode 100644
index 0000000..db13b77
--- /dev/null
+++ b/mijia_haier_bridge/mijia_haier_bridge.wvproj
@@ -0,0 +1,407 @@
+{
+ "version": "1.0",
+ "isNormalMRSProject": true,
+ "basic": {
+ "chipInfo": {
+ "vendor": "WCH",
+ "toolchain": "RISC-V",
+ "series": "CH32V103",
+ "rtos": "NoneOS",
+ "mcu": "CH32V103C8T6",
+ "description": "===",
+ "link": "WCH-Link",
+ "peripheral_version": "===1.0",
+ "calibrateSupport": false,
+ "calibrateCommand": ""
+ },
+ "linkedFolders": [],
+ "removedResources": [
+ {
+ "parentLogicPath": "",
+ "type": "file",
+ "name": "*.wvproj"
+ }
+ ],
+ "projectName": "mijia_haier_bridge",
+ "architecture": "RISC-V",
+ "projectType": "c"
+ },
+ "buildConfig": {
+ "configurations": [
+ {
+ "buildArtifact": {
+ "artifact_name": "${ProjName}",
+ "artifact_extension": "elf",
+ "output_prefix": "",
+ "artifact_type": "Executable"
+ },
+ "parallelizationNumber": "optimal",
+ "stop_on_first_build_error": true,
+ "pre_script": "",
+ "pre_script_description": "",
+ "post_script": "",
+ "post_script_description": "",
+ "excludeResources": [],
+ "optimization": {
+ "level": "debug",
+ "message_length": true,
+ "char_is_signed": true,
+ "function_sections": true,
+ "data_sections": true,
+ "no_common_unitialized": true,
+ "do_not_inline_functions": false,
+ "assume_freestanding_environment": false,
+ "disable_builtin": false,
+ "single_precision_constants": false,
+ "position_independent_code": false,
+ "link_time_optimizer": false,
+ "disable_loop_invariant_move": false,
+ "optimize_unused_sections_declared_as_high_code": false,
+ "code_generation_without_hardware_floating": false,
+ "use_pipelines": false,
+ "show_caret_indicating_the_column": false,
+ "other_optimization_flags": ""
+ },
+ "warnings": {
+ "check_syntax_only": false,
+ "pedantic": false,
+ "pedantic_warnings_as_errors": false,
+ "inhibit_all_warnings": false,
+ "warn_on_various_unused_elements": true,
+ "warn_on_uninitialized_variables": true,
+ "enable_all_common_warnings": false,
+ "enable_extra_warnings": false,
+ "warn_on_undeclared_global_function": false,
+ "warn_on_implicit_conversions": false,
+ "warn_if_pointer_arthmetic": false,
+ "warn_if_padding_is_included": false,
+ "warn_if_shadowed_variable": false,
+ "warn_if_suspicious_logical_ops": false,
+ "warn_if_struct_is_returned": false,
+ "warn_if_floats_are_compared_as_equal": false,
+ "generate_errors_instead_of_warnings": false,
+ "other_warning_flags": ""
+ },
+ "debugging": {
+ "debug_level": "default",
+ "debug_format": "default",
+ "generate_prof_information": false,
+ "generate_gprof_information": false,
+ "other_debugging_flags": ""
+ },
+ "assembler": {
+ "preprocessor": {
+ "use_preprocessor": true,
+ "do_not_search_system_directories": false,
+ "preprocess_only": false,
+ "defined_symbols": [],
+ "undefined_symbols": []
+ },
+ "includes": {
+ "include_paths": [],
+ "include_system_paths": [],
+ "include_files": []
+ },
+ "other_warning_flags": "",
+ "miscellaneous": {
+ "assembler_flags": [],
+ "generate_assembler_listing": false,
+ "save_temporary_files": false,
+ "verbose": false,
+ "other_assembler_flags": ""
+ }
+ },
+ "ccompiler": {
+ "preprocessor": {
+ "do_not_search_system_directories": false,
+ "preprocess_only": false,
+ "defined_symbols": [],
+ "undefined_symbols": []
+ },
+ "includes": {
+ "include_paths": [
+ "${project}/src/core",
+ "${project}/src/periph",
+ "${project}/src/user",
+ "${project}/3rdparty/CherryUSB/class/cdc",
+ "${project}/3rdparty/CherryUSB/class/hid",
+ "${project}/3rdparty/CherryUSB/core",
+ "${project}/3rdparty/CherryUSB/common",
+ "${project}/3rdparty/CherryUSB/port/ch32v103"
+ ],
+ "include_system_paths": [],
+ "include_files": []
+ },
+ "optimization": {
+ "language_standard": "gnu99",
+ "other_optimization_flags": ""
+ },
+ "warnings": {
+ "warn_if_a_global_function_has_no_prototype": false,
+ "warn_if_a_function_has_no_arg_type": false,
+ "warn_if_wrong_cast": false,
+ "other_warning_flags": ""
+ },
+ "miscellaneous": {
+ "generate_assembler_listing": false,
+ "save_temporary_files": false,
+ "verbose": false,
+ "other_compiler_flags": ""
+ }
+ },
+ "cppcompiler": {
+ "preprocessor": {
+ "do_not_search_system_directories": false,
+ "do_not_search_system_cpp_directories": false,
+ "preprocess_only": false,
+ "defined_symbols": [],
+ "undefined_symbols": []
+ },
+ "includes": {
+ "include_paths": [],
+ "include_system_paths": [],
+ "include_files": []
+ },
+ "optimization": {
+ "cpp_language_standard": "gnucpp11",
+ "abi_version": "0",
+ "do_not_use_exceptions": false,
+ "do_not_use_rtti": false,
+ "do_not_use__cxa_atexit": false,
+ "do_not_use_thread_safe_statics": false,
+ "other_optimization_flags": ""
+ },
+ "warnings": {
+ "warn_on_abi_violations": false,
+ "warn_on_class_privacy": false,
+ "warn_on_no_except_expressions": false,
+ "warn_on_virtual_destructors": false,
+ "warn_on_uncast_null": false,
+ "warn_on_sign_promotion": false,
+ "warn_about_effictive_cpp_violcations": false,
+ "other_warning_flags": ""
+ },
+ "miscellaneous": {
+ "generate_assembler_listing": false,
+ "save_temporary_files": false,
+ "verbose": false,
+ "other_compiler_flags": ""
+ }
+ },
+ "clinker": {
+ "general": {
+ "scriptFiles": [
+ "${project}/src/core/ld_ch32v10x.ld"
+ ],
+ "do_not_use_standard_start_files": true,
+ "do_not_use_default_libraries": false,
+ "no_startup_or_default_libs": false,
+ "remove_unused_sections": true,
+ "print_removed_sections": false,
+ "omit_all_symbol_information": false
+ },
+ "libraries": {
+ "libraries": [],
+ "library_search_path": []
+ },
+ "miscellaneous": {
+ "picolibc": "double",
+ "linker_flags": [],
+ "other_objects": [],
+ "generate_map": "\"${BuildArtifactFileBaseName}.map\"",
+ "cross_reference": false,
+ "print_link_map": false,
+ "use_newlib_nano": true,
+ "use_float_with_nano_printf": false,
+ "use_float_with_nano_scanf": false,
+ "do_not_use_syscalls": true,
+ "verbose": false,
+ "use_wch_printffloat": false,
+ "use_wch_printf": true,
+ "use_iqmath": false,
+ "other_linker_flags": "-Wl,--print-memory-usage"
+ }
+ },
+ "cpplinker": {
+ "general": {
+ "scriptFiles": [
+ "${project}/src/core/ld_ch32v10x.ld"
+ ],
+ "do_not_use_standard_start_files": true,
+ "do_not_use_default_libraries": false,
+ "no_startup_or_default_libs": false,
+ "remove_unused_sections": true,
+ "print_removed_sections": false,
+ "omit_all_symbol_information": false
+ },
+ "libraries": {
+ "libraries": [],
+ "library_search_path": []
+ },
+ "miscellaneous": {
+ "picolibc": "double",
+ "linker_flags": [],
+ "other_objects": [],
+ "generate_map": "\"${BuildArtifactFileBaseName}.map\"",
+ "cross_reference": false,
+ "print_link_map": false,
+ "use_newlib_nano": true,
+ "use_float_with_nano_printf": false,
+ "use_float_with_nano_scanf": false,
+ "do_not_use_syscalls": true,
+ "verbose": false,
+ "use_wch_printffloat": false,
+ "use_wch_printf": true,
+ "use_iqmath": false,
+ "other_linker_flags": "-Wl,--print-memory-usage"
+ }
+ },
+ "archiver": {
+ "archiver_flags": "-r"
+ },
+ "createFlash": {
+ "enabled": true,
+ "outputFileFormat": "ihex",
+ "copy_only_section_text": false,
+ "copy_only_section_data": false,
+ "copy_only_sections": [],
+ "other_flags": ""
+ },
+ "createList": {
+ "enabled": true,
+ "display_source": false,
+ "display_all_headers": true,
+ "demangle_names": true,
+ "display_debug_info": false,
+ "disassemble": true,
+ "display_file_headers": false,
+ "display_line_numbers": false,
+ "display_relocation_info": false,
+ "display_symbols": false,
+ "wide_lines": false,
+ "other_flags": ""
+ },
+ "printSize": {
+ "enabled": false,
+ "size_format": "berkeley",
+ "hex": false,
+ "show_totals": false,
+ "other_flags": ""
+ },
+ "riscvTargetProcessor": {
+ "architecture": "rv32i",
+ "multiply_extension": true,
+ "atomic_extension": true,
+ "floating_point": "none",
+ "compressed_extension": true,
+ "extra_compressed_extension": false,
+ "bit_extension": false,
+ "multiplication_subset_of_the_M_extension": false,
+ "integer_ABI": "ilp32",
+ "floating_point_ABI": "none",
+ "tuning": "default",
+ "code_model": "default",
+ "small_data_limit": 8,
+ "align": "default",
+ "save_restore": true,
+ "other_target_flags": ""
+ },
+ "component_toolchain": "${WCH:Toolchain:GCC12}",
+ "name": "build",
+ "configVariables": []
+ }
+ ]
+ },
+ "flashConfig": {
+ "mcutype": "CH32V10x",
+ "address": "0x08000000",
+ "target_path": "build\\mijia_haier_bridge.hex",
+ "clkSpeed": "High",
+ "debug_interface_mode": "1-wire serial",
+ "erase": true,
+ "program": true,
+ "verify": false,
+ "reset": true,
+ "sdiPrintf": false,
+ "disablepowerout": false,
+ "clearcodeflash": false,
+ "disablecodeprotect": false,
+ "exepath": "",
+ "exearguments": ""
+ },
+ "debugConfigurations": {
+ "openOCDCfg": {
+ "useLocalOpenOCD": true,
+ "executable": "${WCH:OpenOCD:default}",
+ "gdbport": 3333,
+ "telnetport": 4444,
+ "tclport": 6666,
+ "configOptions": [
+ "-f \"${WCH:OpenOCD:default}/bin/wch-riscv.cfg\""
+ ],
+ "host": "localhost",
+ "port": 3333,
+ "skipDownloadBeforeDebug": false,
+ "enablePageEraser": false,
+ "enableNoZeroWaitingAreaFlash": false
+ },
+ "gdbCfg": {
+ "executable": "${WCH:Toolchain:GCC12}",
+ "options": [],
+ "commands": [
+ "set mem inaccessible-by-default off",
+ "set architecture riscv:rv32",
+ "set remotetimeout unlimited"
+ ]
+ },
+ "startup": {
+ "initCommands": {
+ "initReset": true,
+ "initResetType": "init",
+ "additionalCommands": [],
+ "armSemihosting": false,
+ "armSemihosting_old": false
+ },
+ "loadedFiles": {
+ "loadSymbols": true,
+ "useProjBinaryForSymbols": true,
+ "useFileForSymbols": false,
+ "symbolFile": "",
+ "symbolFileOffset": "",
+ "loadImage": true,
+ "useProjBinaryForImage": true,
+ "useFileForImage": false,
+ "executableFile": "",
+ "executableFileOffset": ""
+ },
+ "runCommands": {
+ "runReset": true,
+ "runResetType": "halt",
+ "additionalCommands": [],
+ "setBreakAt": "handle_reset",
+ "continue": true,
+ "setBreak": true,
+ "setProgramCounter": false,
+ "setProgramCounterAddress": ""
+ },
+ "debugInRAM": false
+ },
+ "svdpath": "${WCH:SDK:default}/RISC-V/CH32L103/NoneOS/CH32L103xx.svd",
+ "output": {
+ "showDebugGDBTrace": true,
+ "saveDebugOutputToFile": false,
+ "showDebugOutputTimestamps": true
+ },
+ "reserve": {
+ "PROGRAM_NAME": "obj/mijia_haier_bridge.elf",
+ "PROJECT_ATTR": "mijia_haier_bridge",
+ "PROJECT_BUILD_CONFIG_AUTO_ATTR": true,
+ "PROJECT_BUILD_CONFIG_ID_ATTR": "",
+ "ATTR_BUILD_BEFORE_LAUNCH_ATTR": 2,
+ "GdbServerAllocateConsole": true,
+ "GdbServerAllocateTelnetConsole": false,
+ "StartGdbCLient": true,
+ "UPDATE_THREADLIST_ON_SUSPEND": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/mijia_haier_bridge/src/core/core_riscv.c b/mijia_haier_bridge/src/core/core_riscv.c
new file mode 100644
index 0000000..89aa0bf
--- /dev/null
+++ b/mijia_haier_bridge/src/core/core_riscv.c
@@ -0,0 +1,303 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : core_riscv.c
+ * Author : WCH
+ * Version : V1.0.1
+ * Date : 2023/11/11
+ * Description : RISC-V V3 Core Peripheral Access Layer Source File for CH32V10x
+*********************************************************************************
+* 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
+
+/* define compiler specific symbols */
+#if defined(__CC_ARM)
+ #define __ASM __asm /* asm keyword for ARM Compiler */
+ #define __INLINE __inline /* inline keyword for ARM Compiler */
+
+#elif defined(__ICCARM__)
+ #define __ASM __asm /* asm keyword for IAR Compiler */
+ #define __INLINE inline /* inline keyword for IAR Compiler. Only avaiable in High optimization mode! */
+
+#elif defined(__GNUC__)
+ #define __ASM __asm /* asm keyword for GNU Compiler */
+ #define __INLINE inline /* inline keyword for GNU Compiler */
+
+#elif defined(__TASKING__)
+ #define __ASM __asm /* asm keyword for TASKING Compiler */
+ #define __INLINE inline /* inline keyword for TASKING Compiler */
+
+#endif
+
+/*********************************************************************
+ * @fn __get_MSTATUS
+ *
+ * @brief Return the Machine Status Register
+ *
+ * @return mstatus value
+ */
+uint32_t __get_MSTATUS(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0," "mstatus": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MSTATUS
+ *
+ * @brief Set the Machine Status Register
+ *
+ * @param value - set mstatus value
+ *
+ * @return none
+ */
+void __set_MSTATUS(uint32_t value)
+{
+ __ASM volatile("csrw mstatus, %0" : : "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MISA
+ *
+ * @brief Return the Machine ISA Register
+ *
+ * @return misa value
+ */
+uint32_t __get_MISA(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0,""misa" : "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MISA
+ *
+ * @brief Set the Machine ISA Register
+ *
+ * @param value - set misa value
+ *
+ * @return none
+ */
+void __set_MISA(uint32_t value)
+{
+ __ASM volatile("csrw misa, %0" : : "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MTVEC
+ *
+ * @brief Return the Machine Trap-Vector Base-Address Register
+ *
+ * @return mtvec value
+ */
+uint32_t __get_MTVEC(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0," "mtvec": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MTVEC
+ *
+ * @brief Set the Machine Trap-Vector Base-Address Register
+ *
+ * @param value - set mtvec value
+ *
+ * @return none
+ */
+void __set_MTVEC(uint32_t value)
+{
+ __ASM volatile("csrw mtvec, %0":: "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MSCRATCH
+ *
+ * @brief Return the Machine Seratch Register
+ *
+ * @return mscratch value
+ */
+uint32_t __get_MSCRATCH(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0," "mscratch" : "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MSCRATCH
+ *
+ * @brief Set the Machine Seratch Register
+ *
+ * @param value - set mscratch value
+ *
+ * @return none
+ */
+void __set_MSCRATCH(uint32_t value)
+{
+ __ASM volatile("csrw mscratch, %0" : : "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MEPC
+ *
+ * @brief Return the Machine Exception Program Register
+ *
+ * @return mepc value
+ */
+uint32_t __get_MEPC(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0," "mepc" : "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MEPC
+ *
+ * @brief Set the Machine Exception Program Register
+ *
+ * @return mepc value
+ */
+void __set_MEPC(uint32_t value)
+{
+ __ASM volatile("csrw mepc, %0" : : "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MCAUSE
+ *
+ * @brief Return the Machine Cause Register
+ *
+ * @return mcause value
+ */
+uint32_t __get_MCAUSE(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0," "mcause": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MEPC
+ *
+ * @brief Set the Machine Cause Register
+ *
+ * @return mcause value
+ */
+void __set_MCAUSE(uint32_t value)
+{
+ __ASM volatile("csrw mcause, %0":: "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MTVAL
+ *
+ * @brief Return the Machine Trap Value Register
+ *
+ * @return mtval value
+ */
+uint32_t __get_MTVAL(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0," "mtval" : "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __set_MTVAL
+ *
+ * @brief Set the Machine Trap Value Register
+ *
+ * @return mtval value
+ */
+void __set_MTVAL(uint32_t value)
+{
+ __ASM volatile("csrw mtval, %0":: "r"(value));
+}
+
+/*********************************************************************
+ * @fn __get_MVENDORID
+ *
+ * @brief Return Vendor ID Register
+ *
+ * @return mvendorid value
+ */
+uint32_t __get_MVENDORID(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0,""mvendorid": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __get_MARCHID
+ *
+ * @brief Return Machine Architecture ID Register
+ *
+ * @return marchid value
+ */
+uint32_t __get_MARCHID(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0,""marchid": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __get_MIMPID
+ *
+ * @brief Return Machine Implementation ID Register
+ *
+ * @return mimpid value
+ */
+uint32_t __get_MIMPID(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0,""mimpid": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __get_MHARTID
+ *
+ * @brief Return Hart ID Register
+ *
+ * @return mhartid value
+ */
+uint32_t __get_MHARTID(void)
+{
+ uint32_t result;
+
+ __ASM volatile("csrr %0,""mhartid": "=r"(result));
+ return (result);
+}
+
+/*********************************************************************
+ * @fn __get_SP
+ *
+ * @brief Return SP Register
+ *
+ * @return SP value
+ */
+uint32_t __get_SP(void)
+{
+ uint32_t result;
+
+ __ASM volatile("mv %0,""sp": "=r"(result):);
+ return (result);
+}
diff --git a/mijia_haier_bridge/src/core/core_riscv.h b/mijia_haier_bridge/src/core/core_riscv.h
new file mode 100644
index 0000000..a9fdae4
--- /dev/null
+++ b/mijia_haier_bridge/src/core/core_riscv.h
@@ -0,0 +1,629 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : core_riscv.h
+ * Author : WCH
+ * Version : V1.0.1
+ * Date : 2023/11/11
+ * Description : RISC-V V3 Core Peripheral Access Layer Header File for CH32V10x
+*********************************************************************************
+* 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 uint32_t vuc32; /* Read Only */
+typedef __I uint16_t vuc16; /* Read Only */
+typedef __I uint8_t vuc8; /* 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 int32_t vsc32; /* Read Only */
+typedef __I int16_t vsc16; /* Read Only */
+typedef __I int8_t vsc8; /* 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 uint32_t vu32;
+typedef __IO uint16_t vu16;
+typedef __IO uint8_t vu8;
+
+typedef uint32_t u32;
+typedef uint16_t u16;
+typedef uint8_t u8;
+
+typedef __IO int32_t vs32;
+typedef __IO int16_t vs16;
+typedef __IO int8_t vs8;
+
+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 VTFBADDRR;
+ __IO uint32_t CFGR;
+ __I uint32_t GISR;
+ uint8_t RESERVED0[0x10];
+ __IO uint32_t VTFADDRR[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;
+
+#define FIBADDRR VTFBADDRR
+#define FIOFADDRR VTFADDRR
+
+
+/* memory mapped structure for SysTick */
+typedef struct
+{
+ __IO uint32_t CTLR;
+ __IO uint8_t CNTL0;
+ __IO uint8_t CNTL1;
+ __IO uint8_t CNTL2;
+ __IO uint8_t CNTL3;
+ __IO uint8_t CNTH0;
+ __IO uint8_t CNTH1;
+ __IO uint8_t CNTH2;
+ __IO uint8_t CNTH3;
+ __IO uint8_t CMPLR0;
+ __IO uint8_t CMPLR1;
+ __IO uint8_t CMPLR2;
+ __IO uint8_t CMPLR3;
+ __IO uint8_t CMPHR0;
+ __IO uint8_t CMPHR1;
+ __IO uint8_t CMPHR2;
+ __IO uint8_t CMPHR3;
+}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
+ * This function is only used for Machine mode.
+ *
+ * @brief Enable Global Interrupt
+ *
+ * @return none
+ */
+__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __enable_irq()
+{
+ __asm volatile ("csrs mstatus, %0" : : "r" (0x88) );
+}
+
+/*********************************************************************
+ * @fn __disable_irq
+ * This function is only used for Machine mode.
+ *
+ * @brief Disable Global Interrupt
+ *
+ * @return none
+ */
+__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __disable_irq()
+{
+ __asm volatile ("csrc mstatus, %0" : : "r" (0x88) );
+}
+
+/*********************************************************************
+ * @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)
+{
+ uint32_t t;
+
+ t = NVIC->ITHRESDR;
+ NVIC->ITHRESDR = 0x10;
+ NVIC->IRER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));
+ NVIC->ITHRESDR = t;
+}
+
+/*********************************************************************
+ * @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(PFIC->CFGR bit1 = 0)
+ * priority - bit[7] - Preemption Priority
+ * bit[6:4] - Sub priority
+ * bit[3:0] - Reserve
+ * interrupt nesting disable(PFIC->CFGR bit1 = 1)
+ * priority - bit[7:4] - Sub priority
+ * bit[3: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)
+{
+ NVIC->SCTLR |= (1<<3)|(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 NVIC_SetFastIRQ
+ *
+ * @brief Set VTF Interrupt
+ *
+ * @param add - VTF interrupt service function base address.
+ * IRQn - Interrupt Numbers
+ * num - VTF Interrupt Numbers
+ *
+ * @return none
+ */
+__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SetFastIRQ(uint32_t addr, IRQn_Type IRQn, uint8_t num)
+{
+ if(num > 3) return ;
+ NVIC->VTFBADDRR = addr;
+ NVIC->VTFADDRR[num] = ((uint32_t)IRQn<<24)|(addr&0xfffff);
+}
+
+/*********************************************************************
+ * @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 NVIC_HaltPushCfg
+ *
+ * @brief Enable Hardware Stack
+ *
+ * @param NewState - DISABLE or ENABLE
+
+ * @return none
+ */
+__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_HaltPushCfg(FunctionalState NewState)
+{
+ if (NewState != DISABLE)
+ {
+ NVIC->CFGR = NVIC_KEY1;
+ }
+ else
+ {
+ NVIC->CFGR = NVIC_KEY1|(1<<0);
+ }
+}
+
+/*********************************************************************
+ * @fn NVIC_INTNestCfg
+ *
+ * @brief Enable Interrupt Nesting
+ *
+ * @param NewState - DISABLE or ENABLE
+ *
+ * @return none
+ */
+__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_INTNestCfg(FunctionalState NewState)
+{
+ if (NewState != DISABLE)
+ {
+ NVIC->CFGR = NVIC_KEY1;
+ }
+ else
+ {
+ NVIC->CFGR = NVIC_KEY1|(1<<1);
+ }
+}
+
+/*********************************************************************
+ * @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_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/* __CORE_RISCV_H__ */
+
+
+
+
+
diff --git a/mijia_haier_bridge/src/core/ld_ch32v10x.ld b/mijia_haier_bridge/src/core/ld_ch32v10x.ld
new file mode 100644
index 0000000..53a5ac6
--- /dev/null
+++ b/mijia_haier_bridge/src/core/ld_ch32v10x.ld
@@ -0,0 +1,146 @@
+ENTRY( _start )
+
+__stack_size = 2048;
+
+PROVIDE( _stack_size = __stack_size );
+
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
+}
+
+SECTIONS
+{
+ .init : {
+ _sinit = .;
+ . = ALIGN(4);
+ KEEP(*(SORT_NONE(.init)))
+ . = ALIGN(4);
+ _einit = .;
+ } >FLASH AT>FLASH
+
+ .vector : {
+ *(.vector);
+ . = ALIGN(64);
+ } >FLASH AT>FLASH
+
+ .text : {
+ . = ALIGN(4);
+ *(.text)
+ *(.text.*)
+ *(.rodata)
+ *(.rodata*)
+ *(.gnu.linkonce.t.*)
+ . = ALIGN(4);
+ } >FLASH AT>FLASH
+
+ .fini : {
+ KEEP(*(SORT_NONE(.fini)))
+ . = ALIGN(4);
+ } >FLASH AT>FLASH
+
+ PROVIDE( _etext = . );
+ PROVIDE( _eitcm = . );
+
+ .preinit_array : {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH AT>FLASH
+
+ .init_array : {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH AT>FLASH
+
+ .fini_array : {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH AT>FLASH
+
+ .ctors : {
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ /* We don't want to include the .ctor section from
+ the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last */
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ } >FLASH AT>FLASH
+
+ .dtors : {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ } >FLASH AT>FLASH
+
+ .dalign : {
+ . = ALIGN(4);
+ PROVIDE(_data_vma = .);
+ } >RAM AT>FLASH
+
+ .dlalign : {
+ . = ALIGN(4);
+ PROVIDE(_data_lma = .);
+ } >FLASH AT>FLASH
+
+ .data : {
+ *(.gnu.linkonce.r.*)
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.*)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ . = ALIGN(4);
+ PROVIDE( _edata = .);
+ } >RAM AT>FLASH
+
+ .bss : {
+ . = ALIGN(4);
+ PROVIDE( _sbss = .);
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON*)
+ . = ALIGN(4);
+ PROVIDE( _ebss = .);
+ } >RAM AT>FLASH
+
+ PROVIDE( _end = _ebss);
+ PROVIDE( end = . );
+
+ .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : {
+ PROVIDE( _heap_end = . );
+ . = ALIGN(4);
+ PROVIDE(_susrstack = . );
+ . = . + __stack_size;
+ PROVIDE( _eusrstack = .);
+ } >RAM
+}
diff --git a/mijia_haier_bridge/src/core/startup_ch32v10x.S b/mijia_haier_bridge/src/core/startup_ch32v10x.S
new file mode 100644
index 0000000..b8ed2a0
--- /dev/null
+++ b/mijia_haier_bridge/src/core/startup_ch32v10x.S
@@ -0,0 +1,237 @@
+;/********************************** (C) COPYRIGHT *******************************
+;* File Name : startup_ch32v10x.s
+;* Author : WCH
+;* Version : V1.0.1
+;* Date : 2024/01/11
+;* Description : CH32V10x vector table for eclipse toolchain.
+;*********************************************************************************
+;* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+;* Attention: This software (modified or not) and binary are used for
+;* microcontroller manufactured by Nanjing Qinheng Microelectronics.
+;*******************************************************************************/
+
+ .section .init,"ax",@progbits
+ .global _start
+ .align 1
+_start:
+ j handle_reset
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00000013
+ .word 0x00100073
+
+ .section .vector,"ax",@progbits
+ .align 1
+_vector_base:
+ .option norvc;
+ j _start
+ .word 0
+ j NMI_Handler /* NMI Handler */
+ j HardFault_Handler /* Hard Fault Handler */
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ j SysTick_Handler /* SysTick Handler */
+ .word 0
+ j SW_Handler /* SW Handler */
+ .word 0
+ /* External Interrupts */
+ j WWDG_IRQHandler /* Window Watchdog */
+ j PVD_IRQHandler /* PVD through EXTI Line detect */
+ j TAMPER_IRQHandler /* TAMPER */
+ j RTC_IRQHandler /* RTC */
+ j FLASH_IRQHandler /* Flash */
+ j RCC_IRQHandler /* RCC */
+ j EXTI0_IRQHandler /* EXTI Line 0 */
+ j EXTI1_IRQHandler /* EXTI Line 1 */
+ j EXTI2_IRQHandler /* EXTI Line 2 */
+ j EXTI3_IRQHandler /* EXTI Line 3 */
+ j EXTI4_IRQHandler /* EXTI Line 4 */
+ j DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
+ j DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */
+ j DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */
+ j DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */
+ j DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */
+ j DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */
+ j DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */
+ j ADC1_2_IRQHandler /* ADC1_2 */
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ j EXTI9_5_IRQHandler /* EXTI Line 9..5 */
+ j TIM1_BRK_IRQHandler /* TIM1 Break */
+ j TIM1_UP_IRQHandler /* TIM1 Update */
+ j TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */
+ j TIM1_CC_IRQHandler /* TIM1 Capture Compare */
+ j TIM2_IRQHandler /* TIM2 */
+ j TIM3_IRQHandler /* TIM3 */
+ j TIM4_IRQHandler /* TIM4 */
+ j I2C1_EV_IRQHandler /* I2C1 Event */
+ j I2C1_ER_IRQHandler /* I2C1 Error */
+ j I2C2_EV_IRQHandler /* I2C2 Event */
+ j I2C2_ER_IRQHandler /* I2C2 Error */
+ j SPI1_IRQHandler /* SPI1 */
+ j SPI2_IRQHandler /* SPI2 */
+ j USART1_IRQHandler /* USART1 */
+ j USART2_IRQHandler /* USART2 */
+ j USART3_IRQHandler /* USART3 */
+ j EXTI15_10_IRQHandler /* EXTI Line 15..10 */
+ j RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */
+ j USBWakeUp_IRQHandler /* USB Wakeup from suspend */
+ j USBFS_IRQHandler /* USBFS */
+
+ .option rvc;
+ .section .text.vector_handler, "ax", @progbits
+ .weak NMI_Handler
+ .weak HardFault_Handler
+ .weak SysTick_Handler
+ .weak SW_Handler
+ .weak WWDG_IRQHandler
+ .weak PVD_IRQHandler
+ .weak TAMPER_IRQHandler
+ .weak RTC_IRQHandler
+ .weak FLASH_IRQHandler
+ .weak RCC_IRQHandler
+ .weak EXTI0_IRQHandler
+ .weak EXTI1_IRQHandler
+ .weak EXTI2_IRQHandler
+ .weak EXTI3_IRQHandler
+ .weak EXTI4_IRQHandler
+ .weak DMA1_Channel1_IRQHandler
+ .weak DMA1_Channel2_IRQHandler
+ .weak DMA1_Channel3_IRQHandler
+ .weak DMA1_Channel4_IRQHandler
+ .weak DMA1_Channel5_IRQHandler
+ .weak DMA1_Channel6_IRQHandler
+ .weak DMA1_Channel7_IRQHandler
+ .weak ADC1_2_IRQHandler
+ .weak EXTI9_5_IRQHandler
+ .weak TIM1_BRK_IRQHandler
+ .weak TIM1_UP_IRQHandler
+ .weak TIM1_TRG_COM_IRQHandler
+ .weak TIM1_CC_IRQHandler
+ .weak TIM2_IRQHandler
+ .weak TIM3_IRQHandler
+ .weak TIM4_IRQHandler
+ .weak I2C1_EV_IRQHandler
+ .weak I2C1_ER_IRQHandler
+ .weak I2C2_EV_IRQHandler
+ .weak I2C2_ER_IRQHandler
+ .weak SPI1_IRQHandler
+ .weak SPI2_IRQHandler
+ .weak USART1_IRQHandler
+ .weak USART2_IRQHandler
+ .weak USART3_IRQHandler
+ .weak EXTI15_10_IRQHandler
+ .weak RTCAlarm_IRQHandler
+ .weak USBWakeUp_IRQHandler
+ .weak USBFS_IRQHandler
+
+NMI_Handler:
+HardFault_Handler:
+SysTick_Handler:
+SW_Handler:
+WWDG_IRQHandler:
+PVD_IRQHandler:
+TAMPER_IRQHandler:
+RTC_IRQHandler:
+FLASH_IRQHandler:
+RCC_IRQHandler:
+EXTI0_IRQHandler:
+EXTI1_IRQHandler:
+EXTI2_IRQHandler:
+EXTI3_IRQHandler:
+EXTI4_IRQHandler:
+DMA1_Channel1_IRQHandler:
+DMA1_Channel2_IRQHandler:
+DMA1_Channel3_IRQHandler:
+DMA1_Channel4_IRQHandler:
+DMA1_Channel5_IRQHandler:
+DMA1_Channel6_IRQHandler:
+DMA1_Channel7_IRQHandler:
+ADC1_2_IRQHandler:
+EXTI9_5_IRQHandler:
+TIM1_BRK_IRQHandler:
+TIM1_UP_IRQHandler:
+TIM1_TRG_COM_IRQHandler:
+TIM1_CC_IRQHandler:
+TIM2_IRQHandler:
+TIM3_IRQHandler:
+TIM4_IRQHandler:
+I2C1_EV_IRQHandler:
+I2C1_ER_IRQHandler:
+I2C2_EV_IRQHandler:
+I2C2_ER_IRQHandler:
+SPI1_IRQHandler:
+SPI2_IRQHandler:
+USART1_IRQHandler:
+USART2_IRQHandler:
+USART3_IRQHandler:
+EXTI15_10_IRQHandler:
+RTCAlarm_IRQHandler:
+USBWakeUp_IRQHandler:
+USBFS_IRQHandler:
+1:
+ j 1b
+
+ .section .text.handle_reset,"ax",@progbits
+ .weak handle_reset
+ .align 1
+handle_reset:
+.option push
+.option norelax
+ la gp, __global_pointer$
+.option pop
+1:
+ la sp, _eusrstack
+2:
+/* Load data section from flash to RAM */
+ la a0, _data_lma
+ la a1, _data_vma
+ la a2, _edata
+ bgeu a1, a2, 2f
+1:
+ lw t0, (a0)
+ sw t0, (a1)
+ addi a0, a0, 4
+ addi a1, a1, 4
+ bltu a1, a2, 1b
+2:
+/* Clear bss section */
+ la a0, _sbss
+ la a1, _ebss
+ bgeu a0, a1, 2f
+1:
+ sw zero, (a0)
+ addi a0, a0, 4
+ bltu a0, a1, 1b
+2:
+/* Enable global interrupt and configure privileged mode */
+ li t0, 0x88
+ csrw mstatus, t0
+/* Configure entry address mode */
+ la t0, _vector_base
+ ori t0, t0, 1
+ csrw mtvec, t0
+
+ jal SystemInit
+ la t0, main
+ csrw mepc, t0
+ mret
+
+
diff --git a/mijia_haier_bridge/src/periph/ch32v10x.h b/mijia_haier_bridge/src/periph/ch32v10x.h
new file mode 100644
index 0000000..db8565f
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x.h
@@ -0,0 +1,3209 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x.h
+ * Author : WCH
+ * Version : V1.0.1
+ * Date : 2025/01/02
+ * Description : CH32V10x 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 __CH32V10x_H
+#define __CH32V10x_H
+
+#ifdef __cplusplus
+extern "C" {
+#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)0x500) /* Time out for HSE start up */
+
+#define HSI_VALUE ((uint32_t)8000000) /* Value of the Internal oscillator in Hz */
+
+/* CH32V10x Standard Peripheral Library version number */
+#define __CH32V10x_STDPERIPH_VERSION_MAIN (0x02) /* [15:8] main version */
+#define __CH32V10x_STDPERIPH_VERSION_SUB (0x07) /* [7:0] sub version */
+#define __CH32V10x_STDPERIPH_VERSION ( (__CH32V10x_STDPERIPH_VERSION_MAIN << 8)\
+ |(__CH32V10x_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, /* 4 Exception 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 global 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 */
+ USBWakeUp_IRQn = 58, /* USB WakeUp from suspend through EXTI Line Interrupt */
+ USBFS_IRQn = 59, /* USBFS Interrupt */
+
+} IRQn_Type;
+
+#define USBHD_IRQn USBFS_IRQn
+#define USBHD_IRQHandler USBFS_IRQHandler
+#define SysTicK_IRQn SysTick_IRQn
+
+#define HardFault_IRQn EXC_IRQn
+#define ADC1_2_IRQn ADC_IRQn
+
+#include
+#include "core_riscv.h"
+#include "system_ch32v10x.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;
+} 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;
+
+/* 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;
+
+/* Debug MCU */
+typedef struct
+{
+ __IO uint32_t CFGR0;
+ __IO uint32_t CFGR1;
+} DBGMCU_TypeDef;
+
+/* DMA Controller */
+typedef struct
+{
+ __IO uint32_t CFGR;
+ __IO uint32_t CNTR;
+ __IO uint32_t PADDR;
+ __IO uint32_t MADDR;
+} DMA_Channel_TypeDef;
+
+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;
+
+/* 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;
+} 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;
+
+/* 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;
+ uint32_t RESERVED7;
+ uint32_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;
+} 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;
+} 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;
+} EXTEN_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 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 TIM12_BASE (APB1PERIPH_BASE + 0x1800)
+#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00)
+#define TIM14_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 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 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 GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
+#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
+#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 TIM15_BASE (APB2PERIPH_BASE + 0x4000)
+#define TIM16_BASE (APB2PERIPH_BASE + 0x4400)
+#define TIM17_BASE (APB2PERIPH_BASE + 0x4800)
+#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00)
+#define TIM10_BASE (APB2PERIPH_BASE + 0x5000)
+#define TIM11_BASE (APB2PERIPH_BASE + 0x5400)
+
+#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 RCC_BASE (AHBPERIPH_BASE + 0x1000)
+#define CRC_BASE (AHBPERIPH_BASE + 0x3000)
+
+#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /* Flash registers base address */
+#define OB_BASE ((uint32_t)0x1FFFF800) /* Flash Option Bytes base address */
+#define DBGMCU_BASE ((uint32_t)0xE000D000)
+#define EXTEN_BASE ((uint32_t)0x40023800)
+
+/* 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 TIM12 ((TIM_TypeDef *)TIM12_BASE)
+#define TIM13 ((TIM_TypeDef *)TIM13_BASE)
+#define TIM14 ((TIM_TypeDef *)TIM14_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 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 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 GPIOF ((GPIO_TypeDef *)GPIOF_BASE)
+#define GPIOG ((GPIO_TypeDef *)GPIOG_BASE)
+#define ADC1 ((ADC_TypeDef *)ADC1_BASE)
+#define ADC2 ((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 TIM15 ((TIM_TypeDef *)TIM15_BASE)
+#define TIM16 ((TIM_TypeDef *)TIM16_BASE)
+#define TIM17 ((TIM_TypeDef *)TIM17_BASE)
+#define TIM9 ((TIM_TypeDef *)TIM9_BASE)
+#define TIM10 ((TIM_TypeDef *)TIM10_BASE)
+#define TIM11 ((TIM_TypeDef *)TIM11_BASE)
+#define DMA1 ((DMA_TypeDef *)DMA1_BASE)
+#define DMA2 ((DMA_TypeDef *)DMA2_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 RCC ((RCC_TypeDef *)RCC_BASE)
+#define CRC ((CRC_TypeDef *)CRC_BASE)
+#define FLASH ((FLASH_TypeDef *)FLASH_R_BASE)
+#define OB ((OB_TypeDef *)OB_BASE)
+#define DBGMCU ((DBGMCU_TypeDef *)DBGMCU_BASE)
+#define EXTEN ((EXTEN_TypeDef *)EXTEN_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 */
+
+/******************* 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 */
+
+/******************************************************************************/
+/* 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 */
+
+/******************************************************************************/
+/* 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 */
+
+/******************* 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 */
+
+/******************* 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_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_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 */
+
+/******************************************************************************/
+/* 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 */
+
+/******************* 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 */
+
+/****************** 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 */
+
+/****************** 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 */
+
+/****************** 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 */
+
+/******************* 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 */
+
+/******************************************************************************/
+/* FLASH and Option Bytes Registers */
+/******************************************************************************/
+
+/******************* Bit definition for FLASH_ACTLR register ******************/
+#define FLASH_ACTLR_LATENCY ((uint8_t)0x03) /* LATENCY[2:0] bits (Latency) */
+#define FLASH_ACTLR_LATENCY_0 ((uint8_t)0x00) /* Bit 0 */
+#define FLASH_ACTLR_LATENCY_1 ((uint8_t)0x01) /* Bit 0 */
+#define FLASH_ACTLR_LATENCY_2 ((uint8_t)0x02) /* Bit 1 */
+
+#define FLASH_ACTLR_HLFCYA ((uint8_t)0x08) /* Flash Half Cycle Access Enable */
+#define FLASH_ACTLR_PRFTBE ((uint8_t)0x10) /* Prefetch Buffer Enable */
+#define FLASH_ACTLR_PRFTBS ((uint8_t)0x20) /* Prefetch Buffer Status */
+
+/****************** Bit definition for FLASH_KEYR register ******************/
+#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /* FPEC Key */
+
+/***************** 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_PGERR ((uint8_t)0x04) /* Programming Error */
+#define FLASH_STATR_WRPRTERR ((uint8_t)0x10) /* Write Protection Error */
+#define FLASH_STATR_EOP ((uint8_t)0x20) /* End of operation */
+
+/******************* Bit definition for FLASH_CTLR register *******************/
+#define FLASH_CTLR_PG ((uint16_t)0x0001) /* Programming */
+#define FLASH_CTLR_PER ((uint16_t)0x0002) /* Page Erase */
+#define FLASH_CTLR_MER ((uint16_t)0x0004) /* Mass Erase */
+#define FLASH_CTLR_OPTPG ((uint16_t)0x0010) /* Option Byte Programming */
+#define FLASH_CTLR_OPTER ((uint16_t)0x0020) /* Option Byte Erase */
+#define FLASH_CTLR_STRT ((uint16_t)0x0040) /* Start */
+#define FLASH_CTLR_LOCK ((uint16_t)0x0080) /* Lock */
+#define FLASH_CTLR_OPTWRE ((uint16_t)0x0200) /* Option Bytes Write Enable */
+#define FLASH_CTLR_ERRIE ((uint16_t)0x0400) /* Error Interrupt Enable */
+#define FLASH_CTLR_EOPIE ((uint16_t)0x1000) /* End of operation interrupt enable */
+#define FLASH_CTLR_PAGE_PG ((uint16_t)0x00010000) /* Page Programming 128Byte */
+#define FLASH_CTLR_PAGE_ER ((uint16_t)0x00020000) /* Page Erase 128Byte */
+#define FLASH_CTLR_BUF_LOAD ((uint16_t)0x00040000) /* Buffer Load */
+#define FLASH_CTLR_BUF_RST ((uint16_t)0x00080000) /* Buffer Reset */
+
+/******************* 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_BFB2 ((uint16_t)0x0020) /* BFB2 */
+
+/****************** Bit definition for FLASH_WPR register ******************/
+#define FLASH_WPR_WRP ((uint32_t)0xFFFFFFFF) /* Write Protect */
+
+/****************** 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_PARTIALREMAP ((uint32_t)0x00000010) /* Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */
+#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_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)
+#define AFIO_PCFR1_SWJ_CFG_DISABLE ((uint32_t)0x04000000)
+
+/***************** 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_EXTI0_PF ((uint16_t)0x0005) /* PF[0] pin */
+#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /* PG[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_EXTI1_PF ((uint16_t)0x0050) /* PF[1] pin */
+#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /* PG[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_EXTI2_PF ((uint16_t)0x0500) /* PF[2] pin */
+#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /* PG[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 */
+#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /* PF[3] pin */
+#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /* PG[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_EXTI4_PF ((uint16_t)0x0005) /* PF[4] pin */
+#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /* PG[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_EXTI5_PF ((uint16_t)0x0050) /* PF[5] pin */
+#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /* PG[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_EXTI6_PF ((uint16_t)0x0500) /* PF[6] pin */
+#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /* PG[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 */
+#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /* PF[7] pin */
+#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /* PG[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_EXTI8_PF ((uint16_t)0x0005) /* PF[8] pin */
+#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /* PG[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_EXTI9_PF ((uint16_t)0x0050) /* PF[9] pin */
+#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /* PG[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_EXTI10_PF ((uint16_t)0x0500) /* PF[10] pin */
+#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /* PG[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 */
+#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /* PF[11] pin */
+#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /* PG[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_EXTI12_PF ((uint16_t)0x0005) /* PF[12] pin */
+#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /* PG[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_EXTI13_PF ((uint16_t)0x0050) /* PF[13] pin */
+#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /* PG[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_EXTI14_PF ((uint16_t)0x0500) /* PF[14] pin */
+#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /* PG[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 */
+#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /* PF[15] pin */
+#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /* PG[15] pin */
+
+/******************************************************************************/
+/* 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_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 */
+
+/******************* 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 */
+
+/******************* 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 */
+
+#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_USBPRE ((uint32_t)0x00400000) /* USB Device prescaler */
+
+#define RCC_CFGR0_MCO ((uint32_t)0x07000000) /* MCO[2: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_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 */
+
+/******************* 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_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_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_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_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_USART1RST ((uint32_t)0x00004000) /* USART1 reset */
+
+/***************** 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_WWDGRST ((uint32_t)0x00000800) /* Window Watchdog reset */
+#define RCC_USART2RST ((uint32_t)0x00020000) /* USART 2 reset */
+#define RCC_I2C1RST ((uint32_t)0x00200000) /* I2C 1 reset */
+
+#define RCC_CAN1RST ((uint32_t)0x02000000) /* CAN1 reset */
+
+#define RCC_BKPRST ((uint32_t)0x08000000) /* Backup interface reset */
+#define RCC_PWRRST ((uint32_t)0x10000000) /* Power interface reset */
+
+#define RCC_TIM4RST ((uint32_t)0x00000004) /* Timer 4 reset */
+#define RCC_SPI2RST ((uint32_t)0x00004000) /* SPI 2 reset */
+#define RCC_USART3RST ((uint32_t)0x00040000) /* USART 3 reset */
+#define RCC_I2C2RST ((uint32_t)0x00400000) /* I2C 2 reset */
+
+#define RCC_USBRST ((uint32_t)0x00800000) /* USB Device reset */
+
+/****************** Bit definition for RCC_AHBPCENR register ******************/
+#define RCC_DMA1EN ((uint16_t)0x0001) /* DMA1 clock enable */
+#define RCC_SRAMEN ((uint16_t)0x0004) /* SRAM interface clock enable */
+#define RCC_FLITFEN ((uint16_t)0x0010) /* FLITF clock enable */
+#define RCC_CRCEN ((uint16_t)0x0040) /* CRC clock enable */
+#define RCC_USBHD ((uint16_t)0x1000)
+
+/****************** 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_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_USART1EN ((uint32_t)0x00004000) /* USART1 clock enable */
+
+/***************** 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_WWDGEN ((uint32_t)0x00000800) /* Window Watchdog clock enable */
+#define RCC_USART2EN ((uint32_t)0x00020000) /* USART 2 clock enable */
+#define RCC_I2C1EN ((uint32_t)0x00200000) /* I2C 1 clock enable */
+
+#define RCC_BKPEN ((uint32_t)0x08000000) /* Backup interface clock enable */
+#define RCC_PWREN ((uint32_t)0x10000000) /* Power interface clock enable */
+
+#define RCC_USBEN ((uint32_t)0x00800000) /* USB Device clock enable */
+
+/******************* 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) /* HSE oscillator clock divided by 128 used as RTC clock */
+
+#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 */
+
+/******************************************************************************/
+/* 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_HSCR register *****************/
+#define SPI_HSCR_HSRXEN ((uint16_t)0x0001)
+
+/******************************************************************************/
+/* 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 */
+#define TIM_CC4NP ((uint16_t)0x8000) /* Capture/Compare 4 Complementary 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 */
+
+/******************************************************************************/
+/* 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 */
+
+/******************* 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_OVER8 ((uint16_t)0x8000) /* USART Oversmapling 8-bits */
+
+/****************** 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 */
+
+/******************************************************************************/
+/* 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 register *****************************/
+#define EXTEN_USBD_LS ((uint32_t)0x00000001) /* Bit 0 */
+#define EXTEN_USBD_PU_EN ((uint32_t)0x00000002) /* Bit 1 */
+#define EXTEN_USBFS_IO_EN ((uint32_t)0x00000004) /* Bit 2 */
+#define EXTEN_USB_5V_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_USBHD_IO_EN EXTEN_USBFS_IO_EN
+
+#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_IDO_TRIM ((uint32_t)0x00000400) /* Bit 10 */
+#define EXTEN_WRITE_EN ((uint32_t)0x00004000) /* Bit 14 */
+#define EXTEN_SHORT_WAKE ((uint32_t)0x00008000) /* Bit 15 */
+
+#define EXTEN_FLASH_CLK_TRIM ((uint32_t)0x00070000) /* FLASH_CLK_TRIM[2:0] bits */
+#define EXTEN_FLASH_CLK_TRIM0 ((uint32_t)0x00010000) /* Bit 0 */
+#define EXTEN_FLASH_CLK_TRIM1 ((uint32_t)0x00020000) /* Bit 1 */
+#define EXTEN_FLASH_CLK_TRIM2 ((uint32_t)0x00040000) /* Bit 2 */
+
+#include "ch32v10x_conf.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CH32V10x_H */
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_dma.c b/mijia_haier_bridge/src/periph/ch32v10x_dma.c
new file mode 100644
index 0000000..0ade3e1
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_dma.c
@@ -0,0 +1,552 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_dma.c
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2020/04/30
+ * 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 "ch32v10x_dma.h"
+#include "ch32v10x_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))
+
+/* DMA2 FLAG mask */
+#define FLAG_Mask ((uint32_t)0x10000000)
+
+/* 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 5 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;
+ }
+ }
+}
+
+/*********************************************************************
+ * @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 5 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 5 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 5 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 5 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 5 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 5 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.
+ *
+ * @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) != (uint32_t)RESET)
+ {
+ tmpreg = DMA2->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.
+ *
+ * @return none
+ */
+void DMA_ClearFlag(uint32_t DMAy_FLAG)
+{
+ if((DMAy_FLAG & FLAG_Mask) != (uint32_t)RESET)
+ {
+ DMA2->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.
+ *
+ * @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) != (uint32_t)RESET)
+ {
+ tmpreg = DMA2->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.
+ *
+ * @return none
+ */
+void DMA_ClearITPendingBit(uint32_t DMAy_IT)
+{
+ if((DMAy_IT & FLAG_Mask) != (uint32_t)RESET)
+ {
+ DMA2->INTFCR = DMAy_IT;
+ }
+ else
+ {
+ DMA1->INTFCR = DMAy_IT;
+ }
+}
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_dma.h b/mijia_haier_bridge/src/periph/ch32v10x_dma.h
new file mode 100644
index 0000000..fc3689b
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_dma.h
@@ -0,0 +1,218 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_dma.h
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2020/04/30
+ * 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 __CH32V10x_DMA_H
+#define __CH32V10x_DMA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ch32v10x.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)
+
+/* 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)
+
+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 /*__CH32V10x_DMA_H */
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_gpio.c b/mijia_haier_bridge/src/periph/ch32v10x_gpio.c
new file mode 100644
index 0000000..a52fb2c
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_gpio.c
@@ -0,0 +1,578 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_gpio.c
+ * Author : WCH
+ * Version : V1.0.1
+ * Date : 2025/01/02
+ * Description : This file provides all the GPIO firmware functions.
+ *********************************************************************************
+ * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+ * Attention: This software (modified or not) and binary are used for
+ * microcontroller manufactured by Nanjing Qinheng Microelectronics.
+ *******************************************************************************/
+#include "ch32v10x_gpio.h"
+#include "ch32v10x_rcc.h"
+
+/* MASK */
+#define ECR_PORTPINCONFIG_MASK ((uint16_t)0xFF80)
+#define LSB_MASK ((uint16_t)0xFFFF)
+#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000)
+#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF)
+#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000)
+#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000)
+
+/*********************************************************************
+ * @fn GPIO_DeInit
+ *
+ * @brief Deinitializes the GPIOx peripheral registers to their default
+ * reset values.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ *
+ * @return none
+ */
+void GPIO_DeInit(GPIO_TypeDef *GPIOx)
+{
+ if(GPIOx == GPIOA)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
+ }
+ else if(GPIOx == GPIOB)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
+ }
+ else if(GPIOx == GPIOC)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
+ }
+ else if(GPIOx == GPIOD)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE);
+ }
+ else if(GPIOx == GPIOE)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE);
+ }
+ else if(GPIOx == GPIOF)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE);
+ }
+ else
+ {
+ if(GPIOx == GPIOG)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE);
+ }
+ }
+}
+
+/*********************************************************************
+ * @fn GPIO_AFIODeInit
+ *
+ * @brief Deinitializes the Alternate Functions (remap, event control
+ * and EXTI configuration) registers to their default reset values.
+ *
+ * @return none
+ */
+void GPIO_AFIODeInit(void)
+{
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);
+}
+
+/*********************************************************************
+ * @fn GPIO_Init
+ *
+ * @brief GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ *
+ * @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure that
+ * contains the configuration information for the specified GPIO peripheral.
+ *
+ * @return none
+ */
+void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct)
+{
+ uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
+ uint32_t tmpreg = 0x00, pinmask = 0x00;
+
+ currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
+
+ if((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
+ {
+ currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
+ }
+
+ if(((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
+ {
+ tmpreg = GPIOx->CFGLR;
+
+ for(pinpos = 0x00; pinpos < 0x08; pinpos++)
+ {
+ pos = ((uint32_t)0x01) << pinpos;
+ currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
+
+ if(currentpin == pos)
+ {
+ pos = pinpos << 2;
+ pinmask = ((uint32_t)0x0F) << pos;
+ tmpreg &= ~pinmask;
+ tmpreg |= (currentmode << pos);
+
+ if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
+ {
+ GPIOx->BCR = (((uint32_t)0x01) << pinpos);
+ }
+ else
+ {
+ if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
+ {
+ GPIOx->BSHR = (((uint32_t)0x01) << pinpos);
+ }
+ }
+ }
+ }
+ GPIOx->CFGLR = tmpreg;
+ }
+
+ if(GPIO_InitStruct->GPIO_Pin > 0x00FF)
+ {
+ tmpreg = GPIOx->CFGHR;
+
+ for(pinpos = 0x00; pinpos < 0x08; pinpos++)
+ {
+ pos = (((uint32_t)0x01) << (pinpos + 0x08));
+ currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
+
+ if(currentpin == pos)
+ {
+ pos = pinpos << 2;
+ pinmask = ((uint32_t)0x0F) << pos;
+ tmpreg &= ~pinmask;
+ tmpreg |= (currentmode << pos);
+
+ if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
+ {
+ GPIOx->BCR = (((uint32_t)0x01) << (pinpos + 0x08));
+ }
+
+ if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
+ {
+ GPIOx->BSHR = (((uint32_t)0x01) << (pinpos + 0x08));
+ }
+ }
+ }
+ GPIOx->CFGHR = tmpreg;
+ }
+}
+
+/*********************************************************************
+ * @fn GPIO_StructInit
+ *
+ * @brief Fills each GPIO_InitStruct member with its default
+ *
+ * @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure
+ * which will be initialized.
+ *
+ * @return none
+ */
+void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct)
+{
+ GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All;
+ GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;
+ GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING;
+}
+
+/*********************************************************************
+ * @fn GPIO_ReadInputDataBit
+ *
+ * @brief GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ *
+ * @param GPIO_Pin - specifies the port bit to read.
+ * This parameter can be GPIO_Pin_x where x can be (0..15).
+ *
+ * @return The input port pin value.
+ */
+uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
+{
+ uint8_t bitstatus = 0x00;
+
+ if((GPIOx->INDR & GPIO_Pin) != (uint32_t)Bit_RESET)
+ {
+ bitstatus = (uint8_t)Bit_SET;
+ }
+ else
+ {
+ bitstatus = (uint8_t)Bit_RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn GPIO_ReadInputData
+ *
+ * @brief Reads the specified GPIO input data port.
+ *
+ * @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
+ *
+ * @return The input port pin value.
+ */
+uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx)
+{
+ return ((uint16_t)GPIOx->INDR);
+}
+
+/*********************************************************************
+ * @fn GPIO_ReadOutputDataBit
+ *
+ * @brief Reads the specified output data port bit.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ * GPIO_Pin - specifies the port bit to read.
+ * This parameter can be GPIO_Pin_x where x can be (0..15).
+ *
+ * @return none
+ */
+uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
+{
+ uint8_t bitstatus = 0x00;
+
+ if((GPIOx->OUTDR & GPIO_Pin) != (uint32_t)Bit_RESET)
+ {
+ bitstatus = (uint8_t)Bit_SET;
+ }
+ else
+ {
+ bitstatus = (uint8_t)Bit_RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn GPIO_ReadOutputData
+ *
+ * @brief Reads the specified GPIO output data port.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ *
+ * @return GPIO output port pin value.
+ */
+uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx)
+{
+ return ((uint16_t)GPIOx->OUTDR);
+}
+
+/*********************************************************************
+ * @fn GPIO_SetBits
+ *
+ * @brief Sets the selected data port bits.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ * GPIO_Pin - specifies the port bits to be written.
+ * This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
+ *
+ * @return none
+ */
+void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
+{
+ GPIOx->BSHR = GPIO_Pin;
+}
+
+/*********************************************************************
+ * @fn GPIO_ResetBits
+ *
+ * @brief Clears the selected data port bits.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ * GPIO_Pin - specifies the port bits to be written.
+ * This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
+ *
+ * @return none
+ */
+void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
+{
+ GPIOx->BCR = GPIO_Pin;
+}
+
+/*********************************************************************
+ * @fn GPIO_WriteBit
+ *
+ * @brief Sets or clears the selected data port bit.
+ *
+ * @param GPIO_Pin - specifies the port bit to be written.
+ * This parameter can be one of GPIO_Pin_x where x can be (0..15).
+ * BitVal - specifies the value to be written to the selected bit.
+ * Bit_RESET - to clear the port pin.
+ * Bit_SET - to set the port pin.
+ *
+ * @return none
+ */
+void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
+{
+ if(BitVal != Bit_RESET)
+ {
+ GPIOx->BSHR = GPIO_Pin;
+ }
+ else
+ {
+ GPIOx->BCR = GPIO_Pin;
+ }
+}
+
+/*********************************************************************
+ * @fn GPIO_Write
+ *
+ * @brief Writes data to the specified GPIO data port.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ * PortVal - specifies the value to be written to the port output data register.
+ *
+ * @return none
+ */
+void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal)
+{
+ GPIOx->OUTDR = PortVal;
+}
+
+/*********************************************************************
+ * @fn GPIO_PinLockConfig
+ *
+ * @brief Locks GPIO Pins configuration registers.
+ *
+ * @param GPIOx - where x can be (A..G) to select the GPIO peripheral.
+ * GPIO_Pin - specifies the port bit to be written.
+ * This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
+ *
+ * @return none
+ */
+void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
+{
+ uint32_t tmp = 0x00010000;
+
+ tmp |= GPIO_Pin;
+ GPIOx->LCKR = tmp;
+ GPIOx->LCKR = GPIO_Pin;
+ GPIOx->LCKR = tmp;
+ tmp = GPIOx->LCKR;
+ tmp = GPIOx->LCKR;
+}
+
+/*********************************************************************
+ * @fn GPIO_EventOutputConfig
+ *
+ * @brief Selects the GPIO pin used as Event output.
+ *
+ * @param GPIO_PortSource - selects the GPIO port to be used as source
+ * for Event output.
+ * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E).
+ * GPIO_PinSource - specifies the pin for the Event output.
+ * This parameter can be GPIO_PinSourcex where x can be (0..15).
+ *
+ * @return none
+ */
+void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
+{
+ uint32_t tmpreg = 0x00;
+
+ tmpreg = AFIO->ECR;
+ tmpreg &= ECR_PORTPINCONFIG_MASK;
+ tmpreg |= (uint32_t)GPIO_PortSource << 0x04;
+ tmpreg |= GPIO_PinSource;
+ AFIO->ECR = tmpreg;
+}
+
+/*********************************************************************
+ * @fn GPIO_EventOutputCmd
+ *
+ * @brief Enables or disables the Event Output.
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void GPIO_EventOutputCmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ AFIO->ECR |= (1 << 7);
+ }
+ else
+ {
+ AFIO->ECR &= ~(1 << 7);
+ }
+}
+
+/*********************************************************************
+ * @fn GPIO_PinRemapConfig
+ *
+ * @brief Changes the mapping of the specified pin.
+ *
+ * @param GPIO_Remap - selects the pin to remap.
+ * GPIO_Remap_SPI1 - SPI1 Alternate Function mapping
+ * GPIO_Remap_I2C1 - I2C1 Alternate Function mapping
+ * GPIO_Remap_USART1 - USART1 Alternate Function mapping
+ * GPIO_Remap_USART2 - USART2 Alternate Function mapping
+ * GPIO_PartialRemap_USART3 - USART3 Partial Alternate Function mapping
+ * GPIO_FullRemap_USART3 - USART3 Full Alternate Function mapping
+ * GPIO_PartialRemap_TIM1 - TIM1 Partial Alternate Function mapping
+ * GPIO_FullRemap_TIM1 - TIM1 Full Alternate Function mapping
+ * GPIO_PartialRemap1_TIM2 - TIM2 Partial1 Alternate Function mapping
+ * GPIO_PartialRemap2_TIM2 - TIM2 Partial2 Alternate Function mapping
+ * GPIO_FullRemap_TIM2 - TIM2 Full Alternate Function mapping
+ * GPIO_PartialRemap_TIM3 - TIM3 Partial Alternate Function mapping
+ * GPIO_FullRemap_TIM3 - TIM3 Full Alternate Function mapping
+ * GPIO_Remap_TIM4 - TIM4 Alternate Function mapping
+ * GPIO_Remap1_CAN1 - CAN1 Alternate Function mapping
+ * GPIO_Remap2_CAN1 - CAN1 Alternate Function mapping
+ * GPIO_Remap_PD0PD1 - PD0 and PD1 Alternate Function mapping
+ * GPIO_Remap_ADC1_ETRGINJ - ADC1 External Trigger Injected Conversion remapping
+ * GPIO_Remap_ADC1_ETRGREG - ADC1 External Trigger Regular Conversion remapping
+ * GPIO_Remap_ADC2_ETRGINJ - ADC2 External Trigger Injected Conversion remapping
+ * GPIO_Remap_ADC2_ETRGREG - ADC2 External Trigger Regular Conversion remapping
+ * GPIO_Remap_ETH - Ethernet remapping
+ * GPIO_Remap_CAN2 - CAN2 remapping
+ * GPIO_Remap_MII_RMII_SEL - MII or RMII selection
+ * GPIO_Remap_SWJ_Disable - Full SWJ Disabled
+ * GPIO_Remap_TIM2ITR1_PTP_SOF - Ethernet PTP output or USB OTG SOF (Start of Frame) connected
+ * to TIM2 Internal Trigger 1 for calibration
+ * GPIO_Remap_TIM2ITR1_PTP_SOF - Ethernet PTP output or USB OTG SOF (Start of Frame)
+ * GPIO_Remap_TIM8 - TIM8 Alternate Function mapping
+ * GPIO_PartialRemap_TIM9 - TIM9 Partial Alternate Function mapping
+ * GPIO_FullRemap_TIM9 - TIM9 Full Alternate Function mapping
+ * GPIO_PartialRemap_TIM10 - TIM10 Partial Alternate Function mapping
+ * GPIO_FullRemap_TIM10 - TIM10 Full Alternate Function mapping
+ * GPIO_Remap_FSMC_NADV - FSMC_NADV Alternate Function mapping
+ * GPIO_PartialRemap_USART4 - USART4 Partial Alternate Function mapping
+ * GPIO_FullRemap_USART4 - USART4 Full Alternate Function mapping
+ * GPIO_PartialRemap_USART5 - USART5 Partial Alternate Function mapping
+ * GPIO_FullRemap_USART5 - USART5 Full Alternate Function mapping
+ * GPIO_PartialRemap_USART6 - USART6 Partial Alternate Function mapping
+ * GPIO_FullRemap_USART6 - USART6 Full Alternate Function mapping
+ * GPIO_PartialRemap_USART7 - USART7 Partial Alternate Function mapping
+ * GPIO_FullRemap_USART7 - USART7 Full Alternate Function mapping
+ * GPIO_PartialRemap_USART8 - USART8 Partial Alternate Function mapping
+ * GPIO_FullRemap_USART8 - USART8 Full Alternate Function mapping
+ * GPIO_Remap_USART1_HighBit - USART1 Alternate Function mapping high bit
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
+{
+ uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00;
+
+ if((GPIO_Remap & 0x80000000) == 0x80000000)
+ {
+ tmpreg = AFIO->PCFR2;
+ }
+ else
+ {
+ tmpreg = AFIO->PCFR1;
+ }
+
+ tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10;
+ tmp = GPIO_Remap & LSB_MASK;
+
+ if((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK))
+ {
+ tmpreg &= DBGAFR_SWJCFG_MASK;
+ AFIO->PCFR1 &= DBGAFR_SWJCFG_MASK;
+ }
+ else if((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK)
+ {
+ tmp1 = ((uint32_t)0x03) << tmpmask;
+ tmpreg &= ~tmp1;
+ tmpreg |= ~DBGAFR_SWJCFG_MASK;
+ }
+ else
+ {
+ tmpreg &= ~(tmp << (((GPIO_Remap & 0x7FFFFFFF)>> 0x15) * 0x10));
+ tmpreg |= ~DBGAFR_SWJCFG_MASK;
+ }
+
+ if(NewState != DISABLE)
+ {
+ tmpreg |= (tmp << (((GPIO_Remap & 0x7FFFFFFF)>> 0x15) * 0x10));
+ }
+
+ if((GPIO_Remap & 0x80000000) == 0x80000000)
+ {
+ AFIO->PCFR2 = tmpreg;
+ }
+ else
+ {
+ AFIO->PCFR1 = tmpreg;
+ }
+}
+
+/*********************************************************************
+ * @fn GPIO_EXTILineConfig
+ *
+ * @brief Selects the GPIO pin used as EXTI Line.
+ *
+ * @param GPIO_PortSource - selects the GPIO port to be used as source for EXTI lines.
+ * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
+ * GPIO_PinSource - specifies the EXTI line to be configured.
+ * This parameter can be GPIO_PinSourcex where x can be (0..15).
+ *
+ * @return none
+ */
+void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
+{
+ uint32_t tmp = 0x00;
+
+ tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
+ AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
+ AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
+}
+
+
+/*********************************************************************
+ * @fn GPIO_IPD_Unused
+ *
+ * @brief Configure unused GPIO as input pull-up.
+ *
+ * @param none
+ *
+ * @return none
+ */
+void GPIO_IPD_Unused(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure = {0};
+ uint32_t chip = 0;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
+ chip = *( uint32_t * )0x1FFFF884 & (~0x000000F0);
+ switch(chip)
+ {
+ case 0x25004102: //CH32V103C8T6
+ {
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\
+ |GPIO_Pin_2|GPIO_Pin_3\
+ |GPIO_Pin_4|GPIO_Pin_5\
+ |GPIO_Pin_6|GPIO_Pin_7\
+ |GPIO_Pin_8|GPIO_Pin_9\
+ |GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+ GPIO_Init(GPIOD, &GPIO_InitStructure);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+}
+
+
+
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_gpio.h b/mijia_haier_bridge/src/periph/ch32v10x_gpio.h
new file mode 100644
index 0000000..d3ff46e
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_gpio.h
@@ -0,0 +1,161 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_gpio.h
+ * Author : WCH
+ * Version : V1.0.1
+ * Date : 2025/01/02
+ * 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 __CH32V10x_GPIO_H
+#define __CH32V10x_GPIO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ch32v10x.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 */
+#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 */
+#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_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_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_SWJ_Disable ((uint32_t)0x00300400) /* Full SWJ Disabled */
+#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_TIM1_DMA ((uint32_t)0x80000010) /* TIM1 DMA requests mapping (only for Value line devices) */
+#define GPIO_Remap_TIM67_DAC_DMA ((uint32_t)0x80000800) /* TIM6/TIM7 and DAC DMA requests remapping (only for High density Value line devices) */
+#define GPIO_Remap_MISC ((uint32_t)0x80002000) /* Miscellaneous Remap (DMA2 Channel5 Position and DAC Trigger remapping, \
+ only for High density Value line devices) */
+#define GPIO_Remap_PD01 GPIO_Remap_PD0PD1
+
+/* 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)
+#define GPIO_PortSourceGPIOF ((uint8_t)0x05)
+#define GPIO_PortSourceGPIOG ((uint8_t)0x06)
+
+/* GPIO_Pin_sources */
+#define GPIO_PinSource0 ((uint8_t)0x00)
+#define GPIO_PinSource1 ((uint8_t)0x01)
+#define GPIO_PinSource2 ((uint8_t)0x02)
+#define GPIO_PinSource3 ((uint8_t)0x03)
+#define GPIO_PinSource4 ((uint8_t)0x04)
+#define GPIO_PinSource5 ((uint8_t)0x05)
+#define GPIO_PinSource6 ((uint8_t)0x06)
+#define GPIO_PinSource7 ((uint8_t)0x07)
+#define GPIO_PinSource8 ((uint8_t)0x08)
+#define GPIO_PinSource9 ((uint8_t)0x09)
+#define GPIO_PinSource10 ((uint8_t)0x0A)
+#define GPIO_PinSource11 ((uint8_t)0x0B)
+#define GPIO_PinSource12 ((uint8_t)0x0C)
+#define GPIO_PinSource13 ((uint8_t)0x0D)
+#define GPIO_PinSource14 ((uint8_t)0x0E)
+#define GPIO_PinSource15 ((uint8_t)0x0F)
+
+void GPIO_DeInit(GPIO_TypeDef *GPIOx);
+void GPIO_AFIODeInit(void);
+void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct);
+void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct);
+uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
+uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx);
+uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
+uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx);
+void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
+void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
+void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
+void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal);
+void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
+void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
+void GPIO_EventOutputCmd(FunctionalState NewState);
+void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
+void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CH32V10x_GPIO_H */
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_misc.c b/mijia_haier_bridge/src/periph/ch32v10x_misc.c
new file mode 100644
index 0000000..542193d
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_misc.c
@@ -0,0 +1,87 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_misc.c
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2024/01/05
+ * Description : This file provides all the miscellaneous firmware functions .
+*********************************************************************************
+* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+* Attention: This software (modified or not) and binary are used for
+* microcontroller manufactured by Nanjing Qinheng Microelectronics.
+*******************************************************************************/
+#include "ch32v10x_misc.h"
+
+__IO uint32_t NVIC_Priority_Group = 0;
+
+/*********************************************************************
+ * @fn NVIC_PriorityGroupConfig
+ *
+ * @brief Configures the priority grouping - pre-emption priority and subpriority.
+ *
+ * @param NVIC_PriorityGroup - specifies the priority grouping bits length.
+ * NVIC_PriorityGroup_0 - 0 bits for pre-emption priority
+ * 4 bits for subpriority
+ * NVIC_PriorityGroup_1 - 1 bits for pre-emption priority
+ * 3 bits for subpriority
+ *
+ * @return none
+ */
+void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
+{
+#if (INTSYSCR_INEST == INTSYSCR_INEST_NoEN)
+ NVIC_INTNestCfg(DISABLE);
+#else
+ NVIC_INTNestCfg(ENABLE);
+#endif
+
+ NVIC_Priority_Group = NVIC_PriorityGroup;
+}
+
+/*********************************************************************
+ * @fn NVIC_Init
+ *
+ * @brief Initializes the NVIC peripheral according to the specified parameters in
+ * the NVIC_InitStruct.
+ *
+ * @param NVIC_InitStruct - pointer to a NVIC_InitTypeDef structure that contains the
+ * configuration information for the specified NVIC peripheral.
+ * interrupt nesting enable(PFIC->CFGR bit1 = 0)
+ * NVIC_IRQChannelPreemptionPriority - range from 0 to 1.
+ * NVIC_IRQChannelSubPriority - range from 0 to 7.
+ *
+ * interrupt nesting disable(PFIC->CFGR bit1 = 1)
+ * NVIC_IRQChannelPreemptionPriority - range is 0.
+ * NVIC_IRQChannelSubPriority - range from 0 to 0xF.
+ *
+ * @return none
+ */
+void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
+{
+#if (INTSYSCR_INEST == INTSYSCR_INEST_NoEN)
+ if(NVIC_Priority_Group == NVIC_PriorityGroup_0)
+ {
+ NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4);
+ }
+#else
+ if(NVIC_Priority_Group == NVIC_PriorityGroup_1)
+ {
+ if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 1)
+ {
+ NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
+ }
+ else if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 0)
+ {
+ NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
+ }
+ }
+#endif
+
+ if(NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
+ {
+ NVIC_EnableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
+ }
+ else
+ {
+ NVIC_DisableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
+ }
+}
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_misc.h b/mijia_haier_bridge/src/periph/ch32v10x_misc.h
new file mode 100644
index 0000000..5db551c
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_misc.h
@@ -0,0 +1,70 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_misc.h
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2024/01/05
+ * 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 __CH32V10X_MISC_H
+#define __CH32V10X_MISC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ch32v10x.h"
+
+/* CSR_INTSYSCR_INEST_definition */
+#define INTSYSCR_INEST_NoEN 0x00 /* interrupt nesting disable(PFIC->CFGR bit1 = 1) */
+#define INTSYSCR_INEST_EN 0x01 /* interrupt nesting enable(PFIC->CFGR bit1 = 0) */
+
+/* Check the configuration of PFIC->CFGR
+ * interrupt nesting enable(PFIC->CFGR bit1 = 0)
+ * priority - bit[7] - Preemption Priority
+ * bit[6:4] - Sub priority
+ * bit[3:0] - Reserve
+ * interrupt nesting disable(PFIC->CFGR bit1 = 1)
+ * priority - bit[7:4] - Sub priority
+ * bit[3:0] - Reserve
+ */
+
+#ifndef INTSYSCR_INEST
+#define INTSYSCR_INEST INTSYSCR_INEST_EN
+#endif
+
+/* NVIC Init Structure definition
+ * interrupt nesting enable(PFIC->CFGR bit1 = 0)
+ * NVIC_IRQChannelPreemptionPriority - range from 0 to 1.
+ * NVIC_IRQChannelSubPriority - range from 0 to 7.
+ *
+ * interrupt nesting disable(PFIC->CFGR bit1 = 1)
+ * NVIC_IRQChannelPreemptionPriority - range is 0.
+ * NVIC_IRQChannelSubPriority - range from 0 to 0xF.
+ *
+ */
+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(PFIC->CFGR bit1 = 1) */
+#else
+#define NVIC_PriorityGroup_1 ((uint32_t)0x01) /* interrupt nesting enable(PFIC->CFGR bit1 = 0) */
+#endif
+
+
+void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
+void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
+
+#endif /* __CH32V10x_MISC_H */
+
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_rcc.c b/mijia_haier_bridge/src/periph/ch32v10x_rcc.c
new file mode 100644
index 0000000..66b93ea
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_rcc.c
@@ -0,0 +1,950 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_rcc.c
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2020/04/30
+ * 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.
+*******************************************************************************/
+#include "ch32v10x_rcc.h"
+
+/* RCC registers bit address in the alias region */
+#define RCC_OFFSET (RCC_BASE - PERIPH_BASE)
+
+/* BDCTLR Register */
+#define BDCTLR_OFFSET (RCC_OFFSET + 0x20)
+
+/* RCC registers bit mask */
+
+/* CTLR register bit mask */
+#define CTLR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF)
+#define CTLR_HSEBYP_Set ((uint32_t)0x00040000)
+#define CTLR_HSEON_Reset ((uint32_t)0xFFFEFFFF)
+#define CTLR_HSEON_Set ((uint32_t)0x00010000)
+#define CTLR_HSITRIM_Mask ((uint32_t)0xFFFFFF07)
+
+#define CFGR0_PLL_Mask ((uint32_t)0xFFC0FFFF)
+#define CFGR0_PLLMull_Mask ((uint32_t)0x003C0000)
+#define CFGR0_PLLSRC_Mask ((uint32_t)0x00010000)
+#define CFGR0_PLLXTPRE_Mask ((uint32_t)0x00020000)
+#define CFGR0_SWS_Mask ((uint32_t)0x0000000C)
+#define CFGR0_SW_Mask ((uint32_t)0xFFFFFFFC)
+#define CFGR0_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F)
+#define CFGR0_HPRE_Set_Mask ((uint32_t)0x000000F0)
+#define CFGR0_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF)
+#define CFGR0_PPRE1_Set_Mask ((uint32_t)0x00000700)
+#define CFGR0_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF)
+#define CFGR0_PPRE2_Set_Mask ((uint32_t)0x00003800)
+#define CFGR0_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF)
+#define CFGR0_ADCPRE_Set_Mask ((uint32_t)0x0000C000)
+
+/* RSTSCKR register bit mask */
+#define RSTSCKR_RMVF_Set ((uint32_t)0x01000000)
+
+/* RCC Flag Mask */
+#define FLAG_Mask ((uint8_t)0x1F)
+
+/* INTR register byte 2 (Bits[15:8]) base address */
+#define INTR_BYTE2_ADDRESS ((uint32_t)0x40021009)
+
+/* INTR register byte 3 (Bits[23:16]) base address */
+#define INTR_BYTE3_ADDRESS ((uint32_t)0x4002100A)
+
+/* CFGR0 register byte 4 (Bits[31:24]) base address */
+#define CFGR0_BYTE4_ADDRESS ((uint32_t)0x40021007)
+
+/* BDCTLR register base address */
+#define BDCTLR_ADDRESS (PERIPH_BASE + BDCTLR_OFFSET)
+
+static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
+static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8};
+
+/*********************************************************************
+ * @fn RCC_DeInit
+ *
+ * @brief Resets the RCC clock configuration to the default reset state.
+ * Note-
+ * HSE can not be stopped if it is used directly or through the PLL as system clock.
+ * @return none
+ */
+void RCC_DeInit(void)
+{
+ RCC->CTLR |= (uint32_t)0x00000001;
+ RCC->CFGR0 &= (uint32_t)0xF8FF0000;
+ RCC->CTLR &= (uint32_t)0xFEF6FFFF;
+ RCC->CTLR &= (uint32_t)0xFFFBFFFF;
+ RCC->CFGR0 &= (uint32_t)0xFF80FFFF;
+ RCC->INTR = 0x009F0000;
+}
+
+/*********************************************************************
+ * @fn RCC_HSEConfig
+ *
+ * @brief Configures the External High Speed oscillator (HSE).
+ *
+ * @param RCC_HSE -
+ * RCC_HSE_OFF - HSE oscillator OFF.
+ * RCC_HSE_ON - HSE oscillator ON.
+ * RCC_HSE_Bypass - HSE oscillator bypassed with external clock.
+ * Note-
+ * HSE can not be stopped if it is used directly or through the PLL as system clock.
+ * @return none
+ */
+void RCC_HSEConfig(uint32_t RCC_HSE)
+{
+ RCC->CTLR &= CTLR_HSEON_Reset;
+ RCC->CTLR &= CTLR_HSEBYP_Reset;
+
+ switch(RCC_HSE)
+ {
+ case RCC_HSE_ON:
+ RCC->CTLR |= CTLR_HSEON_Set;
+ break;
+
+ case RCC_HSE_Bypass:
+ RCC->CTLR |= CTLR_HSEBYP_Set | CTLR_HSEON_Set;
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_WaitForHSEStartUp
+ *
+ * @brief Waits for HSE start-up.
+ *
+ * @return READY - HSE oscillator is stable and ready to use.
+ * NoREADY - HSE oscillator not yet ready.
+ */
+ErrorStatus RCC_WaitForHSEStartUp(void)
+{
+ __IO uint32_t StartUpCounter = 0;
+
+ ErrorStatus status = NoREADY;
+ FlagStatus HSEStatus = RESET;
+
+ do
+ {
+ HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY);
+ StartUpCounter++;
+ } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET));
+
+ if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)
+ {
+ status = READY;
+ }
+ else
+ {
+ status = NoREADY;
+ }
+
+ return (status);
+}
+
+/*********************************************************************
+ * @fn RCC_AdjustHSICalibrationValue
+ *
+ * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value.
+ *
+ * @param HSICalibrationValue - specifies the calibration trimming value.
+ * This parameter must be a number between 0 and 0x1F.
+ *
+ * @return none
+ */
+void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CTLR;
+ tmpreg &= CTLR_HSITRIM_Mask;
+ tmpreg |= (uint32_t)HSICalibrationValue << 3;
+ RCC->CTLR = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_HSICmd
+ *
+ * @brief Enables or disables the Internal High Speed oscillator (HSI).
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_HSICmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ RCC->CTLR |= (1 << 0);
+ }
+ else
+ {
+ RCC->CTLR &= ~(1 << 0);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_PLLConfig
+ *
+ * @brief Configures the PLL clock source and multiplication factor.
+ *
+ * @param RCC_PLLSource - specifies the PLL entry clock source.
+ * RCC_PLLSource_HSI_Div2 - HSI oscillator clock divided by 2
+ * selected as PLL clock entry.
+ * RCC_PLLSource_HSE_Div1 - HSE oscillator clock selected as PLL
+ * clock entry.
+ * RCC_PLLSource_HSE_Div2 - HSE oscillator clock divided by 2
+ * selected as PLL clock entry.
+ * RCC_PLLMul - specifies the PLL multiplication factor.
+ * This parameter can be RCC_PLLMul_x where x:[2,16].
+ *
+ * @return none
+ */
+void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CFGR0;
+ tmpreg &= CFGR0_PLL_Mask;
+ tmpreg |= RCC_PLLSource | RCC_PLLMul;
+ RCC->CFGR0 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_PLLCmd
+ *
+ * @brief Enables or disables the PLL.
+ * Note-The PLL can not be disabled if it is used as system clock.
+ *
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_PLLCmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ RCC->CTLR |= (1 << 24);
+ }
+ else
+ {
+ RCC->CTLR &= ~(1 << 24);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_SYSCLKConfig
+ *
+ * @brief Configures the system clock (SYSCLK).
+ *
+ * @param RCC_SYSCLKSource - specifies the clock source used as system clock.
+ * RCC_SYSCLKSource_HSI - HSI selected as system clock.
+ * RCC_SYSCLKSource_HSE - HSE selected as system clock.
+ * RCC_SYSCLKSource_PLLCLK - PLL selected as system clock.
+ *
+ * @return none
+ */
+void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CFGR0;
+ tmpreg &= CFGR0_SW_Mask;
+ tmpreg |= RCC_SYSCLKSource;
+ RCC->CFGR0 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_GetSYSCLKSource
+ *
+ * @brief Returns the clock source used as system clock.
+ *
+ * @return 0x00 - HSI used as system clock.
+ * 0x04 - HSE used as system clock.
+ * 0x08 - PLL used as system clock.
+ */
+uint8_t RCC_GetSYSCLKSource(void)
+{
+ return ((uint8_t)(RCC->CFGR0 & CFGR0_SWS_Mask));
+}
+
+/*********************************************************************
+ * @fn RCC_HCLKConfig
+ *
+ * @brief Configures the AHB clock (HCLK).
+ *
+ * @param RCC_SYSCLK - defines the AHB clock divider. This clock is derived from
+ * the system clock (SYSCLK).
+ * RCC_SYSCLK_Div1 - AHB clock = SYSCLK.
+ * RCC_SYSCLK_Div2 - AHB clock = SYSCLK/2.
+ * RCC_SYSCLK_Div4 - AHB clock = SYSCLK/4.
+ * RCC_SYSCLK_Div8 - AHB clock = SYSCLK/8.
+ * RCC_SYSCLK_Div16 - AHB clock = SYSCLK/16.
+ * RCC_SYSCLK_Div64 - AHB clock = SYSCLK/64.
+ * RCC_SYSCLK_Div128 - AHB clock = SYSCLK/128.
+ * RCC_SYSCLK_Div256 - AHB clock = SYSCLK/256.
+ * RCC_SYSCLK_Div512 - AHB clock = SYSCLK/512.
+ *
+ * @return none
+ */
+void RCC_HCLKConfig(uint32_t RCC_SYSCLK)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CFGR0;
+ tmpreg &= CFGR0_HPRE_Reset_Mask;
+ tmpreg |= RCC_SYSCLK;
+ RCC->CFGR0 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_PCLK1Config
+ *
+ * @brief Configures the Low Speed APB clock (PCLK1).
+ *
+ * @param RCC_HCLK - defines the APB1 clock divider. This clock is derived from
+ * the AHB clock (HCLK).
+ * RCC_HCLK_Div1 - APB1 clock = HCLK.
+ * RCC_HCLK_Div2 - APB1 clock = HCLK/2.
+ * RCC_HCLK_Div4 - APB1 clock = HCLK/4.
+ * RCC_HCLK_Div8 - APB1 clock = HCLK/8.
+ * RCC_HCLK_Div16 - APB1 clock = HCLK/16.
+ *
+ * @return none
+ */
+void RCC_PCLK1Config(uint32_t RCC_HCLK)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CFGR0;
+ tmpreg &= CFGR0_PPRE1_Reset_Mask;
+ tmpreg |= RCC_HCLK;
+ RCC->CFGR0 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_PCLK2Config
+ *
+ * @brief Configures the High Speed APB clock (PCLK2).
+ *
+ * @param RCC_HCLK - defines the APB2 clock divider. This clock is derived from
+ * the AHB clock (HCLK).
+ * RCC_HCLK_Div1 - APB2 clock = HCLK.
+ * RCC_HCLK_Div2 - APB2 clock = HCLK/2.
+ * RCC_HCLK_Div4 - APB2 clock = HCLK/4.
+ * RCC_HCLK_Div8 - APB2 clock = HCLK/8.
+ * RCC_HCLK_Div16 - APB2 clock = HCLK/16.
+ * @return none
+ */
+void RCC_PCLK2Config(uint32_t RCC_HCLK)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CFGR0;
+ tmpreg &= CFGR0_PPRE2_Reset_Mask;
+ tmpreg |= RCC_HCLK << 3;
+ RCC->CFGR0 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_ITConfig
+ *
+ * @brief Enables or disables the specified RCC interrupts.
+ *
+ * @param RCC_IT - specifies the RCC interrupt sources to be enabled or disabled.
+ * RCC_IT_LSIRDY - LSI ready interrupt.
+ * RCC_IT_LSERDY - LSE ready interrupt.
+ * RCC_IT_HSIRDY - HSI ready interrupt.
+ * RCC_IT_HSERDY - HSE ready interrupt.
+ * RCC_IT_PLLRDY - PLL ready interrupt.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ *(__IO uint8_t *)INTR_BYTE2_ADDRESS |= RCC_IT;
+ }
+ else
+ {
+ *(__IO uint8_t *)INTR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_USBCLKConfig
+ *
+ * @brief Configures the USB clock (USBCLK).
+ *
+ * @param RCC_USBCLKSource: specifies the USB clock source. This clock is
+ * derived from the PLL output.
+ * RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB
+ * clock source.
+ * RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source.
+ *
+ * @return none
+ */
+void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource)
+{
+ if(RCC_USBCLKSource)
+ {
+ RCC->CFGR0 |= (1 << 22);
+ }
+ else
+ {
+ RCC->CFGR0 &= ~(1 << 22);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_ADCCLKConfig
+ *
+ * @brief Configures the ADC clock (ADCCLK).
+ *
+ * @param RCC_PCLK2 - defines the ADC clock divider. This clock is derived from
+ * the APB2 clock (PCLK2).
+ * RCC_PCLK2_Div2 - ADC clock = PCLK2/2.
+ * RCC_PCLK2_Div4 - ADC clock = PCLK2/4.
+ * RCC_PCLK2_Div6 - ADC clock = PCLK2/6.
+ * RCC_PCLK2_Div8 - ADC clock = PCLK2/8.
+ *
+ * @return none
+ */
+void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)
+{
+ uint32_t tmpreg = 0;
+
+ tmpreg = RCC->CFGR0;
+ tmpreg &= CFGR0_ADCPRE_Reset_Mask;
+ tmpreg |= RCC_PCLK2;
+ RCC->CFGR0 = tmpreg;
+}
+
+/*********************************************************************
+ * @fn RCC_LSEConfig
+ *
+ * @brief Configures the External Low Speed oscillator (LSE).
+ *
+ * @param RCC_LSE - specifies the new state of the LSE.
+ * RCC_LSE_OFF - LSE oscillator OFF.
+ * RCC_LSE_ON - LSE oscillator ON.
+ * RCC_LSE_Bypass - LSE oscillator bypassed with external clock.
+ *
+ * @return none
+ */
+void RCC_LSEConfig(uint8_t RCC_LSE)
+{
+ *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_OFF;
+ *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_OFF;
+
+ switch(RCC_LSE)
+ {
+ case RCC_LSE_ON:
+ *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_ON;
+ break;
+
+ case RCC_LSE_Bypass:
+ *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON;
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_LSICmd
+ *
+ * @brief Enables or disables the Internal Low Speed oscillator (LSI).
+ * Note-
+ * LSI can not be disabled if the IWDG is running.
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_LSICmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ RCC->RSTSCKR |= (1 << 0);
+ }
+ else
+ {
+ RCC->RSTSCKR &= ~(1 << 0);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_RTCCLKConfig
+ *
+ * @brief Once the RTC clock is selected it can't be changed unless the Backup domain is reset.
+ *
+ * @param RCC_RTCCLKSource - specifies the RTC clock source.
+ * RCC_RTCCLKSource_LSE - LSE selected as RTC clock.
+ * RCC_RTCCLKSource_LSI - LSI selected as RTC clock.
+ * RCC_RTCCLKSource_HSE_Div128 - HSE clock divided by 128 selected as RTC clock.
+ * Note-
+ * Once the RTC clock is selected it can't be changed unless the Backup domain is reset.
+ * @return none
+ */
+void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)
+{
+ RCC->BDCTLR |= RCC_RTCCLKSource;
+}
+
+/*********************************************************************
+ * @fn RCC_RTCCLKCmd
+ *
+ * @brief This function must be used only after the RTC clock was selected
+ * using the RCC_RTCCLKConfig function.
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_RTCCLKCmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ RCC->BDCTLR |= (1 << 15);
+ }
+ else
+ {
+ RCC->BDCTLR &= ~(1 << 15);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_GetClocksFreq
+ *
+ * @brief The result of this function could be not correct when using
+ * fractional value for HSE crystal.
+ *
+ * @param RCC_Clocks - pointer to a RCC_ClocksTypeDef structure which will hold
+ * the clocks frequencies.
+ *
+ * @return none
+ */
+void RCC_GetClocksFreq(RCC_ClocksTypeDef *RCC_Clocks)
+{
+ uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
+
+ tmp = RCC->CFGR0 & CFGR0_SWS_Mask;
+
+ switch(tmp)
+ {
+ case 0x00:
+ RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
+ break;
+
+ case 0x04:
+ RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
+ break;
+
+ case 0x08:
+ pllmull = RCC->CFGR0 & CFGR0_PLLMull_Mask;
+ pllsource = RCC->CFGR0 & CFGR0_PLLSRC_Mask;
+ pllmull = (pllmull >> 18) + 2;
+
+ if(pllsource == 0x00)
+ {
+ if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE)
+ {
+ RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE)*pllmull;
+ }
+ else
+ {
+ RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull;
+ }
+ }
+ else
+ {
+ if((RCC->CFGR0 & CFGR0_PLLXTPRE_Mask) != (uint32_t)RESET)
+ {
+ RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull;
+ }
+ else
+ {
+ RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull;
+ }
+ }
+ break;
+
+ default:
+ RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
+ break;
+ }
+
+ tmp = RCC->CFGR0 & CFGR0_HPRE_Set_Mask;
+ tmp = tmp >> 4;
+ presc = APBAHBPrescTable[tmp];
+ RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
+ tmp = RCC->CFGR0 & CFGR0_PPRE1_Set_Mask;
+ tmp = tmp >> 8;
+ presc = APBAHBPrescTable[tmp];
+ RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
+ tmp = RCC->CFGR0 & CFGR0_PPRE2_Set_Mask;
+ tmp = tmp >> 11;
+ presc = APBAHBPrescTable[tmp];
+ RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
+ tmp = RCC->CFGR0 & CFGR0_ADCPRE_Set_Mask;
+ tmp = tmp >> 14;
+ presc = ADCPrescTable[tmp];
+ RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc;
+}
+
+/*********************************************************************
+ * @fn RCC_AHBPeriphClockCmd
+ *
+ * @brief Enables or disables the AHB peripheral clock.
+ *
+ * @param RCC_AHBPeriph - specifies the AHB peripheral to gates its clock.
+ * RCC_AHBPeriph_DMA1.
+ * RCC_AHBPeriph_DMA2.
+ * RCC_AHBPeriph_SRAM.
+ * Note-
+ * SRAM clock can be disabled only during sleep mode.
+ * NewState: ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ RCC->AHBPCENR |= RCC_AHBPeriph;
+ }
+ else
+ {
+ RCC->AHBPCENR &= ~RCC_AHBPeriph;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_APB2PeriphClockCmd
+ *
+ * @brief Enables or disables the High Speed APB (APB2) peripheral clock.
+ *
+ * @param RCC_APB2Periph - specifies the APB2 peripheral to gates its clock.
+ * RCC_APB2Periph_AFIO.
+ * RCC_APB2Periph_GPIOA.
+ * RCC_APB2Periph_GPIOB.
+ * RCC_APB2Periph_GPIOC.
+ * RCC_APB2Periph_GPIOD.
+ * RCC_APB2Periph_GPIOE
+ * RCC_APB2Periph_ADC1.
+ * RCC_APB2Periph_ADC2
+ * RCC_APB2Periph_TIM1.
+ * RCC_APB2Periph_SPI1.
+ * RCC_APB2Periph_TIM8
+ * RCC_APB2Periph_USART1.
+ * NewState - ENABLE or DISABLE
+ *
+ * @return none
+ */
+void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ RCC->APB2PCENR |= RCC_APB2Periph;
+ }
+ else
+ {
+ RCC->APB2PCENR &= ~RCC_APB2Periph;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_APB1PeriphClockCmd
+ *
+ * @brief Enables or disables the Low Speed APB (APB1) peripheral clock.
+ *
+ * @param RCC_APB1Periph - specifies the APB1 peripheral to gates its clock.
+ * RCC_APB1Periph_TIM2.
+ * RCC_APB1Periph_TIM3.
+ * RCC_APB1Periph_TIM4.
+ * RCC_APB1Periph_WWDG.
+ * RCC_APB1Periph_SPI2.
+ * RCC_APB1Periph_USART2.
+ * RCC_APB1Periph_I2C1.
+ * RCC_APB1Periph_I2C2.
+ * RCC_APB1Periph_USB.
+ * RCC_APB1Periph_CAN1.
+ * RCC_APB1Periph_BKP.
+ * RCC_APB1Periph_PWR.
+ * RCC_APB1Periph_DAC.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ RCC->APB1PCENR |= RCC_APB1Periph;
+ }
+ else
+ {
+ RCC->APB1PCENR &= ~RCC_APB1Periph;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_APB2PeriphResetCmd
+ *
+ * @brief Forces or releases High Speed APB (APB2) peripheral reset.
+ *
+ * @param RCC_APB2Periph - specifies the APB2 peripheral to reset.
+ * RCC_APB2Periph_AFIO.
+ * RCC_APB2Periph_GPIOA.
+ * RCC_APB2Periph_GPIOB.
+ * RCC_APB2Periph_GPIOC.
+ * RCC_APB2Periph_GPIOD.
+ * RCC_APB2Periph_GPIOE
+ * RCC_APB2Periph_ADC1.
+ * RCC_APB2Periph_TIM1.
+ * RCC_APB2Periph_SPI1.
+ * RCC_APB2Periph_USART1.
+ * NewState - ENABLE or DISABLE
+ *
+ * @return none
+ */
+void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ RCC->APB2PRSTR |= RCC_APB2Periph;
+ }
+ else
+ {
+ RCC->APB2PRSTR &= ~RCC_APB2Periph;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_APB1PeriphResetCmd
+ *
+ * @brief Forces or releases Low Speed APB (APB1) peripheral reset.
+ *
+ * @param RCC_APB1Periph - specifies the APB1 peripheral to reset.
+ * RCC_APB1Periph_TIM2.
+ * RCC_APB1Periph_TIM3.
+ * RCC_APB1Periph_TIM4.
+ * RCC_APB1Periph_WWDG.
+ * RCC_APB1Periph_SPI2.
+ * RCC_APB1Periph_USART2.
+ * RCC_APB1Periph_USART3.
+ * RCC_APB1Periph_I2C1.
+ * RCC_APB1Periph_I2C2.
+ * RCC_APB1Periph_USB.
+ * RCC_APB1Periph_CAN1.
+ * RCC_APB1Periph_BKP.
+ * RCC_APB1Periph_PWR.
+ * RCC_APB1Periph_DAC.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ RCC->APB1PRSTR |= RCC_APB1Periph;
+ }
+ else
+ {
+ RCC->APB1PRSTR &= ~RCC_APB1Periph;
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_BackupResetCmd
+ *
+ * @brief Forces or releases the Backup domain reset.
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_BackupResetCmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ RCC->BDCTLR |= (1 << 16);
+ }
+ else
+ {
+ RCC->BDCTLR &= ~(1 << 16);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_ClockSecuritySystemCmd
+ *
+ * @brief Enables or disables the Clock Security System.
+ *
+ * @param NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void RCC_ClockSecuritySystemCmd(FunctionalState NewState)
+{
+ if(NewState)
+ {
+ RCC->CTLR |= (1 << 19);
+ }
+ else
+ {
+ RCC->CTLR &= ~(1 << 19);
+ }
+}
+
+/*********************************************************************
+ * @fn RCC_MCOConfig
+ *
+ * @brief Selects the clock source to output on MCO pin.
+ *
+ * @param RCC_MCO - specifies the clock source to output.
+ * RCC_MCO_NoClock - No clock selected.
+ * RCC_MCO_SYSCLK - System clock selected.
+ * RCC_MCO_HSI - HSI oscillator clock selected.
+ * RCC_MCO_HSE - HSE oscillator clock selected.
+ * RCC_MCO_PLLCLK_Div2 - PLL clock divided by 2 selected.
+ *
+ * @return none
+ */
+void RCC_MCOConfig(uint8_t RCC_MCO)
+{
+ *(__IO uint8_t *)CFGR0_BYTE4_ADDRESS = RCC_MCO;
+}
+
+/*********************************************************************
+ * @fn RCC_GetFlagStatus
+ *
+ * @brief Checks whether the specified RCC flag is set or not.
+ *
+ * @param RCC_FLAG - specifies the flag to check.
+ * RCC_FLAG_HSIRDY - HSI oscillator clock ready.
+ * RCC_FLAG_HSERDY - HSE oscillator clock ready.
+ * RCC_FLAG_PLLRDY - PLL clock ready.
+ * RCC_FLAG_LSERDY - LSE oscillator clock ready.
+ * RCC_FLAG_LSIRDY - LSI oscillator clock ready.
+ * RCC_FLAG_PINRST - Pin reset.
+ * RCC_FLAG_PORRST - POR/PDR reset.
+ * RCC_FLAG_SFTRST - Software reset.
+ * RCC_FLAG_IWDGRST - Independent Watchdog reset.
+ * RCC_FLAG_WWDGRST - Window Watchdog reset.
+ * RCC_FLAG_LPWRRST - Low Power reset.
+ *
+ * @return FlagStatus - SET or RESET.
+ */
+FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
+{
+ uint32_t tmp = 0;
+ uint32_t statusreg = 0;
+
+ FlagStatus bitstatus = RESET;
+ tmp = RCC_FLAG >> 5;
+
+ if(tmp == 1)
+ {
+ statusreg = RCC->CTLR;
+ }
+ else if(tmp == 2)
+ {
+ statusreg = RCC->BDCTLR;
+ }
+ else
+ {
+ statusreg = RCC->RSTSCKR;
+ }
+
+ tmp = RCC_FLAG & FLAG_Mask;
+
+ if((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn RCC_ClearFlag
+ *
+ * @brief Clears the RCC reset flags.
+ * Note-
+ * The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST,
+ * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST
+ * @return none
+ */
+void RCC_ClearFlag(void)
+{
+ RCC->RSTSCKR |= RSTSCKR_RMVF_Set;
+}
+
+/*********************************************************************
+ * @fn RCC_GetITStatus
+ *
+ * @brief Checks whether the specified RCC interrupt has occurred or not.
+ *
+ * @param RCC_IT - specifies the RCC interrupt source to check.
+ * RCC_IT_LSIRDY - LSI ready interrupt.
+ * RCC_IT_LSERDY - LSE ready interrupt.
+ * RCC_IT_HSIRDY - HSI ready interrupt.
+ * RCC_IT_HSERDY - HSE ready interrupt.
+ * RCC_IT_PLLRDY - PLL ready interrupt.
+ * RCC_IT_CSS - Clock Security System interrupt.
+ *
+ * @return ITStatus - SET or RESET.
+ */
+ITStatus RCC_GetITStatus(uint8_t RCC_IT)
+{
+ ITStatus bitstatus = RESET;
+
+ if((RCC->INTR & RCC_IT) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn RCC_ClearITPendingBit
+ *
+ * @brief Clears the RCC's interrupt pending bits.
+ *
+ * @param RCC_IT - specifies the interrupt pending bit to clear.
+ * RCC_IT_LSIRDY - LSI ready interrupt.
+ * RCC_IT_LSERDY - LSE ready interrupt.
+ * RCC_IT_HSIRDY - HSI ready interrupt.
+ * RCC_IT_HSERDY - HSE ready interrupt.
+ * RCC_IT_PLLRDY - PLL ready interrupt.
+ * RCC_IT_CSS - Clock Security System interrupt.
+ *
+ * @return none
+ */
+void RCC_ClearITPendingBit(uint8_t RCC_IT)
+{
+ *(__IO uint8_t *)INTR_BYTE3_ADDRESS = RCC_IT;
+}
+
+
+
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_rcc.h b/mijia_haier_bridge/src/periph/ch32v10x_rcc.h
new file mode 100644
index 0000000..0efbf16
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_rcc.h
@@ -0,0 +1,230 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_rcc.h
+ * Author : WCH
+ * Version : V1.0.1
+ * Date : 2025/01/02
+ * 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 __CH32V10x_RCC_H
+#define __CH32V10x_RCC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ch32v10x.h"
+
+/* RCC_Exported_Types */
+typedef struct
+{
+ uint32_t SYSCLK_Frequency; /* returns SYSCLK clock frequency expressed in Hz */
+ uint32_t HCLK_Frequency; /* returns HCLK clock frequency expressed in Hz */
+ uint32_t PCLK1_Frequency; /* returns PCLK1 clock frequency expressed in Hz */
+ uint32_t PCLK2_Frequency; /* returns PCLK2 clock frequency expressed in Hz */
+ uint32_t ADCCLK_Frequency; /* returns ADCCLK clock frequency expressed in Hz */
+} RCC_ClocksTypeDef;
+
+/* HSE_configuration */
+#define RCC_HSE_OFF ((uint32_t)0x00000000)
+#define RCC_HSE_ON ((uint32_t)0x00010000)
+#define RCC_HSE_Bypass ((uint32_t)0x00040000)
+
+/* PLL_entry_clock_source */
+#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000)
+#define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000)
+#define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000)
+
+/* PLL_multiplication_factor */
+#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)
+
+/* 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)
+
+/* USB_Device_clock_source */
+#define RCC_USBCLKSource_PLLCLK_1Div5 ((uint8_t)0x00)
+#define RCC_USBCLKSource_PLLCLK_Div1 ((uint8_t)0x01)
+
+/* 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_FLITF ((uint32_t)0x00000010)
+#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040)
+#define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100)
+#define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400)
+#define RCC_AHBPeriph_USBFS ((uint32_t)0x00001000)
+#define RCC_AHBPeriph_USBHD 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_GPIOF ((uint32_t)0x00000080)
+#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100)
+#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_ADC3 ((uint32_t)0x00008000)
+#define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000)
+#define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000)
+#define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000)
+#define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000)
+#define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000)
+#define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000)
+
+/* 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_TIM12 ((uint32_t)0x00000040)
+#define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080)
+#define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100)
+#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800)
+#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000)
+#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)
+#define RCC_APB1Periph_CEC ((uint32_t)0x40000000)
+
+/* Clock_source_to_output_on_MCO_pin */
+#define RCC_MCO_NoClock ((uint8_t)0x00)
+#define RCC_MCO_SYSCLK ((uint8_t)0x04)
+#define RCC_MCO_HSI ((uint8_t)0x05)
+#define RCC_MCO_HSE ((uint8_t)0x06)
+#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07)
+
+/* RCC_Flag */
+#define RCC_FLAG_HSIRDY ((uint8_t)0x21)
+#define RCC_FLAG_HSERDY ((uint8_t)0x31)
+#define RCC_FLAG_PLLRDY ((uint8_t)0x39)
+#define RCC_FLAG_LSERDY ((uint8_t)0x41)
+#define RCC_FLAG_LSIRDY ((uint8_t)0x61)
+#define RCC_FLAG_PINRST ((uint8_t)0x7A)
+#define RCC_FLAG_PORRST ((uint8_t)0x7B)
+#define RCC_FLAG_SFTRST ((uint8_t)0x7C)
+#define RCC_FLAG_IWDGRST ((uint8_t)0x7D)
+#define RCC_FLAG_WWDGRST ((uint8_t)0x7E)
+#define RCC_FLAG_LPWRRST ((uint8_t)0x7F)
+
+/* SysTick_clock_source */
+#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)
+#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)
+
+void RCC_DeInit(void);
+void RCC_HSEConfig(uint32_t RCC_HSE);
+ErrorStatus RCC_WaitForHSEStartUp(void);
+void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);
+void RCC_HSICmd(FunctionalState NewState);
+void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
+void RCC_PLLCmd(FunctionalState NewState);
+void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
+uint8_t RCC_GetSYSCLKSource(void);
+void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
+void RCC_PCLK1Config(uint32_t RCC_HCLK);
+void RCC_PCLK2Config(uint32_t RCC_HCLK);
+void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
+void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
+void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
+void RCC_LSEConfig(uint8_t RCC_LSE);
+void RCC_LSICmd(FunctionalState NewState);
+void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
+void RCC_RTCCLKCmd(FunctionalState NewState);
+void RCC_GetClocksFreq(RCC_ClocksTypeDef *RCC_Clocks);
+void RCC_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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CH32V10x_RCC_H */
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_tim.c b/mijia_haier_bridge/src/periph/ch32v10x_tim.c
new file mode 100644
index 0000000..7a772b6
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_tim.c
@@ -0,0 +1,2355 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_tim.c
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2024/01/06
+ * Description : This file provides all the TIM firmware functions.
+*********************************************************************************
+* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+* Attention: This software (modified or not) and binary are used for
+* microcontroller manufactured by Nanjing Qinheng Microelectronics.
+*******************************************************************************/
+#include "ch32v10x_tim.h"
+#include "ch32v10x_rcc.h"
+
+/* TIM registers bit mask */
+#define SMCFGR_ETR_Mask ((uint16_t)0x00FF)
+#define CHCTLR_Offset ((uint16_t)0x0018)
+#define CCER_CCE_Set ((uint16_t)0x0001)
+#define CCER_CCNE_Set ((uint16_t)0x0004)
+
+static void TI1_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+static void TI2_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+static void TI3_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+static void TI4_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+
+/*********************************************************************
+ * @fn TIM_DeInit
+ *
+ * @brief Deinitializes the TIMx peripheral registers to their default
+ * reset values.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ *
+ * @return none
+ */
+void TIM_DeInit(TIM_TypeDef *TIMx)
+{
+ if(TIMx == TIM1)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE);
+ }
+ else if(TIMx == TIM2)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
+ }
+ else if(TIMx == TIM3)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
+ }
+ else if(TIMx == TIM4)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_TimeBaseInit
+ *
+ * @brief Initializes the TIMx Time Base Unit peripheral according to
+ * the specified parameters in the TIM_TimeBaseInitStruct.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_TimeBaseInitStruct - pointer to a TIM_TimeBaseInitTypeDef
+ * structure.
+ *
+ * @return none
+ */
+void TIM_TimeBaseInit(TIM_TypeDef *TIMx, TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct)
+{
+ uint16_t tmpcr1 = 0;
+
+ tmpcr1 = TIMx->CTLR1;
+
+ if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4))
+ {
+ tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_DIR | TIM_CMS)));
+ tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
+ }
+
+ tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CTLR1_CKD));
+ tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;
+
+ TIMx->CTLR1 = tmpcr1;
+ TIMx->ATRLR = TIM_TimeBaseInitStruct->TIM_Period;
+ TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
+
+ if(TIMx == TIM1)
+ {
+ TIMx->RPTCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
+ }
+
+ TIMx->SWEVGR = TIM_PSCReloadMode_Immediate;
+}
+
+/*********************************************************************
+ * @fn TIM_OC1Init
+ *
+ * @brief Initializes the TIMx Channel1 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_OC1Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CC1E);
+ tmpccer = TIMx->CCER;
+ tmpcr2 = TIMx->CTLR2;
+ tmpccmrx = TIMx->CHCTLR1;
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC1M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC1S));
+ tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1P));
+ tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;
+ tmpccer |= TIM_OCInitStruct->TIM_OutputState;
+
+ if(TIMx == TIM1)
+ {
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1NP));
+ tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity;
+
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1NE));
+ tmpccer |= TIM_OCInitStruct->TIM_OutputNState;
+
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS1));
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS1N));
+
+ tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState;
+ tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState;
+ }
+
+ TIMx->CTLR2 = tmpcr2;
+ TIMx->CHCTLR1 = tmpccmrx;
+ TIMx->CH1CVR = TIM_OCInitStruct->TIM_Pulse;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC2Init
+ *
+ * @brief Initializes the TIMx Channel2 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_OC2Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC2E));
+ tmpccer = TIMx->CCER;
+ tmpcr2 = TIMx->CTLR2;
+ tmpccmrx = TIMx->CHCTLR1;
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC2M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC2S));
+ tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2P));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4);
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4);
+
+ if(TIMx == TIM1)
+ {
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2NP));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4);
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2NE));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4);
+
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS2));
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS2N));
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2);
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2);
+ }
+
+ TIMx->CTLR2 = tmpcr2;
+ TIMx->CHCTLR1 = tmpccmrx;
+ TIMx->CH2CVR = TIM_OCInitStruct->TIM_Pulse;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC3Init
+ *
+ * @brief Initializes the TIMx Channel3 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_OC3Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC3E));
+ tmpccer = TIMx->CCER;
+ tmpcr2 = TIMx->CTLR2;
+ tmpccmrx = TIMx->CHCTLR2;
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC3M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC3S));
+ tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3P));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8);
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8);
+
+ if(TIMx == TIM1)
+ {
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3NP));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8);
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3NE));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8);
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS3));
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS3N));
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4);
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4);
+ }
+
+ TIMx->CTLR2 = tmpcr2;
+ TIMx->CHCTLR2 = tmpccmrx;
+ TIMx->CH3CVR = TIM_OCInitStruct->TIM_Pulse;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC4Init
+ *
+ * @brief Initializes the TIMx Channel4 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_OC4Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC4E));
+ tmpccer = TIMx->CCER;
+ tmpcr2 = TIMx->CTLR2;
+ tmpccmrx = TIMx->CHCTLR2;
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC4M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC4S));
+ tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CC4P));
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12);
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12);
+
+ if(TIMx == TIM1)
+ {
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS4));
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6);
+ }
+
+ TIMx->CTLR2 = tmpcr2;
+ TIMx->CHCTLR2 = tmpccmrx;
+ TIMx->CH4CVR = TIM_OCInitStruct->TIM_Pulse;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_ICInit
+ *
+ * @brief IInitializes the TIM peripheral according to the specified
+ * parameters in the TIM_ICInitStruct.
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_ICInit(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct)
+{
+ if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_2)
+ {
+ TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_3)
+ {
+ TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else
+ {
+ TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_PWMIConfig
+ *
+ * @brief Configures the TIM peripheral according to the specified
+ * parameters in the TIM_ICInitStruct to measure an external
+ * PWM signal.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_PWMIConfig(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct)
+{
+ uint16_t icoppositepolarity = TIM_ICPolarity_Rising;
+ uint16_t icoppositeselection = TIM_ICSelection_DirectTI;
+
+ if(TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising)
+ {
+ icoppositepolarity = TIM_ICPolarity_Falling;
+ }
+ else
+ {
+ icoppositepolarity = TIM_ICPolarity_Rising;
+ }
+
+ if(TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI)
+ {
+ icoppositeselection = TIM_ICSelection_IndirectTI;
+ }
+ else
+ {
+ icoppositeselection = TIM_ICSelection_DirectTI;
+ }
+
+ if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else
+ {
+ TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_BDTRConfig
+ *
+ * @brief Configures the: Break feature, dead time, Lock level, the OSSI,
+ * the OSSR State and the AOE(automatic output enable).
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_BDTRInitStruct - pointer to a TIM_BDTRInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_BDTRConfig(TIM_TypeDef *TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)
+{
+ TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState |
+ TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime |
+ TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity |
+ TIM_BDTRInitStruct->TIM_AutomaticOutput;
+}
+
+/*********************************************************************
+ * @fn TIM_TimeBaseStructInit
+ *
+ * @brief Fills each TIM_TimeBaseInitStruct member with its default value.
+ *
+ * @param TIM_TimeBaseInitStruct - pointer to a TIM_TimeBaseInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct)
+{
+ TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF;
+ TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000;
+ TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1;
+ TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000;
+}
+
+/*********************************************************************
+ * @fn TIM_OCStructInit
+ *
+ * @brief Fills each TIM_OCInitStruct member with its default value.
+ *
+ * @param TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_OCStructInit(TIM_OCInitTypeDef *TIM_OCInitStruct)
+{
+ TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing;
+ TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable;
+ TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable;
+ TIM_OCInitStruct->TIM_Pulse = 0x0000;
+ TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High;
+ TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High;
+ TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset;
+ TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset;
+}
+
+/*********************************************************************
+ * @fn TIM_ICStructInit
+ *
+ * @brief Fills each TIM_ICInitStruct member with its default value.
+ *
+ * @param TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_ICStructInit(TIM_ICInitTypeDef *TIM_ICInitStruct)
+{
+ TIM_ICInitStruct->TIM_Channel = TIM_Channel_1;
+ TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising;
+ TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI;
+ TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1;
+ TIM_ICInitStruct->TIM_ICFilter = 0x00;
+}
+
+/*********************************************************************
+ * @fn TIM_BDTRStructInit
+ *
+ * @brief Fills each TIM_BDTRInitStruct member with its default value.
+ *
+ * @param TIM_BDTRInitStruct - pointer to a TIM_BDTRInitTypeDef structure.
+ *
+ * @return none
+ */
+void TIM_BDTRStructInit(TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)
+{
+ TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable;
+ TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable;
+ TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF;
+ TIM_BDTRInitStruct->TIM_DeadTime = 0x00;
+ TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable;
+ TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low;
+ TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
+}
+
+/*********************************************************************
+ * @fn TIM_Cmd
+ *
+ * @brief Enables or disables the specified TIM peripheral.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_Cmd(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR1 |= TIM_CEN;
+ }
+ else
+ {
+ TIMx->CTLR1 &= (uint16_t)(~((uint16_t)TIM_CEN));
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_CtrlPWMOutputs
+ *
+ * @brief Enables or disables the TIM peripheral Main Outputs.
+ *
+ * @param TIMx - where x can be 1 to select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_CtrlPWMOutputs(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->BDTR |= TIM_MOE;
+ }
+ else
+ {
+ TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_MOE));
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_ITConfig
+ *
+ * @brief Enables or disables the specified TIM interrupts.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_IT - specifies the TIM interrupts sources to be enabled or disabled.
+ * TIM_IT_Update - TIM update Interrupt source.
+ * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source.
+ * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source
+ * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source.
+ * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source.
+ * TIM_IT_COM - TIM Commutation Interrupt source.
+ * TIM_IT_Trigger - TIM Trigger Interrupt source.
+ * TIM_IT_Break - TIM Break Interrupt source.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_ITConfig(TIM_TypeDef *TIMx, uint16_t TIM_IT, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->DMAINTENR |= TIM_IT;
+ }
+ else
+ {
+ TIMx->DMAINTENR &= (uint16_t)~TIM_IT;
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_GenerateEvent
+ *
+ * @brief Configures the TIMx event to be generate by software.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_IT - specifies the TIM interrupts sources to be enabled or disabled.
+ * TIM_IT_Update - TIM update Interrupt source.
+ * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source.
+ * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source
+ * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source.
+ * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source.
+ * TIM_IT_COM - TIM Commutation Interrupt source.
+ * TIM_IT_Trigger - TIM Trigger Interrupt source.
+ * TIM_IT_Break - TIM Break Interrupt source.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_GenerateEvent(TIM_TypeDef *TIMx, uint16_t TIM_EventSource)
+{
+ TIMx->SWEVGR = TIM_EventSource;
+}
+
+/*********************************************************************
+ * @fn TIM_DMAConfig
+ *
+ * @brief Configures the TIMx's DMA interface.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_DMABase: DMA Base address.
+ * TIM_DMABase_CR.
+ * TIM_DMABase_CR2.
+ * TIM_DMABase_SMCR.
+ * TIM_DMABase_DIER.
+ * TIM1_DMABase_SR.
+ * TIM_DMABase_EGR.
+ * TIM_DMABase_CCMR1.
+ * TIM_DMABase_CCMR2.
+ * TIM_DMABase_CCER.
+ * TIM_DMABase_CNT.
+ * TIM_DMABase_PSC.
+ * TIM_DMABase_CCR1.
+ * TIM_DMABase_CCR2.
+ * TIM_DMABase_CCR3.
+ * TIM_DMABase_CCR4.
+ * TIM_DMABase_BDTR.
+ * TIM_DMABase_DCR.
+ * TIM_DMABurstLength - DMA Burst length.
+ * TIM_DMABurstLength_1Transfer.
+ * TIM_DMABurstLength_18Transfers.
+ *
+ * @return none
+ */
+void TIM_DMAConfig(TIM_TypeDef *TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength)
+{
+ TIMx->DMACFGR = TIM_DMABase | TIM_DMABurstLength;
+}
+
+/*********************************************************************
+ * @fn TIM_DMACmd
+ *
+ * @brief Enables or disables the TIMx's DMA Requests.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_DMASource - specifies the DMA Request sources.
+ * TIM_DMA_Update - TIM update Interrupt source.
+ * TIM_DMA_CC1 - TIM Capture Compare 1 DMA source.
+ * TIM_DMA_CC2 - TIM Capture Compare 2 DMA source.
+ * TIM_DMA_CC3 - TIM Capture Compare 3 DMA source.
+ * TIM_DMA_CC4 - TIM Capture Compare 4 DMA source.
+ * TIM_DMA_COM - TIM Commutation DMA source.
+ * TIM_DMA_Trigger - TIM Trigger DMA source.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_DMACmd(TIM_TypeDef *TIMx, uint16_t TIM_DMASource, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->DMAINTENR |= TIM_DMASource;
+ }
+ else
+ {
+ TIMx->DMAINTENR &= (uint16_t)~TIM_DMASource;
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_InternalClockConfig
+ *
+ * @brief Configures the TIMx internal Clock.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ *
+ * @return none
+ */
+void TIM_InternalClockConfig(TIM_TypeDef *TIMx)
+{
+ TIMx->SMCFGR &= (uint16_t)(~((uint16_t)TIM_SMS));
+}
+
+/*********************************************************************
+ * @fn TIM_ITRxExternalClockConfig
+ *
+ * @brief Configures the TIMx Internal Trigger as External Clock.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_InputTriggerSource: Trigger source.
+ * TIM_TS_ITR0 - Internal Trigger 0.
+ * TIM_TS_ITR1 - Internal Trigger 1.
+ * TIM_TS_ITR2 - Internal Trigger 2.
+ * TIM_TS_ITR3 - Internal Trigger 3.
+ *
+ * @return none
+ */
+void TIM_ITRxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource)
+{
+ TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource);
+ TIMx->SMCFGR |= TIM_SlaveMode_External1;
+}
+
+/*********************************************************************
+ * @fn TIM_TIxExternalClockConfig
+ *
+ * @brief Configures the TIMx Trigger as External Clock.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_TIxExternalCLKSource - Trigger source.
+ * TIM_TIxExternalCLK1Source_TI1ED - TI1 Edge Detector.
+ * TIM_TIxExternalCLK1Source_TI1 - Filtered Timer Input 1.
+ * TIM_TIxExternalCLK1Source_TI2 - Filtered Timer Input 2.
+ * TIM_ICPolarity - specifies the TIx Polarity.
+ * TIM_ICPolarity_Rising.
+ * TIM_ICPolarity_Falling.
+ * TIM_DMA_COM - TIM Commutation DMA source.
+ * TIM_DMA_Trigger - TIM Trigger DMA source.
+ * ICFilter - specifies the filter value.
+ * This parameter must be a value between 0x0 and 0xF.
+ *
+ * @return none
+ */
+void TIM_TIxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_TIxExternalCLKSource,
+ uint16_t TIM_ICPolarity, uint16_t ICFilter)
+{
+ if(TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2)
+ {
+ TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);
+ }
+ else
+ {
+ TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);
+ }
+
+ TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource);
+ TIMx->SMCFGR |= TIM_SlaveMode_External1;
+}
+
+/*********************************************************************
+ * @fn TIM_ETRClockMode1Config
+ *
+ * @brief Configures the External clock Mode1.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ExtTRGPrescaler - The external Trigger Prescaler.
+ * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF.
+ * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2.
+ * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4.
+ * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8.
+ * TIM_ExtTRGPolarity - The external Trigger Polarity.
+ * TIM_ExtTRGPolarity_Inverted - active low or falling edge active.
+ * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active.
+ * ExtTRGFilter - External Trigger Filter.
+ * This parameter must be a value between 0x0 and 0xF.
+ *
+ * @return none
+ */
+void TIM_ETRClockMode1Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
+ uint16_t ExtTRGFilter)
+{
+ uint16_t tmpsmcr = 0;
+
+ TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);
+ tmpsmcr = TIMx->SMCFGR;
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS));
+ tmpsmcr |= TIM_SlaveMode_External1;
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS));
+ tmpsmcr |= TIM_TS_ETRF;
+ TIMx->SMCFGR = tmpsmcr;
+}
+
+/*********************************************************************
+ * @fn TIM_ETRClockMode2Config
+ *
+ * @brief Configures the External clock Mode2.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ExtTRGPrescaler - The external Trigger Prescaler.
+ * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF.
+ * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2.
+ * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4.
+ * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8.
+ * TIM_ExtTRGPolarity - The external Trigger Polarity.
+ * TIM_ExtTRGPolarity_Inverted - active low or falling edge active.
+ * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active.
+ * ExtTRGFilter - External Trigger Filter.
+ * This parameter must be a value between 0x0 and 0xF.
+ *
+ * @return none
+ */
+void TIM_ETRClockMode2Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler,
+ uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter)
+{
+ TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);
+ TIMx->SMCFGR |= TIM_ECE;
+}
+
+/*********************************************************************
+ * @fn TIM_ETRConfig
+ *
+ * @brief Configures the TIMx External Trigger (ETR).
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ExtTRGPrescaler - The external Trigger Prescaler.
+ * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF.
+ * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2.
+ * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4.
+ * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8.
+ * TIM_ExtTRGPolarity - The external Trigger Polarity.
+ * TIM_ExtTRGPolarity_Inverted - active low or falling edge active.
+ * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active.
+ * ExtTRGFilter - External Trigger Filter.
+ * This parameter must be a value between 0x0 and 0xF.
+ *
+ * @return none
+ */
+void TIM_ETRConfig(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
+ uint16_t ExtTRGFilter)
+{
+ uint16_t tmpsmcr = 0;
+
+ tmpsmcr = TIMx->SMCFGR;
+ tmpsmcr &= SMCFGR_ETR_Mask;
+ tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8)));
+ TIMx->SMCFGR = tmpsmcr;
+}
+
+/*********************************************************************
+ * @fn TIM_PrescalerConfig
+ *
+ * @brief Configures the TIMx Prescaler.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * Prescaler - specifies the Prescaler Register value.
+ * TIM_PSCReloadMode - specifies the TIM Prescaler Reload mode.
+ * TIM_PSCReloadMode - specifies the TIM Prescaler Reload mode.
+ * TIM_PSCReloadMode_Update - The Prescaler is loaded at the update event.
+ * TIM_PSCReloadMode_Immediate - The Prescaler is loaded immediately.
+ *
+ * @return none
+ */
+void TIM_PrescalerConfig(TIM_TypeDef *TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
+{
+ TIMx->PSC = Prescaler;
+ TIMx->SWEVGR = TIM_PSCReloadMode;
+}
+
+/*********************************************************************
+ * @fn TIM_CounterModeConfig
+ *
+ * @brief Specifies the TIMx Counter Mode to be used.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_CounterMode - specifies the Counter Mode to be used.
+ * TIM_CounterMode_Up - TIM Up Counting Mode.
+ * TIM_CounterMode_Down - TIM Down Counting Mode.
+ * TIM_CounterMode_CenterAligned1 - TIM Center Aligned Mode1.
+ * TIM_CounterMode_CenterAligned2 - TIM Center Aligned Mode2.
+ * TIM_CounterMode_CenterAligned3 - TIM Center Aligned Mode3.
+ *
+ * @return none
+ */
+void TIM_CounterModeConfig(TIM_TypeDef *TIMx, uint16_t TIM_CounterMode)
+{
+ uint16_t tmpcr1 = 0;
+
+ tmpcr1 = TIMx->CTLR1;
+ tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_DIR | TIM_CMS)));
+ tmpcr1 |= TIM_CounterMode;
+ TIMx->CTLR1 = tmpcr1;
+}
+
+/*********************************************************************
+ * @fn TIM_SelectInputTrigger
+ *
+ * @brief Selects the Input Trigger source.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_InputTriggerSource - The Input Trigger source.
+ * TIM_TS_ITR0 - Internal Trigger 0.
+ * TIM_TS_ITR1 - Internal Trigger 1.
+ * TIM_TS_ITR2 - Internal Trigger 2.
+ * TIM_TS_ITR3 - Internal Trigger 3.
+ * TIM_TS_TI1F_ED - TI1 Edge Detector.
+ * TIM_TS_TI1FP1 - Filtered Timer Input 1.
+ * TIM_TS_TI2FP2 - Filtered Timer Input 2.
+ * TIM_TS_ETRF - External Trigger input.
+ *
+ * @return none
+ */
+void TIM_SelectInputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource)
+{
+ uint16_t tmpsmcr = 0;
+
+ tmpsmcr = TIMx->SMCFGR;
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS));
+ tmpsmcr |= TIM_InputTriggerSource;
+ TIMx->SMCFGR = tmpsmcr;
+}
+
+/*********************************************************************
+ * @fn TIM_EncoderInterfaceConfig
+ *
+ * @brief Configures the TIMx Encoder Interface.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_EncoderMode - specifies the TIMx Encoder Mode.
+ * TIM_EncoderMode_TI1 - Counter counts on TI1FP1 edge depending
+ * on TI2FP2 level.
+ * TIM_EncoderMode_TI2 - Counter counts on TI2FP2 edge depending
+ * on TI1FP1 level.
+ * TIM_EncoderMode_TI12 - Counter counts on both TI1FP1 and
+ * TI2FP2 edges depending.
+ * TIM_IC1Polarity - specifies the IC1 Polarity.
+ * TIM_ICPolarity_Falling - IC Falling edge.
+ * TTIM_ICPolarity_Rising - IC Rising edge.
+ * TIM_IC2Polarity - specifies the IC2 Polarity.
+ * TIM_ICPolarity_Falling - IC Falling edge.
+ * TIM_ICPolarity_Rising - IC Rising edge.
+ *
+ * @return none
+ */
+void TIM_EncoderInterfaceConfig(TIM_TypeDef *TIMx, uint16_t TIM_EncoderMode,
+ uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
+{
+ uint16_t tmpsmcr = 0;
+ uint16_t tmpccmr1 = 0;
+ uint16_t tmpccer = 0;
+
+ tmpsmcr = TIMx->SMCFGR;
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccer = TIMx->CCER;
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS));
+ tmpsmcr |= TIM_EncoderMode;
+ tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1S)) & (uint16_t)(~((uint16_t)TIM_CC2S)));
+ tmpccmr1 |= TIM_CC1S_0 | TIM_CC2S_0;
+ tmpccer &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1P)) & ((uint16_t) ~((uint16_t)TIM_CC2P)));
+ tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));
+ TIMx->SMCFGR = tmpsmcr;
+ TIMx->CHCTLR1 = tmpccmr1;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_ForcedOC1Config
+ *
+ * @brief Forces the TIMx output 1 waveform to active or inactive level.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ForcedAction - specifies the forced Action to be set to the
+ * output waveform.
+ * TIM_ForcedAction_Active - Force active level on OC1REF.
+ * TIM_ForcedAction_InActive - Force inactive level on OC1REF.
+ *
+ * @return none
+ */
+void TIM_ForcedOC1Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1M);
+ tmpccmr1 |= TIM_ForcedAction;
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_ForcedOC2Config
+ *
+ * @brief Forces the TIMx output 2 waveform to active or inactive level.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ForcedAction - specifies the forced Action to be set to the
+ * output waveform.
+ * TIM_ForcedAction_Active - Force active level on OC2REF.
+ * TIM_ForcedAction_InActive - Force inactive level on OC2REF.
+ *
+ * @return none
+ */
+void TIM_ForcedOC2Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2M);
+ tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8);
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_ForcedOC3Config
+ *
+ * @brief Forces the TIMx output 3 waveform to active or inactive level.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ForcedAction - specifies the forced Action to be set to the
+ * output waveform.
+ * TIM_ForcedAction_Active - Force active level on OC3REF.
+ * TIM_ForcedAction_InActive - Force inactive level on OC3REF.
+ *
+ * @return none
+ */
+void TIM_ForcedOC3Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3M);
+ tmpccmr2 |= TIM_ForcedAction;
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_ForcedOC4Config
+ *
+ * @brief Forces the TIMx output 4 waveform to active or inactive level.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_ForcedAction - specifies the forced Action to be set to the
+ * output waveform.
+ * TIM_ForcedAction_Active - Force active level on OC4REF.
+ * TIM_ForcedAction_InActive - Force inactive level on OC4REF.
+ *
+ * @return none
+ */
+void TIM_ForcedOC4Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4M);
+ tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8);
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_ARRPreloadConfig
+ *
+ * @brief Enables or disables TIMx peripheral Preload register on ARR.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_ARRPreloadConfig(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR1 |= TIM_ARPE;
+ }
+ else
+ {
+ TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_ARPE);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_SelectCOM
+ *
+ * @brief Selects the TIM peripheral Commutation event.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_SelectCOM(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR2 |= TIM_CCUS;
+ }
+ else
+ {
+ TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCUS);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_SelectCCDMA
+ *
+ * @brief Selects the TIMx peripheral Capture Compare DMA source.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_SelectCCDMA(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR2 |= TIM_CCDS;
+ }
+ else
+ {
+ TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCDS);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_CCPreloadControl
+ *
+ * @brief DSets or Resets the TIM peripheral Capture Compare Preload Control bit.
+ * reset values (Affects also the I2Ss).
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_CCPreloadControl(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR2 |= TIM_CCPC;
+ }
+ else
+ {
+ TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCPC);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_OC1PreloadConfig
+ *
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR1.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCPreload - new state of the TIMx peripheral Preload register.
+ * TIM_OCPreload_Enable.
+ * TIM_OCPreload_Disable.
+ *
+ * @return none
+ */
+void TIM_OC1PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1PE);
+ tmpccmr1 |= TIM_OCPreload;
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_OC2PreloadConfig
+ *
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR2.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCPreload - new state of the TIMx peripheral Preload register.
+ * TIM_OCPreload_Enable.
+ * TIM_OCPreload_Disable.
+ *
+ * @return none
+ */
+void TIM_OC2PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2PE);
+ tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8);
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_OC3PreloadConfig
+ *
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR3.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCPreload - new state of the TIMx peripheral Preload register.
+ * TIM_OCPreload_Enable.
+ * TIM_OCPreload_Disable.
+ *
+ * @return none
+ */
+void TIM_OC3PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3PE);
+ tmpccmr2 |= TIM_OCPreload;
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_OC4PreloadConfig
+ *
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR4.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCPreload - new state of the TIMx peripheral Preload register.
+ * TIM_OCPreload_Enable.
+ * TIM_OCPreload_Disable.
+ *
+ * @return none
+ */
+void TIM_OC4PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4PE);
+ tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8);
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_OC1FastConfig
+ *
+ * @brief Configures the TIMx Output Compare 1 Fast feature.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCFast - new state of the Output Compare Fast Enable Bit.
+ * TIM_OCFast_Enable - TIM output compare fast enable.
+ * TIM_OCFast_Disable - TIM output compare fast disable.
+ *
+ * @return none
+ */
+void TIM_OC1FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1FE);
+ tmpccmr1 |= TIM_OCFast;
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_OC2FastConfig
+ *
+ * @brief Configures the TIMx Output Compare 2 Fast feature.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCFast - new state of the Output Compare Fast Enable Bit.
+ * TIM_OCFast_Enable - TIM output compare fast enable.
+ * TIM_OCFast_Disable - TIM output compare fast disable.
+ *
+ * @return none
+ */
+void TIM_OC2FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2FE);
+ tmpccmr1 |= (uint16_t)(TIM_OCFast << 8);
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_OC3FastConfig
+ *
+ * @brief Configures the TIMx Output Compare 3 Fast feature.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCFast - new state of the Output Compare Fast Enable Bit.
+ * TIM_OCFast_Enable - TIM output compare fast enable.
+ * TIM_OCFast_Disable - TIM output compare fast disable.
+ *
+ * @return none
+ */
+void TIM_OC3FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3FE);
+ tmpccmr2 |= TIM_OCFast;
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_OC4FastConfig
+ *
+ * @brief Configures the TIMx Output Compare 4 Fast feature.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCFast - new state of the Output Compare Fast Enable Bit.
+ * TIM_OCFast_Enable - TIM output compare fast enable.
+ * TIM_OCFast_Disable - TIM output compare fast disable.
+ *
+ * @return none
+ */
+void TIM_OC4FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4FE);
+ tmpccmr2 |= (uint16_t)(TIM_OCFast << 8);
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_ClearOC1Ref
+ *
+ * @brief Clears or safeguards the OCREF1 signal on an external event.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCClear - new state of the Output Compare Clear Enable Bit.
+ * TIM_OCClear_Enable - TIM Output clear enable.
+ * TIM_OCClear_Disable - TIM Output clear disable.
+ *
+ * @return none
+ */
+void TIM_ClearOC1Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1CE);
+ tmpccmr1 |= TIM_OCClear;
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_ClearOC2Ref
+ *
+ * @brief Clears or safeguards the OCREF2 signal on an external event.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCClear - new state of the Output Compare Clear Enable Bit.
+ * TIM_OCClear_Enable - TIM Output clear enable.
+ * TIM_OCClear_Disable - TIM Output clear disable.
+ *
+ * @return none
+ */
+void TIM_ClearOC2Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr1 = 0;
+
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2CE);
+ tmpccmr1 |= (uint16_t)(TIM_OCClear << 8);
+ TIMx->CHCTLR1 = tmpccmr1;
+}
+
+/*********************************************************************
+ * @fn TIM_ClearOC3Ref
+ *
+ * @brief Clears or safeguards the OCREF3 signal on an external event.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCClear - new state of the Output Compare Clear Enable Bit.
+ * TIM_OCClear_Enable - TIM Output clear enable.
+ * TIM_OCClear_Disable - TIM Output clear disable.
+ *
+ * @return none
+ */
+void TIM_ClearOC3Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3CE);
+ tmpccmr2 |= TIM_OCClear;
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_ClearOC4Ref
+ *
+ * @brief Clears or safeguards the OCREF4 signal on an external event.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCClear - new state of the Output Compare Clear Enable Bit.
+ * TIM_OCClear_Enable - TIM Output clear enable.
+ * TIM_OCClear_Disable - TIM Output clear disable.
+ *
+ * @return none
+ */
+void TIM_ClearOC4Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr2 = 0;
+
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4CE);
+ tmpccmr2 |= (uint16_t)(TIM_OCClear << 8);
+ TIMx->CHCTLR2 = tmpccmr2;
+}
+
+/*********************************************************************
+ * @fn TIM_OC1PolarityConfig
+ *
+ * @brief Configures the TIMx channel 1 polarity.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCPolarity - specifies the OC1 Polarity.
+ * TIM_OCPolarity_High - Output Compare active high.
+ * TIM_OCPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC1PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC1P);
+ tmpccer |= TIM_OCPolarity;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC1NPolarityConfig
+ *
+ * @brief Configures the TIMx channel 1 polarity.
+ *
+ * @param TIMx - where x can be 1 to select the TIM peripheral.
+ * TIM_OCNPolarity - specifies the OC1N Polarity.
+ * TIM_OCNPolarity_High - Output Compare active high.
+ * TIM_OCNPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC1NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC1NP);
+ tmpccer |= TIM_OCNPolarity;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC2PolarityConfig
+ *
+ * @brief Configures the TIMx channel 2 polarity.
+ *
+ * @param TIMx - where x can be 1 to 4 to select the TIM peripheral.
+ * TIM_OCPolarity - specifies the OC2 Polarity.
+ * TIM_OCPolarity_High - Output Compare active high.
+ * TIM_OCPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC2PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC2P);
+ tmpccer |= (uint16_t)(TIM_OCPolarity << 4);
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC2NPolarityConfig
+ *
+ * @brief Configures the TIMx channel 2 polarity.
+ *
+ * @param TIMx - where x can be 1 to select the TIM peripheral.
+ * TIM_OCNPolarity - specifies the OC1N Polarity.
+ * TIM_OCNPolarity_High - Output Compare active high.
+ * TIM_OCNPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC2NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC2NP);
+ tmpccer |= (uint16_t)(TIM_OCNPolarity << 4);
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC3PolarityConfig
+ *
+ * @brief Configures the TIMx Channel 3 polarity.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_OCPolarit - specifies the OC3 Polarity.
+ * TIM_OCPolarity_High - Output Compare active high.
+ * TIM_OCPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC3PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC3P);
+ tmpccer |= (uint16_t)(TIM_OCPolarity << 8);
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC3NPolarityConfig
+ *
+ * @brief Configures the TIMx Channel 3N polarity.
+ *
+ * @param TIMx - where x can be 1 to select the TIM peripheral.
+ * TIM_OCNPolarity - specifies the OC2N Polarity.
+ * TIM_OCNPolarity_High - Output Compare active high.
+ * TIM_OCNPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC3NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC3NP);
+ tmpccer |= (uint16_t)(TIM_OCNPolarity << 8);
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_OC4PolarityConfig
+ *
+ * @brief Configures the TIMx Channel 4 polarity.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_OCPolarit - specifies the OC3 Polarity.
+ * TIM_OCPolarity_High - Output Compare active high.
+ * TIM_OCPolarity_Low - Output Compare active low.
+ *
+ * @return none
+ */
+void TIM_OC4PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ tmpccer = TIMx->CCER;
+ tmpccer &= (uint16_t) ~((uint16_t)TIM_CC4P);
+ tmpccer |= (uint16_t)(TIM_OCPolarity << 12);
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TIM_CCxCmd
+ *
+ * @brief Enables or disables the TIM Capture Compare Channel x.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_Channel - specifies the TIM Channel.
+ * TIM_Channel_1 - TIM Channel 1.
+ * TIM_Channel_2 - TIM Channel 2.
+ * TIM_Channel_3 - TIM Channel 3.
+ * TIM_Channel_4 - TIM Channel 4.
+ * TIM_CCx - specifies the TIM Channel CCxE bit new state.
+ * TIM_CCx_Enable.
+ * TIM_CCx_Disable.
+ *
+ * @return none
+ */
+void TIM_CCxCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)
+{
+ uint16_t tmp = 0;
+
+ tmp = CCER_CCE_Set << TIM_Channel;
+ TIMx->CCER &= (uint16_t)~tmp;
+ TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel);
+}
+
+/*********************************************************************
+ * @fn TIM_CCxNCmd
+ *
+ * @brief Enables or disables the TIM Capture Compare Channel xN.
+ *
+ * @param TIMx - where x can be 1 select the TIM peripheral.
+ * TIM_Channel - specifies the TIM Channel.
+ * TIM_Channel_1 - TIM Channel 1.
+ * TIM_Channel_2 - TIM Channel 2.
+ * TIM_Channel_3 - TIM Channel 3.
+ * TIM_CCxN - specifies the TIM Channel CCxNE bit new state.
+ * TIM_CCxN_Enable.
+ * TIM_CCxN_Disable.
+ *
+ * @return none
+ */
+void TIM_CCxNCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN)
+{
+ uint16_t tmp = 0;
+
+ tmp = CCER_CCNE_Set << TIM_Channel;
+ TIMx->CCER &= (uint16_t)~tmp;
+ TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel);
+}
+
+/*********************************************************************
+ * @fn TIM_SelectOCxM
+ *
+ * @brief Selects the TIM Output Compare Mode.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_Channel - specifies the TIM Channel.
+ * TIM_Channel_1 - TIM Channel 1.
+ * TIM_Channel_2 - TIM Channel 2.
+ * TIM_Channel_3 - TIM Channel 3.
+ * TIM_Channel_4 - TIM Channel 4.
+ * TIM_OCMode - specifies the TIM Output Compare Mode.
+ * TIM_OCMode_Timing.
+ * TIM_OCMode_Active.
+ * TIM_OCMode_Toggle.
+ * TIM_OCMode_PWM1.
+ * TIM_OCMode_PWM2.
+ * TIM_ForcedAction_Active.
+ * TIM_ForcedAction_InActive.
+ *
+ * @return none
+ */
+void TIM_SelectOCxM(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode)
+{
+ uint32_t tmp = 0;
+ uint16_t tmp1 = 0;
+
+ tmp = (uint32_t)TIMx;
+ tmp += CHCTLR_Offset;
+ tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel;
+ TIMx->CCER &= (uint16_t)~tmp1;
+
+ if((TIM_Channel == TIM_Channel_1) || (TIM_Channel == TIM_Channel_3))
+ {
+ tmp += (TIM_Channel >> 1);
+ *(__IO uint32_t *)tmp &= (uint32_t) ~((uint32_t)TIM_OC1M);
+ *(__IO uint32_t *)tmp |= TIM_OCMode;
+ }
+ else
+ {
+ tmp += (uint16_t)(TIM_Channel - (uint16_t)4) >> (uint16_t)1;
+ *(__IO uint32_t *)tmp &= (uint32_t) ~((uint32_t)TIM_OC2M);
+ *(__IO uint32_t *)tmp |= (uint16_t)(TIM_OCMode << 8);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_UpdateDisableConfig
+ *
+ * @brief Enables or Disables the TIMx Update event.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_UpdateDisableConfig(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR1 |= TIM_UDIS;
+ }
+ else
+ {
+ TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_UDIS);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_UpdateRequestConfig
+ *
+ * @brief Configures the TIMx Update Request Interrupt source.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_UpdateSource - specifies the Update source.
+ * TIM_UpdateSource_Regular.
+ * TIM_UpdateSource_Global.
+ *
+ * @return none
+ */
+void TIM_UpdateRequestConfig(TIM_TypeDef *TIMx, uint16_t TIM_UpdateSource)
+{
+ if(TIM_UpdateSource != TIM_UpdateSource_Global)
+ {
+ TIMx->CTLR1 |= TIM_URS;
+ }
+ else
+ {
+ TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_URS);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_SelectHallSensor
+ *
+ * @brief Enables or disables the TIMx's Hall sensor interface.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void TIM_SelectHallSensor(TIM_TypeDef *TIMx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ TIMx->CTLR2 |= TIM_TI1S;
+ }
+ else
+ {
+ TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_TI1S);
+ }
+}
+
+/*********************************************************************
+ * @fn TIM_SelectOnePulseMode
+ *
+ * @brief Selects the TIMx's One Pulse Mode.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_OPMode - specifies the OPM Mode to be used.
+ * TIM_OPMode_Single.
+ * TIM_OPMode_Repetitive.
+ *
+ * @return none
+ */
+void TIM_SelectOnePulseMode(TIM_TypeDef *TIMx, uint16_t TIM_OPMode)
+{
+ TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_OPM);
+ TIMx->CTLR1 |= TIM_OPMode;
+}
+
+/*********************************************************************
+ * @fn TIM_SelectOutputTrigger
+ *
+ * @brief Selects the TIMx Trigger Output Mode.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_TRGOSource - specifies the Trigger Output source.
+ * TIM_TRGOSource_Reset - The UG bit in the TIM_EGR register is
+ * used as the trigger output (TRGO).
+ * TIM_TRGOSource_Enable - The Counter Enable CEN is used as the
+ * trigger output (TRGO).
+ * TIM_TRGOSource_Update - The update event is selected as the
+ * trigger output (TRGO).
+ * TIM_TRGOSource_OC1 - The trigger output sends a positive pulse
+ * when the CC1IF flag is to be set, as soon as a capture or compare match occurs (TRGO).
+ * TIM_TRGOSource_OC1Ref - OC1REF signal is used as the trigger output (TRGO).
+ * TIM_TRGOSource_OC2Ref - OC2REF signal is used as the trigger output (TRGO).
+ * TIM_TRGOSource_OC3Ref - OC3REF signal is used as the trigger output (TRGO).
+ * TIM_TRGOSource_OC4Ref - OC4REF signal is used as the trigger output (TRGO).
+ *
+ * @return none
+ */
+void TIM_SelectOutputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_TRGOSource)
+{
+ TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_MMS);
+ TIMx->CTLR2 |= TIM_TRGOSource;
+}
+
+/*********************************************************************
+ * @fn TIM_SelectSlaveMode
+ *
+ * @brief Selects the TIMx Slave Mode.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_SlaveMode - specifies the Timer Slave Mode.
+ * TIM_SlaveMode_Reset - Rising edge of the selected trigger
+ * signal (TRGI) re-initializes.
+ * TIM_SlaveMode_Gated - The counter clock is enabled when the
+ * trigger signal (TRGI) is high.
+ * TIM_SlaveMode_Trigger - The counter starts at a rising edge
+ * of the trigger TRGI.
+ * TIM_SlaveMode_External1 - Rising edges of the selected trigger
+ * (TRGI) clock the counter.
+ *
+ * @return none
+ */
+void TIM_SelectSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_SlaveMode)
+{
+ TIMx->SMCFGR &= (uint16_t) ~((uint16_t)TIM_SMS);
+ TIMx->SMCFGR |= TIM_SlaveMode;
+}
+
+/*********************************************************************
+ * @fn TIM_SelectMasterSlaveMode
+ *
+ * @brief Sets or Resets the TIMx Master/Slave Mode.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_MasterSlaveMode - specifies the Timer Master Slave Mode.
+ * TIM_MasterSlaveMode_Enable - synchronization between the current
+ * timer and its slaves (through TRGO).
+ * TIM_MasterSlaveMode_Disable - No action.
+ *
+ * @return none
+ */
+void TIM_SelectMasterSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_MasterSlaveMode)
+{
+ TIMx->SMCFGR &= (uint16_t) ~((uint16_t)TIM_MSM);
+ TIMx->SMCFGR |= TIM_MasterSlaveMode;
+}
+
+/*********************************************************************
+ * @fn TIM_SetCounter
+ *
+ * @brief Sets the TIMx Counter Register value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * Counter - specifies the Counter register new value.
+ *
+ * @return none
+ */
+void TIM_SetCounter(TIM_TypeDef *TIMx, uint16_t Counter)
+{
+ TIMx->CNT = Counter;
+}
+
+/*********************************************************************
+ * @fn TIM_SetAutoreload
+ *
+ * @brief Sets the TIMx Autoreload Register value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * Autoreload - specifies the Autoreload register new value.
+ *
+ * @return none
+ */
+void TIM_SetAutoreload(TIM_TypeDef *TIMx, uint16_t Autoreload)
+{
+ TIMx->ATRLR = Autoreload;
+}
+
+/*********************************************************************
+ * @fn TIM_SetCompare1
+ *
+ * @brief Sets the TIMx Capture Compare1 Register value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * Compare1 - specifies the Capture Compare1 register new value.
+ *
+ * @return none
+ */
+void TIM_SetCompare1(TIM_TypeDef *TIMx, uint16_t Compare1)
+{
+ TIMx->CH1CVR = Compare1;
+}
+
+/*********************************************************************
+ * @fn TIM_SetCompare2
+ *
+ * @brief Sets the TIMx Capture Compare2 Register value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * Compare1 - specifies the Capture Compare1 register new value.
+ *
+ * @return none
+ */
+void TIM_SetCompare2(TIM_TypeDef *TIMx, uint16_t Compare2)
+{
+ TIMx->CH2CVR = Compare2;
+}
+
+/*********************************************************************
+ * @fn TIM_SetCompare3
+ *
+ * @brief Sets the TIMx Capture Compare3 Register value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * Compare1 - specifies the Capture Compare1 register new value.
+ *
+ * @return none
+ */
+void TIM_SetCompare3(TIM_TypeDef *TIMx, uint16_t Compare3)
+{
+ TIMx->CH3CVR = Compare3;
+}
+
+/*********************************************************************
+ * @fn TIM_SetCompare4
+ *
+ * @brief Sets the TIMx Capture Compare4 Register value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * Compare1 - specifies the Capture Compare1 register new value.
+ *
+ * @return none
+ */
+void TIM_SetCompare4(TIM_TypeDef *TIMx, uint16_t Compare4)
+{
+ TIMx->CH4CVR = Compare4;
+}
+
+/*********************************************************************
+ * @fn TIM_SetIC1Prescaler
+ *
+ * @brief Sets the TIMx Input Capture 1 prescaler.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_ICPSC - specifies the Input Capture1 prescaler new value.
+ * TIM_ICPSC_DIV1 - no prescaler.
+ * TIM_ICPSC_DIV2 - capture is done once every 2 events.
+ * TIM_ICPSC_DIV4 - capture is done once every 4 events.
+ * TIM_ICPSC_DIV8 - capture is done once every 8 events.
+ *
+ * @return none
+ */
+void TIM_SetIC1Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC)
+{
+ TIMx->CHCTLR1 &= (uint16_t) ~((uint16_t)TIM_IC1PSC);
+ TIMx->CHCTLR1 |= TIM_ICPSC;
+}
+
+/*********************************************************************
+ * @fn TIM_SetIC2Prescaler
+ *
+ * @brief Sets the TIMx Input Capture 2 prescaler.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_ICPSC - specifies the Input Capture1 prescaler new value.
+ * TIM_ICPSC_DIV1 - no prescaler.
+ * TIM_ICPSC_DIV2 - capture is done once every 2 events.
+ * TIM_ICPSC_DIV4 - capture is done once every 4 events.
+ * TIM_ICPSC_DIV8 - capture is done once every 8 events.
+ *
+ * @return none
+ */
+void TIM_SetIC2Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC)
+{
+ TIMx->CHCTLR1 &= (uint16_t) ~((uint16_t)TIM_IC2PSC);
+ TIMx->CHCTLR1 |= (uint16_t)(TIM_ICPSC << 8);
+}
+
+/*********************************************************************
+ * @fn TIM_SetIC3Prescaler
+ *
+ * @brief Sets the TIMx Input Capture 3 prescaler.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_ICPSC - specifies the Input Capture1 prescaler new value.
+ * TIM_ICPSC_DIV1 - no prescaler.
+ * TIM_ICPSC_DIV2 - capture is done once every 2 events.
+ * TIM_ICPSC_DIV4 - capture is done once every 4 events.
+ * TIM_ICPSC_DIV8 - capture is done once every 8 events.
+ *
+ * @return none
+ */
+void TIM_SetIC3Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC)
+{
+ TIMx->CHCTLR2 &= (uint16_t) ~((uint16_t)TIM_IC3PSC);
+ TIMx->CHCTLR2 |= TIM_ICPSC;
+}
+
+/*********************************************************************
+ * @fn TIM_SetIC4Prescaler
+ *
+ * @brief Sets the TIMx Input Capture 4 prescaler.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_ICPSC - specifies the Input Capture1 prescaler new value.
+ * TIM_ICPSC_DIV1 - no prescaler.
+ * TIM_ICPSC_DIV2 - capture is done once every 2 events.
+ * TIM_ICPSC_DIV4 - capture is done once every 4 events.
+ * TIM_ICPSC_DIV8 - capture is done once every 8 events.
+ *
+ * @return none
+ */
+void TIM_SetIC4Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC)
+{
+ TIMx->CHCTLR2 &= (uint16_t) ~((uint16_t)TIM_IC4PSC);
+ TIMx->CHCTLR2 |= (uint16_t)(TIM_ICPSC << 8);
+}
+
+/*********************************************************************
+ * @fn TIM_SetClockDivision
+ *
+ * @brief Sets the TIMx Clock Division value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_CKD - specifies the clock division value.
+ * TIM_CKD_DIV1 - TDTS = Tck_tim.
+ * TIM_CKD_DIV2 - TDTS = 2*Tck_tim.
+ * TIM_CKD_DIV4 - TDTS = 4*Tck_tim.
+ *
+ * @return none
+ */
+void TIM_SetClockDivision(TIM_TypeDef *TIMx, uint16_t TIM_CKD)
+{
+ TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_CTLR1_CKD);
+ TIMx->CTLR1 |= TIM_CKD;
+}
+
+/*********************************************************************
+ * @fn TIM_GetCapture1
+ *
+ * @brief Gets the TIMx Input Capture 1 value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ *
+ * @return TIMx->CH1CVR - Capture Compare 1 Register value.
+ */
+uint16_t TIM_GetCapture1(TIM_TypeDef *TIMx)
+{
+ return TIMx->CH1CVR;
+}
+
+/*********************************************************************
+ * @fn TIM_GetCapture2
+ *
+ * @brief Gets the TIMx Input Capture 2 value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ *
+ * @return TIMx->CH2CVR - Capture Compare 2 Register value.
+ */
+uint16_t TIM_GetCapture2(TIM_TypeDef *TIMx)
+{
+ return TIMx->CH2CVR;
+}
+
+/*********************************************************************
+ * @fn TIM_GetCapture2
+ *
+ * @brief Gets the TIMx Input Capture 2 value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ *
+ * @return TIMx->CH2CVR - Capture Compare 2 Register value.
+ */
+uint16_t TIM_GetCapture3(TIM_TypeDef *TIMx)
+{
+ return TIMx->CH3CVR;
+}
+
+/*********************************************************************
+ * @fn TIM_GetCapture4
+ *
+ * @brief Gets the TIMx Input Capture 4 value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ *
+ * @return TIMx->CH4CVR - Capture Compare 4 Register value.
+ */
+uint16_t TIM_GetCapture4(TIM_TypeDef *TIMx)
+{
+ return TIMx->CH4CVR;
+}
+
+/*********************************************************************
+ * @fn TIM_GetCounter
+ *
+ * @brief Gets the TIMx Counter value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ *
+ * @return TIMx->CNT - Counter Register value.
+ */
+uint16_t TIM_GetCounter(TIM_TypeDef *TIMx)
+{
+ return TIMx->CNT;
+}
+
+/*********************************************************************
+ * @fn TIM_GetPrescaler
+ *
+ * @brief Gets the TIMx Prescaler value.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ *
+ * @return TIMx->PSC - Prescaler Register value.
+ */
+uint16_t TIM_GetPrescaler(TIM_TypeDef *TIMx)
+{
+ return TIMx->PSC;
+}
+
+/*********************************************************************
+ * @fn TIM_GetFlagStatus
+ *
+ * @brief Checks whether the specified TIM flag is set or not.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_FLAG - specifies the flag to check.
+ * TIM_FLAG_Update - TIM update Flag.
+ * TIM_FLAG_CC1 - TIM Capture Compare 1 Flag.
+ * TIM_FLAG_CC2 - TIM Capture Compare 2 Flag.
+ * TIM_FLAG_CC3 - TIM Capture Compare 3 Flag.
+ * TIM_FLAG_CC4 - TIM Capture Compare 4 Flag.
+ * TIM_FLAG_COM - TIM Commutation Flag.
+ * TIM_FLAG_Trigger - TIM Trigger Flag.
+ * TIM_FLAG_Break - TIM Break Flag.
+ * TIM_FLAG_CC1OF - TIM Capture Compare 1 overcapture Flag.
+ * TIM_FLAG_CC2OF - TIM Capture Compare 2 overcapture Flag.
+ * TIM_FLAG_CC3OF - TIM Capture Compare 3 overcapture Flag.
+ * TIM_FLAG_CC4OF - TIM Capture Compare 4 overcapture Flag.
+ *
+ * @return SET or RESET.
+ */
+FlagStatus TIM_GetFlagStatus(TIM_TypeDef *TIMx, uint16_t TIM_FLAG)
+{
+ ITStatus bitstatus = RESET;
+
+ if((TIMx->INTFR & TIM_FLAG) != (uint16_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn TIM_ClearFlag
+ *
+ * @brief Clears the TIMx's pending flags.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_FLAG - specifies the flag to check.
+ * TIM_FLAG_Update - TIM update Flag.
+ * TIM_FLAG_CC1 - TIM Capture Compare 1 Flag.
+ * TIM_FLAG_CC2 - TIM Capture Compare 2 Flag.
+ * TIM_FLAG_CC3 - TIM Capture Compare 3 Flag.
+ * TIM_FLAG_CC4 - TIM Capture Compare 4 Flag.
+ * TIM_FLAG_COM - TIM Commutation Flag.
+ * TIM_FLAG_Trigger - TIM Trigger Flag.
+ * TIM_FLAG_Break - TIM Break Flag.
+ * TIM_FLAG_CC1OF - TIM Capture Compare 1 overcapture Flag.
+ * TIM_FLAG_CC2OF - TIM Capture Compare 2 overcapture Flag.
+ * TIM_FLAG_CC3OF - TIM Capture Compare 3 overcapture Flag.
+ * TIM_FLAG_CC4OF - TIM Capture Compare 4 overcapture Flag.
+ *
+ * @return none
+ */
+void TIM_ClearFlag(TIM_TypeDef *TIMx, uint16_t TIM_FLAG)
+{
+ TIMx->INTFR = (uint16_t)~TIM_FLAG;
+}
+
+/*********************************************************************
+ * @fn TIM_GetITStatus
+ *
+ * @brief Checks whether the TIM interrupt has occurred or not.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_IT - specifies the TIM interrupt source to check.
+ * TIM_IT_Update - TIM update Interrupt source.
+ * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source.
+ * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source.
+ * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source.
+ * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source.
+ * TIM_IT_COM - TIM Commutation Interrupt source.
+ * TIM_IT_Trigger - TIM Trigger Interrupt source.
+ * TIM_IT_Break - TIM Break Interrupt source.
+ *
+ * @return none
+ */
+ITStatus TIM_GetITStatus(TIM_TypeDef *TIMx, uint16_t TIM_IT)
+{
+ ITStatus bitstatus = RESET;
+ uint16_t itstatus = 0x0, itenable = 0x0;
+
+ itstatus = TIMx->INTFR & TIM_IT;
+
+ itenable = TIMx->DMAINTENR & TIM_IT;
+ if((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn TIM_ClearITPendingBit
+ *
+ * @brief Clears the TIMx's interrupt pending bits.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * TIM_IT - specifies the TIM interrupt source to check.
+ * TIM_IT_Update - TIM update Interrupt source.
+ * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source.
+ * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source.
+ * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source.
+ * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source.
+ * TIM_IT_COM - TIM Commutation Interrupt source.
+ * TIM_IT_Trigger - TIM Trigger Interrupt source.
+ * TIM_IT_Break - TIM Break Interrupt source.
+ *
+ * @return none
+ */
+void TIM_ClearITPendingBit(TIM_TypeDef *TIMx, uint16_t TIM_IT)
+{
+ TIMx->INTFR = (uint16_t)~TIM_IT;
+}
+
+/*********************************************************************
+ * @fn TI1_Config
+ *
+ * @brief Configure the TI1 as Input.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * IM_ICPolarity - The Input Polarity.
+ * TIM_ICPolarity_Rising.
+ * TIM_ICPolarity_Falling.
+ * TIM_ICSelection - specifies the input to be used.
+ * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be
+ * connected to IC1.
+ * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be
+ * connected to IC2.
+ * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected
+ * to TRC.
+ * TIM_ICFilter - Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ *
+ * @return none
+ */
+static void TI1_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr1 = 0, tmpccer = 0;
+
+ TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC1E);
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccer = TIMx->CCER;
+ tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1S)) & ((uint16_t) ~((uint16_t)TIM_IC1F)));
+
+ TIMx->CHCTLR1 |= (uint16_t)(TIM_ICSelection);
+ tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4));
+
+ if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4))
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC1P));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC1E);
+ }
+ else
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC1P | TIM_CC1NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC1E);
+ }
+
+ TIMx->CHCTLR1 = tmpccmr1;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TI2_Config
+ *
+ * @brief Configure the TI2 as Input.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * IM_ICPolarity - The Input Polarity.
+ * TIM_ICPolarity_Rising.
+ * TIM_ICPolarity_Falling.
+ * TIM_ICSelection - specifies the input to be used.
+ * TIM_ICSelection_DirectTI - TIM Input 2 is selected to be
+ * connected to IC1.
+ * TIM_ICSelection_IndirectTI - TIM Input 2 is selected to be
+ * connected to IC2.
+ * TIM_ICSelection_TRC - TIM Input 2 is selected to be connected
+ * to TRC.
+ * TIM_ICFilter - Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ *
+ * @return none
+ */
+static void TI2_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0;
+
+ TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC2E);
+ tmpccmr1 = TIMx->CHCTLR1;
+ tmpccer = TIMx->CCER;
+ tmp = (uint16_t)(TIM_ICPolarity << 4);
+ tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC2S)) & ((uint16_t) ~((uint16_t)TIM_IC2F)));
+
+ TIMx->CHCTLR1 |= (uint16_t)(TIM_ICSelection << 8);
+ tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8) | (uint16_t)(TIM_ICFilter << 12);
+
+ if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4))
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC2P));
+ tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC2E);
+ }
+ else
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC2P | TIM_CC2NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC2E);
+ }
+
+ TIMx->CHCTLR1 = tmpccmr1;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TI3_Config
+ *
+ * @brief Configure the TI3 as Input.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * IM_ICPolarity - The Input Polarity.
+ * TIM_ICPolarity_Rising.
+ * TIM_ICPolarity_Falling.
+ * TIM_ICSelection - specifies the input to be used.
+ * TIM_ICSelection_DirectTI - TIM Input 3 is selected to be
+ * connected to IC1.
+ * TIM_ICSelection_IndirectTI - TIM Input 3 is selected to be
+ * connected to IC2.
+ * TIM_ICSelection_TRC - TIM Input 3 is selected to be connected
+ * to TRC.
+ * TIM_ICFilter - Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ *
+ * @return none
+ */
+static void TI3_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0;
+
+ TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC3E);
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccer = TIMx->CCER;
+ tmp = (uint16_t)(TIM_ICPolarity << 8);
+ tmpccmr2 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC3S)) & ((uint16_t) ~((uint16_t)TIM_IC3F)));
+
+ TIMx->CHCTLR2 |= (uint16_t)(TIM_ICSelection);
+ tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4));
+
+ if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4))
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P));
+ tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC3E);
+ }
+ else
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P | TIM_CC3NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC3E);
+ }
+
+ TIMx->CHCTLR2 = tmpccmr2;
+ TIMx->CCER = tmpccer;
+}
+
+/*********************************************************************
+ * @fn TI4_Config
+ *
+ * @brief Configure the TI4 as Input.
+ *
+ * @param TIMx - where x can be 1 to 4 select the TIM peripheral.
+ * IM_ICPolarity - The Input Polarity.
+ * TIM_ICPolarity_Rising.
+ * TIM_ICPolarity_Falling.
+ * TIM_ICSelection - specifies the input to be used.
+ * TIM_ICSelection_DirectTI - TIM Input 4 is selected to be
+ * connected to IC1.
+ * TIM_ICSelection_IndirectTI - TIM Input 4 is selected to be
+ * connected to IC2.
+ * TIM_ICSelection_TRC - TIM Input 4 is selected to be connected
+ * to TRC.
+ * TIM_ICFilter - Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ *
+ * @return none
+ */
+static void TI4_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0;
+
+ TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC4E);
+ tmpccmr2 = TIMx->CHCTLR2;
+ tmpccer = TIMx->CCER;
+ tmp = (uint16_t)(TIM_ICPolarity << 12);
+ tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CC4S) & ((uint16_t) ~((uint16_t)TIM_IC4F)));
+
+ TIMx->CHCTLR2 |= (uint16_t)(TIM_ICSelection << 8);
+ tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8) | (uint16_t)(TIM_ICFilter << 12);
+
+ if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4))
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC4P));
+ tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC4E);
+ }
+ else
+ {
+ tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC4E);
+ }
+
+ TIMx->CHCTLR2 = tmpccmr2;
+ TIMx->CCER = tmpccer;
+}
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_tim.h b/mijia_haier_bridge/src/periph/ch32v10x_tim.h
new file mode 100644
index 0000000..17d254d
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_tim.h
@@ -0,0 +1,508 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_tim.h
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2020/04/30
+ * 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 __CH32V10x_TIM_H
+#define __CH32V10x_TIM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ch32v10x.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 /*__CH32V10x_TIM_H */
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_usart.c b/mijia_haier_bridge/src/periph/ch32v10x_usart.c
new file mode 100644
index 0000000..b9a4f89
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_usart.c
@@ -0,0 +1,747 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_usart.c
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2024/01/06
+ * Description : This file provides all the USART firmware functions.
+*********************************************************************************
+* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+* Attention: This software (modified or not) and binary are used for
+* microcontroller manufactured by Nanjing Qinheng Microelectronics.
+*******************************************************************************/
+#include "ch32v10x_usart.h"
+#include "ch32v10x_rcc.h"
+
+/* USART_Private_Defines */
+#define CTLR1_UE_Set ((uint16_t)0x2000) /* USART Enable Mask */
+#define CTLR1_UE_Reset ((uint16_t)0xDFFF) /* USART Disable Mask */
+
+#define CTLR1_WAKE_Mask ((uint16_t)0xF7FF) /* USART WakeUp Method Mask */
+
+#define CTLR1_RWU_Set ((uint16_t)0x0002) /* USART mute mode Enable Mask */
+#define CTLR1_RWU_Reset ((uint16_t)0xFFFD) /* USART mute mode Enable Mask */
+#define CTLR1_SBK_Set ((uint16_t)0x0001) /* USART Break Character send Mask */
+#define CTLR1_CLEAR_Mask ((uint16_t)0xE9F3) /* USART CTLR1 Mask */
+#define CTLR2_Address_Mask ((uint16_t)0xFFF0) /* USART address Mask */
+
+#define CTLR2_LINEN_Set ((uint16_t)0x4000) /* USART LIN Enable Mask */
+#define CTLR2_LINEN_Reset ((uint16_t)0xBFFF) /* USART LIN Disable Mask */
+
+#define CTLR2_LBDL_Mask ((uint16_t)0xFFDF) /* USART LIN Break detection Mask */
+#define CTLR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /* USART CTLR2 STOP Bits Mask */
+#define CTLR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /* USART CTLR2 Clock Mask */
+
+#define CTLR3_SCEN_Set ((uint16_t)0x0020) /* USART SC Enable Mask */
+#define CTLR3_SCEN_Reset ((uint16_t)0xFFDF) /* USART SC Disable Mask */
+
+#define CTLR3_NACK_Set ((uint16_t)0x0010) /* USART SC NACK Enable Mask */
+#define CTLR3_NACK_Reset ((uint16_t)0xFFEF) /* USART SC NACK Disable Mask */
+
+#define CTLR3_HDSEL_Set ((uint16_t)0x0008) /* USART Half-Duplex Enable Mask */
+#define CTLR3_HDSEL_Reset ((uint16_t)0xFFF7) /* USART Half-Duplex Disable Mask */
+
+#define CTLR3_IRLP_Mask ((uint16_t)0xFFFB) /* USART IrDA LowPower mode Mask */
+#define CTLR3_CLEAR_Mask ((uint16_t)0xFCFF) /* USART CTLR3 Mask */
+
+#define CTLR3_IREN_Set ((uint16_t)0x0002) /* USART IrDA Enable Mask */
+#define CTLR3_IREN_Reset ((uint16_t)0xFFFD) /* USART IrDA Disable Mask */
+#define GPR_LSB_Mask ((uint16_t)0x00FF) /* Guard Time Register LSB Mask */
+#define GPR_MSB_Mask ((uint16_t)0xFF00) /* Guard Time Register MSB Mask */
+#define IT_Mask ((uint16_t)0x001F) /* USART Interrupt Mask */
+
+/*********************************************************************
+ * @fn USART_DeInit
+ *
+ * @brief Deinitializes the USARTx peripheral registers to their default
+ * reset values.
+ *
+ * @param USARTx - where x can be 1, 2 or 3 to select the UART peripheral.
+ *
+ * @return none
+ */
+void USART_DeInit(USART_TypeDef *USARTx)
+{
+ if(USARTx == USART1)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
+ }
+ else if(USARTx == USART2)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
+ }
+ else if(USARTx == USART3)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
+ }
+ else if(USARTx == UART4)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
+ }
+ else
+ {
+ if(USARTx == UART5)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
+ }
+ }
+}
+
+/*********************************************************************
+ * @fn USART_Init
+ *
+ * @brief Initializes the USARTx peripheral according to the specified
+ * parameters in the USART_InitStruct.
+ *
+ * @param USARTx - where x can be 1, 2 or 3 to select the UART peripheral.
+ * USART_InitStruct - pointer to a USART_InitTypeDef structure
+ * that contains the configuration information for the specified
+ * USART peripheral.
+ *
+ * @return none
+ */
+void USART_Init(USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct)
+{
+ uint32_t tmpreg = 0x00, apbclock = 0x00;
+ uint32_t integerdivider = 0x00;
+ uint32_t fractionaldivider = 0x00;
+ uint32_t usartxbase = 0;
+ RCC_ClocksTypeDef RCC_ClocksStatus;
+
+ if(USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None)
+ {
+ }
+
+ usartxbase = (uint32_t)USARTx;
+ tmpreg = USARTx->CTLR2;
+ tmpreg &= CTLR2_STOP_CLEAR_Mask;
+ tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
+
+ USARTx->CTLR2 = (uint16_t)tmpreg;
+ tmpreg = USARTx->CTLR1;
+ tmpreg &= CTLR1_CLEAR_Mask;
+ tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
+ USART_InitStruct->USART_Mode;
+ USARTx->CTLR1 = (uint16_t)tmpreg;
+
+ tmpreg = USARTx->CTLR3;
+ tmpreg &= CTLR3_CLEAR_Mask;
+ tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
+ USARTx->CTLR3 = (uint16_t)tmpreg;
+
+ RCC_GetClocksFreq(&RCC_ClocksStatus);
+
+ if(usartxbase == USART1_BASE)
+ {
+ apbclock = RCC_ClocksStatus.PCLK2_Frequency;
+ }
+ else
+ {
+ apbclock = RCC_ClocksStatus.PCLK1_Frequency;
+ }
+
+ integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
+ tmpreg = (integerdivider / 100) << 4;
+ fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
+ tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
+ USARTx->BRR = (uint16_t)tmpreg;
+}
+
+/*********************************************************************
+ * @fn USART_StructInit
+ *
+ * @brief Fills each USART_InitStruct member with its default value.
+ *
+ * @param USART_InitStruct: pointer to a USART_InitTypeDef structure
+ * which will be initialized.
+ *
+ * @return none
+ */
+void USART_StructInit(USART_InitTypeDef *USART_InitStruct)
+{
+ USART_InitStruct->USART_BaudRate = 9600;
+ USART_InitStruct->USART_WordLength = USART_WordLength_8b;
+ USART_InitStruct->USART_StopBits = USART_StopBits_1;
+ USART_InitStruct->USART_Parity = USART_Parity_No;
+ USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
+ USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+}
+
+/*********************************************************************
+ * @fn USART_ClockInit
+ *
+ * @brief Initializes the USARTx peripheral Clock according to the
+ * specified parameters in the USART_ClockInitStruct .
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef
+ * structure that contains the configuration information for the specified
+ * USART peripheral.
+ *
+ * @return none
+ */
+void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitTypeDef *USART_ClockInitStruct)
+{
+ uint32_t tmpreg = 0x00;
+
+ tmpreg = USARTx->CTLR2;
+ tmpreg &= CTLR2_CLOCK_CLEAR_Mask;
+ tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL |
+ USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit;
+ USARTx->CTLR2 = (uint16_t)tmpreg;
+}
+
+/*********************************************************************
+ * @fn USART_ClockStructInit
+ *
+ * @brief Fills each USART_ClockStructInit member with its default value.
+ *
+ * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef
+ * structure which will be initialized.
+ *
+ * @return none
+ */
+void USART_ClockStructInit(USART_ClockInitTypeDef *USART_ClockInitStruct)
+{
+ USART_ClockInitStruct->USART_Clock = USART_Clock_Disable;
+ USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low;
+ USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge;
+ USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;
+}
+
+/*********************************************************************
+ * @fn USART_Cmd
+ *
+ * @brief Enables or disables the specified USART peripheral.
+ * reset values (Affects also the I2Ss).
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState: ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_Cmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR1 |= CTLR1_UE_Set;
+ }
+ else
+ {
+ USARTx->CTLR1 &= CTLR1_UE_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_ITConfig
+ *
+ * @brief Enables or disables the specified USART interrupts.
+ * reset values (Affects also the I2Ss).
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_IT - specifies the USART interrupt sources to be enabled or disabled.
+ * USART_IT_LBD - LIN Break detection interrupt.
+ * USART_IT_TXE - Transmit Data Register empty interrupt.
+ * USART_IT_TC - Transmission complete interrupt.
+ * USART_IT_RXNE - Receive Data register not empty interrupt.
+ * USART_IT_IDLE - Idle line detection interrupt.
+ * USART_IT_PE - Parity Error interrupt.
+ * USART_IT_ERR - Error interrupt.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_ITConfig(USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState)
+{
+ uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00;
+ uint32_t usartxbase = 0x00;
+
+ usartxbase = (uint32_t)USARTx;
+ usartreg = (((uint8_t)USART_IT) >> 0x05);
+ itpos = USART_IT & IT_Mask;
+ itmask = (((uint32_t)0x01) << itpos);
+
+ if(usartreg == 0x01)
+ {
+ usartxbase += 0x0C;
+ }
+ else if(usartreg == 0x02)
+ {
+ usartxbase += 0x10;
+ }
+ else
+ {
+ usartxbase += 0x14;
+ }
+
+ if(NewState != DISABLE)
+ {
+ *(__IO uint32_t *)usartxbase |= itmask;
+ }
+ else
+ {
+ *(__IO uint32_t *)usartxbase &= ~itmask;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_DMACmd
+ *
+ * @brief Enables or disables the USART DMA interface.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_DMAReq - specifies the DMA request.
+ * USART_DMAReq_Tx - USART DMA transmit request.
+ * USART_DMAReq_Rx - USART DMA receive request.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_DMACmd(USART_TypeDef *USARTx, uint16_t USART_DMAReq, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR3 |= USART_DMAReq;
+ }
+ else
+ {
+ USARTx->CTLR3 &= (uint16_t)~USART_DMAReq;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_SetAddress
+ *
+ * @brief Sets the address of the USART node.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_Address - Indicates the address of the USART node.
+ *
+ * @return none
+ */
+void USART_SetAddress(USART_TypeDef *USARTx, uint8_t USART_Address)
+{
+ USARTx->CTLR2 &= CTLR2_Address_Mask;
+ USARTx->CTLR2 |= USART_Address;
+}
+
+/*********************************************************************
+ * @fn USART_WakeUpConfig
+ *
+ * @brief Selects the USART WakeUp method.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_WakeUp - specifies the USART wakeup method.
+ * USART_WakeUp_IdleLine - WakeUp by an idle line detection.
+ * USART_WakeUp_AddressMark - WakeUp by an address mark.
+ *
+ * @return none
+ */
+void USART_WakeUpConfig(USART_TypeDef *USARTx, uint16_t USART_WakeUp)
+{
+ USARTx->CTLR1 &= CTLR1_WAKE_Mask;
+ USARTx->CTLR1 |= USART_WakeUp;
+}
+
+/*********************************************************************
+ * @fn USART_ReceiverWakeUpCmd
+ *
+ * @brief Determines if the USART is in mute mode or not.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_ReceiverWakeUpCmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR1 |= CTLR1_RWU_Set;
+ }
+ else
+ {
+ USARTx->CTLR1 &= CTLR1_RWU_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_LINBreakDetectLengthConfig
+ *
+ * @brief Sets the USART LIN Break detection length.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_LINBreakDetectLength - specifies the LIN break detection length.
+ * USART_LINBreakDetectLength_10b - 10-bit break detection.
+ * USART_LINBreakDetectLength_11b - 11-bit break detection.
+ *
+ * @return none
+ */
+void USART_LINBreakDetectLengthConfig(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength)
+{
+ USARTx->CTLR2 &= CTLR2_LBDL_Mask;
+ USARTx->CTLR2 |= USART_LINBreakDetectLength;
+}
+
+/*********************************************************************
+ * @fn USART_LINCmd
+ *
+ * @brief Enables or disables the USART LIN mode.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_LINCmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR2 |= CTLR2_LINEN_Set;
+ }
+ else
+ {
+ USARTx->CTLR2 &= CTLR2_LINEN_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_SendData
+ *
+ * @brief Transmits single data through the USARTx peripheral.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * Data - the data to transmit.
+ *
+ * @return none
+ */
+void USART_SendData(USART_TypeDef *USARTx, uint16_t Data)
+{
+ USARTx->DATAR = (Data & (uint16_t)0x01FF);
+}
+
+/*********************************************************************
+ * @fn USART_ReceiveData
+ *
+ * @brief Returns the most recent received data by the USARTx peripheral.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ *
+ * @return The received data.
+ */
+uint16_t USART_ReceiveData(USART_TypeDef *USARTx)
+{
+ return (uint16_t)(USARTx->DATAR & (uint16_t)0x01FF);
+}
+
+/*********************************************************************
+ * @fn USART_SendBreak
+ *
+ * @brief Transmits break characters.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ *
+ * @return none
+ */
+void USART_SendBreak(USART_TypeDef *USARTx)
+{
+ USARTx->CTLR1 |= CTLR1_SBK_Set;
+}
+
+/*********************************************************************
+ * @fn USART_SetGuardTime
+ *
+ * @brief Sets the specified USART guard time.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_GuardTime - specifies the guard time.
+ *
+ * @return none
+ */
+void USART_SetGuardTime(USART_TypeDef *USARTx, uint8_t USART_GuardTime)
+{
+ USARTx->GPR &= GPR_LSB_Mask;
+ USARTx->GPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08);
+}
+
+/*********************************************************************
+ * @fn USART_SetPrescaler
+ *
+ * @brief Sets the system clock prescaler.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_Prescaler - specifies the prescaler clock.
+ *
+ * @return none
+ */
+void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler)
+{
+ USARTx->GPR &= GPR_MSB_Mask;
+ USARTx->GPR |= USART_Prescaler;
+}
+
+/*********************************************************************
+ * @fn USART_SmartCardCmd
+ *
+ * @brief Enables or disables the USART Smart Card mode.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_SmartCardCmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR3 |= CTLR3_SCEN_Set;
+ }
+ else
+ {
+ USARTx->CTLR3 &= CTLR3_SCEN_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_SmartCardNACKCmd
+ *
+ * @brief Enables or disables NACK transmission.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_SmartCardNACKCmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR3 |= CTLR3_NACK_Set;
+ }
+ else
+ {
+ USARTx->CTLR3 &= CTLR3_NACK_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_HalfDuplexCmd
+ *
+ * @brief Enables or disables the USART Half Duplex communication.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_HalfDuplexCmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR3 |= CTLR3_HDSEL_Set;
+ }
+ else
+ {
+ USARTx->CTLR3 &= CTLR3_HDSEL_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_IrDAConfig
+ *
+ * @brief Configures the USART's IrDA interface.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_IrDAMode - specifies the IrDA mode.
+ * USART_IrDAMode_LowPower.
+ * USART_IrDAMode_Normal.
+ *
+ * @return none
+ */
+void USART_IrDAConfig(USART_TypeDef *USARTx, uint16_t USART_IrDAMode)
+{
+ USARTx->CTLR3 &= CTLR3_IRLP_Mask;
+ USARTx->CTLR3 |= USART_IrDAMode;
+}
+
+/*********************************************************************
+ * @fn USART_IrDACmd
+ *
+ * @brief Enables or disables the USART's IrDA interface.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * NewState - ENABLE or DISABLE.
+ *
+ * @return none
+ */
+void USART_IrDACmd(USART_TypeDef *USARTx, FunctionalState NewState)
+{
+ if(NewState != DISABLE)
+ {
+ USARTx->CTLR3 |= CTLR3_IREN_Set;
+ }
+ else
+ {
+ USARTx->CTLR3 &= CTLR3_IREN_Reset;
+ }
+}
+
+/*********************************************************************
+ * @fn USART_GetFlagStatus
+ *
+ * @brief Checks whether the specified USART flag is set or not.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_FLAG - specifies the flag to check.
+ * USART_FLAG_LBD - LIN Break detection flag.
+ * USART_FLAG_TXE - Transmit data register empty flag.
+ * USART_FLAG_TC - Transmission Complete flag.
+ * USART_FLAG_RXNE - Receive data register not empty flag.
+ * USART_FLAG_IDLE - Idle Line detection flag.
+ * USART_FLAG_ORE - OverRun Error flag.
+ * USART_FLAG_NE - Noise Error flag.
+ * USART_FLAG_FE - Framing Error flag.
+ * USART_FLAG_PE - Parity Error flag.
+ *
+ * @return bitstatus: SET or RESET
+ */
+FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx, uint16_t USART_FLAG)
+{
+ FlagStatus bitstatus = RESET;
+
+ if((USARTx->STATR & USART_FLAG) != (uint16_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn USART_ClearFlag
+ *
+ * @brief Clears the USARTx's pending flags.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_FLAG - specifies the flag to clear.
+ * USART_FLAG_LBD - LIN Break detection flag.
+ * USART_FLAG_TC - Transmission Complete flag.
+ * USART_FLAG_RXNE - Receive data register not empty flag.
+ * Note-
+ * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
+ * error) and IDLE (Idle line detected) flags are cleared by software
+ * sequence: a read operation to USART_STATR register (USART_GetFlagStatus())
+ * followed by a read operation to USART_DATAR register (USART_ReceiveData()).
+ * - RXNE flag can be also cleared by a read to the USART_DATAR register
+ * (USART_ReceiveData()).
+ * - TC flag can be also cleared by software sequence: a read operation to
+ * USART_STATR register (USART_GetFlagStatus()) followed by a write operation
+ * to USART_DATAR register (USART_SendData()).
+ * - TXE flag is cleared only by a write to the USART_DATAR register
+ * (USART_SendData()).
+ * @return none
+ */
+void USART_ClearFlag(USART_TypeDef *USARTx, uint16_t USART_FLAG)
+{
+
+ USARTx->STATR = (uint16_t)~USART_FLAG;
+}
+
+/*********************************************************************
+ * @fn USART_GetITStatus
+ *
+ * @brief Checks whether the specified USART interrupt has occurred or not.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_IT - specifies the USART interrupt source to check.
+ * USART_IT_LBD - LIN Break detection interrupt.
+ * USART_IT_TXE - Tansmit Data Register empty interrupt.
+ * USART_IT_TC - Transmission complete interrupt.
+ * USART_IT_RXNE - Receive Data register not empty interrupt.
+ * USART_IT_IDLE - Idle line detection interrupt.
+ * USART_IT_ORE_RX - OverRun Error interrupt if the RXNEIE bit is set.
+ * USART_IT_ORE_ER - OverRun Error interrupt if the EIE bit is set.
+ * USART_IT_NE - Noise Error interrupt.
+ * USART_IT_FE - Framing Error interrupt.
+ * USART_IT_PE - Parity Error interrupt.
+ *
+ * @return bitstatus: SET or RESET.
+ */
+ITStatus USART_GetITStatus(USART_TypeDef *USARTx, uint16_t USART_IT)
+{
+ uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
+ ITStatus bitstatus = RESET;
+
+ usartreg = (((uint8_t)USART_IT) >> 0x05);
+ itmask = USART_IT & IT_Mask;
+ itmask = (uint32_t)0x01 << itmask;
+
+ if(usartreg == 0x01)
+ {
+ itmask &= USARTx->CTLR1;
+ }
+ else if(usartreg == 0x02)
+ {
+ itmask &= USARTx->CTLR2;
+ }
+ else
+ {
+ itmask &= USARTx->CTLR3;
+ }
+
+ bitpos = USART_IT >> 0x08;
+ bitpos = (uint32_t)0x01 << bitpos;
+ bitpos &= USARTx->STATR;
+
+ if((itmask != (uint16_t)RESET) && (bitpos != (uint16_t)RESET))
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+
+ return bitstatus;
+}
+
+/*********************************************************************
+ * @fn USART_ClearITPendingBit
+ *
+ * @brief Clears the USARTx's interrupt pending bits.
+ *
+ * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral.
+ * USART_IT - specifies the interrupt pending bit to clear.
+ * USART_IT_LBD - LIN Break detection interrupt.
+ * USART_IT_TC - Transmission complete interrupt.
+ * USART_IT_RXNE - Receive Data register not empty interrupt.
+ * Note-
+ * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
+ * error) and IDLE (Idle line detected) pending bits are cleared by
+ * software sequence: a read operation to USART_STATR register
+ * (USART_GetITStatus()) followed by a read operation to USART_DATAR register
+ * (USART_ReceiveData()).
+ * - RXNE pending bit can be also cleared by a read to the USART_DATAR register
+ * (USART_ReceiveData()).
+ * - TC pending bit can be also cleared by software sequence: a read
+ * operation to USART_STATR register (USART_GetITStatus()) followed by a write
+ * operation to USART_DATAR register (USART_SendData()).
+ * - TXE pending bit is cleared only by a write to the USART_DATAR register
+ * (USART_SendData()).
+ * @return none
+ */
+void USART_ClearITPendingBit(USART_TypeDef *USARTx, uint16_t USART_IT)
+{
+ uint16_t bitpos = 0x00, itmask = 0x00;
+
+ bitpos = USART_IT >> 0x08;
+ itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
+ USARTx->STATR = (uint16_t)~itmask;
+}
diff --git a/mijia_haier_bridge/src/periph/ch32v10x_usart.h b/mijia_haier_bridge/src/periph/ch32v10x_usart.h
new file mode 100644
index 0000000..74d75cd
--- /dev/null
+++ b/mijia_haier_bridge/src/periph/ch32v10x_usart.h
@@ -0,0 +1,185 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : ch32v10x_usart.h
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2024/01/30
+ * 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 __CH32V10x_USART_H
+#define __CH32V10x_USART_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ch32v10x.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 /* __CH32V10x_USART_H */
diff --git a/mijia_haier_bridge/src/user/app_routines.c b/mijia_haier_bridge/src/user/app_routines.c
new file mode 100644
index 0000000..602b0a9
--- /dev/null
+++ b/mijia_haier_bridge/src/user/app_routines.c
@@ -0,0 +1,52 @@
+#include "app_routines.h"
+#include "bsp_tick.h"
+#include "bsp_led.h"
+#include "bsp_buzzer.h"
+#include "bsp_module_io.h"
+#include "util_delay.h"
+#include "util_log.h"
+
+void app_routine_relay_control(uint64_t tick);
+void app_routine_led_blink(uint64_t tick);
+
+void app_routines_loop(void)
+{
+ while (1) {
+ uint64_t tick = bsp_tick_get();
+
+ app_routine_relay_control(tick);
+ app_routine_led_blink(tick);
+ }
+}
+
+void app_routine_relay_control(uint64_t tick)
+{
+ static uint64_t tick_last = 0;
+ static uint8_t relay_stat_last = 0x00;
+
+ if (tick != tick_last) { //每tick执行一次
+ uint8_t relay_stat = bsp_module_relay_read();
+
+ for (uint8_t i = 0; i < BSP_MODULE_RELAY_NUMBER; i ++) {
+ uint8_t relay_bit_mask = 1 << i;
+ if ((relay_stat & relay_bit_mask) != (relay_stat_last & relay_bit_mask)) {
+ LOG_I("%s is turned %s", bsp_relay_index_to_string(relay_bit_mask), relay_stat & relay_bit_mask ? "on" : "off");
+ }
+ }
+
+ relay_stat_last = relay_stat;
+ }
+
+ tick_last = tick;
+}
+
+void app_routine_led_blink(uint64_t tick)
+{
+ static uint64_t tick_last = 0;
+
+ if (tick % 500 == 0 && tick != tick_last) { //每500个tick执行一次
+ bsp_led_toggle();
+ }
+
+ tick_last = tick;
+}
diff --git a/mijia_haier_bridge/src/user/app_routines.h b/mijia_haier_bridge/src/user/app_routines.h
new file mode 100644
index 0000000..26b28ad
--- /dev/null
+++ b/mijia_haier_bridge/src/user/app_routines.h
@@ -0,0 +1,6 @@
+#ifndef __APP_ROUTINES_H
+#define __APP_ROUTINES_H
+
+void app_routines_loop(void);
+
+#endif
diff --git a/mijia_haier_bridge/src/user/bsp_buzzer.c b/mijia_haier_bridge/src/user/bsp_buzzer.c
new file mode 100644
index 0000000..8a06cc5
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_buzzer.c
@@ -0,0 +1,66 @@
+#include "bsp_buzzer.h"
+#include "util_delay.h"
+
+static const uint16_t note_frequency_table[] = {
+//Low do do# re re# mi fa fa# so so# ra ra# si
+ 1048, 1108, 1176, 1244, 1320, 1396, 1480, 1568, 1660, 1760, 1864, 1976,
+//Med do do# re re# mi fa fa# so so# ra ra# si
+ 2092, 2216, 2348, 2488, 2636, 2792, 2960, 3136, 3324, 3520, 3728, 3952,
+//High do do# re re# mi fa fa# so so# ra ra# si
+ 4184, 4436, 4700, 4980, 5272, 5588, 5920, 6272, 6644, 7040, 7456, 7904,
+};
+
+void bsp_buzzer_init(void)
+{
+ /* 开启GPIOB和TIM4时钟 */
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+
+ /* 配置PB6为复用推挽输出 */
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_Init(GPIOB, &GPIO_InitStructure); //TIM4_CH1=PB6
+
+ /* 初始化定时器时基 */
+ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
+ TIM_TimeBaseStructure.TIM_Prescaler = 0;
+ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseStructure.TIM_Period = 1;
+ TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
+ TIM_ARRPreloadConfig(TIM4, ENABLE);
+
+ /* 初始化定时器PWM输出 */
+ TIM_OCInitTypeDef TIM_OCInitStructure;
+ TIM_OCStructInit(&TIM_OCInitStructure);
+ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
+ TIM_OCInitStructure.TIM_Pulse = 0; //关闭输出
+ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
+ TIM_OC1Init(TIM4, &TIM_OCInitStructure);
+ TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
+
+ TIM_Cmd(TIM4, ENABLE);
+}
+
+void bsp_buzzer_play_note(bsp_buzzer_key key)
+{
+ if (key != STOP) {
+ TIM_PrescalerConfig(TIM4, SystemCoreClock / note_frequency_table[key] / 2, TIM_PSCReloadMode_Update);
+ TIM_SetCompare1(TIM4, 1); //占空比为50%
+ } else {
+ TIM_SetCompare1(TIM4, 0);
+ }
+}
+
+void bsp_buzzer_play_song(const uint8_t *note_table, uint32_t note_count)
+{
+ for (uint32_t i = 0; i < note_count; i ++) {
+ bsp_buzzer_play_note(note_table[i * 2]);
+ delay_ms(note_table[i * 2 + 1] * 8);
+ }
+
+ bsp_buzzer_play_note(STOP);
+}
diff --git a/mijia_haier_bridge/src/user/bsp_buzzer.h b/mijia_haier_bridge/src/user/bsp_buzzer.h
new file mode 100644
index 0000000..a982746
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_buzzer.h
@@ -0,0 +1,20 @@
+#ifndef __BSP_BUZZER_H
+#define __BSP_BUZZER_H
+
+#include "ch32v10x.h"
+
+typedef enum {
+ L1 = 0, LS1 = 1, L2 = 2, LS2 = 3, L3 = 4, L4 = 5,
+ LS4 = 6, L5 = 7, LS5 = 8, L6 = 9, LS6 = 10, L7 = 11,
+ M1 = 12, MS1 = 13, M2 = 14, MS2 = 15, M3 = 16, M4 = 17,
+ MS4 = 18, M5 = 19, MS5 = 20, M6 = 21, MS6 = 22, M7 = 23,
+ H1 = 24, HS1 = 25, H2 = 26, HS2 = 27, H3 = 28, H4 = 29,
+ HS4 = 30, H5 = 31, HS5 = 32, H6 = 33, HS6 = 34, H7 = 35,
+ BEEP = 36, STOP = 0xFF
+} bsp_buzzer_key;
+
+void bsp_buzzer_init(void);
+void bsp_buzzer_play_note(bsp_buzzer_key key);
+void bsp_buzzer_play_song(const uint8_t *note_table, uint32_t note_count);
+
+#endif
diff --git a/mijia_haier_bridge/src/user/bsp_led.c b/mijia_haier_bridge/src/user/bsp_led.c
new file mode 100644
index 0000000..84f1994
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_led.c
@@ -0,0 +1,122 @@
+#include "bsp_led.h"
+
+static const uint16_t led_brightness_table[1001];
+
+void bsp_led_init(void)
+{
+ /* 开启GPIOA/B和TIM1时钟 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);
+
+ /* 配置GPIO */
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_Init(GPIOA, &GPIO_InitStructure); //TIM1_CH1=PA8
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_WriteBit(GPIOB, GPIO_InitStructure.GPIO_Pin, Bit_RESET);
+ GPIO_Init(GPIOB, &GPIO_InitStructure); //LED=PB9
+
+ /* 初始化定时器时基 */
+ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
+ TIM_TimeBaseStructure.TIM_Prescaler = 3-1;
+ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseStructure.TIM_Period = 10000-1; //2.4kHz PWM
+ TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
+ TIM_ARRPreloadConfig(TIM1, ENABLE);
+
+ /* 初始化定时器PWM输出 */
+ TIM_OCInitTypeDef TIM_OCInitStructure;
+ TIM_OCStructInit(&TIM_OCInitStructure);
+ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
+ TIM_OCInitStructure.TIM_Pulse = 0;
+ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
+ TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
+ TIM_OC1Init(TIM1, &TIM_OCInitStructure);
+ TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
+
+ TIM_Cmd(TIM1, ENABLE);
+ TIM_CtrlPWMOutputs(TIM1, ENABLE);
+}
+
+void bsp_led_on(void)
+{
+ GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
+}
+
+void bsp_led_off(void)
+{
+ GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
+}
+
+void bsp_led_toggle(void)
+{
+ GPIO_WriteBit(GPIOB, GPIO_Pin_9, !GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_9));
+}
+
+void bsp_led_strip_set_brightness(uint16_t brightness)
+{
+ if (brightness > 1000) {
+ brightness = 1000;
+ }
+
+ TIM_SetCompare1(TIM1, led_brightness_table[brightness]);
+}
+
+static const uint16_t led_brightness_table[1001] = { //指数亮度表 1000->10000
+ 0, 1, 2, 4, 6, 8, 10, 13, 15, 18, 21, 24, 27, 30, 33, 36, 40, 43, 47, 50, 54,
+ 57, 61, 65, 69, 73, 77, 80, 85, 89, 93, 97, 101, 105, 110, 114, 118, 123, 127, 132, 136,
+ 141, 145, 150, 155, 160, 164, 169, 174, 179, 184, 189, 194, 199, 204, 209, 214, 219, 224, 229, 234,
+ 240, 245, 250, 255, 261, 266, 272, 277, 283, 288, 293, 299, 305, 310, 316, 321, 327, 333, 338, 344,
+ 350, 356, 362, 367, 373, 379, 385, 391, 397, 403, 409, 415, 421, 427, 433, 439, 445, 451, 457, 464,
+ 470, 476, 482, 489, 495, 501, 507, 514, 520, 527, 533, 539, 546, 552, 559, 565, 572, 578, 585, 591,
+ 598, 605, 611, 618, 624, 631, 638, 645, 651, 658, 665, 672, 678, 685, 692, 699, 706, 713, 720, 726,
+ 733, 740, 747, 754, 761, 768, 775, 782, 789, 796, 804, 811, 818, 825, 832, 839, 846, 854, 861, 868,
+ 875, 883, 890, 897, 904, 912, 919, 926, 934, 941, 949, 956, 963, 971, 978, 986, 993, 1001, 1008, 1016,
+ 1023, 1031, 1038, 1046, 1054, 1061, 1069, 1076, 1084, 1092, 1099, 1107, 1115, 1123, 1130, 1138, 1146, 1154, 1161, 1169,
+ 1177, 1185, 1193, 1200, 1208, 1216, 1224, 1232, 1240, 1248, 1256, 1264, 1272, 1280, 1288, 1295, 1304, 1312, 1320, 1328,
+ 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392, 1401, 1409, 1417, 1425, 1433, 1441, 1450, 1458, 1466, 1474, 1483, 1491,
+ 1499, 1508, 1516, 1524, 1533, 1541, 1549, 1558, 1566, 1574, 1583, 1591, 1600, 1608, 1617, 1625, 1633, 1642, 1650, 1659,
+ 1667, 1676, 1685, 1693, 1702, 1710, 1719, 1727, 1736, 1745, 1753, 1762, 1770, 1779, 1788, 1796, 1805, 1814, 1823, 1831,
+ 1840, 1849, 1858, 1866, 1875, 1884, 1893, 1901, 1910, 1919, 1928, 1937, 1946, 1954, 1963, 1972, 1981, 1990, 1999, 2008,
+ 2017, 2026, 2035, 2044, 2053, 2062, 2071, 2080, 2089, 2098, 2107, 2116, 2125, 2134, 2143, 2152, 2161, 2170, 2179, 2188,
+ 2197, 2207, 2216, 2225, 2234, 2243, 2252, 2262, 2271, 2280, 2289, 2298, 2308, 2317, 2326, 2335, 2345, 2354, 2363, 2373,
+ 2382, 2391, 2400, 2410, 2419, 2429, 2438, 2447, 2457, 2466, 2475, 2485, 2494, 2504, 2513, 2523, 2532, 2542, 2551, 2560,
+ 2570, 2579, 2589, 2598, 2608, 2618, 2627, 2637, 2646, 2656, 2665, 2675, 2685, 2694, 2704, 2713, 2723, 2733, 2742, 2752,
+ 2762, 2771, 2781, 2791, 2800, 2810, 2820, 2829, 2839, 2849, 2859, 2868, 2878, 2888, 2898, 2907, 2917, 2927, 2937, 2947,
+ 2957, 2966, 2976, 2986, 2996, 3006, 3016, 3026, 3035, 3045, 3055, 3065, 3075, 3085, 3095, 3105, 3115, 3125, 3135, 3145,
+ 3155, 3165, 3175, 3185, 3195, 3205, 3215, 3225, 3235, 3245, 3255, 3265, 3275, 3285, 3295, 3306, 3316, 3326, 3336, 3346,
+ 3356, 3366, 3377, 3387, 3397, 3407, 3417, 3427, 3438, 3448, 3458, 3468, 3479, 3489, 3499, 3509, 3520, 3530, 3540, 3550,
+ 3561, 3571, 3581, 3592, 3602, 3612, 3623, 3633, 3643, 3654, 3664, 3674, 3685, 3695, 3706, 3716, 3726, 3737, 3747, 3758,
+ 3768, 3779, 3789, 3800, 3810, 3821, 3831, 3842, 3852, 3863, 3873, 3884, 3894, 3905, 3915, 3926, 3936, 3947, 3957, 3968,
+ 3979, 3989, 4000, 4010, 4021, 4032, 4042, 4053, 4064, 4074, 4085, 4095, 4106, 4117, 4128, 4138, 4149, 4160, 4170, 4181,
+ 4192, 4203, 4213, 4224, 4235, 4246, 4256, 4267, 4278, 4289, 4299, 4310, 4321, 4332, 4343, 4353, 4364, 4375, 4386, 4397,
+ 4408, 4419, 4429, 4440, 4451, 4462, 4473, 4484, 4495, 4506, 4517, 4528, 4539, 4550, 4560, 4571, 4582, 4593, 4604, 4615,
+ 4626, 4637, 4648, 4659, 4670, 4681, 4692, 4703, 4715, 4726, 4737, 4748, 4759, 4770, 4781, 4792, 4803, 4814, 4825, 4836,
+ 4848, 4859, 4870, 4881, 4892, 4903, 4914, 4926, 4937, 4948, 4959, 4970, 4982, 4993, 5004, 5015, 5026, 5038, 5049, 5060,
+ 5071, 5083, 5094, 5105, 5116, 5128, 5139, 5150, 5162, 5173, 5184, 5195, 5207, 5218, 5229, 5241, 5252, 5264, 5275, 5286,
+ 5298, 5309, 5320, 5332, 5343, 5355, 5366, 5377, 5389, 5400, 5412, 5423, 5435, 5446, 5457, 5469, 5480, 5492, 5503, 5515,
+ 5526, 5538, 5549, 5561, 5572, 5584, 5595, 5607, 5619, 5630, 5642, 5653, 5665, 5676, 5688, 5699, 5711, 5723, 5734, 5746,
+ 5757, 5769, 5781, 5792, 5804, 5816, 5827, 5839, 5851, 5862, 5874, 5886, 5897, 5909, 5921, 5932, 5944, 5956, 5967, 5979,
+ 5991, 6003, 6014, 6026, 6038, 6050, 6061, 6073, 6085, 6097, 6109, 6120, 6132, 6144, 6156, 6168, 6179, 6191, 6203, 6215,
+ 6227, 6239, 6250, 6262, 6274, 6286, 6298, 6310, 6322, 6333, 6345, 6357, 6369, 6381, 6393, 6405, 6417, 6429, 6441, 6453,
+ 6465, 6477, 6489, 6501, 6513, 6525, 6537, 6549, 6560, 6573, 6585, 6597, 6609, 6621, 6633, 6645, 6657, 6669, 6681, 6693,
+ 6705, 6717, 6729, 6741, 6753, 6765, 6777, 6789, 6802, 6814, 6826, 6838, 6850, 6862, 6874, 6886, 6899, 6911, 6923, 6935,
+ 6947, 6959, 6972, 6984, 6996, 7008, 7020, 7033, 7045, 7057, 7069, 7082, 7094, 7106, 7118, 7130, 7143, 7155, 7167, 7180,
+ 7192, 7204, 7216, 7229, 7241, 7253, 7266, 7278, 7290, 7303, 7315, 7327, 7340, 7352, 7364, 7377, 7389, 7401, 7414, 7426,
+ 7438, 7451, 7463, 7476, 7488, 7500, 7513, 7525, 7538, 7550, 7563, 7575, 7587, 7600, 7612, 7625, 7637, 7650, 7662, 7675,
+ 7687, 7700, 7712, 7725, 7737, 7750, 7762, 7775, 7787, 7800, 7812, 7825, 7837, 7850, 7862, 7875, 7888, 7900, 7913, 7925,
+ 7938, 7950, 7963, 7976, 7988, 8001, 8013, 8026, 8039, 8051, 8064, 8077, 8089, 8102, 8114, 8127, 8140, 8152, 8165, 8178,
+ 8191, 8203, 8216, 8229, 8241, 8254, 8267, 8279, 8292, 8305, 8318, 8330, 8343, 8356, 8369, 8381, 8394, 8407, 8420, 8432,
+ 8445, 8458, 8471, 8484, 8496, 8509, 8522, 8535, 8548, 8560, 8573, 8586, 8599, 8612, 8625, 8637, 8650, 8663, 8676, 8689,
+ 8702, 8715, 8728, 8740, 8753, 8766, 8779, 8792, 8805, 8818, 8831, 8844, 8857, 8870, 8883, 8895, 8908, 8921, 8934, 8947,
+ 8960, 8973, 8986, 8999, 9012, 9025, 9038, 9051, 9064, 9077, 9090, 9103, 9116, 9129, 9142, 9155, 9168, 9181, 9195, 9208,
+ 9221, 9234, 9247, 9260, 9273, 9286, 9299, 9312, 9325, 9338, 9352, 9365, 9378, 9391, 9404, 9417, 9430, 9443, 9457, 9470,
+ 9483, 9496, 9509, 9522, 9536, 9549, 9562, 9575, 9588, 9602, 9615, 9628, 9641, 9654, 9668, 9681, 9694, 9707, 9720, 9734,
+ 9747, 9760, 9773, 9787, 9800, 9813, 9827, 9840, 9853, 9866, 9880, 9893, 9906, 9920, 9933, 9946, 9960, 9973, 9986, 9999
+};
diff --git a/mijia_haier_bridge/src/user/bsp_led.h b/mijia_haier_bridge/src/user/bsp_led.h
new file mode 100644
index 0000000..115602d
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_led.h
@@ -0,0 +1,12 @@
+#ifndef __BSP_LED_H
+#define __BSP_LED_H
+
+#include "ch32v10x.h"
+
+void bsp_led_init(void);
+void bsp_led_on(void);
+void bsp_led_off(void);
+void bsp_led_toggle(void);
+void bsp_led_strip_set_brightness(uint16_t brightness);
+
+#endif
diff --git a/mijia_haier_bridge/src/user/bsp_module_io.c b/mijia_haier_bridge/src/user/bsp_module_io.c
new file mode 100644
index 0000000..042f8b0
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_module_io.c
@@ -0,0 +1,115 @@
+#include "bsp_module_io.h"
+#include "util_log.h"
+
+void bsp_module_io_init(void)
+{
+ /* 开启GPIOA/B时钟 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
+
+ /* 配置GPIO */
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+ GPIO_WriteBit(GPIOA, GPIO_InitStructure.GPIO_Pin, Bit_SET);
+ GPIO_Init(GPIOA, &GPIO_InitStructure); //MIJIA_KEY3=PA0 MIJIA_KEY2=PA1 MIJIA_KEY1=PA2
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
+ GPIO_WriteBit(GPIOB, GPIO_InitStructure.GPIO_Pin, Bit_SET);
+ GPIO_Init(GPIOB, &GPIO_InitStructure); //MIJIA_KEY4=PB11 HAIER_KEY1=PB12
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+ GPIO_Init(GPIOA, &GPIO_InitStructure); //MIJIA_RELAY1=PA3 MIJIA_RELAY2=PA4 MIJIA_RELAY3=PA5 MIJIA_RELAY4=PA6 MIJIA_BACKLIGHT=PA7
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
+ GPIO_Init(GPIOB, &GPIO_InitStructure); //HAIER_RELAY1=PB13
+}
+
+bsp_module_relay_t bsp_module_relay_read(void)
+{
+ bsp_module_relay_t relay_stat = 0x00;
+
+ if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)) {
+ relay_stat |= bsp_module_mijia_relay1;
+ } else {
+ relay_stat &= ~bsp_module_mijia_relay1;
+ }
+
+ if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)) {
+ relay_stat |= bsp_module_mijia_relay2;
+ } else {
+ relay_stat &= ~bsp_module_mijia_relay2;
+ }
+
+ if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5)) {
+ relay_stat |= bsp_module_mijia_relay3;
+ } else {
+ relay_stat &= ~bsp_module_mijia_relay3;
+ }
+
+ if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) {
+ relay_stat |= bsp_module_mijia_relay4;
+ } else {
+ relay_stat &= ~bsp_module_mijia_relay4;
+ }
+
+ if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)) {
+ relay_stat |= bsp_module_mijia_backlight;
+ } else {
+ relay_stat &= ~bsp_module_mijia_backlight;
+ }
+
+ if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)) {
+ relay_stat |= bsp_module_haier_relay1;
+ } else {
+ relay_stat &= ~bsp_module_haier_relay1;
+ }
+
+ return relay_stat;
+}
+
+void bsp_module_key_write(bsp_module_relay_t key, uint8_t pressed)
+{
+ switch (key) {
+ case bsp_module_mijia_relay1:
+ GPIO_WriteBit(GPIOA, GPIO_Pin_2, pressed ? Bit_RESET : Bit_SET);
+ return;
+ case bsp_module_mijia_relay2:
+ GPIO_WriteBit(GPIOA, GPIO_Pin_1, pressed ? Bit_RESET : Bit_SET);
+ return;
+ case bsp_module_mijia_relay3:
+ GPIO_WriteBit(GPIOA, GPIO_Pin_0, pressed ? Bit_RESET : Bit_SET);
+ return;
+ case bsp_module_mijia_relay4:
+ GPIO_WriteBit(GPIOB, GPIO_Pin_11, pressed ? Bit_RESET : Bit_SET);
+ return;
+ case bsp_module_haier_relay1:
+ GPIO_WriteBit(GPIOB, GPIO_Pin_12, pressed ? Bit_RESET : Bit_SET);
+ return;
+ default:
+ LOG_W("unknown relay index");
+ return;
+ }
+}
+
+const char *bsp_relay_index_to_string(bsp_module_relay_t relay_stat)
+{
+ switch (relay_stat) {
+ case bsp_module_mijia_relay1:
+ return "mijia relay1";
+ case bsp_module_mijia_relay2:
+ return "mijia relay2";
+ case bsp_module_mijia_relay3:
+ return "mijia relay3";
+ case bsp_module_mijia_relay4:
+ return "mijia relay4";
+ case bsp_module_mijia_backlight:
+ return "mijia backlight";
+ case bsp_module_haier_relay1:
+ return "haier relay1";
+ default:
+ LOG_W("unknown relay index");
+ return "unknown";
+ }
+}
diff --git a/mijia_haier_bridge/src/user/bsp_module_io.h b/mijia_haier_bridge/src/user/bsp_module_io.h
new file mode 100644
index 0000000..bb23203
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_module_io.h
@@ -0,0 +1,22 @@
+#ifndef __BSP_MODULE_IO_H
+#define __BSP_MODULE_IO_H
+
+#include "ch32v10x.h"
+
+typedef enum {
+ bsp_module_mijia_relay1 = 1 << 0,
+ bsp_module_mijia_relay2 = 1 << 1,
+ bsp_module_mijia_relay3 = 1 << 2,
+ bsp_module_mijia_relay4 = 1 << 3,
+ bsp_module_mijia_backlight = 1 << 4,
+ bsp_module_haier_relay1 = 1 << 5,
+} bsp_module_relay_t;
+
+#define BSP_MODULE_RELAY_NUMBER 6
+
+void bsp_module_io_init(void);
+bsp_module_relay_t bsp_module_relay_read(void);
+void bsp_module_key_write(bsp_module_relay_t key, uint8_t pressed);
+const char *bsp_relay_index_to_string(bsp_module_relay_t relay_stat);
+
+#endif
diff --git a/mijia_haier_bridge/src/user/bsp_tick.c b/mijia_haier_bridge/src/user/bsp_tick.c
new file mode 100644
index 0000000..46d42e7
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_tick.c
@@ -0,0 +1,45 @@
+#include "bsp_tick.h"
+
+static uint64_t tick = 0;
+
+void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+
+void bsp_tick_init(void)
+{
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
+
+ /* 初始化用于产生时基的定时器 */
+ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
+ TIM_TimeBaseInitStructure.TIM_Prescaler = SystemCoreClock / 1000000 - 1; //定时器时钟频率1MHz
+ TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1; //定时器更新频率1kHz
+ TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+ TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
+
+ TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除更新中断标志位
+ TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允许更新中断
+
+ /* 配置定时器中断请求 */
+ NVIC_InitTypeDef NVIC_InitStructure;
+ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+ NVIC_Init(&NVIC_InitStructure);
+
+ TIM_Cmd(TIM3, ENABLE); //启动定时器
+}
+
+uint64_t bsp_tick_get(void)
+{
+ return tick;
+}
+
+void TIM3_IRQHandler(void)
+{
+ if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
+ TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
+
+ tick ++;
+ }
+}
diff --git a/mijia_haier_bridge/src/user/bsp_tick.h b/mijia_haier_bridge/src/user/bsp_tick.h
new file mode 100644
index 0000000..f7977dc
--- /dev/null
+++ b/mijia_haier_bridge/src/user/bsp_tick.h
@@ -0,0 +1,9 @@
+#ifndef __BSP_TICK_H
+#define __BSP_TICK_H
+
+#include "ch32v10x.h"
+
+void bsp_tick_init(void);
+uint64_t bsp_tick_get(void);
+
+#endif
diff --git a/mijia_haier_bridge/src/user/ch32v10x_conf.h b/mijia_haier_bridge/src/user/ch32v10x_conf.h
new file mode 100644
index 0000000..ca612ec
--- /dev/null
+++ b/mijia_haier_bridge/src/user/ch32v10x_conf.h
@@ -0,0 +1,11 @@
+#ifndef __CH32V10x_CONF_H
+#define __CH32V10x_CONF_H
+
+#include "ch32v10x_dma.h"
+#include "ch32v10x_gpio.h"
+#include "ch32v10x_rcc.h"
+#include "ch32v10x_tim.h"
+#include "ch32v10x_usart.h"
+#include "ch32v10x_misc.h"
+
+#endif
diff --git a/mijia_haier_bridge/src/user/ch32v10x_it.c b/mijia_haier_bridge/src/user/ch32v10x_it.c
new file mode 100644
index 0000000..9c590d3
--- /dev/null
+++ b/mijia_haier_bridge/src/user/ch32v10x_it.c
@@ -0,0 +1,14 @@
+#include "ch32v10x.h"
+
+void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
+
+void NMI_Handler(void)
+{
+ while (1);
+}
+
+void HardFault_Handler(void)
+{
+ while (1);
+}
diff --git a/mijia_haier_bridge/src/user/main.c b/mijia_haier_bridge/src/user/main.c
new file mode 100644
index 0000000..0c9d69e
--- /dev/null
+++ b/mijia_haier_bridge/src/user/main.c
@@ -0,0 +1,26 @@
+#include "bsp_tick.h"
+#include "bsp_led.h"
+#include "bsp_buzzer.h"
+#include "bsp_module_io.h"
+#include "util_delay.h"
+#include "util_log.h"
+#include "app_routines.h"
+
+int main(void)
+{
+ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
+ SystemCoreClockUpdate();
+
+ delay_init();
+ bsp_tick_init();
+ log_init(921600);
+
+ bsp_led_init();
+ bsp_buzzer_init();
+ bsp_module_io_init();
+
+ LOG_I("executable compiled time: %s %s", __DATE__, __TIME__);
+ LOG_I("system core clock: %d MHz", SystemCoreClock / 1000000);
+
+ app_routines_loop();
+}
diff --git a/mijia_haier_bridge/src/user/system_ch32v10x.c b/mijia_haier_bridge/src/user/system_ch32v10x.c
new file mode 100644
index 0000000..16ca8f9
--- /dev/null
+++ b/mijia_haier_bridge/src/user/system_ch32v10x.c
@@ -0,0 +1,600 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : system_ch32v10x.c
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2024/06/23
+ * Description : CH32V10x Device Peripheral Access Layer System Source File.
+*********************************************************************************
+* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
+* Attention: This software (modified or not) and binary are used for
+* microcontroller manufactured by Nanjing Qinheng Microelectronics.
+*******************************************************************************/
+#include "ch32v10x.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_HSI HSI_VALUE
+//#define SYSCLK_FREQ_48MHz_HSI 48000000
+//#define SYSCLK_FREQ_56MHz_HSI 56000000
+//#define SYSCLK_FREQ_72MHz_HSI 72000000
+
+/* 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_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) */
+#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};
+
+/* ch32v10x_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_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 );
+
+#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)0xF8FF0000;
+ RCC->CTLR &= (uint32_t)0xFEF6FFFF;
+ RCC->CTLR &= (uint32_t)0xFFFBFFFF;
+ RCC->CFGR0 &= (uint32_t)0xFF80FFFF;
+ RCC->INTR = 0x009F0000;
+ SetSysClock();
+}
+
+/*********************************************************************
+ * @fn SystemCoreClockUpdate
+ *
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ *
+ * @return none
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp = 0, pllmull = 0, pllsource = 0;
+
+ tmp = RCC->CFGR0 & RCC_SWS;
+
+ switch(tmp)
+ {
+ case 0x00:
+ SystemCoreClock = HSI_VALUE;
+ break;
+ case 0x04:
+ SystemCoreClock = HSE_VALUE;
+ break;
+ case 0x08:
+ pllmull = RCC->CFGR0 & RCC_PLLMULL;
+ pllsource = RCC->CFGR0 & RCC_PLLSRC;
+ pllmull = (pllmull >> 18) + 2;
+ if(pllsource == 0x00)
+ {
+ if( EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE )
+ {
+ SystemCoreClock = ( HSI_VALUE ) * pllmull;
+ }
+ else
+ {
+ SystemCoreClock = ( HSI_VALUE >> 1 ) * pllmull;
+ }
+ }
+ else
+ {
+ if((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)
+ {
+ SystemCoreClock = (HSE_VALUE >> 1) * pllmull;
+ }
+ else
+ {
+ SystemCoreClock = HSE_VALUE * pllmull;
+ }
+ }
+ break;
+ default:
+ SystemCoreClock = HSI_VALUE;
+ break;
+ }
+
+ tmp = 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_48MHz_HSI
+ SetSysClockTo48_HSI();
+#elif defined SYSCLK_FREQ_56MHz_HSI
+ SetSysClockTo56_HSI();
+#elif defined SYSCLK_FREQ_72MHz_HSI
+ SetSysClockTo72_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)
+ {
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+ /* Flash 0 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_0;
+
+ /* 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)
+ {
+ /* Enable Prefetch Buffer */
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+
+ /* Flash 1 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;
+
+ /* 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));
+ RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLMULL6);
+
+ /* Enable PLL */
+ RCC->CTLR |= RCC_PLLON;
+ /* Wait till PLL is ready */
+ while((RCC->CTLR & RCC_PLLRDY) == 0)
+ {
+ }
+ /* Select PLL as system clock source */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));
+ RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
+ /* Wait till PLL is used as system clock source */
+ while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
+ {
+ }
+ }
+ else
+ {
+ /*
+ * 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)
+ {
+ /* Enable Prefetch Buffer */
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+
+ /* Flash 2 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
+
+ /* 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));
+ RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLMULL7);
+ /* Enable PLL */
+ RCC->CTLR |= RCC_PLLON;
+ /* Wait till PLL is ready */
+ while((RCC->CTLR & RCC_PLLRDY) == 0)
+ {
+ }
+
+ /* Select PLL as system clock source */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));
+ RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
+ /* Wait till PLL is used as system clock source */
+ while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
+ {
+ }
+ }
+ else
+ {
+ /*
+ * 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)
+ {
+ /* Enable Prefetch Buffer */
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+
+ /* Flash 2 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
+
+ /* 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));
+ RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLMULL9);
+ /* Enable PLL */
+ RCC->CTLR |= RCC_PLLON;
+ /* Wait till PLL is ready */
+ while((RCC->CTLR & RCC_PLLRDY) == 0)
+ {
+ }
+ /* Select PLL as system clock source */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));
+ RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
+ /* Wait till PLL is used as system clock source */
+ while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
+ {
+ }
+ }
+ else
+ {
+ /*
+ * 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;
+
+ /* Enable Prefetch Buffer */
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+
+ /* Flash 1 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;
+
+ /* HCLK = SYSCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
+ /* PCLK2 = HCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
+ /* PCLK1 = HCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
+
+ /* PLL configuration: PLLCLK = HSI * 6 = 48 MHz */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+ RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6);
+
+ /* Enable PLL */
+ RCC->CTLR |= RCC_PLLON;
+ /* Wait till PLL is ready */
+ while((RCC->CTLR & RCC_PLLRDY) == 0)
+ {
+ }
+ /* Select PLL as system clock source */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));
+ RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
+ /* Wait till PLL is used as system clock source */
+ while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
+ {
+ }
+}
+
+#elif defined SYSCLK_FREQ_56MHz_HSI
+
+/*********************************************************************
+ * @fn SetSysClockTo56_HSI
+ *
+ * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
+ *
+ * @return none
+ */
+static void SetSysClockTo56_HSI(void)
+{
+ EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
+
+ /* Enable Prefetch Buffer */
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+
+ /* Flash 2 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
+
+ /* HCLK = SYSCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
+ /* PCLK2 = HCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
+ /* PCLK1 = HCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
+
+ /* PLL configuration: PLLCLK = HSI * 7 = 56 MHz */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+ RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7);
+
+ /* Enable PLL */
+ RCC->CTLR |= RCC_PLLON;
+ /* Wait till PLL is ready */
+ while((RCC->CTLR & RCC_PLLRDY) == 0)
+ {
+ }
+ /* Select PLL as system clock source */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));
+ RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
+ /* Wait till PLL is used as system clock source */
+ while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
+ {
+ }
+}
+
+#elif defined SYSCLK_FREQ_72MHz_HSI
+
+/*********************************************************************
+ * @fn SetSysClockTo72_HSI
+ *
+ * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
+ *
+ * @return none
+ */
+static void SetSysClockTo72_HSI(void)
+{
+ EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;
+
+ /* Enable Prefetch Buffer */
+ FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;
+
+ /* Flash 2 wait state */
+ FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);
+ FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;
+
+ /* HCLK = SYSCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;
+ /* PCLK2 = HCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;
+ /* PCLK1 = HCLK */
+ RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;
+
+ /* PLL configuration: PLLCLK = HSI * 9 = 72 MHz */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));
+ RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9);
+
+ /* Enable PLL */
+ RCC->CTLR |= RCC_PLLON;
+ /* Wait till PLL is ready */
+ while((RCC->CTLR & RCC_PLLRDY) == 0)
+ {
+ }
+ /* Select PLL as system clock source */
+ RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));
+ RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;
+ /* Wait till PLL is used as system clock source */
+ while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)
+ {
+ }
+}
+
+#endif
diff --git a/mijia_haier_bridge/src/user/system_ch32v10x.h b/mijia_haier_bridge/src/user/system_ch32v10x.h
new file mode 100644
index 0000000..03652f0
--- /dev/null
+++ b/mijia_haier_bridge/src/user/system_ch32v10x.h
@@ -0,0 +1,29 @@
+/********************************** (C) COPYRIGHT *******************************
+ * File Name : system_ch32v10x.h
+ * Author : WCH
+ * Version : V1.0.0
+ * Date : 2020/04/30
+ * Description : CH32V10x 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_CH32V10x_H
+#define __SYSTEM_CH32V10x_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 /*__CH32V10x_SYSTEM_H */
diff --git a/mijia_haier_bridge/src/user/util_delay.c b/mijia_haier_bridge/src/user/util_delay.c
new file mode 100644
index 0000000..4f0b9ce
--- /dev/null
+++ b/mijia_haier_bridge/src/user/util_delay.c
@@ -0,0 +1,38 @@
+#include "util_delay.h"
+
+static uint8_t p_us = 0;
+static uint16_t p_ms = 0;
+
+void delay_init(void)
+{
+ p_us = SystemCoreClock / 8000000;
+ p_ms = (uint16_t)p_us * 1000;
+}
+
+void delay_us(uint32_t n_us)
+{
+ SysTick->CNTL0 = 0;
+ SysTick->CNTL1 = 0;
+ SysTick->CNTL2 = 0;
+ SysTick->CNTL3 = 0;
+ SysTick->CTLR = 1;
+
+ uint32_t i = (uint32_t)n_us * p_us;
+ while((*(volatile uint32_t *)&SysTick->CNTL0) <= i);
+
+ SysTick->CTLR = 0;
+}
+
+void delay_ms(uint32_t n_ms)
+{
+ SysTick->CNTL0 = 0;
+ SysTick->CNTL1 = 0;
+ SysTick->CNTL2 = 0;
+ SysTick->CNTL3 = 0;
+ SysTick->CTLR = 1;
+
+ uint32_t i = (uint32_t)n_ms * p_ms;
+ while((*(volatile uint32_t *)&SysTick->CNTL0) <= i);
+
+ SysTick->CTLR = 0;
+}
diff --git a/mijia_haier_bridge/src/user/util_delay.h b/mijia_haier_bridge/src/user/util_delay.h
new file mode 100644
index 0000000..f3cfec3
--- /dev/null
+++ b/mijia_haier_bridge/src/user/util_delay.h
@@ -0,0 +1,10 @@
+#ifndef __UTIL_DELAY_H
+#define __UTIL_DELAY_H
+
+#include "ch32v10x.h"
+
+void delay_init(void);
+void delay_us(uint32_t n);
+void delay_ms(uint32_t n);
+
+#endif
diff --git a/mijia_haier_bridge/src/user/util_log.c b/mijia_haier_bridge/src/user/util_log.c
new file mode 100644
index 0000000..f20d211
--- /dev/null
+++ b/mijia_haier_bridge/src/user/util_log.c
@@ -0,0 +1,77 @@
+#include "util_log.h"
+#include
+#include
+
+static char string_buffer[256];
+
+/**
+ * @brief 初始化日志打印
+ *
+ */
+void log_init(uint32_t baudrate)
+{
+ /* 开启时钟 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
+ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
+
+ /* 配置GPIO */
+ GPIO_InitTypeDef GPIO_InitStructure;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1_TX=PA9
+ 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; //USART1_RX=PA10
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+ GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ /* 初始化串口外设 */
+ USART_InitTypeDef USART_InitStructure;
+ 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 | USART_Mode_Rx;
+ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_Init(USART1, &USART_InitStructure);
+ USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //使能UART1的DMA发送
+
+ /* 配置DMA通道 */
+ DMA_InitTypeDef DMA_InitStructure;
+ DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DATAR; //USART1数据寄存器地址
+ DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)string_buffer; //数据缓冲区地址
+ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设->内存方向
+ DMA_InitStructure.DMA_BufferSize = 0; //缓冲区大小
+ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不自增
+ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
+ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据大小:字节
+ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据大小:字节
+ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //普通模式
+ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //中优先级
+ DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非内存到内存传输
+ DMA_Init(DMA1_Channel4, &DMA_InitStructure);
+
+ USART_Cmd(USART1, ENABLE); //使能串口
+}
+
+/**
+ * @brief 使用串口打印日志
+ *
+ * @param fmt 格式化字符串
+ * @param ... 可变参数
+ * @note 本函数将格式化字符串至静态内存,并将其拷贝到发送缓冲区中。若当前未在发送,则启动一次发送
+ */
+void log_uart_printf(const char *fmt, ...)
+{
+ while (DMA_GetCurrDataCounter(DMA1_Channel4) != 0); //等待上次传输完成
+
+ va_list va_args;
+ va_start(va_args, fmt);
+ int length = vsnprintf(string_buffer, sizeof(string_buffer), fmt, va_args);
+ va_end(va_args);
+
+ DMA_Cmd(DMA1_Channel4, DISABLE); //禁用DMA通道4
+ DMA_SetCurrDataCounter(DMA1_Channel4, length); //设置DMA传输数据长度
+ DMA_Cmd(DMA1_Channel4, ENABLE); //使能DMA通道4,开始发送
+}
diff --git a/mijia_haier_bridge/src/user/util_log.h b/mijia_haier_bridge/src/user/util_log.h
new file mode 100644
index 0000000..0d6f125
--- /dev/null
+++ b/mijia_haier_bridge/src/user/util_log.h
@@ -0,0 +1,42 @@
+#ifndef __UTIL_LOG_H
+#define __UTIL_LOG_H
+
+#include "ch32v10x.h"
+#include "bsp_tick.h"
+
+#define CSI_START "\033["
+#define CSI_END "\033[0m"
+/* output log front color */
+#define F_BLACK "30;"
+#define F_RED "31;"
+#define F_GREEN "32;"
+#define F_YELLOW "33;"
+#define F_BLUE "34;"
+#define F_MAGENTA "35;"
+#define F_CYAN "36;"
+#define F_WHITE "37;"
+/* output log background color */
+#define B_NULL
+#define B_BLACK "40;"
+#define B_RED "41;"
+#define B_GREEN "42;"
+#define B_YELLOW "43;"
+#define B_BLUE "44;"
+#define B_MAGENTA "45;"
+#define B_CYAN "46;"
+#define B_WHITE "47;"
+/* output log fonts style */
+#define S_BOLD "1m"
+#define S_UNDERLINE "4m"
+#define S_BLINK "5m"
+#define S_NORMAL "22m"
+
+#define LOG_E(format, ...) log_uart_printf(CSI_START F_RED S_NORMAL "E/%s(%llu): " format CSI_END "\n", __func__, bsp_tick_get(), ##__VA_ARGS__)
+#define LOG_W(format, ...) log_uart_printf(CSI_START F_YELLOW S_NORMAL "W/%s(%llu): " format CSI_END "\n", __func__, bsp_tick_get(), ##__VA_ARGS__)
+#define LOG_I(format, ...) log_uart_printf(CSI_START F_GREEN S_NORMAL "I/%s(%llu): " format CSI_END "\n", __func__, bsp_tick_get(), ##__VA_ARGS__)
+#define LOG_D(format, ...) log_uart_printf(CSI_START F_CYAN S_NORMAL "D/%s(%llu): " format CSI_END "\n", __func__, bsp_tick_get(), ##__VA_ARGS__)
+
+void log_init(uint32_t baudrate);
+void log_uart_printf(const char *fmt, ...);
+
+#endif