From f28d129e11f25bbe5b4acc06341f3b1a2e47dd95 Mon Sep 17 00:00:00 2001 From: SkyLi Date: Sat, 6 Jun 2026 21:26:08 +0800 Subject: [PATCH] =?UTF-8?q?init:=E5=85=A8=E9=93=BE=E8=B7=AF=E9=97=AD?= =?UTF-8?q?=E7=8E=AF=E6=8E=A7=E5=88=B6=E8=B0=83=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 10 + .vscode/c_cpp_properties.json | 443 ++++ .vscode/settings.json | 4 + .../SeekFree_MSPM0G3507_Device_Library.syscfg | 30 +- libraries/sdk/ti_config/ti_msp_dl_config.c | 176 +- libraries/sdk/ti_config/ti_msp_dl_config.h | 20 + project/code/Beep.c | 33 + project/code/Beep.h | 12 + project/code/Command.c | 66 + project/code/Command.h | 12 + project/code/GrayscaleSensor.c | 122 ++ project/code/GrayscaleSensor.h | 13 + project/code/ICM_42688.c | 172 ++ project/code/ICM_42688.h | 198 ++ project/code/IMU.c | 374 ++++ project/code/IMU.h | 105 + project/code/Motor.c | 33 + project/code/Motor.h | 18 + project/code/MotorEncoder.c | 76 + project/code/MotorEncoder.h | 17 + project/code/PID_Controller.c | 232 ++ project/code/PID_Controller.h | 114 + project/code/{新建文本文档.txt => README.md} | 0 project/code/Task.c | 158 ++ project/code/Task.h | 22 + project/keil/.vscode/c_cpp_properties.json | 443 ++++ ...ee_MSPM0G3507_Device_Library.uvguix.SkyGod | 1905 +++++++++++++++++ .../SeekFree_MSPM0G3507_Device_Library.uvoptx | 306 ++- ...SeekFree_MSPM0G3507_Device_Library.uvprojx | 97 + project/user/src/main.c | 68 +- project/尽量不要使用的引脚.md | 11 + project/尽量不要使用的引脚.txt | 11 - 32 files changed, 5120 insertions(+), 181 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json create mode 100644 project/code/Beep.c create mode 100644 project/code/Beep.h create mode 100644 project/code/Command.c create mode 100644 project/code/Command.h create mode 100644 project/code/GrayscaleSensor.c create mode 100644 project/code/GrayscaleSensor.h create mode 100644 project/code/ICM_42688.c create mode 100644 project/code/ICM_42688.h create mode 100644 project/code/IMU.c create mode 100644 project/code/IMU.h create mode 100644 project/code/Motor.c create mode 100644 project/code/Motor.h create mode 100644 project/code/MotorEncoder.c create mode 100644 project/code/MotorEncoder.h create mode 100644 project/code/PID_Controller.c create mode 100644 project/code/PID_Controller.h rename project/code/{新建文本文档.txt => README.md} (100%) create mode 100644 project/code/Task.c create mode 100644 project/code/Task.h create mode 100644 project/keil/.vscode/c_cpp_properties.json create mode 100644 project/keil/SeekFree_MSPM0G3507_Device_Library.uvguix.SkyGod create mode 100644 project/尽量不要使用的引脚.md delete mode 100644 project/尽量不要使用的引脚.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d05a3da --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/libraries/sdk/ti_config/excluded + +/project/keil/Listings/ +/project/keil/Objects/ + +uv4.log +uv4.log.lock +keil-assistant.log + +CLAUDE.md \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..50e0c6c --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,443 @@ +{ + "configurations": [ + { + "name": "SeekFree_MSPM0G3507_Device_Library", + "includePath": [ + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\third_party\\CMSIS\\Core\\Include", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti_config", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_common", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_components", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_device", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_driver", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\inc", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\code", + "E:\\software\\ARM\\ARMCLANG\\include", + "E:\\software\\ARM\\ARMCLANG\\include\\arm_linux", + "E:\\software\\ARM\\ARMCLANG\\include\\arm_linux_compat", + "E:\\software\\ARM\\ARMCLANG\\include\\libcxx", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\src", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib\\m0p\\sysctl" + ], + "defines": [ + "__MSPM0G3507__", + "__alignof__(x)=", + "__asm(x)=", + "__asm__(x)=", + "__forceinline=", + "__restrict=", + "__volatile__=", + "__inline=", + "__inline__=", + "__declspec(x)=", + "__attribute__(x)=", + "__nonnull__(x)=", + "__unaligned=", + "__promise(x)=", + "__irq=", + "__swi=", + "__weak=", + "__register=", + "__pure=", + "__value_in_regs=", + "__breakpoint(x)=", + "__current_pc()=0U", + "__current_sp()=0U", + "__disable_fiq()=", + "__disable_irq()=", + "__enable_fiq()=", + "__enable_irq()=", + "__force_stores()=", + "__memory_changed()=", + "__schedule_barrier()=", + "__semihost(x,y)=0", + "__vfp_status(x,y)=0", + "__builtin_arm_nop()=", + "__builtin_arm_wfi()=", + "__builtin_arm_wfe()=", + "__builtin_arm_sev()=", + "__builtin_arm_sevl()=", + "__builtin_arm_yield()=", + "__builtin_arm_isb(x)=", + "__builtin_arm_dsb(x)=", + "__builtin_arm_dmb(x)=", + "__builtin_bswap32(x)=0U", + "__builtin_bswap16(x)=0U", + "__builtin_arm_rbit(x)=0U", + "__builtin_clz(x)=0U", + "__builtin_arm_ldrex(x)=0U", + "__builtin_arm_strex(x,y)=0U", + "__builtin_arm_clrex()=", + "__builtin_arm_ssat(x,y)=0U", + "__builtin_arm_usat(x,y)=0U", + "__builtin_arm_ldaex(x)=0U", + "__builtin_arm_stlex(x,y)=0U", + "_ILP32=1", + "_USE_STATIC_INLINE=1", + "__APCS_32__=1", + "__ARMCC_VERSION=6190004", + "__ARMCOMPILER_VERSION=6190004", + "__ARMEL__=1", + "__ARM_32BIT_STATE=1", + "__ARM_ACLE=200", + "__ARM_ARCH=4", + "__ARM_ARCH_4T__=1", + "__ARM_ARCH_ISA_ARM=1", + "__ARM_ARCH_ISA_THUMB=1", + "__ARM_EABI__=1", + "__ARM_FP16_ARGS=1", + "__ARM_FP16_FORMAT_IEEE=1", + "__ARM_NO_IMAGINARY_TYPE=1", + "__ARM_PCS=1", + "__ARM_PROMISE=__builtin_assume", + "__ARM_SIZEOF_MINIMAL_ENUM=4", + "__ARM_SIZEOF_WCHAR_T=4", + "__ARM_TARGET_COPROC=1", + "__ARM_TARGET_COPROC_V4=1", + "__ATOMIC_ACQUIRE=2", + "__ATOMIC_ACQ_REL=4", + "__ATOMIC_CONSUME=1", + "__ATOMIC_RELAXED=0", + "__ATOMIC_RELEASE=3", + "__ATOMIC_SEQ_CST=5", + "__BIGGEST_ALIGNMENT__=8", + "__BITINT_MAXWIDTH__=128", + "__BOOL_WIDTH__=8", + "__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__", + "__CHAR16_TYPE__=unsigned short", + "__CHAR32_TYPE__=unsigned int", + "__CHAR_BIT__=8", + "__CHAR_UNSIGNED__=1", + "__CLANG_ATOMIC_BOOL_LOCK_FREE=1", + "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE=1", + "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE=1", + "__CLANG_ATOMIC_CHAR_LOCK_FREE=1", + "__CLANG_ATOMIC_INT_LOCK_FREE=1", + "__CLANG_ATOMIC_LLONG_LOCK_FREE=1", + "__CLANG_ATOMIC_LONG_LOCK_FREE=1", + "__CLANG_ATOMIC_POINTER_LOCK_FREE=1", + "__CLANG_ATOMIC_SHORT_LOCK_FREE=1", + "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE=1", + "__CONSTANT_CFSTRINGS__=1", + "__DBL_DECIMAL_DIG__=17", + "__DBL_DENORM_MIN__=4.9406564584124654e-324", + "__DBL_DIG__=15", + "__DBL_EPSILON__=2.2204460492503131e-16", + "__DBL_HAS_DENORM__=1", + "__DBL_HAS_INFINITY__=1", + "__DBL_HAS_QUIET_NAN__=1", + "__DBL_MANT_DIG__=53", + "__DBL_MAX_10_EXP__=308", + "__DBL_MAX_EXP__=1024", + "__DBL_MAX__=1.7976931348623157e+308", + "__DBL_MIN_10_EXP__=(-307)", + "__DBL_MIN_EXP__=(-1021)", + "__DBL_MIN__=2.2250738585072014e-308", + "__DECIMAL_DIG__=__LDBL_DECIMAL_DIG__", + "__ELF__=1", + "__ESCAPE__=", + "__FINITE_MATH_ONLY__=1", + "__FLT16_DECIMAL_DIG__=5", + "__FLT16_DENORM_MIN__=5.9604644775390625e-8F16", + "__FLT16_DIG__=3", + "__FLT16_EPSILON__=9.765625e-4F16", + "__FLT16_HAS_DENORM__=1", + "__FLT16_HAS_INFINITY__=1", + "__FLT16_HAS_QUIET_NAN__=1", + "__FLT16_MANT_DIG__=11", + "__FLT16_MAX_10_EXP__=4", + "__FLT16_MAX_EXP__=16", + "__FLT16_MAX__=6.5504e+4F16", + "__FLT16_MIN_10_EXP__=(-4)", + "__FLT16_MIN_EXP__=(-13)", + "__FLT16_MIN__=6.103515625e-5F16", + "__FLT_DECIMAL_DIG__=9", + "__FLT_DENORM_MIN__=1.40129846e-45F", + "__FLT_DIG__=6", + "__FLT_EPSILON__=1.19209290e-7F", + "__FLT_HAS_DENORM__=1", + "__FLT_HAS_INFINITY__=1", + "__FLT_HAS_QUIET_NAN__=1", + "__FLT_MANT_DIG__=24", + "__FLT_MAX_10_EXP__=38", + "__FLT_MAX_EXP__=128", + "__FLT_MAX__=3.40282347e+38F", + "__FLT_MIN_10_EXP__=(-37)", + "__FLT_MIN_EXP__=(-125)", + "__FLT_MIN__=1.17549435e-38F", + "__FLT_RADIX__=2", + "__GCC_ATOMIC_BOOL_LOCK_FREE=1", + "__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1", + "__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1", + "__GCC_ATOMIC_CHAR_LOCK_FREE=1", + "__GCC_ATOMIC_INT_LOCK_FREE=1", + "__GCC_ATOMIC_LLONG_LOCK_FREE=1", + "__GCC_ATOMIC_LONG_LOCK_FREE=1", + "__GCC_ATOMIC_POINTER_LOCK_FREE=1", + "__GCC_ATOMIC_SHORT_LOCK_FREE=1", + "__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1", + "__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1", + "__GNUC_MINOR__=2", + "__GNUC_PATCHLEVEL__=1", + "__GNUC_STDC_INLINE__=1", + "__GNUC__=4", + "__GXX_ABI_VERSION=1002", + "__ILP32__=1", + "__INT16_C_SUFFIX__=", + "__INT16_FMTd__=\"hd\"", + "__INT16_FMTi__=\"hi\"", + "__INT16_MAX__=32767", + "__INT16_TYPE__=short", + "__INT32_C_SUFFIX__=", + "__INT32_FMTd__=\"d\"", + "__INT32_FMTi__=\"i\"", + "__INT32_MAX__=2147483647", + "__INT32_TYPE__=int", + "__INT64_C_SUFFIX__=LL", + "__INT64_FMTd__=\"lld\"", + "__INT64_FMTi__=\"lli\"", + "__INT64_MAX__=9223372036854775807LL", + "__INT64_TYPE__=long long int", + "__INT8_C_SUFFIX__=", + "__INT8_FMTd__=\"hhd\"", + "__INT8_FMTi__=\"hhi\"", + "__INT8_MAX__=127", + "__INT8_TYPE__=signed char", + "__INTMAX_C_SUFFIX__=LL", + "__INTMAX_FMTd__=\"lld\"", + "__INTMAX_FMTi__=\"lli\"", + "__INTMAX_MAX__=9223372036854775807LL", + "__INTMAX_TYPE__=long long int", + "__INTMAX_WIDTH__=64", + "__INTPTR_FMTd__=\"d\"", + "__INTPTR_FMTi__=\"i\"", + "__INTPTR_MAX__=2147483647", + "__INTPTR_TYPE__=int", + "__INTPTR_WIDTH__=32", + "__INT_FAST16_FMTd__=\"hd\"", + "__INT_FAST16_FMTi__=\"hi\"", + "__INT_FAST16_MAX__=32767", + "__INT_FAST16_TYPE__=short", + "__INT_FAST16_WIDTH__=16", + "__INT_FAST32_FMTd__=\"d\"", + "__INT_FAST32_FMTi__=\"i\"", + "__INT_FAST32_MAX__=2147483647", + "__INT_FAST32_TYPE__=int", + "__INT_FAST32_WIDTH__=32", + "__INT_FAST64_FMTd__=\"lld\"", + "__INT_FAST64_FMTi__=\"lli\"", + "__INT_FAST64_MAX__=9223372036854775807LL", + "__INT_FAST64_TYPE__=long long int", + "__INT_FAST64_WIDTH__=64", + "__INT_FAST8_FMTd__=\"hhd\"", + "__INT_FAST8_FMTi__=\"hhi\"", + "__INT_FAST8_MAX__=127", + "__INT_FAST8_TYPE__=signed char", + "__INT_FAST8_WIDTH__=8", + "__INT_LEAST16_FMTd__=\"hd\"", + "__INT_LEAST16_FMTi__=\"hi\"", + "__INT_LEAST16_MAX__=32767", + "__INT_LEAST16_TYPE__=short", + "__INT_LEAST16_WIDTH__=16", + "__INT_LEAST32_FMTd__=\"d\"", + "__INT_LEAST32_FMTi__=\"i\"", + "__INT_LEAST32_MAX__=2147483647", + "__INT_LEAST32_TYPE__=int", + "__INT_LEAST32_WIDTH__=32", + "__INT_LEAST64_FMTd__=\"lld\"", + "__INT_LEAST64_FMTi__=\"lli\"", + "__INT_LEAST64_MAX__=9223372036854775807LL", + "__INT_LEAST64_TYPE__=long long int", + "__INT_LEAST64_WIDTH__=64", + "__INT_LEAST8_FMTd__=\"hhd\"", + "__INT_LEAST8_FMTi__=\"hhi\"", + "__INT_LEAST8_MAX__=127", + "__INT_LEAST8_TYPE__=signed char", + "__INT_LEAST8_WIDTH__=8", + "__INT_MAX__=2147483647", + "__INT_WIDTH__=32", + "__I__=1.0if", + "__LDBL_DECIMAL_DIG__=17", + "__LDBL_DENORM_MIN__=4.9406564584124654e-324L", + "__LDBL_DIG__=15", + "__LDBL_EPSILON__=2.2204460492503131e-16L", + "__LDBL_HAS_DENORM__=1", + "__LDBL_HAS_INFINITY__=1", + "__LDBL_HAS_QUIET_NAN__=1", + "__LDBL_MANT_DIG__=53", + "__LDBL_MAX_10_EXP__=308", + "__LDBL_MAX_EXP__=1024", + "__LDBL_MAX__=1.7976931348623157e+308L", + "__LDBL_MIN_10_EXP__=(-307)", + "__LDBL_MIN_EXP__=(-1021)", + "__LDBL_MIN__=2.2250738585072014e-308L", + "__LITTLE_ENDIAN__=1", + "__LLONG_WIDTH__=64", + "__LONG_LONG_MAX__=9223372036854775807LL", + "__LONG_MAX__=2147483647L", + "__LONG_WIDTH__=32", + "__NO_INLINE__=1", + "__OBJC_BOOL_IS_BOOL=0", + "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES=3", + "__OPENCL_MEMORY_SCOPE_DEVICE=2", + "__OPENCL_MEMORY_SCOPE_SUB_GROUP=4", + "__OPENCL_MEMORY_SCOPE_WORK_GROUP=1", + "__OPENCL_MEMORY_SCOPE_WORK_ITEM=0", + "__ORDER_BIG_ENDIAN__=4321", + "__ORDER_LITTLE_ENDIAN__=1234", + "__ORDER_PDP_ENDIAN__=3412", + "__POINTER_WIDTH__=32", + "__PRAGMA_REDEFINE_EXTNAME=1", + "__PTRDIFF_FMTd__=\"d\"", + "__PTRDIFF_FMTi__=\"i\"", + "__PTRDIFF_MAX__=2147483647", + "__PTRDIFF_TYPE__=int", + "__PTRDIFF_WIDTH__=32", + "__REGISTER_PREFIX__=", + "__SCHAR_MAX__=127", + "__SHRT_MAX__=32767", + "__SHRT_WIDTH__=16", + "__SIG_ATOMIC_MAX__=2147483647", + "__SIG_ATOMIC_WIDTH__=32", + "__SIZEOF_DOUBLE__=8", + "__SIZEOF_FLOAT__=4", + "__SIZEOF_INT__=4", + "__SIZEOF_LONG_DOUBLE__=8", + "__SIZEOF_LONG_LONG__=8", + "__SIZEOF_LONG__=4", + "__SIZEOF_POINTER__=4", + "__SIZEOF_PTRDIFF_T__=4", + "__SIZEOF_SHORT__=2", + "__SIZEOF_SIZE_T__=4", + "__SIZEOF_WCHAR_T__=4", + "__SIZEOF_WINT_T__=4", + "__SIZE_FMTX__=\"X\"", + "__SIZE_FMTo__=\"o\"", + "__SIZE_FMTu__=\"u\"", + "__SIZE_FMTx__=\"x\"", + "__SIZE_MAX__=4294967295U", + "__SIZE_TYPE__=unsigned int", + "__SIZE_WIDTH__=32", + "__STDC_HOSTED__=1", + "__STDC_UTF_16__=1", + "__STDC_UTF_32__=1", + "__STDC_VERSION__=201710L", + "__STDC__=1", + "__UINT16_C_SUFFIX__=", + "__UINT16_FMTX__=\"hX\"", + "__UINT16_FMTo__=\"ho\"", + "__UINT16_FMTu__=\"hu\"", + "__UINT16_FMTx__=\"hx\"", + "__UINT16_MAX__=65535", + "__UINT16_TYPE__=unsigned short", + "__UINT32_C_SUFFIX__=U", + "__UINT32_FMTX__=\"X\"", + "__UINT32_FMTo__=\"o\"", + "__UINT32_FMTu__=\"u\"", + "__UINT32_FMTx__=\"x\"", + "__UINT32_MAX__=4294967295U", + "__UINT32_TYPE__=unsigned int", + "__UINT64_C_SUFFIX__=ULL", + "__UINT64_FMTX__=\"llX\"", + "__UINT64_FMTo__=\"llo\"", + "__UINT64_FMTu__=\"llu\"", + "__UINT64_FMTx__=\"llx\"", + "__UINT64_MAX__=18446744073709551615ULL", + "__UINT64_TYPE__=long long unsigned int", + "__UINT8_C_SUFFIX__=", + "__UINT8_FMTX__=\"hhX\"", + "__UINT8_FMTo__=\"hho\"", + "__UINT8_FMTu__=\"hhu\"", + "__UINT8_FMTx__=\"hhx\"", + "__UINT8_MAX__=255", + "__UINT8_TYPE__=unsigned char", + "__UINTMAX_C_SUFFIX__=ULL", + "__UINTMAX_FMTX__=\"llX\"", + "__UINTMAX_FMTo__=\"llo\"", + "__UINTMAX_FMTu__=\"llu\"", + "__UINTMAX_FMTx__=\"llx\"", + "__UINTMAX_MAX__=18446744073709551615ULL", + "__UINTMAX_TYPE__=long long unsigned int", + "__UINTMAX_WIDTH__=64", + "__UINTPTR_FMTX__=\"X\"", + "__UINTPTR_FMTo__=\"o\"", + "__UINTPTR_FMTu__=\"u\"", + "__UINTPTR_FMTx__=\"x\"", + "__UINTPTR_MAX__=4294967295U", + "__UINTPTR_TYPE__=unsigned int", + "__UINTPTR_WIDTH__=32", + "__UINT_FAST16_FMTX__=\"hX\"", + "__UINT_FAST16_FMTo__=\"ho\"", + "__UINT_FAST16_FMTu__=\"hu\"", + "__UINT_FAST16_FMTx__=\"hx\"", + "__UINT_FAST16_MAX__=65535", + "__UINT_FAST16_TYPE__=unsigned short", + "__UINT_FAST32_FMTX__=\"X\"", + "__UINT_FAST32_FMTo__=\"o\"", + "__UINT_FAST32_FMTu__=\"u\"", + "__UINT_FAST32_FMTx__=\"x\"", + "__UINT_FAST32_MAX__=4294967295U", + "__UINT_FAST32_TYPE__=unsigned int", + "__UINT_FAST64_FMTX__=\"llX\"", + "__UINT_FAST64_FMTo__=\"llo\"", + "__UINT_FAST64_FMTu__=\"llu\"", + "__UINT_FAST64_FMTx__=\"llx\"", + "__UINT_FAST64_MAX__=18446744073709551615ULL", + "__UINT_FAST64_TYPE__=long long unsigned int", + "__UINT_FAST8_FMTX__=\"hhX\"", + "__UINT_FAST8_FMTo__=\"hho\"", + "__UINT_FAST8_FMTu__=\"hhu\"", + "__UINT_FAST8_FMTx__=\"hhx\"", + "__UINT_FAST8_MAX__=255", + "__UINT_FAST8_TYPE__=unsigned char", + "__UINT_LEAST16_FMTX__=\"hX\"", + "__UINT_LEAST16_FMTo__=\"ho\"", + "__UINT_LEAST16_FMTu__=\"hu\"", + "__UINT_LEAST16_FMTx__=\"hx\"", + "__UINT_LEAST16_MAX__=65535", + "__UINT_LEAST16_TYPE__=unsigned short", + "__UINT_LEAST32_FMTX__=\"X\"", + "__UINT_LEAST32_FMTo__=\"o\"", + "__UINT_LEAST32_FMTu__=\"u\"", + "__UINT_LEAST32_FMTx__=\"x\"", + "__UINT_LEAST32_MAX__=4294967295U", + "__UINT_LEAST32_TYPE__=unsigned int", + "__UINT_LEAST64_FMTX__=\"llX\"", + "__UINT_LEAST64_FMTo__=\"llo\"", + "__UINT_LEAST64_FMTu__=\"llu\"", + "__UINT_LEAST64_FMTx__=\"llx\"", + "__UINT_LEAST64_MAX__=18446744073709551615ULL", + "__UINT_LEAST64_TYPE__=long long unsigned int", + "__UINT_LEAST8_FMTX__=\"hhX\"", + "__UINT_LEAST8_FMTo__=\"hho\"", + "__UINT_LEAST8_FMTu__=\"hhu\"", + "__UINT_LEAST8_FMTx__=\"hhx\"", + "__UINT_LEAST8_MAX__=255", + "__UINT_LEAST8_TYPE__=unsigned char", + "__USER_LABEL_PREFIX__=", + "__VERSION__=\"Clang 16.0.0\"", + "__VFP_FP__=1", + "__WCHAR_MAX__=4294967295U", + "__WCHAR_TYPE__=unsigned int", + "__WCHAR_UNSIGNED__=1", + "__WCHAR_WIDTH__=32", + "__WINT_MAX__=2147483647", + "__WINT_TYPE__=int", + "__WINT_WIDTH__=32", + "__arm=1", + "__arm__=1", + "__clang__=1", + "__clang_literal_encoding__=\"UTF-8\"", + "__clang_major__=16", + "__clang_minor__=0", + "__clang_patchlevel__=0", + "__clang_version__=\"16.0.0 \"", + "__clang_wide_literal_encoding__=\"UTF-32\"", + "__llvm__=1" + ], + "intelliSenseMode": "${default}" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c04d010 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "C_Cpp.errorSquiggles": "disabled", + "C_Cpp.default.compilerPath": "" +} \ No newline at end of file diff --git a/libraries/sdk/ti_config/SeekFree_MSPM0G3507_Device_Library.syscfg b/libraries/sdk/ti_config/SeekFree_MSPM0G3507_Device_Library.syscfg index 411113c..88868cb 100644 --- a/libraries/sdk/ti_config/SeekFree_MSPM0G3507_Device_Library.syscfg +++ b/libraries/sdk/ti_config/SeekFree_MSPM0G3507_Device_Library.syscfg @@ -5,16 +5,25 @@ * @v2CliArgs --device "MSPM0G3507" --package "LQFP-64(PM)" --product "mspm0_sdk@2.04.00.06" * @versions {"tool":"1.23.1+4034"} */ +scripting.excludeFromBuild("device_linker.cmd"); +scripting.excludeFromBuild("device_linker.lds"); +scripting.excludeFromBuild("device.opt"); +scripting.excludeFromBuild("device.cmd.genlibs"); +scripting.excludeFromBuild("device.lds.genlibs"); +scripting.excludeFromBuild("Event.dot"); /** * Import the modules used in this configuration. */ -const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false); -const GPIO1 = GPIO.addInstance(); -const GPIO2 = GPIO.addInstance(); -const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL"); -const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK"); -const VREF = scripting.addModule("/ti/driverlib/VREF"); +const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false); +const GPIO1 = GPIO.addInstance(); +const GPIO2 = GPIO.addInstance(); +const QEI = scripting.addModule("/ti/driverlib/QEI", {}, false); +const QEI1 = QEI.addInstance(); +const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL"); +const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK"); +const VREF = scripting.addModule("/ti/driverlib/VREF"); +const ProjectConfig = scripting.addModule("/ti/project_config/ProjectConfig"); /** * Write custom configuration values to the imported modules. @@ -79,6 +88,13 @@ GPIO2.associatedPins[0].interruptEn = true; GPIO2.associatedPins[0].polarity = "RISE"; GPIO2.associatedPins[0].pin.$assign = "PA18"; +QEI1.$name = "QEI_0"; +QEI1.peripheral.$assign = "TIMG8"; +QEI1.peripheral.ccp0Pin.$assign = "PB6"; +QEI1.peripheral.ccp1Pin.$assign = "PB7"; +QEI1.ccp0PinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric0"; +QEI1.ccp1PinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric1"; + SYSCTL.forceDefaultClkConfig = true; SYSCTL.clockTreeEn = true; scripting.suppress("For best practices when the CPUCLK is running at 32MHz and above, clear the flash status bit using DL_FlashCTL_executeClearStatus\\(\\) before executing any flash operation\\. Otherwise there may be false positives\\.", SYSCTL); @@ -98,6 +114,8 @@ VREF.peripheral.vrefPosPin.$assign = "PA23"; VREF.peripheral.vrefNegPin.$assign = "PA21"; VREF.vrefNegPinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric30"; +ProjectConfig.genLibIQVersion = "MATHACL"; + /** * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to diff --git a/libraries/sdk/ti_config/ti_msp_dl_config.c b/libraries/sdk/ti_config/ti_msp_dl_config.c index 00a167b..153c058 100644 --- a/libraries/sdk/ti_config/ti_msp_dl_config.c +++ b/libraries/sdk/ti_config/ti_msp_dl_config.c @@ -40,6 +40,8 @@ #include "ti_msp_dl_config.h" +DL_TimerG_backupConfig gQEI_0Backup; + /* * ======== SYSCFG_DL_init ======== * Perform any initialization needed before using any board APIs @@ -50,19 +52,47 @@ SYSCONFIG_WEAK void SYSCFG_DL_init(void) SYSCFG_DL_GPIO_init(); /* Module-Specific Initializations*/ SYSCFG_DL_SYSCTL_init(); + SYSCFG_DL_QEI_0_init(); SYSCFG_DL_VREF_init(); SYSCFG_DL_SYSTICK_init(); + /* Ensure backup structures have no valid state */ + gQEI_0Backup.backupRdy = false; + +} +/* + * User should take care to save and restore register configuration in application. + * See Retention Configuration section for more details. + */ +SYSCONFIG_WEAK bool SYSCFG_DL_saveConfiguration(void) +{ + bool retStatus = true; + + retStatus &= DL_TimerG_saveConfiguration(QEI_0_INST, &gQEI_0Backup); + + return retStatus; +} + + +SYSCONFIG_WEAK bool SYSCFG_DL_restoreConfiguration(void) +{ + bool retStatus = true; + + retStatus &= DL_TimerG_restoreConfiguration(QEI_0_INST, &gQEI_0Backup, false); + + return retStatus; } SYSCONFIG_WEAK void SYSCFG_DL_initPower(void) { DL_GPIO_reset(GPIOA); DL_GPIO_reset(GPIOB); + DL_TimerG_reset(QEI_0_INST); DL_VREF_reset(VREF); DL_GPIO_enablePower(GPIOA); DL_GPIO_enablePower(GPIOB); + DL_TimerG_enablePower(QEI_0_INST); DL_VREF_enablePower(VREF); delay_cycles(POWER_STARTUP_DELAY); @@ -76,6 +106,9 @@ SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void) DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXIN_IOMUX); DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXOUT_IOMUX); + DL_GPIO_initPeripheralInputFunction(GPIO_QEI_0_PHA_IOMUX,GPIO_QEI_0_PHA_IOMUX_FUNC); + DL_GPIO_initPeripheralInputFunction(GPIO_QEI_0_PHB_IOMUX,GPIO_QEI_0_PHB_IOMUX_FUNC); + DL_GPIO_initDigitalOutputFeatures(LED_A14_PIN_14_IOMUX, DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_DOWN, DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE); @@ -111,128 +144,6 @@ static const DL_SYSCTL_LFCLKConfig gLFCLKConfig = { .monitor = false, .xt1Drive = DL_SYSCTL_LFXT_DRIVE_STRENGTH_HIGHEST, }; - - -/////////////////////////////////////////////////////////////// - - -void DL_SYSCTL_setHFCLKSourceHFXTParams (DL_SYSCTL_HFXT_RANGE range, uint32_t startupTime, bool monitorEnable) -{ - uint32_t register_temp = SYSCTL->SOCLOCK.HFCLKCLKCFG; - - register_temp &= ~(SYSCTL_HFCLKCLKCFG_HFXTRSEL_MASK | SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_MASK); - - switch(range) - { - case DL_SYSCTL_HFXT_RANGE_4_8_MHZ : register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE4TO8); break; - case DL_SYSCTL_HFXT_RANGE_8_16_MHZ : register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE8TO16); break; - case DL_SYSCTL_HFXT_RANGE_16_32_MHZ: register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE16TO32); break; - case DL_SYSCTL_HFXT_RANGE_32_48_MHZ: register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE32TO48); break; - } - register_temp |= (monitorEnable) ? (SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_ENABLE) : (SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_DISABLE); - - SYSCTL->SOCLOCK.HFCLKCLKCFG = register_temp; - - SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_HFXTEN_ENABLE; // 必须启动 否则频率不准 - - SYSCTL->SOCLOCK.HSCLKEN = SYSCTL_HSCLKEN_SYSPLLEN_ENABLE | SYSCTL_HSCLKEN_USEEXTHFCLK_ENABLE; - SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKCFG_HSCLKSEL_HFCLKCLK; - - - - -} - - - - - -void DL_SYSCTL_configSYSPLL (const DL_SYSCTL_SYSPLLConfig *config) -{ - uint32_t register_temp = 0; - - - SYSCTL->SOCLOCK.HSCLKEN &= ~(SYSCTL_HSCLKEN_SYSPLLEN_MASK); - - { - register_temp = SYSCTL->SOCLOCK.SYSPLLCFG0; - - register_temp &= ~(SYSCTL_SYSPLLCFG0_SYSPLLREF_MASK | SYSCTL_SYSPLLCFG0_MCLK2XVCO_MASK - | SYSCTL_SYSPLLCFG0_ENABLECLK0_MASK | SYSCTL_SYSPLLCFG0_ENABLECLK1_MASK | SYSCTL_SYSPLLCFG0_ENABLECLK2X_MASK - | SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK ); - register_temp |= config->rDivClk2x ; - register_temp |= config->rDivClk1 ; - register_temp |= config->rDivClk0 ; - register_temp |= config->enableCLK2x ; - register_temp |= config->enableCLK1 ; - register_temp |= config->enableCLK0 ; - register_temp |= config->sysPLLMCLK ; - register_temp |= config->sysPLLRef ; - - SYSCTL->SOCLOCK.SYSPLLCFG0 = register_temp; - } - - - { - register_temp = SYSCTL->SOCLOCK.SYSPLLCFG1; - - register_temp &= ~(SYSCTL_SYSPLLCFG1_PDIV_MASK | SYSCTL_SYSPLLCFG1_QDIV_MASK); - register_temp |= (config->qDiv << SYSCTL_SYSPLLCFG1_QDIV_OFS ); - register_temp |= (config->pDiv); - - SYSCTL->SOCLOCK.SYSPLLCFG1 = register_temp; - } - - { - SYSCTL->SOCLOCK.SYSPLLPARAM0 = - *(volatile uint32_t *) ((uint32_t) config->inputFreq); - SYSCTL->SOCLOCK.SYSPLLPARAM1 = - *(volatile uint32_t *) ((uint32_t) config->inputFreq + (uint32_t) 0x4); - } - - - SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_SYSPLLEN_ENABLE; - - while ((DL_SYSCTL_getClockStatus() & SYSCTL_CLKSTATUS_SYSPLLGOOD_MASK) != - DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD) { - ; - } - - - - -} - -void DL_SYSCTL_setLFCLKSourceLFXT (const DL_SYSCTL_LFCLKConfig *config) -{ - uint32_t register_temp = SYSCTL->SOCLOCK.LFCLKCFG; - - register_temp &= ~(SYSCTL_LFCLKCFG_XT1DRIVE_MASK | SYSCTL_LFCLKCFG_MONITOR_MASK | SYSCTL_LFCLKCFG_LOWCAP_MASK); - register_temp |= (config->lowCap) ? (SYSCTL_LFCLKCFG_LOWCAP_ENABLE) : (SYSCTL_LFCLKCFG_LOWCAP_DISABLE); - register_temp |= (config->monitor) ? (SYSCTL_LFCLKCFG_MONITOR_ENABLE) : (SYSCTL_LFCLKCFG_MONITOR_DISABLE); - register_temp |= (config->xt1Drive); - - SYSCTL->SOCLOCK.LFCLKCFG = register_temp; - - - - -} - - - - -void DL_SYSCTL_switchMCLKfromSYSOSCtoHSCLK (DL_SYSCTL_HSCLK_SOURCE source) -{ - - SYSCTL->SOCLOCK.HSCLKCFG = (uint32_t) source; - SYSCTL->SOCLOCK.MCLKCFG |= SYSCTL_MCLKCFG_USEHSCLK_ENABLE; - -} - - -//////////////////////////////////////////////////////////////////////////// - SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void) { @@ -258,6 +169,27 @@ SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void) } +static const DL_TimerG_ClockConfig gQEI_0ClockConfig = { + .clockSel = DL_TIMER_CLOCK_BUSCLK, + .divideRatio = DL_TIMER_CLOCK_DIVIDE_1, + .prescale = 0U +}; + + +SYSCONFIG_WEAK void SYSCFG_DL_QEI_0_init(void) { + + DL_TimerG_setClockConfig( + QEI_0_INST, (DL_TimerG_ClockConfig *) &gQEI_0ClockConfig); + + DL_TimerG_configQEI(QEI_0_INST, DL_TIMER_QEI_MODE_2_INPUT, + DL_TIMER_CC_INPUT_INV_NOINVERT, DL_TIMER_CC_0_INDEX); + DL_TimerG_configQEI(QEI_0_INST, DL_TIMER_QEI_MODE_2_INPUT, + DL_TIMER_CC_INPUT_INV_NOINVERT, DL_TIMER_CC_1_INDEX); + DL_TimerG_setLoadValue(QEI_0_INST, 65535); + DL_TimerG_enableClock(QEI_0_INST); +} + + static const DL_VREF_Config gVREFConfig = { .vrefEnable = DL_VREF_ENABLE_DISABLE, diff --git a/libraries/sdk/ti_config/ti_msp_dl_config.h b/libraries/sdk/ti_config/ti_msp_dl_config.h index c7ee4e9..6294e8b 100644 --- a/libraries/sdk/ti_config/ti_msp_dl_config.h +++ b/libraries/sdk/ti_config/ti_msp_dl_config.h @@ -87,6 +87,23 @@ extern "C" { + +/* Defines for QEI_0 */ +#define QEI_0_INST TIMG8 +#define QEI_0_INST_IRQHandler TIMG8_IRQHandler +#define QEI_0_INST_INT_IRQN (TIMG8_INT_IRQn) +/* Pin configuration defines for QEI_0 PHA Pin */ +#define GPIO_QEI_0_PHA_PORT GPIOB +#define GPIO_QEI_0_PHA_PIN DL_GPIO_PIN_6 +#define GPIO_QEI_0_PHA_IOMUX (IOMUX_PINCM23) +#define GPIO_QEI_0_PHA_IOMUX_FUNC IOMUX_PINCM23_PF_TIMG8_CCP0 +/* Pin configuration defines for QEI_0 PHB Pin */ +#define GPIO_QEI_0_PHB_PORT GPIOB +#define GPIO_QEI_0_PHB_PIN DL_GPIO_PIN_7 +#define GPIO_QEI_0_PHB_IOMUX (IOMUX_PINCM24) +#define GPIO_QEI_0_PHB_IOMUX_FUNC IOMUX_PINCM24_PF_TIMG8_CCP1 + + /* Defines for VREF */ #define VREF_VOLTAGE_MV 3300 #define GPIO_VREF_VREFPOS_PORT GPIOA @@ -126,10 +143,13 @@ void SYSCFG_DL_init(void); void SYSCFG_DL_initPower(void); void SYSCFG_DL_GPIO_init(void); void SYSCFG_DL_SYSCTL_init(void); +void SYSCFG_DL_QEI_0_init(void); void SYSCFG_DL_VREF_init(void); void SYSCFG_DL_SYSTICK_init(void); +bool SYSCFG_DL_saveConfiguration(void); +bool SYSCFG_DL_restoreConfiguration(void); #ifdef __cplusplus } diff --git a/project/code/Beep.c b/project/code/Beep.c new file mode 100644 index 0000000..1b4b035 --- /dev/null +++ b/project/code/Beep.c @@ -0,0 +1,33 @@ +#include "Beep.h" +#include "zf_driver_gpio.h" + +static int beep_time=0; +static int beep_T; +void beep_init(int t){ + //gpio_init(P33_10, GPO, 0, GPO_PUSH_PULL); // 蜂鸣器初始化 + gpio_init(A14, GPO, 0, GPO_PUSH_PULL); + beep_T=t; +} +void beep_on(void){ + // pwm_set_duty(ATOM2_CH0_P33_10,5000); + //gpio_set_level(P33_10,1); + gpio_set_level(A14,1); +} +void beep_off(void){ + // pwm_set_duty(ATOM2_CH0_P33_10,0); + //gpio_set_level(P33_10,0); + gpio_set_level(A14,0); +} +void beep_on_time(int ms){ + beep_time=ms/beep_T; +} + +void beep_actuator(void){ + if(beep_time>0){ + beep_on(); + beep_time--; + } + else{ + beep_off(); + } +} diff --git a/project/code/Beep.h b/project/code/Beep.h new file mode 100644 index 0000000..0fdff50 --- /dev/null +++ b/project/code/Beep.h @@ -0,0 +1,12 @@ +#ifndef __BEEP_H +#define __BEEP_H + +//初始化,参数为周期单位ms +void beep_init(int t); +void beep_on(void); +void beep_off(void); +//蜂鸣器鸣叫指定时间,参数为时间单位ms +void beep_on_time(int ms); +void beep_actuator(void); + +#endif \ No newline at end of file diff --git a/project/code/Command.c b/project/code/Command.c new file mode 100644 index 0000000..5c11324 --- /dev/null +++ b/project/code/Command.c @@ -0,0 +1,66 @@ +#include "Command.h" +#include "zf_driver_uart.h" +#include "zf_common_interrupt.h" +#include "ti/driverlib/dl_uart_main.h" +#include "zf_common_fifo.h" + +volatile fifo_struct command_fifo = {0}; +volatile uint8_t command_fifo_buffer[COMMAND_FIFO_BUFFER_SIZE] = {0}; +uint8_t command_sum(uint8_t* data,int len); + +void command_callback(uint32 state, void *ptr) +{ + while(false == DL_UART_isRXFIFOEmpty(UART2))//读取到一个数据 + { + fifo_write_element((fifo_struct*)&command_fifo,DL_UART_Main_receiveData(UART2));//写入软件FIFO + } +} +void command_init() +{ + uart_init(UART_2,115200,UART2_TX_B15,UART2_RX_B16); + uart_set_interrupt_config(UART_2,UART_INTERRUPT_CONFIG_RX_ENABLE); + interrupt_set_priority(UART2_INT_IRQn,1);//设置为与主要任务平行的优先级 + + //开启发送DMA + + //开启硬件FIFO + DL_UART_Main_enableFIFOs(UART2); + DL_UART_Main_setRXFIFOThreshold(UART2,DL_UART_MAIN_RX_FIFO_LEVEL_1_2_FULL); + + //设置软件FIFO + fifo_init((fifo_struct *)&command_fifo,FIFO_DATA_8BIT,(void*)command_fifo_buffer,COMMAND_FIFO_BUFFER_SIZE); + //设置中断回调 + uart_set_callback(UART_2,command_callback,NULL); +} +//从软件FIFO中解析数据包并执行 +void command_task() +{ + +} +//DMA发送使用的地址 +uint8_t angle_velocity_data[6] = {0}; +//发送速度前馈 +void command_send_angle_velocity(float* pointer_angle_velocity) +{ + //等待上一次DMA发送完成 + + //填充数据 + uint8_t* p = (uint8_t*)pointer_angle_velocity; + angle_velocity_data[0]=0xA1; + angle_velocity_data[1]=*(p++); + angle_velocity_data[2]=*(p++); + angle_velocity_data[3]=*(p++); + angle_velocity_data[4]=*(p++); + angle_velocity_data[5]=command_sum(angle_velocity_data,5); + //DMA发送(非阻塞) + +} +uint8_t command_sum(uint8_t* data,int len) +{ + uint8_t sum = 0; + for(int i=0;i 0) + { + grayscale_sensor_position /= adc_normalized_sum; + } + else + { + grayscale_sensor_position = 0; // 避免除以零,默认位置为0 + } + grayscale_sensor_position = grayscale_sensor_position_prev + FILTER_ALPHA * (grayscale_sensor_position - grayscale_sensor_position_prev); + grayscale_sensor_position_prev = grayscale_sensor_position; +} \ No newline at end of file diff --git a/project/code/GrayscaleSensor.h b/project/code/GrayscaleSensor.h new file mode 100644 index 0000000..5f4c743 --- /dev/null +++ b/project/code/GrayscaleSensor.h @@ -0,0 +1,13 @@ +#ifndef GRAYSCALESENSOR_H +#define GRAYSCALESENSOR_H + +#include "zf_common_typedef.h" + +extern volatile float grayscale_sensor_position; // 存储小车相对于黑线的位置 + +void grayscale_sensor_init(void); +void grayscale_sensor_scan(void); +void grayscale_sensor_set_white(void); +void grayscale_sensor_set_black(void); + +#endif \ No newline at end of file diff --git a/project/code/ICM_42688.c b/project/code/ICM_42688.c new file mode 100644 index 0000000..761075d --- /dev/null +++ b/project/code/ICM_42688.c @@ -0,0 +1,172 @@ +#include "ICM_42688.h" + +//================================================================================================== +// 内部变量 +//================================================================================================== + +static float accel_scale = 1.0f; // 加速度计 LSB → g +static float gyro_scale = 1.0f; // 陀螺仪 LSB → °/s + +//================================================================================================== +// SPI 底层操作宏 +//================================================================================================== + +#define ICM42688_WRITE_REG(reg, data) spi_write_8bit_register(ICM42688_SPI, reg, data) +#define ICM42688_READ_REGS(reg, data, num) spi_read_8bit_registers(ICM42688_SPI, (reg) | 0x80, data, num) + +//================================================================================================== +// 静态函数 — 寄存器级 SPI 操作 +//================================================================================================== + +/** @brief 向指定寄存器写入一字节 + * @param reg 寄存器地址 + * @param data 写入值 + * 片选 → 写寄存器 → 释放片选 + */ +static void icm42688_write_reg(uint8_t reg, uint8_t data) +{ + ICM42688_CS_LEVEL(0); + ICM42688_WRITE_REG(reg, data); + ICM42688_CS_LEVEL(1); +} + +/** @brief 从指定寄存器连续读取多字节 + * @param reg 起始寄存器地址 + * @param data 输出缓冲区指针 + * @param num 读取字节数 + * 片选 → 读多字节 → 释放片选 + */ +static void icm42688_read_regs(uint8_t reg, uint8_t *data, uint8_t num) +{ + ICM42688_CS_LEVEL(0); + ICM42688_READ_REGS(reg, data, num); + ICM42688_CS_LEVEL(1); +} + +/** @brief 将两个 uint8 拼接为 int16(大端序) + * @param hi 高字节 + * @param lo 低字节 + * @return 有符号 16 位整数 + */ +static int16_t icm42688_combine_bytes(uint8_t hi, uint8_t lo) +{ + return (int16_t)(((uint16_t)hi << 8) | lo); +} + +/** @brief 配置加速度计/陀螺仪的量程和输出速率 + * @param afs 加速度计量程 + * @param aodr 加速度计输出速率 + * @param gfs 陀螺仪量程 + * @param godr 陀螺仪输出速率 + * 同时更新内部比例系数 accel_scale / gyro_scale + */ +static void icm42688_set_range_odr(enum icm42688_afs afs, enum icm42688_aodr aodr, + enum icm42688_gfs gfs, enum icm42688_godr godr) +{ + icm42688_write_reg(ICM42688_ACCEL_CONFIG0, (afs << 5) | (aodr + 1)); + icm42688_write_reg(ICM42688_GYRO_CONFIG0, (gfs << 5) | (godr + 1)); + + switch (afs) { + case ICM42688_AFS_2G: accel_scale = 2000.0f / 32768.0f; break; + case ICM42688_AFS_4G: accel_scale = 4000.0f / 32768.0f; break; + case ICM42688_AFS_8G: accel_scale = 8000.0f / 32768.0f; break; + case ICM42688_AFS_16G: accel_scale = 16000.0f / 32768.0f; break; + default: accel_scale = 1.0f; break; + } + + switch (gfs) { + case ICM42688_GFS_15_625DPS: gyro_scale = 15.625f / 32768.0f; break; + case ICM42688_GFS_31_25DPS: gyro_scale = 31.25f / 32768.0f; break; + case ICM42688_GFS_62_5DPS: gyro_scale = 62.5f / 32768.0f; break; + case ICM42688_GFS_125DPS: gyro_scale = 125.0f / 32768.0f; break; + case ICM42688_GFS_250DPS: gyro_scale = 250.0f / 32768.0f; break; + case ICM42688_GFS_500DPS: gyro_scale = 500.0f / 32768.0f; break; + case ICM42688_GFS_1000DPS: gyro_scale = 1000.0f / 32768.0f; break; + case ICM42688_GFS_2000DPS: gyro_scale = 2000.0f / 32768.0f; break; + default: gyro_scale = 1.0f; break; + } +} + +//================================================================================================== +// 公开接口 +//================================================================================================== + +/** @brief 返回当前陀螺仪比例系数 (LSB → °/s) + * 供 imu_calibrate_gyro() 将原始 ADC 均值转换为物理偏移量 + */ +float icm42688_gyro_scale(void) +{ + return gyro_scale; +} + +/** @brief 初始化 ICM-42688 + * 1. 初始化 SPI 外设和 CS 引脚 + * 2. 读取 WHO_AM_I 进行自检(超时 500ms 后报错死循环) + * 3. 复位并配置量程/速率(默认 ±16G / ±2000dps / 200Hz ODR) + * 4. 设置为低噪声模式 + * 由 imu_init() 内部调用,用户一般不直接调用 + */ +void icm42688_init(void) +{ + system_delay_ms(10); + spi_init(ICM42688_SPI, SPI_MODE0, ICM42688_SPI_SPEED, + ICM42688_SPC_PIN, ICM42688_SDI_PIN, ICM42688_SDO_PIN, SPI_CS_NULL); + gpio_init(ICM42688_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + + uint8_t model = 0xFF; + int timeout = 50; + while (1) { + icm42688_read_regs(ICM42688_WHO_AM_I, &model, 1); + if (model == 0x47) { + break; + } + ICM42688_DELAY_MS(10); + if (--timeout < 0) { + zf_log(0, "ICM42688 Init Error!"); + while (1); + } + } + + icm42688_write_reg(ICM42688_PWR_MGMT0, 0x00); + ICM42688_DELAY_MS(20); + + // 如果修改了采样频率(定时器中断周期),则需要对应修改下方的配置 + icm42688_set_range_odr(ICM42688_AFS_16G, ICM42688_AODR_200HZ, + ICM42688_GFS_2000DPS, ICM42688_GODR_200HZ); + + icm42688_write_reg(ICM42688_PWR_MGMT0, 0x0F); + ICM42688_DELAY_MS(10); +} + +/** @brief 读取全部传感器数据(加速度 + 角速度) + * @param data 输出结构体指针 + * 一次 12 字节 SPI 突发从 ACCEL_DATA_X1 开始连续读取 + * 读取顺序: AX→AY→AZ→GX→GY→GZ(与传感器内部 FIFO 顺序一致) + */ +void icm42688_read_all(icm42688_data_t *data) +{ + uint8_t buf[12]; + icm42688_read_regs(ICM42688_ACCEL_DATA_X1, buf, 12); + + data->accel_x = accel_scale * icm42688_combine_bytes(buf[0], buf[1]); + data->accel_y = accel_scale * icm42688_combine_bytes(buf[2], buf[3]); + data->accel_z = accel_scale * icm42688_combine_bytes(buf[4], buf[5]); + + data->gyro_x = gyro_scale * icm42688_combine_bytes(buf[6], buf[7]); + data->gyro_y = gyro_scale * icm42688_combine_bytes(buf[8], buf[9]); + data->gyro_z = gyro_scale * icm42688_combine_bytes(buf[10], buf[11]); +} + +/** @brief 读取陀螺仪原始 ADC 值(不做比例换算) + * @param gx/gy/gz 输出 int16 原始值指针 + * 供 imu_calibrate_gyro() 在静止状态下采集原始数据计算零偏 + */ +void icm42688_read_gyro_raw(int16_t *gx, int16_t *gy, int16_t *gz) +{ + uint8_t buf[6]; + icm42688_read_regs(ICM42688_GYRO_DATA_X1, buf, 6); + + *gx = icm42688_combine_bytes(buf[0], buf[1]); + *gy = icm42688_combine_bytes(buf[2], buf[3]); + *gz = icm42688_combine_bytes(buf[4], buf[5]); +} diff --git a/project/code/ICM_42688.h b/project/code/ICM_42688.h new file mode 100644 index 0000000..17d8f99 --- /dev/null +++ b/project/code/ICM_42688.h @@ -0,0 +1,198 @@ +#ifndef __ICM_42688_H +#define __ICM_42688_H + +#include "zf_common_headfile.h" + +//================================================================================================== +// ICM-42688-P 6轴惯性传感器 硬件抽象层 +// 本文件仅负责 SPI 通信、寄存器读写、原始数据获取,不涉及姿态解算 +//================================================================================================== + +// SPI 引脚定义 +#define ICM42688_SPI (SPI_1) +#define ICM42688_SPI_SPEED (8 * 1000 * 1000) +#define ICM42688_SPC_PIN (SPI1_SCK_B23) +#define ICM42688_SDI_PIN (SPI1_MOSI_B22) +#define ICM42688_SDO_PIN (SPI1_MISO_B21) +#define ICM42688_CS_PIN (B19) + +#define ICM42688_DELAY_MS(time) (system_delay_ms(time)) +#define ICM42688_CS_LEVEL(level) gpio_set_level(ICM42688_CS_PIN, level) + +// 传感器原始数据(物理单位:加速度 g,角速度 °/s,传感器坐标系) +typedef struct { + float accel_x, accel_y, accel_z; + float gyro_x, gyro_y, gyro_z; +} icm42688_data_t; + +// 加速度计量程 +enum icm42688_afs { + ICM42688_AFS_16G, + ICM42688_AFS_8G, + ICM42688_AFS_4G, + ICM42688_AFS_2G, +}; + +// 加速度计输出速率 (ODR) +enum icm42688_aodr { + ICM42688_AODR_32000HZ, + ICM42688_AODR_16000HZ, + ICM42688_AODR_8000HZ, + ICM42688_AODR_4000HZ, + ICM42688_AODR_2000HZ, + ICM42688_AODR_1000HZ, + ICM42688_AODR_200HZ, + ICM42688_AODR_100HZ, + ICM42688_AODR_50HZ, + ICM42688_AODR_25HZ, + ICM42688_AODR_12_5HZ, + ICM42688_AODR_6_25HZ, + ICM42688_AODR_3_125HZ, + ICM42688_AODR_1_5625HZ, + ICM42688_AODR_500HZ, +}; + +// 陀螺仪量程 +enum icm42688_gfs { + ICM42688_GFS_2000DPS, + ICM42688_GFS_1000DPS, + ICM42688_GFS_500DPS, + ICM42688_GFS_250DPS, + ICM42688_GFS_125DPS, + ICM42688_GFS_62_5DPS, + ICM42688_GFS_31_25DPS, + ICM42688_GFS_15_625DPS, +}; + +// 陀螺仪输出速率 (ODR) +enum icm42688_godr { + ICM42688_GODR_32000HZ, + ICM42688_GODR_16000HZ, + ICM42688_GODR_8000HZ, + ICM42688_GODR_4000HZ, + ICM42688_GODR_2000HZ, + ICM42688_GODR_1000HZ, + ICM42688_GODR_200HZ, + ICM42688_GODR_100HZ, + ICM42688_GODR_50HZ, + ICM42688_GODR_25HZ, + ICM42688_GODR_12_5HZ, + ICM42688_GODR_X0HZ, + ICM42688_GODR_X1HZ, + ICM42688_GODR_X2HZ, + ICM42688_GODR_500HZ, +}; + +//================================================================================================== +// 公开接口(由 IMU 层调用,用户一般不直接使用) +//================================================================================================== + +/** @brief 初始化 ICM-42688(SPI 配置 + 寄存器设置 + 自检) + * 由 imu_init() 内部调用,用户无需单独调用 + */ +void icm42688_init(void); + +/** @brief 读取加速度和角速度(物理单位,传感器坐标系) + * @param data 输出结构体指针 + * 一次 12 字节 SPI 突发读取,节省通信时间 + */ +void icm42688_read_all(icm42688_data_t *data); + +/** @brief 读取陀螺仪原始 ADC 值(不含比例换算) + * @param gx/gy/gz 输出 int16 原始值指针 + * 供校准函数使用 + */ +void icm42688_read_gyro_raw(int16_t *gx, int16_t *gy, int16_t *gz); + +/** @brief 返回当前陀螺仪比例系数 (LSB → °/s) + * 供校准函数计算零偏 + */ +float icm42688_gyro_scale(void); + +//================================================================================================== +// 寄存器地址 +//================================================================================================== + +// Bank 0 +#define ICM42688_DEVICE_CONFIG 0x11 +#define ICM42688_DRIVE_CONFIG 0x13 +#define ICM42688_INT_CONFIG 0x14 +#define ICM42688_FIFO_CONFIG 0x16 +#define ICM42688_TEMP_DATA1 0x1D +#define ICM42688_TEMP_DATA0 0x1E +#define ICM42688_ACCEL_DATA_X1 0x1F +#define ICM42688_ACCEL_DATA_X0 0x20 +#define ICM42688_ACCEL_DATA_Y1 0x21 +#define ICM42688_ACCEL_DATA_Y0 0x22 +#define ICM42688_ACCEL_DATA_Z1 0x23 +#define ICM42688_ACCEL_DATA_Z0 0x24 +#define ICM42688_GYRO_DATA_X1 0x25 +#define ICM42688_GYRO_DATA_X0 0x26 +#define ICM42688_GYRO_DATA_Y1 0x27 +#define ICM42688_GYRO_DATA_Y0 0x28 +#define ICM42688_GYRO_DATA_Z1 0x29 +#define ICM42688_GYRO_DATA_Z0 0x2A +#define ICM42688_TMST_FSYNCH 0x2B +#define ICM42688_TMST_FSYNCL 0x2C +#define ICM42688_INT_STATUS 0x2D +#define ICM42688_FIFO_COUNTH 0x2E +#define ICM42688_FIFO_COUNTL 0x2F +#define ICM42688_FIFO_DATA 0x30 +#define ICM42688_APEX_DATA0 0x31 +#define ICM42688_APEX_DATA1 0x32 +#define ICM42688_APEX_DATA2 0x33 +#define ICM42688_APEX_DATA3 0x34 +#define ICM42688_APEX_DATA4 0x35 +#define ICM42688_APEX_DATA5 0x36 +#define ICM42688_INT_STATUS2 0x37 +#define ICM42688_INT_STATUS3 0x38 +#define ICM42688_SIGNAL_PATH_RESET 0x4B +#define ICM42688_INTF_CONFIG0 0x4C +#define ICM42688_INTF_CONFIG1 0x4D +#define ICM42688_PWR_MGMT0 0x4E +#define ICM42688_GYRO_CONFIG0 0x4F +#define ICM42688_ACCEL_CONFIG0 0x50 +#define ICM42688_GYRO_CONFIG1 0x51 +#define ICM42688_GYRO_ACCEL_CONFIG0 0x52 +#define ICM42688_ACCEL_CONFIG1 0x53 +#define ICM42688_TMST_CONFIG 0x54 +#define ICM42688_APEX_CONFIG0 0x56 +#define ICM42688_SMD_CONFIG 0x57 +#define ICM42688_FIFO_CONFIG1 0x5F +#define ICM42688_FIFO_CONFIG2 0x60 +#define ICM42688_FIFO_CONFIG3 0x61 +#define ICM42688_FSYNC_CONFIG 0x62 +#define ICM42688_INT_CONFIG0 0x63 +#define ICM42688_INT_CONFIG1 0x64 +#define ICM42688_INT_SOURCE0 0x65 +#define ICM42688_INT_SOURCE1 0x66 +#define ICM42688_INT_SOURCE3 0x68 +#define ICM42688_INT_SOURCE4 0x69 +#define ICM42688_FIFO_LOST_PKT0 0x6C +#define ICM42688_FIFO_LOST_PKT1 0x6D +#define ICM42688_SELF_TEST_CONFIG 0x70 +#define ICM42688_WHO_AM_I 0x75 +#define ICM42688_REG_BANK_SEL 0x76 + +// Bank 1 +#define ICM42688_SENSOR_CONFIG0 0x03 +#define ICM42688_GYRO_CONFIG_STATIC2 0x0B +#define ICM42688_GYRO_CONFIG_STATIC3 0x0C +#define ICM42688_GYRO_CONFIG_STATIC4 0x0D +#define ICM42688_GYRO_CONFIG_STATIC5 0x0E +#define ICM42688_GYRO_CONFIG_STATIC6 0x0F +#define ICM42688_GYRO_CONFIG_STATIC7 0x10 +#define ICM42688_GYRO_CONFIG_STATIC8 0x11 +#define ICM42688_GYRO_CONFIG_STATIC9 0x12 +#define ICM42688_GYRO_CONFIG_STATIC10 0x13 +#define ICM42688_XG_ST_DATA 0x5F +#define ICM42688_YG_ST_DATA 0x60 +#define ICM42688_ZG_ST_DATA 0x61 +#define ICM42688_TMSTVAL0 0x62 +#define ICM42688_TMSTVAL1 0x63 +#define ICM42688_TMSTVAL2 0x64 +#define ICM42688_INTF_CONFIG4 0x7A +#define ICM42688_INTF_CONFIG5 0x7B +#define ICM42688_INTF_CONFIG6 0x7C + +#endif diff --git a/project/code/IMU.c b/project/code/IMU.c new file mode 100644 index 0000000..9fae9a1 --- /dev/null +++ b/project/code/IMU.c @@ -0,0 +1,374 @@ +#include "IMU.h" +#include + +//================================================================================================== +// 常量 +//================================================================================================== + +#ifndef PI +#define PI 3.141592654f +#endif + +#define TWO_KP_DEF (2.0f * 0.5f) // Mahony 比例增益(默认 1.0) +#define TWO_KI_DEF (2.0f * 0.0f) // Mahony 积分增益(默认 0, 关闭) + +//================================================================================================== +// Mahony 滤波器状态(静态,本文件内可见) +//================================================================================================== + +static float inv_sample_freq; // 1 / 采样频率 +static float two_kp = TWO_KP_DEF; // 比例增益 +static float two_ki = TWO_KI_DEF; // 积分增益 +static float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f; // 姿态四元数 +static float integral_fbx = 0.0f, integral_fby = 0.0f, integral_fbz = 0.0f; // 积分误差项 + +//================================================================================================== +// 陀螺仪零偏(由 imu_calibrate_gyro 填入) +//================================================================================================== + +static float gyro_bias_x = 0.0f; +static float gyro_bias_y = 0.0f; +static float gyro_bias_z = 0.0f; + +//================================================================================================== +// 姿态输出 +//================================================================================================== + +volatile imu_attitude_t imu_angle; + +volatile int yaw_round_count = 0; + +volatile static float yaw_angle_last = 0.0f; + + +//================================================================================================== +// 双二阶滤波器状态 +//================================================================================================== + +static biquad_state_t bq_gyro_x, bq_gyro_y, bq_gyro_z; +static biquad_state_t bq_accel_x, bq_accel_y, bq_accel_z; + +//================================================================================================== +// 公开接口实现 +//================================================================================================== + +/** @brief 初始化 IMU + * @param sample_freq_hz 采样频率(Hz),等于定时器中断频率 + * 1. 初始化 ICM-42688 硬件 + * 2. 配置 Mahony 采样周期 + * 3. 初始化各轴陀螺仪/加速度计双二阶滤波器 + * 滤波器参数: + * 陀螺仪 X/Y/Z: 低通 30/20/30Hz → 滤除高频振动 + * 加速度计 X/Y/Z: 低通 10Hz → 重力矢量提取(响应慢但稳) + */ +void imu_init(int sample_freq_hz) +{ + icm42688_init(); + + inv_sample_freq = 1.0f / sample_freq_hz; + + biquad_init(&bq_gyro_x, BIQUAD_LOWPASS, sample_freq_hz, 30, 0.7071f); + biquad_init(&bq_gyro_y, BIQUAD_LOWPASS, sample_freq_hz, 20, 0.5773f); + biquad_init(&bq_gyro_z, BIQUAD_LOWPASS, sample_freq_hz, 30, 0.5773f); + biquad_init(&bq_accel_x, BIQUAD_LOWPASS, sample_freq_hz, 10, 0.5773f); + biquad_init(&bq_accel_y, BIQUAD_LOWPASS, sample_freq_hz, 10, 0.5773f); + biquad_init(&bq_accel_z, BIQUAD_LOWPASS, sample_freq_hz, 10, 0.5773f); +} + +/** @brief 更新姿态(定时器 ISR 中按固定频率调用) + * 数据流:传感器 → 零偏修正 → 双二阶滤波 → Mahony → 欧拉角 → Yaw 连续角度 + * 传感器坐标系直通,无坐标轴转换 + * 陀螺仪数据不进 Mahony 前只做偏置修正(Mahony 内部自带角速度积分处理) + * 加速度数据经低通滤波后送入 Mahony 做重力矢量参考 + */ +void imu_update(void) +{ + icm42688_data_t raw; + icm42688_read_all(&raw); + + // 零偏修正 + raw.gyro_x -= gyro_bias_x; + raw.gyro_y -= gyro_bias_y; + raw.gyro_z -= gyro_bias_z; + + // 滤波(传感器坐标系,不做轴转换) + imu_angle.gyro_x = biquad_apply(&bq_gyro_x, raw.gyro_x); + imu_angle.gyro_y = biquad_apply(&bq_gyro_y, raw.gyro_y); + imu_angle.gyro_z = biquad_apply(&bq_gyro_z, raw.gyro_z); + + float ax_f = biquad_apply(&bq_accel_x, raw.accel_x); + float ay_f = biquad_apply(&bq_accel_y, raw.accel_y); + float az_f = biquad_apply(&bq_accel_z, raw.accel_z); + + // Mahony AHRS 姿态解算 + mahony_ahrs_update(raw.gyro_x, raw.gyro_y, raw.gyro_z, ax_f, ay_f, az_f); + + // Yaw 连续角度跟踪(处理 ±180° 跳变) + if (imu_angle.yaw - yaw_angle_last > 180.0f) { + yaw_round_count--; + } else if (imu_angle.yaw - yaw_angle_last < -180.0f) { + yaw_round_count++; + } + yaw_angle_last = imu_angle.yaw; +} + +/** @brief 陀螺仪零偏校准 + * 必须在设备完全静止时调用,采集 3 秒陀螺仪原始数据 + * 每秒采样 1000 点取均值,3 秒的均值再取平均,乘以比例系数得到 °/s 零偏 + * 校准结果自动存入 gyro_bias_x/y/z,在后续 imu_update() 中生效 + */ +void imu_calibrate_gyro(void) +{ + #define CALIB_SECONDS 3 + #define CALIB_SAMPLES 1000 + + static float gyro_history[3][CALIB_SECONDS]; + int32_t gyro_sum[3] = {0, 0, 0}; + uint32_t sec_cnt = 0, sample_cnt = 0; + + system_delay_ms(1000); + system_delay_ms(1000); + + do { + system_delay_us(1000); + int16_t gx_r, gy_r, gz_r; + icm42688_read_gyro_raw(&gx_r, &gy_r, &gz_r); + + if (sample_cnt < CALIB_SAMPLES) { + gyro_sum[0] += gx_r; + gyro_sum[1] += gy_r; + gyro_sum[2] += gz_r; + sample_cnt++; + } else { + gyro_history[0][sec_cnt] = (float)gyro_sum[0] / CALIB_SAMPLES; + gyro_history[1][sec_cnt] = (float)gyro_sum[1] / CALIB_SAMPLES; + gyro_history[2][sec_cnt] = (float)gyro_sum[2] / CALIB_SAMPLES; + gyro_sum[0] = 0; + gyro_sum[1] = 0; + gyro_sum[2] = 0; + sample_cnt = 0; + sec_cnt++; + } + } while (sec_cnt < CALIB_SECONDS); + + float sum[3] = {0, 0, 0}; + float k = icm42688_gyro_scale() / CALIB_SECONDS; + for (uint8_t i = 0; i < CALIB_SECONDS; i++) { + sum[0] += gyro_history[0][i]; + sum[1] += gyro_history[1][i]; + sum[2] += gyro_history[2][i]; + } + + gyro_bias_x = k * sum[0]; + gyro_bias_y = k * sum[1]; + gyro_bias_z = k * sum[2]; + +} + +//================================================================================================== +// 算法实现 +//================================================================================================== + +/** @brief Mahony AHRS 6轴姿态解算 + * @param gx/gy/gz 陀螺仪角速度 (°/s) + * @param ax/ay/az 加速度计测量值 (g) + * + * 算法流程: + * 1. 角速度转弧度,加速度归一化 + * 2. 由当前四元数估计重力方向 + * 3. 估计重力与测量重力的叉积 → PI 反馈修正陀螺仪 + * 4. 一阶龙格-库塔积分更新四元数 + * 5. 四元数归一化 + * 6. 提取欧拉角写入 imu_angle + * + * 参考: S.O.H. Madgwick "An efficient orientation filter for IMU and MARG sensor arrays" + */ +void mahony_ahrs_update(float gx, float gy, float gz, float ax, float ay, float az) +{ + float recip_norm; + float halfvx, halfvy, halfvz; + float halfex, halfey, halfez; + float qa, qb, qc; + + // 仅当加速度计有读数时执行修正(静止或匀加速时加速度计才可靠) + if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + // 角速度 → rad/s + gx *= ANG2RAD; + gy *= ANG2RAD; + gz *= ANG2RAD; + + // 加速度归一化 + recip_norm = inv_sqrt(ax * ax + ay * ay + az * az); + ax *= recip_norm; + ay *= recip_norm; + az *= recip_norm; + + // 由当前四元数估计重力方向(世界系 Z 轴在传感器系的投影) + halfvx = q1 * q3 - q0 * q2; + halfvy = q0 * q1 + q2 * q3; + halfvz = q0 * q0 - 0.5f + q3 * q3; + + // 叉积 = 估计方向 × 测量方向 → 姿态误差 + halfex = (ay * halfvz - az * halfvy); + halfey = (az * halfvx - ax * halfvz); + halfez = (ax * halfvy - ay * halfvx); + + // 积分反馈(默认 ki=0, 关闭) + if (two_ki > 0.0f) { + integral_fbx += two_ki * halfex * inv_sample_freq; + integral_fby += two_ki * halfey * inv_sample_freq; + integral_fbz += two_ki * halfez * inv_sample_freq; + gx += integral_fbx; + gy += integral_fby; + gz += integral_fbz; + } else { + integral_fbx = 0.0f; + integral_fby = 0.0f; + integral_fbz = 0.0f; + } + + // 比例反馈 + gx += two_kp * halfex; + gy += two_kp * halfey; + gz += two_kp * halfez; + } + + // 四元数一阶积分 (RK1) + gx *= (0.5f * inv_sample_freq); + gy *= (0.5f * inv_sample_freq); + gz *= (0.5f * inv_sample_freq); + qa = q0; qb = q1; qc = q2; + q0 += (-qb * gx - qc * gy - q3 * gz); + q1 += ( qa * gx + qc * gz - q3 * gy); + q2 += ( qa * gy - qb * gz + q3 * gx); + q3 += ( qa * gz + qb * gy - qc * gx); + + // 四元数归一化 + recip_norm = inv_sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recip_norm; + q1 *= recip_norm; + q2 *= recip_norm; + q3 *= recip_norm; + + // 旋转矩阵 → 欧拉角(传感器坐标系) + float r11 = 2.0f * (q0 * q1 + q2 * q3); + float r12 = 1.0f - 2.0f * (q1 * q1 + q2 * q2); + float r21 = 2.0f * (q0 * q2 - q3 * q1); + float r31 = 2.0f * (q0 * q3 + q1 * q2); + float r32 = 1.0f - 2.0f * (q2 * q2 + q3 * q3); + + imu_angle.pitch = RAD2ANG * asinf(r21); + imu_angle.roll = RAD2ANG * atan2f(r11, r12); + imu_angle.yaw = RAD2ANG * atan2f(r31, r32); +} + +/** @brief 双二阶滤波器系数初始化 + * @param state 滤波器状态 + * @param type 滤波器类型 + * @param fs 采样率 (Hz) + * @param fc 截止/中心频率 (Hz) + * @param q 品质因数 + * + * 通用双二阶传递函数: + * H(z) = (b0 + b1*z^-1 + b2*z^-2) / (a0 + a1*z^-1 + a2*z^-2) + * + * Q 值参考: + * 0.5773 Thomson-Bessel → 最平坦群延迟, 相位失真最小 + * 0.7071 Butterworth → 通带最平坦, 常用默认值 + * 0.9565 Chebyshev 1dB → 陡峭过渡带, 允许 1dB 通带波纹 + */ +void biquad_init(biquad_state_t *state, biquad_type_t type, int fs, float fc, float q) +{ + float w0 = 2.0f * PI * fc / fs; + float sin_w0 = sinf(w0); + float cos_w0 = cosf(w0); + float alpha = sin_w0 / (2.0f * q); + + float b0, b1, b2, a0, a1, a2; + + switch (type) { + case BIQUAD_LOWPASS: + b0 = (1.0f - cos_w0) / 2.0f; + b1 = b0 * 2.0f; + b2 = b0; + a0 = 1.0f + alpha; + a1 = -2.0f * cos_w0; + a2 = 1.0f - alpha; + break; + case BIQUAD_HIGHPASS: + b0 = (1.0f + cos_w0) / 2.0f; + b1 = -b0 * 2.0f; + b2 = b0; + a0 = 1.0f + alpha; + a1 = -2.0f * cos_w0; + a2 = 1.0f - alpha; + break; + case BIQUAD_BANDPASS_PEAK: + b0 = alpha; + b1 = 0.0f; + b2 = -alpha; + a0 = 1.0f + alpha; + a1 = -2.0f * cos_w0; + a2 = 1.0f - alpha; + break; + case BIQUAD_BANDSTOP_NOTCH: + b0 = 1.0f; + b1 = -2.0f * cos_w0; + b2 = 1.0f; + a0 = 1.0f + alpha; + a1 = -2.0f * cos_w0; + a2 = 1.0f - alpha; + break; + } + + // 归一化系数(除以 a0) + state->a0 = b0 / a0; + state->a1 = b1 / a0; + state->a2 = b2 / a0; + state->a3 = a1 / a0; + state->a4 = a2 / a0; + state->x1 = 0.0f; + state->x2 = 0.0f; + state->y1 = 0.0f; + state->y2 = 0.0f; +} + +/** @brief 双二阶滤波器单步迭代 + * @param state 滤波器状态 + * @param data 当前输入 + * @return 当前输出 + * + * 差分方程: + * y[n] = a0*x[n] + a1*x[n-1] + a2*x[n-2] - a3*y[n-1] - a4*y[n-2] + */ +float biquad_apply(biquad_state_t *state, float data) +{ + float result = state->a0 * data + + state->a1 * state->x1 + + state->a2 * state->x2 + - state->a3 * state->y1 + - state->a4 * state->y2; + state->x2 = state->x1; + state->x1 = data; + state->y2 = state->y1; + state->y1 = result; + return result; +} + +/** @brief 快速平方根倒数 (Fast Inverse Square Root) + * @param x 输入正数 + * @return 1/sqrt(x) 近似值 + * + * 使用 Quake III 的经典 magic number 0x5f3759df + * 精度约 0.1%, 在无 FPU 的 M0+ 上远快于 1.0f/sqrtf(x) + */ +float inv_sqrt(float x) +{ + float halfx = 0.5f * x; + float y = x; + long i = *(long *)&y; + i = 0x5f3759df - (i >> 1); + y = *(float *)&i; + y = y * (1.5f - (halfx * y * y)); // 一次 Newton 迭代 + return y; +} diff --git a/project/code/IMU.h b/project/code/IMU.h new file mode 100644 index 0000000..897e715 --- /dev/null +++ b/project/code/IMU.h @@ -0,0 +1,105 @@ +#ifndef __IMU_H +#define __IMU_H + +#include "ICM_42688.h" + +//================================================================================================== +// IMU 姿态解算层 +// 负责:传感器数据滤波 → Mahony AHRS 姿态解算 → 欧拉角输出 +// 所有数据基于传感器坐标系(无机体坐标转换) +//================================================================================================== + +#define ANG2RAD 0.01745329252f // 角度制 → 弧度制 +#define RAD2ANG 57.295779513f // 弧度制 → 角度制 + +//================================================================================================== +// 双二阶滤波器 (Biquad Filter) +//================================================================================================== + +/** @brief 滤波器类型 */ +typedef enum { + BIQUAD_LOWPASS, // 低通 + BIQUAD_HIGHPASS, // 高通 + BIQUAD_BANDPASS_PEAK, // 带通(峰值) + BIQUAD_BANDSTOP_NOTCH, // 带阻(陷波) +} biquad_type_t; + +/** @brief 滤波器状态(系数 + 历史值) + * 典型 Q 值: 0.5773 (Thomson-Bessel, 相位线性度好) + * 0.7071 (Butterworth, 最平坦) + * 0.9565 (Chebyshev 1dB, 阻带衰减快) + */ +typedef struct { + float a0, a1, a2, a3, a4; // 传递函数系数 + float x1, x2, y1, y2; // 历史输入/输出 +} biquad_state_t; + +//================================================================================================== +// 姿态输出 +//================================================================================================== + +/** @brief 姿态数据(传感器坐标系,volatile 因为 ISR 写入、主循环读取) */ +typedef struct { + float pitch, roll, yaw; // 欧拉角 (°) + float gyro_x, gyro_y, gyro_z; // 滤波后角速度 (°/s) +} imu_attitude_t; + +extern volatile imu_attitude_t imu_angle; // 当前姿态 +extern volatile int yaw_round_count; + +//================================================================================================== +// 用户接口 +//================================================================================================== + +/** @brief 初始化 IMU(传感器 + 滤波器 + Mahony) + * @param sample_freq_hz 采样频率(Hz),需与定时器中断频率一致,典型值 200 + * 用户只需调用此函数,内部自动调用 icm42688_init() + */ +void imu_init(int sample_freq_hz); + +/** @brief 更新姿态(在定时器 ISR 中以固定频率调用) + * 读取传感器 → 零偏修正 → 双二阶滤波 → Mahony 解算 → 写入 imu_angle + * 执行时间约 100~150us(80MHz Cortex-M0+ 估算),需保证在中断周期内完成 + */ +void imu_update(void); + +/** @brief 陀螺仪零偏校准(静止状态下调用) + * 采集 3 秒静止数据,计算各轴零偏,自动应用于后续 imu_update() + * 调用时设备必须完全静止 + */ +void imu_calibrate_gyro(void); + +//================================================================================================== +// 算法接口(也可被外部直接调用) +//================================================================================================== + +/** @brief 双二阶滤波器初始化 + * @param state 滤波器状态指针 + * @param type 滤波器类型 + * @param fs 采样频率 (Hz) + * @param fc 截止频率 (Hz) + * @param q 品质因数 + */ +void biquad_init(biquad_state_t *state, biquad_type_t type, int fs, float fc, float q); + +/** @brief 双二阶滤波器单步计算 + * @param state 滤波器状态指针 + * @param data 当前输入值 + * @return 滤波后输出值 + */ +float biquad_apply(biquad_state_t *state, float data); + +/** @brief Mahony AHRS 姿态解算(6轴 IMU 模式) + * @param gx/gy/gz 陀螺仪角速度 (°/s, 传感器坐标系) + * @param ax/ay/az 加速度计测量值 (g, 传感器坐标系) + * 输出写入全局变量 imu_angle.pitch/roll/yaw + */ +void mahony_ahrs_update(float gx, float gy, float gz, float ax, float ay, float az); + +/** @brief 快速平方根倒数(Quake III 算法) + * @param x 输入值 + * @return 1/sqrt(x) 的近似值 + */ +float inv_sqrt(float x); + +#endif diff --git a/project/code/Motor.c b/project/code/Motor.c new file mode 100644 index 0000000..939d16e --- /dev/null +++ b/project/code/Motor.c @@ -0,0 +1,33 @@ +#include "Motor.h" +#include "zf_driver_gpio.h" +#include "zf_driver_pwm.h" +#include "PID_Controller.h" +#include "MotorEncoder.h" + +void motor_init(void) +{ + gpio_init(DIR_L, GPO, GPIO_HIGH, GPO_PUSH_PULL); + pwm_init(PWM_L, 17000, 0); + + gpio_init(DIR_R, GPO, GPIO_HIGH, GPO_PUSH_PULL); + pwm_init(PWM_R, 17000, 0); +} +// 右电机速度设置 +void motor_set_pwm_right(int32 pwm) +{ + uint8_t dir = (pwm >= 0) ? 1 : 0;//根据电机接线方式调整方向 + uint32 abs_pwm = abs(pwm); + if(pwm > MOTOR_MAX) pwm = MOTOR_MAX; + gpio_set_level(DIR_R, dir);//设置方向 + pwm_set_duty(PWM_R, abs_pwm);//设置PWM占空比 +} + +// 左电机速度设置 - 需要根据实际硬件修改 +void motor_set_pwm_left(int32 pwm) +{ + uint8_t dir = (pwm >= 0) ? 0 : 1;//根据电机接线方式调整方向 + uint32 abs_pwm = abs(pwm); + if(pwm > MOTOR_MAX) pwm = MOTOR_MAX; + gpio_set_level(DIR_L, dir);//设置方向 + pwm_set_duty(PWM_L, abs_pwm);//设置PWM占空比 +} \ No newline at end of file diff --git a/project/code/Motor.h b/project/code/Motor.h new file mode 100644 index 0000000..e3cd77f --- /dev/null +++ b/project/code/Motor.h @@ -0,0 +1,18 @@ +#ifndef __MOTOR_H +#define __MOTOR_H + +#include "zf_common_typedef.h" + +#define MOTOR_MAX (3000) + +#define DIR_R (B11) +#define PWM_R (PWM_TIM_G0_CH0_B10) + +#define DIR_L (A27) +#define PWM_L (PWM_TIM_G7_CH0_A26) + +void motor_init(void); +void motor_set_pwm_right(int32 pwm); +void motor_set_pwm_left(int32 pwm); + +#endif \ No newline at end of file diff --git a/project/code/MotorEncoder.c b/project/code/MotorEncoder.c new file mode 100644 index 0000000..cc2b37d --- /dev/null +++ b/project/code/MotorEncoder.c @@ -0,0 +1,76 @@ +#include "MotorEncoder.h" +#include "ti_msp_dl_config.h" +#include "ti/driverlib/dl_timerg.h" +#include "zf_common_interrupt.h" +#include "zf_driver_exti.h" +#include "zf_driver_gpio.h" + +#define MOTOR_ENCODER_LEFT_A_PIN A9 +#define MOTOR_ENCODER_LEFT_B_PIN A12 + +volatile motor_encoder_data_t motor_speed_right = {.raw = 0}; +volatile motor_encoder_data_t motor_speed_left = {.raw = 0}; +/* +由于MSPM0G3507只有一个QEI,因此只能测量一个电机的编码器速度,另一个电机的速度需要通过GPIO中断模拟正交编码器来测量。 +分配如下: +- QEI0:右电机编码器 +- GPIO中断:左电机编码器 +*/ + +//用中断模拟一个正交编码器(或者用输入捕获) +volatile int16_t left_encoder_count = 0; +//A相中断 +void motor_encoder_exit_handler_A(uint32 state, void *ptr) +{ + // 读取A相和B相的状态 + uint8_t A_state = gpio_get_level(MOTOR_ENCODER_LEFT_A_PIN); + uint8_t B_state = gpio_get_level(MOTOR_ENCODER_LEFT_B_PIN); + // 根据A相和B相的状态更新计数 + if(A_state == B_state) + { + left_encoder_count++; + } + else + { + left_encoder_count--; + } + +} +//B相中断 +void motor_encoder_exit_handler_B(uint32 state, void *ptr) +{ + // 读取A相和B相的状态 + uint8_t A_state = gpio_get_level(MOTOR_ENCODER_LEFT_A_PIN); + uint8_t B_state = gpio_get_level(MOTOR_ENCODER_LEFT_B_PIN); + // 根据A相和B相的状态更新计数 + if(A_state == B_state) + { + left_encoder_count--; + } + else + { + left_encoder_count++; + } +} + +void motor_encoder_init(void) +{ + //使用QEI + DL_TimerG_startCounter(QEI_0_INST); + //使用GPIO中断模拟正交编码器 + exti_init(MOTOR_ENCODER_LEFT_A_PIN, EXTI_TRIGGER_BOTH, motor_encoder_exit_handler_A, NULL); + exti_init(MOTOR_ENCODER_LEFT_B_PIN, EXTI_TRIGGER_BOTH, motor_encoder_exit_handler_B, NULL); + interrupt_set_priority(GPIOA_INT_IRQn, 0); +} + +void motor_encoder_update(void) +{ + // 读取右电机编码器 + motor_speed_right.raw = (uint16_t)DL_TimerG_getTimerCount(QEI_0_INST); + DL_TimerG_setTimerCount(QEI_0_INST, 0); // 读取后清零 + + // 读取左电机编码器 + motor_speed_left.value = left_encoder_count; + left_encoder_count = 0; // 读取后清零 +} + diff --git a/project/code/MotorEncoder.h b/project/code/MotorEncoder.h new file mode 100644 index 0000000..d7db1fa --- /dev/null +++ b/project/code/MotorEncoder.h @@ -0,0 +1,17 @@ +#ifndef MOTORENCODER_H +#define MOTORENCODER_H + +#include "zf_common_typedef.h" + +typedef union{ + uint16_t raw; + int16_t value; +} motor_encoder_data_t; + +void motor_encoder_init(void); +void motor_encoder_update(void); + +extern volatile motor_encoder_data_t motor_speed_right; +extern volatile motor_encoder_data_t motor_speed_left; + +#endif \ No newline at end of file diff --git a/project/code/PID_Controller.c b/project/code/PID_Controller.c new file mode 100644 index 0000000..2b2d375 --- /dev/null +++ b/project/code/PID_Controller.c @@ -0,0 +1,232 @@ +/** + * @file controller.c + * @author wanghongxi + * @author modified by neozng + * @brief PID控制器定义 + * @version beta + * @date 2022-11-01 + * + * @copyrightCopyright (c) 2022 HNU YueLu EC all rights reserved + */ +#include "PID_Controller.h" +#include + +/* ----------------------------下面是pid优化环节的实现---------------------------- */ + +// 梯形积分 +static void f_Trapezoid_Intergral(PIDInstance *pid) +{ + // 计算梯形的面积,(上底+下底)*高/2 + pid->ITerm = pid->Ki * ((pid->Err + pid->Last_Err) / 2) * pid->dt; +} + +// 变速积分(误差小时积分作用更强) +static void f_Changing_Integration_Rate(PIDInstance *pid) +{ + if (pid->Err * pid->Iout > 0) + { + // 积分呈累积趋势 + if (fabsf(pid->Err) <= pid->CoefB) + return; // Full integral + if (fabsf(pid->Err) <= (pid->CoefB + pid->CoefA)) + pid->ITerm *= (pid->CoefB + pid->CoefA - fabsf(pid->Err)) / pid->CoefA; + else // 最大阈值,不使用积分 + pid->ITerm = 0; + } +} + +static void f_Integral_Limit(PIDInstance *pid) +{ + static float temp_Output, temp_Iout; + temp_Iout = pid->Iout + pid->ITerm; + temp_Output = pid->Pout + pid->Iout + pid->Dout; + if (fabsf(temp_Output) > pid->MaxOut) + { + if (pid->Err * pid->Iout > 0) // 积分却还在累积 + { + pid->ITerm = 0; // 当前积分项置零 + } + } + + if (temp_Iout > pid->IntegralLimit) + { + pid->ITerm = 0; + pid->Iout = pid->IntegralLimit; + } + if (temp_Iout < -pid->IntegralLimit) + { + pid->ITerm = 0; + pid->Iout = -pid->IntegralLimit; + } +} + +// 微分先行(仅使用反馈值而不计参考输入的微分) +static void f_Derivative_On_Measurement(PIDInstance *pid) +{ + pid->Dout = pid->Kd * (pid->Last_Measure - pid->Measure) / pid->dt; +} + +// 微分滤波(采集微分时,滤除高频噪声) +static void f_Derivative_Filter(PIDInstance *pid) +{ + pid->Dout = pid->Dout * pid->dt / (pid->Derivative_LPF_RC + pid->dt) + + pid->Last_Dout * pid->Derivative_LPF_RC / (pid->Derivative_LPF_RC + pid->dt); +} + +// 输出滤波 +static void f_Output_Filter(PIDInstance *pid) +{ + pid->Output = pid->Output * pid->dt / (pid->Output_LPF_RC + pid->dt) + + pid->Last_Output * pid->Output_LPF_RC / (pid->Output_LPF_RC + pid->dt); +} + +// 输出限幅 +static void f_Output_Limit(PIDInstance *pid) +{ + if (pid->Output > pid->MaxOut) + { + pid->Output = pid->MaxOut; + } + if (pid->Output < -(pid->MaxOut)) + { + pid->Output = -(pid->MaxOut); + } +} + +// 电机堵转检测 +static void f_PID_ErrorHandle(PIDInstance *pid) +{ + /*Motor Blocked Handle*/ + if (fabsf(pid->Output) < pid->MaxOut * 0.001f || fabsf(pid->Ref) < 0.0001f) + return; + + if ((fabsf(pid->Ref - pid->Measure) / fabsf(pid->Ref)) > 0.95f) + { + // Motor blocked counting + pid->ERRORHandler.ERRORCount++; + } + else + { + pid->ERRORHandler.ERRORCount = 0; + } + + if (pid->ERRORHandler.ERRORCount > 500) + { + // Motor blocked over 1000times + pid->ERRORHandler.ERRORType = PID_MOTOR_BLOCKED_ERROR; + } +} + +/* ---------------------------下面是PID的外部算法接口--------------------------- */ + +/** + * @brief 初始化PID,设置参数和启用的优化环节,将其他数据置零 + * + * @param pid PID实例 + * @param config PID初始化设置 + */ +void PIDInit(PIDInstance *pid, PID_Init_Config_s *config) +{ + memset(pid, 0, sizeof(PIDInstance)); + + pid->Kp = config->Kp; + pid->Ki = config->Ki; + pid->Kd = config->Kd; + pid->MaxOut = config->MaxOut; + pid->DeadBand = config->DeadBand; + pid->Improve = config->Improve; + pid->IntegralLimit = config->IntegralLimit; + pid->CoefA = config->CoefA; + pid->CoefB = config->CoefB; + pid->Output_LPF_RC = config->Output_LPF_RC; + pid->Derivative_LPF_RC = config->Derivative_LPF_RC; + pid->dt = config->T; +} + +/** + * @brief PID计算 + * @param[in] PID结构体 + * @param[in] 测量值 + * @param[in] 期望值 + * @retval 返回空 + */ +float PIDCalculate(PIDInstance *pid, float measure, float ref) +{ + // 堵转检测 + if (pid->Improve & PID_ErrorHandle) + f_PID_ErrorHandle(pid); + + if (pid->dt < 0.000001f) // 避免除零 + { + return 0.0f; + } + // 保存上次的测量值和误差,计算当前error + pid->Measure = measure; + pid->Ref = ref; + pid->Err = pid->Ref - pid->Measure; + /* + Yaw角误差修正 + 若err大于180,则应该取反向,负数:-(360-err)=err-360 + 若err小于-180,则应该取反向,正数:360-(-err)=err+360 + */ + if(pid->Improve & PID_Yaw_Error_Corretion) + { + if(pid->Err > 180) + { + pid->Err = pid->Err - 360; + } + else if(pid->Err < -180) + { + pid->Err = pid->Err +360; + } + } + + // 如果在死区外,则计算PID + if (fabsf(pid->Err) > pid->DeadBand) + { + // 基本的pid计算,使用位置式 + pid->Pout = pid->Kp * pid->Err; + pid->ITerm = pid->Ki * pid->Err * pid->dt; + pid->Dout = pid->Kd * (pid->Err - pid->Last_Err) / pid->dt; + + // 梯形积分 + if (pid->Improve & PID_Trapezoid_Intergral) + f_Trapezoid_Intergral(pid); + // 变速积分 + if (pid->Improve & PID_ChangingIntegrationRate) + f_Changing_Integration_Rate(pid); + // 微分先行 + if (pid->Improve & PID_Derivative_On_Measurement) + f_Derivative_On_Measurement(pid); + // 微分滤波器 + if (pid->Improve & PID_DerivativeFilter) + f_Derivative_Filter(pid); + // 积分限幅 + if (pid->Improve & PID_Integral_Limit) + f_Integral_Limit(pid); + + pid->Iout += pid->ITerm; // 累加积分 + pid->Output = pid->Pout + pid->Iout + pid->Dout; // 计算输出 + + // 输出滤波 + if (pid->Improve & PID_OutputFilter) + f_Output_Filter(pid); + + // 输出限幅 + f_Output_Limit(pid); + } + else // 进入死区, 则清空积分和输出 + { + pid->Output = 0; + pid->ITerm = 0; + } + + // 保存当前数据,用于下次计算 + pid->Last_Measure = pid->Measure; + pid->Last_Output = pid->Output; + pid->Last_Dout = pid->Dout; + pid->Last_Err = pid->Err; + pid->Last_ITerm = pid->ITerm; + + return pid->Output; +} \ No newline at end of file diff --git a/project/code/PID_Controller.h b/project/code/PID_Controller.h new file mode 100644 index 0000000..fbd4259 --- /dev/null +++ b/project/code/PID_Controller.h @@ -0,0 +1,114 @@ +#ifndef _PID_CONTROLLER_H +#define _PID_CONTROLLER_H + +#include "zf_common_typedef.h" + +// PID 优化环节使能标志位,通过位与可以判断启用的优化环节;也可以改成位域的形式 +typedef enum +{ + PID_IMPROVE_NONE = 0b00000000, // 0000 0000 + PID_Integral_Limit = 0b00000001, // 0000 0001 + PID_Derivative_On_Measurement = 0b00000010, // 0000 0010 + PID_Trapezoid_Intergral = 0b00000100, // 0000 0100 + PID_Yaw_Error_Corretion = 0b00001000, // 0000 1000 + PID_OutputFilter = 0b00010000, // 0001 0000 + PID_ChangingIntegrationRate = 0b00100000, // 0010 0000 + PID_DerivativeFilter = 0b01000000, // 0100 0000 + PID_ErrorHandle = 0b10000000, // 1000 0000 +} PID_Improvement_e; + +/* PID 报错类型枚举*/ +typedef enum errorType_e +{ + PID_ERROR_NONE = 0x00U, + PID_MOTOR_BLOCKED_ERROR = 0x01U +} ErrorType_e; + +typedef struct +{ + uint64_t ERRORCount; + ErrorType_e ERRORType; +} PID_ErrorHandler_t; + +/* PID结构体 */ +typedef struct +{ + //---------------------------------- init config block + // config parameter + float Kp; + float Ki; + float Kd; + float MaxOut; + float DeadBand; + + // improve parameter + PID_Improvement_e Improve; + float IntegralLimit; // 积分限幅 + float CoefA; // 变速积分 For Changing Integral + float CoefB; // 变速积分 ITerm = Err*((A-abs(err)+B)/A) when B<|err|180) + { + while(set_value > 180) + set_value -= 360; + } + else if(set_value<-180) + { + while(set_value < -180) + set_value += 360; + } + yaw_ref = set_value; +} \ No newline at end of file diff --git a/project/code/Task.h b/project/code/Task.h new file mode 100644 index 0000000..389099f --- /dev/null +++ b/project/code/Task.h @@ -0,0 +1,22 @@ +#ifndef __TASK_H +#define __TASK_H + +#include "zf_common_typedef.h" + +void task_init(void); + +//建议不直接修改此变量,而是通过set_yaw_ref(float set_value)设置,以防预期之外的值 +extern volatile float yaw_ref; +void set_yaw_ref(float set_value); + +//供外部控制使用 +extern volatile uint8_t motor_control_task_enable; +extern volatile uint8_t angle_control_task_enable; +extern volatile uint8_t position_control_task_enable; + + +//配置项 +/*自动模式下的基础直行速度*/ +#define AUTO_MODE_BASE_SPEED 10 + +#endif \ No newline at end of file diff --git a/project/keil/.vscode/c_cpp_properties.json b/project/keil/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..50e0c6c --- /dev/null +++ b/project/keil/.vscode/c_cpp_properties.json @@ -0,0 +1,443 @@ +{ + "configurations": [ + { + "name": "SeekFree_MSPM0G3507_Device_Library", + "includePath": [ + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\third_party\\CMSIS\\Core\\Include", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti_config", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_common", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_components", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_device", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_driver", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\inc", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\code", + "E:\\software\\ARM\\ARMCLANG\\include", + "E:\\software\\ARM\\ARMCLANG\\include\\arm_linux", + "E:\\software\\ARM\\ARMCLANG\\include\\arm_linux_compat", + "E:\\software\\ARM\\ARMCLANG\\include\\libcxx", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\src", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib", + "e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib\\m0p\\sysctl" + ], + "defines": [ + "__MSPM0G3507__", + "__alignof__(x)=", + "__asm(x)=", + "__asm__(x)=", + "__forceinline=", + "__restrict=", + "__volatile__=", + "__inline=", + "__inline__=", + "__declspec(x)=", + "__attribute__(x)=", + "__nonnull__(x)=", + "__unaligned=", + "__promise(x)=", + "__irq=", + "__swi=", + "__weak=", + "__register=", + "__pure=", + "__value_in_regs=", + "__breakpoint(x)=", + "__current_pc()=0U", + "__current_sp()=0U", + "__disable_fiq()=", + "__disable_irq()=", + "__enable_fiq()=", + "__enable_irq()=", + "__force_stores()=", + "__memory_changed()=", + "__schedule_barrier()=", + "__semihost(x,y)=0", + "__vfp_status(x,y)=0", + "__builtin_arm_nop()=", + "__builtin_arm_wfi()=", + "__builtin_arm_wfe()=", + "__builtin_arm_sev()=", + "__builtin_arm_sevl()=", + "__builtin_arm_yield()=", + "__builtin_arm_isb(x)=", + "__builtin_arm_dsb(x)=", + "__builtin_arm_dmb(x)=", + "__builtin_bswap32(x)=0U", + "__builtin_bswap16(x)=0U", + "__builtin_arm_rbit(x)=0U", + "__builtin_clz(x)=0U", + "__builtin_arm_ldrex(x)=0U", + "__builtin_arm_strex(x,y)=0U", + "__builtin_arm_clrex()=", + "__builtin_arm_ssat(x,y)=0U", + "__builtin_arm_usat(x,y)=0U", + "__builtin_arm_ldaex(x)=0U", + "__builtin_arm_stlex(x,y)=0U", + "_ILP32=1", + "_USE_STATIC_INLINE=1", + "__APCS_32__=1", + "__ARMCC_VERSION=6190004", + "__ARMCOMPILER_VERSION=6190004", + "__ARMEL__=1", + "__ARM_32BIT_STATE=1", + "__ARM_ACLE=200", + "__ARM_ARCH=4", + "__ARM_ARCH_4T__=1", + "__ARM_ARCH_ISA_ARM=1", + "__ARM_ARCH_ISA_THUMB=1", + "__ARM_EABI__=1", + "__ARM_FP16_ARGS=1", + "__ARM_FP16_FORMAT_IEEE=1", + "__ARM_NO_IMAGINARY_TYPE=1", + "__ARM_PCS=1", + "__ARM_PROMISE=__builtin_assume", + "__ARM_SIZEOF_MINIMAL_ENUM=4", + "__ARM_SIZEOF_WCHAR_T=4", + "__ARM_TARGET_COPROC=1", + "__ARM_TARGET_COPROC_V4=1", + "__ATOMIC_ACQUIRE=2", + "__ATOMIC_ACQ_REL=4", + "__ATOMIC_CONSUME=1", + "__ATOMIC_RELAXED=0", + "__ATOMIC_RELEASE=3", + "__ATOMIC_SEQ_CST=5", + "__BIGGEST_ALIGNMENT__=8", + "__BITINT_MAXWIDTH__=128", + "__BOOL_WIDTH__=8", + "__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__", + "__CHAR16_TYPE__=unsigned short", + "__CHAR32_TYPE__=unsigned int", + "__CHAR_BIT__=8", + "__CHAR_UNSIGNED__=1", + "__CLANG_ATOMIC_BOOL_LOCK_FREE=1", + "__CLANG_ATOMIC_CHAR16_T_LOCK_FREE=1", + "__CLANG_ATOMIC_CHAR32_T_LOCK_FREE=1", + "__CLANG_ATOMIC_CHAR_LOCK_FREE=1", + "__CLANG_ATOMIC_INT_LOCK_FREE=1", + "__CLANG_ATOMIC_LLONG_LOCK_FREE=1", + "__CLANG_ATOMIC_LONG_LOCK_FREE=1", + "__CLANG_ATOMIC_POINTER_LOCK_FREE=1", + "__CLANG_ATOMIC_SHORT_LOCK_FREE=1", + "__CLANG_ATOMIC_WCHAR_T_LOCK_FREE=1", + "__CONSTANT_CFSTRINGS__=1", + "__DBL_DECIMAL_DIG__=17", + "__DBL_DENORM_MIN__=4.9406564584124654e-324", + "__DBL_DIG__=15", + "__DBL_EPSILON__=2.2204460492503131e-16", + "__DBL_HAS_DENORM__=1", + "__DBL_HAS_INFINITY__=1", + "__DBL_HAS_QUIET_NAN__=1", + "__DBL_MANT_DIG__=53", + "__DBL_MAX_10_EXP__=308", + "__DBL_MAX_EXP__=1024", + "__DBL_MAX__=1.7976931348623157e+308", + "__DBL_MIN_10_EXP__=(-307)", + "__DBL_MIN_EXP__=(-1021)", + "__DBL_MIN__=2.2250738585072014e-308", + "__DECIMAL_DIG__=__LDBL_DECIMAL_DIG__", + "__ELF__=1", + "__ESCAPE__=", + "__FINITE_MATH_ONLY__=1", + "__FLT16_DECIMAL_DIG__=5", + "__FLT16_DENORM_MIN__=5.9604644775390625e-8F16", + "__FLT16_DIG__=3", + "__FLT16_EPSILON__=9.765625e-4F16", + "__FLT16_HAS_DENORM__=1", + "__FLT16_HAS_INFINITY__=1", + "__FLT16_HAS_QUIET_NAN__=1", + "__FLT16_MANT_DIG__=11", + "__FLT16_MAX_10_EXP__=4", + "__FLT16_MAX_EXP__=16", + "__FLT16_MAX__=6.5504e+4F16", + "__FLT16_MIN_10_EXP__=(-4)", + "__FLT16_MIN_EXP__=(-13)", + "__FLT16_MIN__=6.103515625e-5F16", + "__FLT_DECIMAL_DIG__=9", + "__FLT_DENORM_MIN__=1.40129846e-45F", + "__FLT_DIG__=6", + "__FLT_EPSILON__=1.19209290e-7F", + "__FLT_HAS_DENORM__=1", + "__FLT_HAS_INFINITY__=1", + "__FLT_HAS_QUIET_NAN__=1", + "__FLT_MANT_DIG__=24", + "__FLT_MAX_10_EXP__=38", + "__FLT_MAX_EXP__=128", + "__FLT_MAX__=3.40282347e+38F", + "__FLT_MIN_10_EXP__=(-37)", + "__FLT_MIN_EXP__=(-125)", + "__FLT_MIN__=1.17549435e-38F", + "__FLT_RADIX__=2", + "__GCC_ATOMIC_BOOL_LOCK_FREE=1", + "__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1", + "__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1", + "__GCC_ATOMIC_CHAR_LOCK_FREE=1", + "__GCC_ATOMIC_INT_LOCK_FREE=1", + "__GCC_ATOMIC_LLONG_LOCK_FREE=1", + "__GCC_ATOMIC_LONG_LOCK_FREE=1", + "__GCC_ATOMIC_POINTER_LOCK_FREE=1", + "__GCC_ATOMIC_SHORT_LOCK_FREE=1", + "__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1", + "__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1", + "__GNUC_MINOR__=2", + "__GNUC_PATCHLEVEL__=1", + "__GNUC_STDC_INLINE__=1", + "__GNUC__=4", + "__GXX_ABI_VERSION=1002", + "__ILP32__=1", + "__INT16_C_SUFFIX__=", + "__INT16_FMTd__=\"hd\"", + "__INT16_FMTi__=\"hi\"", + "__INT16_MAX__=32767", + "__INT16_TYPE__=short", + "__INT32_C_SUFFIX__=", + "__INT32_FMTd__=\"d\"", + "__INT32_FMTi__=\"i\"", + "__INT32_MAX__=2147483647", + "__INT32_TYPE__=int", + "__INT64_C_SUFFIX__=LL", + "__INT64_FMTd__=\"lld\"", + "__INT64_FMTi__=\"lli\"", + "__INT64_MAX__=9223372036854775807LL", + "__INT64_TYPE__=long long int", + "__INT8_C_SUFFIX__=", + "__INT8_FMTd__=\"hhd\"", + "__INT8_FMTi__=\"hhi\"", + "__INT8_MAX__=127", + "__INT8_TYPE__=signed char", + "__INTMAX_C_SUFFIX__=LL", + "__INTMAX_FMTd__=\"lld\"", + "__INTMAX_FMTi__=\"lli\"", + "__INTMAX_MAX__=9223372036854775807LL", + "__INTMAX_TYPE__=long long int", + "__INTMAX_WIDTH__=64", + "__INTPTR_FMTd__=\"d\"", + "__INTPTR_FMTi__=\"i\"", + "__INTPTR_MAX__=2147483647", + "__INTPTR_TYPE__=int", + "__INTPTR_WIDTH__=32", + "__INT_FAST16_FMTd__=\"hd\"", + "__INT_FAST16_FMTi__=\"hi\"", + "__INT_FAST16_MAX__=32767", + "__INT_FAST16_TYPE__=short", + "__INT_FAST16_WIDTH__=16", + "__INT_FAST32_FMTd__=\"d\"", + "__INT_FAST32_FMTi__=\"i\"", + "__INT_FAST32_MAX__=2147483647", + "__INT_FAST32_TYPE__=int", + "__INT_FAST32_WIDTH__=32", + "__INT_FAST64_FMTd__=\"lld\"", + "__INT_FAST64_FMTi__=\"lli\"", + "__INT_FAST64_MAX__=9223372036854775807LL", + "__INT_FAST64_TYPE__=long long int", + "__INT_FAST64_WIDTH__=64", + "__INT_FAST8_FMTd__=\"hhd\"", + "__INT_FAST8_FMTi__=\"hhi\"", + "__INT_FAST8_MAX__=127", + "__INT_FAST8_TYPE__=signed char", + "__INT_FAST8_WIDTH__=8", + "__INT_LEAST16_FMTd__=\"hd\"", + "__INT_LEAST16_FMTi__=\"hi\"", + "__INT_LEAST16_MAX__=32767", + "__INT_LEAST16_TYPE__=short", + "__INT_LEAST16_WIDTH__=16", + "__INT_LEAST32_FMTd__=\"d\"", + "__INT_LEAST32_FMTi__=\"i\"", + "__INT_LEAST32_MAX__=2147483647", + "__INT_LEAST32_TYPE__=int", + "__INT_LEAST32_WIDTH__=32", + "__INT_LEAST64_FMTd__=\"lld\"", + "__INT_LEAST64_FMTi__=\"lli\"", + "__INT_LEAST64_MAX__=9223372036854775807LL", + "__INT_LEAST64_TYPE__=long long int", + "__INT_LEAST64_WIDTH__=64", + "__INT_LEAST8_FMTd__=\"hhd\"", + "__INT_LEAST8_FMTi__=\"hhi\"", + "__INT_LEAST8_MAX__=127", + "__INT_LEAST8_TYPE__=signed char", + "__INT_LEAST8_WIDTH__=8", + "__INT_MAX__=2147483647", + "__INT_WIDTH__=32", + "__I__=1.0if", + "__LDBL_DECIMAL_DIG__=17", + "__LDBL_DENORM_MIN__=4.9406564584124654e-324L", + "__LDBL_DIG__=15", + "__LDBL_EPSILON__=2.2204460492503131e-16L", + "__LDBL_HAS_DENORM__=1", + "__LDBL_HAS_INFINITY__=1", + "__LDBL_HAS_QUIET_NAN__=1", + "__LDBL_MANT_DIG__=53", + "__LDBL_MAX_10_EXP__=308", + "__LDBL_MAX_EXP__=1024", + "__LDBL_MAX__=1.7976931348623157e+308L", + "__LDBL_MIN_10_EXP__=(-307)", + "__LDBL_MIN_EXP__=(-1021)", + "__LDBL_MIN__=2.2250738585072014e-308L", + "__LITTLE_ENDIAN__=1", + "__LLONG_WIDTH__=64", + "__LONG_LONG_MAX__=9223372036854775807LL", + "__LONG_MAX__=2147483647L", + "__LONG_WIDTH__=32", + "__NO_INLINE__=1", + "__OBJC_BOOL_IS_BOOL=0", + "__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES=3", + "__OPENCL_MEMORY_SCOPE_DEVICE=2", + "__OPENCL_MEMORY_SCOPE_SUB_GROUP=4", + "__OPENCL_MEMORY_SCOPE_WORK_GROUP=1", + "__OPENCL_MEMORY_SCOPE_WORK_ITEM=0", + "__ORDER_BIG_ENDIAN__=4321", + "__ORDER_LITTLE_ENDIAN__=1234", + "__ORDER_PDP_ENDIAN__=3412", + "__POINTER_WIDTH__=32", + "__PRAGMA_REDEFINE_EXTNAME=1", + "__PTRDIFF_FMTd__=\"d\"", + "__PTRDIFF_FMTi__=\"i\"", + "__PTRDIFF_MAX__=2147483647", + "__PTRDIFF_TYPE__=int", + "__PTRDIFF_WIDTH__=32", + "__REGISTER_PREFIX__=", + "__SCHAR_MAX__=127", + "__SHRT_MAX__=32767", + "__SHRT_WIDTH__=16", + "__SIG_ATOMIC_MAX__=2147483647", + "__SIG_ATOMIC_WIDTH__=32", + "__SIZEOF_DOUBLE__=8", + "__SIZEOF_FLOAT__=4", + "__SIZEOF_INT__=4", + "__SIZEOF_LONG_DOUBLE__=8", + "__SIZEOF_LONG_LONG__=8", + "__SIZEOF_LONG__=4", + "__SIZEOF_POINTER__=4", + "__SIZEOF_PTRDIFF_T__=4", + "__SIZEOF_SHORT__=2", + "__SIZEOF_SIZE_T__=4", + "__SIZEOF_WCHAR_T__=4", + "__SIZEOF_WINT_T__=4", + "__SIZE_FMTX__=\"X\"", + "__SIZE_FMTo__=\"o\"", + "__SIZE_FMTu__=\"u\"", + "__SIZE_FMTx__=\"x\"", + "__SIZE_MAX__=4294967295U", + "__SIZE_TYPE__=unsigned int", + "__SIZE_WIDTH__=32", + "__STDC_HOSTED__=1", + "__STDC_UTF_16__=1", + "__STDC_UTF_32__=1", + "__STDC_VERSION__=201710L", + "__STDC__=1", + "__UINT16_C_SUFFIX__=", + "__UINT16_FMTX__=\"hX\"", + "__UINT16_FMTo__=\"ho\"", + "__UINT16_FMTu__=\"hu\"", + "__UINT16_FMTx__=\"hx\"", + "__UINT16_MAX__=65535", + "__UINT16_TYPE__=unsigned short", + "__UINT32_C_SUFFIX__=U", + "__UINT32_FMTX__=\"X\"", + "__UINT32_FMTo__=\"o\"", + "__UINT32_FMTu__=\"u\"", + "__UINT32_FMTx__=\"x\"", + "__UINT32_MAX__=4294967295U", + "__UINT32_TYPE__=unsigned int", + "__UINT64_C_SUFFIX__=ULL", + "__UINT64_FMTX__=\"llX\"", + "__UINT64_FMTo__=\"llo\"", + "__UINT64_FMTu__=\"llu\"", + "__UINT64_FMTx__=\"llx\"", + "__UINT64_MAX__=18446744073709551615ULL", + "__UINT64_TYPE__=long long unsigned int", + "__UINT8_C_SUFFIX__=", + "__UINT8_FMTX__=\"hhX\"", + "__UINT8_FMTo__=\"hho\"", + "__UINT8_FMTu__=\"hhu\"", + "__UINT8_FMTx__=\"hhx\"", + "__UINT8_MAX__=255", + "__UINT8_TYPE__=unsigned char", + "__UINTMAX_C_SUFFIX__=ULL", + "__UINTMAX_FMTX__=\"llX\"", + "__UINTMAX_FMTo__=\"llo\"", + "__UINTMAX_FMTu__=\"llu\"", + "__UINTMAX_FMTx__=\"llx\"", + "__UINTMAX_MAX__=18446744073709551615ULL", + "__UINTMAX_TYPE__=long long unsigned int", + "__UINTMAX_WIDTH__=64", + "__UINTPTR_FMTX__=\"X\"", + "__UINTPTR_FMTo__=\"o\"", + "__UINTPTR_FMTu__=\"u\"", + "__UINTPTR_FMTx__=\"x\"", + "__UINTPTR_MAX__=4294967295U", + "__UINTPTR_TYPE__=unsigned int", + "__UINTPTR_WIDTH__=32", + "__UINT_FAST16_FMTX__=\"hX\"", + "__UINT_FAST16_FMTo__=\"ho\"", + "__UINT_FAST16_FMTu__=\"hu\"", + "__UINT_FAST16_FMTx__=\"hx\"", + "__UINT_FAST16_MAX__=65535", + "__UINT_FAST16_TYPE__=unsigned short", + "__UINT_FAST32_FMTX__=\"X\"", + "__UINT_FAST32_FMTo__=\"o\"", + "__UINT_FAST32_FMTu__=\"u\"", + "__UINT_FAST32_FMTx__=\"x\"", + "__UINT_FAST32_MAX__=4294967295U", + "__UINT_FAST32_TYPE__=unsigned int", + "__UINT_FAST64_FMTX__=\"llX\"", + "__UINT_FAST64_FMTo__=\"llo\"", + "__UINT_FAST64_FMTu__=\"llu\"", + "__UINT_FAST64_FMTx__=\"llx\"", + "__UINT_FAST64_MAX__=18446744073709551615ULL", + "__UINT_FAST64_TYPE__=long long unsigned int", + "__UINT_FAST8_FMTX__=\"hhX\"", + "__UINT_FAST8_FMTo__=\"hho\"", + "__UINT_FAST8_FMTu__=\"hhu\"", + "__UINT_FAST8_FMTx__=\"hhx\"", + "__UINT_FAST8_MAX__=255", + "__UINT_FAST8_TYPE__=unsigned char", + "__UINT_LEAST16_FMTX__=\"hX\"", + "__UINT_LEAST16_FMTo__=\"ho\"", + "__UINT_LEAST16_FMTu__=\"hu\"", + "__UINT_LEAST16_FMTx__=\"hx\"", + "__UINT_LEAST16_MAX__=65535", + "__UINT_LEAST16_TYPE__=unsigned short", + "__UINT_LEAST32_FMTX__=\"X\"", + "__UINT_LEAST32_FMTo__=\"o\"", + "__UINT_LEAST32_FMTu__=\"u\"", + "__UINT_LEAST32_FMTx__=\"x\"", + "__UINT_LEAST32_MAX__=4294967295U", + "__UINT_LEAST32_TYPE__=unsigned int", + "__UINT_LEAST64_FMTX__=\"llX\"", + "__UINT_LEAST64_FMTo__=\"llo\"", + "__UINT_LEAST64_FMTu__=\"llu\"", + "__UINT_LEAST64_FMTx__=\"llx\"", + "__UINT_LEAST64_MAX__=18446744073709551615ULL", + "__UINT_LEAST64_TYPE__=long long unsigned int", + "__UINT_LEAST8_FMTX__=\"hhX\"", + "__UINT_LEAST8_FMTo__=\"hho\"", + "__UINT_LEAST8_FMTu__=\"hhu\"", + "__UINT_LEAST8_FMTx__=\"hhx\"", + "__UINT_LEAST8_MAX__=255", + "__UINT_LEAST8_TYPE__=unsigned char", + "__USER_LABEL_PREFIX__=", + "__VERSION__=\"Clang 16.0.0\"", + "__VFP_FP__=1", + "__WCHAR_MAX__=4294967295U", + "__WCHAR_TYPE__=unsigned int", + "__WCHAR_UNSIGNED__=1", + "__WCHAR_WIDTH__=32", + "__WINT_MAX__=2147483647", + "__WINT_TYPE__=int", + "__WINT_WIDTH__=32", + "__arm=1", + "__arm__=1", + "__clang__=1", + "__clang_literal_encoding__=\"UTF-8\"", + "__clang_major__=16", + "__clang_minor__=0", + "__clang_patchlevel__=0", + "__clang_version__=\"16.0.0 \"", + "__clang_wide_literal_encoding__=\"UTF-32\"", + "__llvm__=1" + ], + "intelliSenseMode": "${default}" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/project/keil/SeekFree_MSPM0G3507_Device_Library.uvguix.SkyGod b/project/keil/SeekFree_MSPM0G3507_Device_Library.uvguix.SkyGod new file mode 100644 index 0000000..7e1e40e --- /dev/null +++ b/project/keil/SeekFree_MSPM0G3507_Device_Library.uvguix.SkyGod @@ -0,0 +1,1905 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 124 79 + + + 346 + Code Coverage + 877 160 + + + 204 + Performance Analyzer + 1037 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 71 71 71 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 42 + 164 + 1444 + 900 + + + + 0 + + 697 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000400000003000000010000004D453A5C66696C655C4154323032365C5365656B467265655F4D53504D3047333530375F4F70656E736F757263655F4C6962726172795C70726F6A6563745C757365725C7372635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF5B453A5C66696C655C4154323032365C5365656B467265655F4D53504D3047333530375F4F70656E736F757263655F4C6962726172795C6C69627261726965735C7A665F636F6D6D6F6E5C7A665F636F6D6D6F6E5F636C6F636B2E6300000000117A665F636F6D6D6F6E5F636C6F636B2E6300000000FFDC7800FFFFFFFF60453A5C66696C655C4154323032365C5365656B467265655F4D53504D3047333530375F4F70656E736F757263655F4C6962726172795C6C69627261726965735C73646B5C74695F636F6E6669675C74695F6D73705F646C5F636F6E6669672E63000000001274695F6D73705F646C5F636F6E6669672E6300000000BECEA100FFFFFFFF78453A5C66696C655C4154323032365C5365656B467265655F4D53504D3047333530375F4F70656E736F757263655F4C6962726172795C6C69627261726965735C73646B5C74695C6472697665726C69625C6D30705C73797363746C5C646C5F73797363746C5F6D73706D3067317830785F67337830782E68000000001C646C5F73797363746C5F6D73706D3067317830785F67337830782E6800000000F0A0A100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD50001000000000000000200000085010000980000009C050000EA020000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D90000004F000000F0040000CA000000 + + + 16 + 85010000980000009C05000013010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000088020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000088020000 + + + 16 + 560000006D000000520100005A020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000088020000 + + + 16 + 560000006D000000520100005A020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000088020000 + + + 16 + 560000006D000000520100005A020000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000B9020000F004000020030000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000C6010000F004000055020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000BC020000ED04000007030000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000088020000 + + + 16 + 560000006D000000520100005A020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000BC020000ED04000007030000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000BC020000ED04000007030000 + + + 16 + 560000006D000000520100005A020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000BC020000ED04000007030000 + + + 16 + 560000006D000000520100005A020000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000BC020000ED04000007030000 + + + 16 + 560000006D000000520100005A020000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000B1000000 + + + 16 + 560000006D000000CE020000E8000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED040000BD010000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 966 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000020030000F004000033030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 476 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000DD010000ED0400003C020000 + + + 16 + 560000006D0000002B0100001E010000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFD9000000CA000000F0040000CE000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E65002000000000000085010000980000009C05000013010000D90000004F000000F0040000CA0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF170400004F0000001B040000D6010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000C7040000980000009C0500001F0200001B0400004F000000F0040000D601000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFD50000004F000000D9000000A1020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000AC0000009800000081010000EA020000000000004F000000D5000000A10200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF00000000C2010000F0040000C601000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000AC0000000F0200009C0500009E02000000000000C6010000F00400005502000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFF78020000C60100007C0200005502000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000A1020000F0040000A5020000010000000100001004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000AC000000EE0200009C0500006903000000000000A5020000F0040000200300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2623 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000155359534346475F444C5F53595343544C5F696E697496000000000000000200155359534346475F444C5F53595343544C5F696E697422444C5F53595343544C5F7365744846434C4B536F7572636548465854506172616D730000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 1028 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000225365656B467265655F4D53504D3047333530375F4465766963655F4C69627261727996000000000000000100225365656B467265655F4D53504D3047333530375F4465766963655F4C696272617279000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1707 + 960 + + + + + + 1 + 0 + + 100 + 3 + + ..\user\src\main.c + 4 + 43 + 60 + 1 + + 0 + + + ..\..\libraries\zf_common\zf_common_clock.c + 13 + 88 + 117 + 1 + + 0 + + + ..\..\libraries\sdk\ti_config\ti_msp_dl_config.c + 9 + 136 + 160 + 1 + + 0 + + + ..\..\libraries\sdk\ti\driverlib\m0p\sysctl\dl_sysctl_mspm0g1x0x_g3x0x.h + 84 + 1938 + 1946 + 1 + + 0 + + + + +
diff --git a/project/keil/SeekFree_MSPM0G3507_Device_Library.uvoptx b/project/keil/SeekFree_MSPM0G3507_Device_Library.uvoptx index 4b7b528..f3d6997 100644 --- a/project/keil/SeekFree_MSPM0G3507_Device_Library.uvoptx +++ b/project/keil/SeekFree_MSPM0G3507_Device_Library.uvoptx @@ -487,7 +487,7 @@ zf_driver - 0 + 1 0 0 0 @@ -1227,6 +1227,222 @@ 0 0 0 + + 6 + 82 + 1 + 0 + 0 + 0 + ..\code\GrayscaleSensor.c + GrayscaleSensor.c + 0 + 0 + + + 6 + 83 + 1 + 0 + 0 + 0 + ..\code\ICM_42688.c + ICM_42688.c + 0 + 0 + + + 6 + 84 + 1 + 0 + 0 + 0 + ..\code\IMU.c + IMU.c + 0 + 0 + + + 6 + 85 + 1 + 0 + 0 + 0 + ..\code\Motor.c + Motor.c + 0 + 0 + + + 6 + 86 + 1 + 0 + 0 + 0 + ..\code\MotorEncoder.c + MotorEncoder.c + 0 + 0 + + + 6 + 87 + 5 + 0 + 0 + 0 + ..\code\GrayscaleSensor.h + GrayscaleSensor.h + 0 + 0 + + + 6 + 88 + 5 + 0 + 0 + 0 + ..\code\ICM_42688.h + ICM_42688.h + 0 + 0 + + + 6 + 89 + 5 + 0 + 0 + 0 + ..\code\IMU.h + IMU.h + 0 + 0 + + + 6 + 90 + 5 + 0 + 0 + 0 + ..\code\Motor.h + Motor.h + 0 + 0 + + + 6 + 91 + 5 + 0 + 0 + 0 + ..\code\MotorEncoder.h + MotorEncoder.h + 0 + 0 + + + 6 + 92 + 1 + 0 + 0 + 0 + ..\code\Task.c + Task.c + 0 + 0 + + + 6 + 93 + 5 + 0 + 0 + 0 + ..\code\Task.h + Task.h + 0 + 0 + + + 6 + 94 + 1 + 0 + 0 + 0 + ..\code\Beep.c + Beep.c + 0 + 0 + + + 6 + 95 + 5 + 0 + 0 + 0 + ..\code\Beep.h + Beep.h + 0 + 0 + + + 6 + 96 + 1 + 0 + 0 + 0 + ..\code\PID_Controller.c + PID_Controller.c + 0 + 0 + + + 6 + 97 + 5 + 0 + 0 + 0 + ..\code\PID_Controller.h + PID_Controller.h + 0 + 0 + + + 6 + 98 + 1 + 0 + 0 + 0 + ..\code\Command.c + Command.c + 0 + 0 + + + 6 + 99 + 5 + 0 + 0 + 0 + ..\code\Command.h + Command.h + 0 + 0 + @@ -1237,7 +1453,7 @@ 0 7 - 82 + 100 2 0 0 @@ -1249,7 +1465,7 @@ 7 - 83 + 101 1 0 0 @@ -1261,7 +1477,7 @@ 7 - 84 + 102 5 0 0 @@ -1275,13 +1491,13 @@ Driverlib - 0 + 1 0 0 0 8 - 85 + 103 1 0 0 @@ -1293,7 +1509,7 @@ 8 - 86 + 104 1 0 0 @@ -1305,7 +1521,7 @@ 8 - 87 + 105 1 0 0 @@ -1317,7 +1533,7 @@ 8 - 88 + 106 1 0 0 @@ -1329,7 +1545,7 @@ 8 - 89 + 107 1 0 0 @@ -1341,7 +1557,7 @@ 8 - 90 + 108 1 0 0 @@ -1353,7 +1569,7 @@ 8 - 91 + 109 1 0 0 @@ -1365,7 +1581,7 @@ 8 - 92 + 110 1 0 0 @@ -1377,7 +1593,7 @@ 8 - 93 + 111 1 0 0 @@ -1389,7 +1605,7 @@ 8 - 94 + 112 1 0 0 @@ -1401,7 +1617,7 @@ 8 - 95 + 113 1 0 0 @@ -1413,7 +1629,7 @@ 8 - 96 + 114 1 0 0 @@ -1425,7 +1641,7 @@ 8 - 97 + 115 1 0 0 @@ -1437,7 +1653,7 @@ 8 - 98 + 116 1 0 0 @@ -1449,7 +1665,7 @@ 8 - 99 + 117 1 0 0 @@ -1461,7 +1677,7 @@ 8 - 100 + 118 1 0 0 @@ -1473,7 +1689,7 @@ 8 - 101 + 119 1 0 0 @@ -1485,7 +1701,7 @@ 8 - 102 + 120 1 0 0 @@ -1497,7 +1713,7 @@ 8 - 103 + 121 1 0 0 @@ -1509,7 +1725,7 @@ 8 - 104 + 122 1 0 0 @@ -1521,7 +1737,7 @@ 8 - 105 + 123 1 0 0 @@ -1533,7 +1749,7 @@ 8 - 106 + 124 1 0 0 @@ -1545,7 +1761,7 @@ 8 - 107 + 125 1 0 0 @@ -1557,7 +1773,7 @@ 8 - 108 + 126 1 0 0 @@ -1569,7 +1785,7 @@ 8 - 109 + 127 1 0 0 @@ -1581,7 +1797,7 @@ 8 - 110 + 128 1 0 0 @@ -1593,7 +1809,7 @@ 8 - 111 + 129 1 0 0 @@ -1605,7 +1821,7 @@ 8 - 112 + 130 1 0 0 @@ -1617,7 +1833,7 @@ 8 - 113 + 131 1 0 0 @@ -1629,7 +1845,7 @@ 8 - 114 + 132 1 0 0 @@ -1641,7 +1857,7 @@ 8 - 115 + 133 1 0 0 @@ -1653,7 +1869,7 @@ 8 - 116 + 134 1 0 0 @@ -1665,7 +1881,7 @@ 8 - 117 + 135 1 0 0 @@ -1677,7 +1893,7 @@ 8 - 118 + 136 1 0 0 @@ -1687,6 +1903,18 @@ 0 0 + + 8 + 137 + 1 + 0 + 0 + 0 + ..\..\libraries\sdk\ti\driverlib\m0p\sysctl\dl_sysctl_mspm0g1x0x_g3x0x.c + dl_sysctl_mspm0g1x0x_g3x0x.c + 0 + 0 + diff --git a/project/keil/SeekFree_MSPM0G3507_Device_Library.uvprojx b/project/keil/SeekFree_MSPM0G3507_Device_Library.uvprojx index 295c6a3..edb7c0a 100644 --- a/project/keil/SeekFree_MSPM0G3507_Device_Library.uvprojx +++ b/project/keil/SeekFree_MSPM0G3507_Device_Library.uvprojx @@ -813,6 +813,98 @@ code + + + GrayscaleSensor.c + 1 + ..\code\GrayscaleSensor.c + + + ICM_42688.c + 1 + ..\code\ICM_42688.c + + + IMU.c + 1 + ..\code\IMU.c + + + Motor.c + 1 + ..\code\Motor.c + + + MotorEncoder.c + 1 + ..\code\MotorEncoder.c + + + GrayscaleSensor.h + 5 + ..\code\GrayscaleSensor.h + + + ICM_42688.h + 5 + ..\code\ICM_42688.h + + + IMU.h + 5 + ..\code\IMU.h + + + Motor.h + 5 + ..\code\Motor.h + + + MotorEncoder.h + 5 + ..\code\MotorEncoder.h + + + Task.c + 1 + ..\code\Task.c + + + Task.h + 5 + ..\code\Task.h + + + Beep.c + 1 + ..\code\Beep.c + + + Beep.h + 5 + ..\code\Beep.h + + + PID_Controller.c + 1 + ..\code\PID_Controller.c + + + PID_Controller.h + 5 + ..\code\PID_Controller.h + + + Command.c + 1 + ..\code\Command.c + + + Command.h + 5 + ..\code\Command.h + + ti_config @@ -1007,6 +1099,11 @@ 1 ..\..\libraries\sdk\ti\driverlib\dl_wwdt.c + + dl_sysctl_mspm0g1x0x_g3x0x.c + 1 + ..\..\libraries\sdk\ti\driverlib\m0p\sysctl\dl_sysctl_mspm0g1x0x_g3x0x.c + diff --git a/project/user/src/main.c b/project/user/src/main.c index 4462fb6..a0ae8f0 100644 --- a/project/user/src/main.c +++ b/project/user/src/main.c @@ -39,20 +39,82 @@ // 本例程是开源库空工程 可用作移植或者测试各类内外设 // **************************** 代码区域 **************************** +#include "Motor.h" +#include "zf_device_key.h" +#include "Task.h" +#include "IMU.h" +#include "Beep.h" +#include "GrayscaleSensor.h" +#include "MotorEncoder.h" +/* +定时器资源分配: +G0 右电机PWM +G7 左电机PWM +A0 100Hz任务 +A1 50Hz任务 +G6 20Hz任务 +*/ +/* +中断等级分配: +0 GPIOA_INT_IRQn 外部中断模拟四倍频正交编码器 +1 TIMA0_INT_IRQn 100Hz任务 +1 TIMA1_INT_IRQn 50Hz任务 +1 UART2_INT_IRQn Command串口接收中断 +7 TIMG6_INT_IRQn 20Hz任务 +*/ int main (void) { clock_init(SYSTEM_CLOCK_80M); // 时钟配置及系统初始化<务必保留> debug_init(); // 调试串口信息初始化 // 此处编写用户代码 例如外设初始化代码等 + beep_init(50); + motor_init(); + key_init(50);//按键初始化,参数为扫描周期50ms + imu_init(200);// IMU 初始化,参数为采样频率 200Hz 需要与定时器中断频率一致 + imu_calibrate_gyro(); // IMU 陀螺仪零偏校准 需要在静止状态下调用 + grayscale_sensor_init();//灰度传感器初始化 + motor_encoder_init();//电机编码器初始化 + task_init(); - + beep_on_time(500);//初始化完成,蜂鸣器响 500ms // 此处编写用户代码 例如外设初始化代码等 - while(true) + while(1) { // 此处编写需要循环执行的代码 - + system_delay_ms(100); + char str[20] = {0}; + sprintf(str,"%d,%d,%d\n", (int)(imu_angle.yaw*100),(int)(yaw_ref*100),(int)(grayscale_sensor_position*100)); + debug_send_buffer((const uint8 *)str,strlen(str)); + if(KEY_SHORT_PRESS == key_get_state(KEY_1)) + { + while(KEY_SHORT_PRESS == key_get_state(KEY_1)); + // 等待按键释放 + grayscale_sensor_set_white(); + beep_on_time(200); + } + else if(KEY_SHORT_PRESS == key_get_state(KEY_2)) + { + while(KEY_SHORT_PRESS == key_get_state(KEY_2)); + // 等待按键释放 + grayscale_sensor_set_black(); + beep_on_time(200); + } + else if(KEY_SHORT_PRESS == key_get_state(KEY_3)) + { + while(KEY_SHORT_PRESS == key_get_state(KEY_3)); + // 等待按键释放 + set_yaw_ref(yaw_ref + 5.0f); + beep_on_time(200); + } + else if(KEY_SHORT_PRESS == key_get_state(KEY_4)) + { + while(KEY_SHORT_PRESS == key_get_state(KEY_4)); + // 等待按键释放 + set_yaw_ref(yaw_ref - 5.0f); + beep_on_time(200); + } // 此处编写需要循环执行的代码 } diff --git a/project/尽量不要使用的引脚.md b/project/尽量不要使用的引脚.md new file mode 100644 index 0000000..db904ac --- /dev/null +++ b/project/尽量不要使用的引脚.md @@ -0,0 +1,11 @@ + +尽量不要使用以下引脚,以下引脚属于特殊功能引脚,使用可能会导致核心板异常。 +因此建议大家尽量不要使用。 +A23 +A21 +A19 +A20 +A5 +A6 +A4 +A3 \ No newline at end of file diff --git a/project/尽量不要使用的引脚.txt b/project/尽量不要使用的引脚.txt deleted file mode 100644 index 253ed12..0000000 --- a/project/尽量不要使用的引脚.txt +++ /dev/null @@ -1,11 +0,0 @@ - -¾¡Á¿²»ҪʹÓÃÒÔÏÂÒý½ţ¬ÒÔÏÂÒý½ÅÊôÓÚÌØÊ⹦ÄÜÒý½ţ¬ʹÓÿÉÄܻᵼÖºËÐİåÒ쳣¡£ -Òò´˽¨Òé´ó¼Ҿ¡Á¿²»ҪʹÓᣠ-A23 -A21 -A19 -A20 -A5 -A6 -A4 -A3 \ No newline at end of file