From 77e608882131f16af814a127651ea97a9192531b Mon Sep 17 00:00:00 2001 From: Shocky <2697121481@qq.com> Date: Fri, 29 Aug 2025 11:30:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已实现功能: 1.波形输出 2.定时器 3.串口调试与通信 尚未完成:正确时间计算,平滑的梯形方波输出 --- .vscode/settings.json | 6 + ENS001_BASIC_PRJ.uvguix.26971 | 96 +- ENS001_BASIC_PRJ.uvoptx | 22 +- FWLIB/include/ENS1_BOOST.h | 2 +- FWLIB/include/ENS1_GPIO.h | 3 +- FWLIB/include/ENS1_UART.h | 103 +- FWLIB/include/ENS1_WAVEGEN.h | 7 + FWLIB/source/ENS1_IIC.c | 73 +- FWLIB/source/ENS1_MTP.c | 29 +- FWLIB/source/ENS1_SPI.c | 126 +- FWLIB/source/ENS1_TIMER.c | 4 +- FWLIB/source/ENS1_UART.c | 50 +- FWLIB/source/ENS1_WAVEGEN.c | 315 +- FWLIB/source/ENS_ADC.c | 137 +- FWLIB/source/ENS_CURRENT_CALIBRATION.c | 216 +- JLinkLog.txt | 5131 ++++++++++------- Listings/ENS001_BASIC_PRJ.map | 698 ++- Objects/ENS001_BASIC_PRJ.axf | Bin 114284 -> 114516 bytes Objects/ENS001_BASIC_PRJ.build_log.htm | 21 +- Objects/ENS001_BASIC_PRJ.hex | 803 ++- Objects/ENS001_BASIC_PRJ.htm | 178 +- Objects/ENS001_BASIC_PRJ_ENS001_BASIC_PRJ.dep | 51 +- Objects/ens1_boost.crf | Bin 59441 -> 59441 bytes Objects/ens1_boost.o | Bin 69192 -> 69192 bytes Objects/ens1_clock.crf | Bin 78888 -> 80753 bytes Objects/ens1_clock.d | 1 + Objects/ens1_clock.o | Bin 81364 -> 82388 bytes Objects/ens1_gpio.crf | Bin 78651 -> 80772 bytes Objects/ens1_gpio.d | 1 + Objects/ens1_gpio.o | Bin 86960 -> 87988 bytes Objects/ens1_mtp.crf | Bin 83315 -> 83311 bytes Objects/ens1_mtp.o | Bin 83412 -> 83264 bytes Objects/ens1_timer.crf | Bin 85009 -> 86812 bytes Objects/ens1_timer.d | 1 + Objects/ens1_timer.o | Bin 124456 -> 125304 bytes Objects/ens1_uart.crf | Bin 85189 -> 88592 bytes Objects/ens1_uart.d | 1 + Objects/ens1_uart.o | Bin 112472 -> 115600 bytes Objects/ens1_wavegen.crf | Bin 79968 -> 82685 bytes Objects/ens1_wavegen.d | 1 + Objects/ens1_wavegen.o | Bin 89100 -> 92800 bytes Objects/mian.crf | Bin 90961 -> 92325 bytes Objects/mian.d | 2 +- Objects/mian.o | Bin 85292 -> 85804 bytes Objects/retarget.o | Bin 71768 -> 71768 bytes Objects/system_cmsdk_cm0.o | Bin 63076 -> 63076 bytes USER/ENS001_CONFIG.h | 2 +- USER/MY_HEADER.h | 32 +- USER/mian.c | 110 +- 缓进缓出功能说明.md | 254 + 缓进缓出功能说明_修正版.md | 229 + 51 files changed, 5024 insertions(+), 3681 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 缓进缓出功能说明.md create mode 100644 缓进缓出功能说明_修正版.md diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0486ec2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "ens1_gpio.h": "c", + "ens1_boost.h": "c" + } +} \ No newline at end of file diff --git a/ENS001_BASIC_PRJ.uvguix.26971 b/ENS001_BASIC_PRJ.uvguix.26971 index 9dbfd0f..257a1c3 100644 --- a/ENS001_BASIC_PRJ.uvguix.26971 +++ b/ENS001_BASIC_PRJ.uvguix.26971 @@ -93,25 +93,25 @@ 2 3 - -1 - -1 + -32000 + -32000 -1 -1 - 0 - -8 - 1499 - 839 + 376 + 222 + 1729 + 1215 0 - 390 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000003000000000000000100000023453A5C576F726B73706163655C54494D45525F44454D4F5C555345525C6D69616E2E6300000000066D69616E2E6300000000C5D4F200FFFFFFFF31453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C736F757263655C454E53315F54494D45522E63000000000C454E53315F54494D45522E6300000000FFDC7800FFFFFFFF32453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C696E636C7564655C454E53315F54494D45522E68000000000C454E53315F54494D45522E6800000000BECEA100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000040100006600000000080000CB030000 + 708 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000007000000050000000100000023453A5C576F726B73706163655C54494D45525F44454D4F5C555345525C6D69616E2E6300000000066D69616E2E6300000000C5D4F200FFFFFFFF31453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C736F757263655C454E53315F54494D45522E63000000000C454E53315F54494D45522E6300000000FFDC7800FFFFFFFF32453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C696E636C7564655C454E53315F54494D45522E68000000000C454E53315F54494D45522E6800000000BECEA100FFFFFFFF33453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C736F757263655C454E53315F5741564547454E2E63000000000E454E53315F5741564547454E2E6300000000F0A0A100FFFFFFFF30453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C736F757263655C454E53315F554152542E63000000000B454E53315F554152542E6300000000BCA8E100FFFFFFFF31453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C696E636C7564655C454E53315F554152542E68000000000B454E53315F554152542E68000000009CC1B600FFFFFFFF32453A5C576F726B73706163655C54494D45525F44454D4F5C46574C49425C696E636C7564655C454E53315F424F4F53542E68000000000C454E53315F424F4F53542E6800000000F7B88600FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000040100006600000000080000BA020000 @@ -150,7 +150,7 @@ 0 16 - 0300000066000000FD0000009B030000 + 0300000066000000FD0000008A020000 16 @@ -170,7 +170,7 @@ 0 16 - 0300000066000000FD0000009B030000 + 0300000066000000FD0000008A020000 16 @@ -450,7 +450,7 @@ 0 16 - 0300000066000000FD0000009B030000 + 0300000066000000FD0000008A020000 16 @@ -470,7 +470,7 @@ 0 16 - 0300000066000000FD0000009B030000 + 0300000066000000FD0000008A020000 16 @@ -490,7 +490,7 @@ 0 16 - 03000000CF030000FD0700003D040000 + 03000000BE020000FD0700003D040000 16 @@ -530,7 +530,7 @@ 0 16 - 03000000CF030000FD0700003D040000 + 03000000BE020000FD0700003D040000 16 @@ -1150,7 +1150,7 @@ 0 16 - 0300000066000000FD000000C0020000 + 0300000066000000FD0000009B030000 16 @@ -1170,7 +1170,7 @@ 0 16 - 03000000CF030000FD0700003D040000 + 03000000BE020000FD0700003D040000 16 @@ -1190,7 +1190,7 @@ 0 16 - 03000000CF030000D20500003D040000 + 03000000BE020000FD0700002C030000 16 @@ -1250,7 +1250,7 @@ 0 16 - 03000000CF030000D20500003D040000 + 03000000BE020000FD0700002C030000 16 @@ -1270,7 +1270,7 @@ 0 16 - 03000000CF030000D20500003D040000 + 03000000BE020000FD0700002C030000 16 @@ -1799,14 +1799,14 @@ 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFF04010000EE000000F0050000F2000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000000401000066000000F005000005010000040100004F000000F0050000EE0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFEC0400004F000000F004000066020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000F004000066000000F00500007D020000F00400004F000000F00500006602000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF000100004F00000004010000B4030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000000000006600000000010000F0020000000000004F00000000010000B40300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000052020000F00500005602000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000006D020000F0050000200300000000000056020000F00500000903000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF802000056020000FC0200000903000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000B403000000080000B803000001000000010000100400000001000000A1FCFFFF9D000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000100000000000000F4020000D50500009203000000000000B803000000080000560400000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFF04010000EE000000F0050000F2000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000000401000066000000F005000005010000040100004F000000F0050000EE0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFEC0400004F000000F004000066020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000F004000066000000F00500007D020000F00400004F000000F00500006602000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF000100004F00000004010000A3020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000000000006600000000010000CB030000000000004F00000000010000A30200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000052020000F00500005602000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000000000006D020000F0050000200300000000000056020000F00500000903000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF802000056020000FC0200000903000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000A302000000080000A702000001000000010000100400000001000000A0FCFFFF9C000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000100000000000000CF030000000800006D04000000000000A702000000080000560400000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File 2733 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000010434D53444B5F74696D65725F496E697496000000000000000C0010434D53444B5F74696D65725F496E69740E54494D4552305F48616E646C65720B467573655F726573756C7404626F6F6C0C436C6F636B496E697453657405313536323505636F756E740B54696D6572305F696E6974044750494F044354524C0D4750494F5F4F547970655F505015434D53444B5F74696D65725F456E61626C65495251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000010434D53444B5F74696D65725F496E697496000000000000000C0010434D53444B5F74696D65725F496E69740E54494D4552305F48616E646C65720B467573655F726573756C7404626F6F6C0C436C6F636B496E697453657405313536323505636F756E740B54696D6572305F696E6974044750494F044354524C0D4750494F5F4F547970655F505015434D53444B5F74696D65725F456E61626C65495251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -1822,7 +1822,7 @@ Build 992 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000010454E533030315F42415349435F50524A9600000000000000010010454E533030315F42415349435F50524A000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000010454E533030315F42415349435F50524A9600000000000000010010454E533030315F42415349435F50524A000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -1838,7 +1838,7 @@ Debug 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 898 @@ -1862,21 +1862,21 @@ 0 100 - 0 + 5 .\USER\mian.c 11 - 58 - 81 + 1 + 31 1 0 .\FWLIB\source\ENS1_TIMER.c - 31 - 426 - 427 + 1 + 434 + 459 1 0 @@ -1884,12 +1884,48 @@ .\FWLIB\include\ENS1_TIMER.h 0 - 21 + 38 12 1 0 + + .\FWLIB\source\ENS1_WAVEGEN.c + 29 + 256 + 257 + 1 + + 0 + + + .\FWLIB\source\ENS1_UART.c + 52 + 302 + 42 + 1 + + 0 + + + .\FWLIB\include\ENS1_UART.h + 76 + 152 + 177 + 1 + + 0 + + + .\FWLIB\include\ENS1_BOOST.h + 36 + 5 + 31 + 1 + + 0 + diff --git a/ENS001_BASIC_PRJ.uvoptx b/ENS001_BASIC_PRJ.uvoptx index 397da40..0267cd1 100644 --- a/ENS001_BASIC_PRJ.uvoptx +++ b/ENS001_BASIC_PRJ.uvoptx @@ -152,6 +152,22 @@ 0 0 + 36 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\USER\mian.c + + +
+ + 1 + 0 283 1
268441304
@@ -166,7 +182,7 @@ \\ENS001_BASIC_PRJ\FWLIB/source/ENS1_UART.c\283
- 1 + 2 0 36 1 @@ -289,7 +305,7 @@ 2 2 1 - 1 + 0 0 0 .\FWLIB\source\ENS1_UART.c @@ -349,7 +365,7 @@ 2 7 1 - 1 + 0 0 0 .\FWLIB\source\ENS1_TIMER.c diff --git a/FWLIB/include/ENS1_BOOST.h b/FWLIB/include/ENS1_BOOST.h index 96553b6..5060be3 100644 --- a/FWLIB/include/ENS1_BOOST.h +++ b/FWLIB/include/ENS1_BOOST.h @@ -34,4 +34,4 @@ void boost_voltage_select_45V(void); //32MHz频率下,设置升压电压为55V void boost_voltage_select_55V(void); -#endif \ No newline at end of file +#endif diff --git a/FWLIB/include/ENS1_GPIO.h b/FWLIB/include/ENS1_GPIO.h index 9c8b1b8..0a926be 100644 --- a/FWLIB/include/ENS1_GPIO.h +++ b/FWLIB/include/ENS1_GPIO.h @@ -19,13 +19,14 @@ History: 1.V1.0 Date: Author: -Modification: +Modification: ���� */ #ifndef ENS1_GPIO_H #define ENS1_GPIO_H #include "my_header.h" #include "CMSDK_CM0.h" extern uint8_t GPIO_AltFunction(GPIO_NUM GPIO_X , GPIO_AltFuncSel GPIO_AltFuncSelx); +extern int8_t GPIO_IO_Init(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,GPIOOType_TypeDef GPIO_OType,GPIO_PUPD_TypeDef GPIO_PUPD,OUTPUT_SPEED_TypeDef OUTPUT_SPEED,OUTPUT_PDRV_TypeDef OUTPUT_PDRV,FunctionalState ENABLEorNOT); extern int8_t GPIO_IO_Select(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,FunctionalState ENABLEorNOT); extern uint8_t GPIO_GetInputValue(GPIO_NUM GPIO_X); extern uint8_t GPIO_GetOutputValue(GPIO_NUM GPIO_X); diff --git a/FWLIB/include/ENS1_UART.h b/FWLIB/include/ENS1_UART.h index de5e53d..ff395dc 100644 --- a/FWLIB/include/ENS1_UART.h +++ b/FWLIB/include/ENS1_UART.h @@ -14,7 +14,7 @@ History: 1.V1.0 Date: Author: -Modification: +Modification: ���� */ #ifndef _ENS1_UART_H_ #define _ENS1_UART_H_ @@ -37,7 +37,38 @@ Modification: #define InterruptEnable __enable_irq typedef enum uartRcvfifoTrigger{byte_1=0 , bytes_4=1,bytes_8=2,bytes_14=3}uartRcvTrigger; typedef enum {OverSamp_16 = 0,OverSamp_13}UART_OverSamp; -/*uartýṹ*/ + + + +typedef enum { +StopLen_1 = 0, +StopLen_Other +}UART_StopLen; + +typedef enum { +WordLen_5, +WordLen_6, +WordLen_7, +WordLen_8 +}UART_WordLen; + + +typedef enum { +Stick_RESET = 0, +Stick_SET +}UART_Stick_EN; + +typedef enum { +Odd_SET = 0, +Even_SET +}UART_Even_EN; + +typedef enum { +Parity_RESET = 0, +Parity_SET +}UART_Parity_EN; + +/*uart�������ýṹ��*/ typedef struct uart_fifo{ uartRcvTrigger level; @@ -48,8 +79,13 @@ typedef struct uart_fifo{ typedef struct uart_para{ uint8_t UART_OverSampMode; uint32_t UART_BaudRate; - uint8_t UART_HardwareFlowControl; //ӲǷ + uint8_t UART_HardwareFlowControl; //Ӳ�������Ƿ��� UART_FifoStructrue* FifoSetting ; + UART_StopLen stop_len; //停止位长度 + UART_WordLen Word_len; //数据位长度 + UART_Stick_EN Stick_EN; //固定奇偶校验使能 + UART_Even_EN Even_EN; //奇偶校验选择 + UART_Parity_EN Parity_EN; //奇偶校验使能 }UART_InitStructure; extern UART_FifoStructrue UART0_Fifo; @@ -58,19 +94,19 @@ extern UART_FifoStructrue UART1_Fifo; extern UART_InitStructure UART1_Init; /* -жԴ˵ -1THREINT THRͼĴFIFO -2RDAINT ռĴݿ FIFOģʽ´ֵ -3RTOINT FIFOģʽ½ճʱĸֽʱûֽƳ룬ʱһֽڽFIFO -4RLSINT ·״̬У֡ж -5MSIINT ƽ״̬CTS״̬autoflowDSR/RI/DCD״̬ +�ж���Դ˵���� +1��THREINT THR���ͼĴ�������FIFO�� +2��RDAINT ���ռĴ������ݿ��� ��FIFOģʽ�´���������ֵ +3��RTOINT FIFOģʽ�½��ճ�ʱ��������ĸ��ֽ�ʱ����û���ֽ��Ƴ��������룬�����ʱ����������һ���ֽ��ڽ���FIFO�� +4��RLSINT ������·״̬���������������У�����֡��������ж� +5��MSIINT ���ƽ����״̬��CTS����״̬������autoflow����DSR/RI/DCD����״̬ */ -/*жʹ*/ +/*�ж�ʹ��*/ #define MSI_EN (uint8_t)0X8 #define RLSI_EN (uint8_t)0X4 #define THRE_EN (uint8_t)0X2 #define RDAI_EN (uint8_t)0X1 -/*жϢ*/ +/*�ж���Ϣ*/ #define INT_MODEM_STATUS (uint8_t)0X0 #define INT_THR_EMPTY (uint8_t)0X1 #define INT_RCV_DATA_AVAILABLE (uint8_t)0X2 @@ -78,8 +114,8 @@ extern UART_InitStructure UART1_Init; #define INT_CHAR_TIMEOUT_INDICATION (uint8_t)0X6 typedef struct uart_it_para{ - uint8_t UartIntModel ; //ѡжϵģʽ - uint8_t UartDMAEnable; //ѡǷDMA + uint8_t UartIntModel ; //ѡ���жϵ�ģʽ + uint8_t UartDMAEnable; //ѡ���Ƿ���DMA }UART_ITStructure; extern UART_ITStructure UART0_ITSet; @@ -91,34 +127,34 @@ extern UART_ITStructure UART1_ITSet; #define UART_WordLength_8b ((uint8_t)0x03) #define UART_NO_PARITY ((uint8_t)0x00 & 0xff) -#define UART_LOGIC_1_ODD_NUM ((uint8_t)0x08 & 0xff) //߼1 -#define UART_LOGIC_1_EVEN_NUM ((uint8_t)0x18 & 0xff) //߼1ż -#define UART_STICK_PARITY_AS1 ((uint8_t)0x28 & 0xff) //̶żУΪ1 +#define UART_LOGIC_1_ODD_NUM ((uint8_t)0x08 & 0xff) //�߼�1������ +#define UART_LOGIC_1_EVEN_NUM ((uint8_t)0x18 & 0xff) //�߼�1ż���� +#define UART_STICK_PARITY_AS1 ((uint8_t)0x28 & 0xff) //�̶���żУ��Ϊ1 #define UART_STICK_PARITY_AS0 ((uint8_t)0x38 & 0xff) -/*жϢȡ*/ -/*жϹ*/ -uint8_t UART_INT_PEND(CMSDK_UART_TypeDef* UARTx); //Ϊ0ʱUARTжϹ -/*ж״̬ж*/ +/*�ж���Ϣ��ȡ*/ +/*�жϹ���*/ +uint8_t UART_INT_PEND(CMSDK_UART_TypeDef* UARTx); //Ϊ0ʱ��UART���жϹ��� +/*�ж�״̬�ж�*/ uint8_t UART_INT_TYPE(CMSDK_UART_TypeDef* UARTx); -/*fifo ʹָʾ*/ -uint8_t UART_FIFO_USE(CMSDK_UART_TypeDef* UARTx); //0:fifoģʽ 1fifo ʹ -/*FIFO*/ +/*fifo ʹ��ָʾ��*/ +uint8_t UART_FIFO_USE(CMSDK_UART_TypeDef* UARTx); //0:��fifoģʽ 1��fifo ʹ�� +/*�������FIFO*/ void UART_TXCLR(CMSDK_UART_TypeDef* UARTx); -/*FIFO*/ +/*�������FIFO*/ void UART_RXCLR(CMSDK_UART_TypeDef* UARTx); -/*FIFOʹ*/ +/*FIFOʹ��*/ void UART_FIFOEnable(CMSDK_UART_TypeDef* UARTx); -/*FIFOر*/ +/*FIFO�ر�*/ void UART_FIFODisable(CMSDK_UART_TypeDef* UARTx); -/**/ +/*��������*/ uint8_t READ_UART_RCVBuff(CMSDK_UART_TypeDef* UARTx ); -/**/ +/*��������*/ void WRITE_UART_THRBuff(CMSDK_UART_TypeDef* UARTx ,uint8_t data); -/*FIFO״̬ȡ*/ +/*FIFO״̬��ȡ*/ uint8_t UART_RX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ; uint8_t UART_TX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ; uint8_t UART_RX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ; @@ -126,19 +162,20 @@ uint8_t UART_RX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ; uint8_t UART_TX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ; uint8_t UART_TX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ; -/*շ״̬ȡ*/ +/*�շ���״̬��ȡ*/ uint8_t UARTLine_RCVError(CMSDK_UART_TypeDef* UARTx); -/*жϷͻǷΪ*/ +/*�жϷ��ͻ����Ƿ�Ϊ��*/ uint8_t UARTLine_TRANSEmpty(CMSDK_UART_TypeDef* UARTx); -/*жTHRǷΪ*/ +/*�ж�THR�Ƿ�Ϊ��*/ uint8_t UARTLine_THREmpty(CMSDK_UART_TypeDef* UARTx); -/*UARTʼ*/ +/*UART��ʼ��*/ void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX); void UART_ITConfig(CMSDK_UART_TypeDef *CMSDK_UART, UART_ITStructure* uart_paraX); unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch); +void Uart_Send(CMSDK_UART_TypeDef *CMSDK_UART ,uint8_t *data, uint8_t len); diff --git a/FWLIB/include/ENS1_WAVEGEN.h b/FWLIB/include/ENS1_WAVEGEN.h index 14a4091..b7282c5 100644 --- a/FWLIB/include/ENS1_WAVEGEN.h +++ b/FWLIB/include/ENS1_WAVEGEN.h @@ -42,6 +42,12 @@ typedef struct { uint16_t intensity; // 强度 (0-255) uint16_t rest_time; // 休息时间 (ms) uint16_t silent_time; // 静默时间 (ms) + + // 缓进缓出控制参数 + uint8_t ramp_up_time; // 缓进时间:2秒 + uint8_t hold_time; // 保持时间:6秒 + uint8_t ramp_down_time; // 缓出时间:2秒 + uint8_t enable_ramp; // 启用渐进控制 } EMS_Config_TypeDef; // 电刺激控制函数 @@ -50,5 +56,6 @@ void EMS_Start(void); void EMS_Stop(void); void EMS_UpdateIntensity(uint16_t intensity); void EMS_Process(void); +void EMS_Process_Ramp(void); // 缓进缓出处理函数 #endif diff --git a/FWLIB/source/ENS1_IIC.c b/FWLIB/source/ENS1_IIC.c index 91e312a..af55a9c 100644 --- a/FWLIB/source/ENS1_IIC.c +++ b/FWLIB/source/ENS1_IIC.c @@ -11,7 +11,7 @@ History: 1.V1.0 Date: Author: - Modification: + Modification: ���� */ #include "ENS1_IIC.h" @@ -33,37 +33,37 @@ IIC_ConfigStructure IIC1_Config = }; -//bus error жϣITERRENʹܣ +//bus error �жϣ�ITERRENʹ�ܣ� bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 8)&0x1) ? true :false);} -//Ӧж +//Ӧ������ж� bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 10)&0x1) ? true :false);} -//ٲ +//�ٲ� bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 9)&0x1) ? true :false);} -/// +//���/������� bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 11)&0x1) ? true :false);} -//ITEVFENʹܺ¼ -//ʼ״̬ʼλͣģʽ +//ITEVFENʹ�ܺ��������¼� +//��ʼ״̬����ʼλ���ͣ�����ģʽ�� bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS)&0x1) ? true :false);} -//ַͣģʽ / ַƥ䣨ӻ¼ +//��ַ���ͣ�����ģʽ�� / ��ַƥ�䣨�ӻ��¼��� bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 1)&0x1) ? true :false);} -//ģʽ£ѷ10bitַݵĵһֽڣ +//����ģʽ�£������ѷ���10bit��ַ���ݵĵ�һ���ֽڣ����� bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 3)&0x1) ? true :false);} -//ӻģʽ£ֹͣյ +//�ӻ�ģʽ�£�ֹͣ���������յ� bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 4)&0x1) ? true :false);} -//ֽڴɹ +//�����ֽڴ���ɹ� bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 2)&0x1) ? true :false);} -//ITEVFEN ITBUFEN ʹܺ¼ -//ݼĴǿգݣ +//ITEVFEN �� ITBUFEN ʹ�ܺ��������¼� +//���ݼĴ����ǿգ��������������ݣ� bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 5)&0x1) ? true :false);} -//ݼĴգݣ +//���ݼĴ����գ����������ݣ� bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 6)&0x1) ? true :false);} -//״̬æ +//����״̬����æ��� uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (uint8_t)(((CMSDK_I2Cx->I2C_STS >> 13)&0x1) ? 1 :0);}; -//ģʽȷ +//ģʽȷ�� bool IIC_MASTER_MODE(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 12)&0x1) ? true :false);} uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* IIC_Para ) @@ -80,7 +80,7 @@ uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* II } if(IIC_Para->MODE == IIC_SLAVE) { - // CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//жʹ--bit8bufferж / bit7¼ж / bit6ж + // CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//�ж�ʹ��--bit8��buffer�ж� / bit7���¼��ж� / bit6�������ж� CMSDK_I2Cx->I2C_CR1|=(1); CMSDK_I2Cx->I2C_OAR = IIC_Para->OWN_ADDRESS ; if(IIC_Para->ACK_EN == true) @@ -90,9 +90,9 @@ uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* II { /* IIC master transmitter: - IIC_CR2:жʱƵ - IIC_CR1:ʹIICӿ - IIC_CR1:START λ IIC + IIC_CR2:�����ж�ʱ��Ƶ�� + IIC_CR1:ʹ��IIC�ӿ� + IIC_CR1:����START λ IIC���� */ CMSDK_I2Cx->I2C_CR2 |= IIC_Para->IIC_SPEED ; CMSDK_I2Cx->I2C_CR1 |= (1) ; @@ -125,7 +125,7 @@ void IIC_ITConfig(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint16_t IIC_IT_SEL ,Functional } } -void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //ʹIIC +void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //ʹ��IIC���� { if(CMSDK_I2Cx ==CMSDK_I2C0) { @@ -157,8 +157,8 @@ void IIC_GenerateSTOP(CMSDK_I2C_TypeDef* CMSDK_I2Cx) CMSDK_I2Cx->I2C_CR1 |= (1<<4); } -//general call 豸Ϣڳʼ豸豸ͬ -//豸ͨ߷0x00ַGENERAL CALL +//general call ���������������豸������Ϣ�����ڳ�ʼ�����豸���豸ͬ�� +//���豸ͨ�������߷���0x00��ַ������GENERAL CALL void IIC_GeneralCallCmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx) { @@ -172,7 +172,7 @@ void IIC_Send7bitAddress(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint8_t Address) void IIC_SendData(CMSDK_I2C_TypeDef* CMSDK_I2Cx , uint8_t data) { CMSDK_I2Cx->I2C_DR = data; - while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //ֽڴ + while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //�ֽڴ������ } uint8_t IIC_ReadData(CMSDK_I2C_TypeDef* CMSDK_I2Cx) @@ -211,9 +211,9 @@ void I2C0_Event_Handler(void) } if(IIC_STOPF_EVENT(CMSDK_I2C0) == true) { - //ٽգرIIC!!! + //������ٽ��գ���ر�IIC!!! IIC_Cmd(CMSDK_I2C0 ,DISABLE) ; - CMSDK_I2C0->I2C_CR2|=(1<<7); //жʹ--bit8bufferж / bit7¼ж / bit6ж + CMSDK_I2C0->I2C_CR2|=(1<<7); //�ж�ʹ��--bit8��buffer�ж� / bit7���¼��ж� / bit6�������ж� CMSDK_I2C0->I2C_CR1|=(1); CMSDK_I2C0->I2C_OAR = 0X78 ; CMSDK_I2C0->I2C_CR1 |= (1<<5); @@ -230,7 +230,6 @@ void I2C0_Event_Handler(void) if(IIC_RxNE_EVENT(CMSDK_I2C0) == true) { uint8_t read_data = (uint8_t)(CMSDK_I2C0->I2C_DR & 0xff); - printf("%d\n", read_data); } if(IIC_TxE_EVENT(CMSDK_I2C0) == true) @@ -246,25 +245,21 @@ void I2C0_Error_Handler(void) if(IIC_BUS_ERROR(CMSDK_I2C0) == true) { - printf("bus error\n"); return ; } if(IIC_ACK_ERROR(CMSDK_I2C0) == true) { - printf("IIC_ACK_ERROR\n"); return ; } if(IIC_ARBITRAT_ERROR(CMSDK_I2C0) == true) { - printf("IIC_ARBITRAT_ERROR\n"); return ; } if(IIC_OVERRUN_ERROR(CMSDK_I2C0) == true) { - printf("IIC_OVERRUN_ERROR\n"); return ; } @@ -293,17 +288,16 @@ void I2C1_Event_Handler(void) } else { - if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //Ϊӻ˴ַƥ䣡 + if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //��Ϊ�ӻ�������˴����ַƥ�䣡 { return ; } - if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //ΪӻյSTOPź + if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //��Ϊ�ӻ������յ�STOP�ź� { - printf("get stop\n"); - //ٽգرIIC!!! + //������ٽ��գ���ر�IIC!!! IIC_Cmd(CMSDK_I2C1 ,DISABLE) ; - CMSDK_I2C1->I2C_CR2|=(1<<7); //жʹ--bit8bufferж / bit7¼ж / bit6ж + CMSDK_I2C1->I2C_CR2|=(1<<7); //�ж�ʹ��--bit8��buffer�ж� / bit7���¼��ж� / bit6�������ж� CMSDK_I2C1->I2C_CR1|=(1); CMSDK_I2C1->I2C_OAR = 0X78 ; CMSDK_I2C1->I2C_CR1 |= (1<<5); @@ -317,10 +311,9 @@ void I2C1_Event_Handler(void) { } - if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //ΪӻbufferǿգIIC_DRе + if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //��Ϊ�ӻ���buffer�ǿգ���IIC_DR�е����� { uint8_t read_data = (uint8_t)(CMSDK_I2C1->I2C_DR & 0xff); - printf("%d\n", read_data); } if(IIC_TxE_EVENT(CMSDK_I2C1) == true) { @@ -335,25 +328,21 @@ void I2C1_Error_Handler(void) if(IIC_BUS_ERROR(CMSDK_I2C1) == true) { - printf("bus error\n"); return ; } if(IIC_ACK_ERROR(CMSDK_I2C1) == true) { - printf("IIC_ACK_ERROR\n"); return ; } if(IIC_ARBITRAT_ERROR(CMSDK_I2C1) == true) { - printf("IIC_ARBITRAT_ERROR\n"); return ; } if(IIC_OVERRUN_ERROR(CMSDK_I2C1) == true) { - printf("IIC_OVERRUN_ERROR\n"); return ; } diff --git a/FWLIB/source/ENS1_MTP.c b/FWLIB/source/ENS1_MTP.c index 063f4cd..92e55b4 100644 --- a/FWLIB/source/ENS1_MTP.c +++ b/FWLIB/source/ENS1_MTP.c @@ -11,14 +11,14 @@ History: 1.V1.0 Date: Author: -Modification: +Modification: ���� */ /* -MTP˵ -1MTPֻܰд,ÿ1024ֽڴС -ıţ +MTP˵�� +1��MTP����ֻ�ܰ���д��,ÿ����1024�ֽڴ�С +��ı�ţ� SECTOR 0 : 0000H - 03FFH SECTOR 1 : 0400H - 07FFH SECTOR 2 : 0800H - 0BFFH @@ -34,8 +34,8 @@ SECTOR 7 : 1C00H - 1FFFH uint16_t write_current_data[4]={0,0,0,0}; STRUCT_MTP_TRIM MTP_FT_SET= { - .OSCA_FT = 0x10, //ĬֵΪ 0X10 - .OSC32K_RTRIM = 0x10, //ĬֵΪ 0X10 + .OSCA_FT = 0x10, //Ĭ��ֵΪ 0X10 + .OSC32K_RTRIM = 0x10, //Ĭ��ֵΪ 0X10 .BG_TRIM = 0x88, }; @@ -52,30 +52,29 @@ uint8_t MTP_init(void) -//MTPڱĵݶȡ +//MTP�ڱ���ĵ���������ݶ�ȡ void flash_read(uint32_t start_addr,uint16_t *test_i){ uint16_t result = 0; result = HW16_REG(start_addr); *test_i = result ; } -//MTPдݣûԶд룡 -//ԶдΪMTPĵ0x1BC0飨MTP_BASE_ADDR + 0x6F00 +//��MTP��д�����ݣ����������û��Զ����д�룡������ +//���Զ����д������ΪMTP�ĵ�0x1BC0�飨MTP_BASE_ADDR + 0x6F00�� int8_t flash_buff_write(uint32_t start_addr, uint16_t *buff) { HW32_REG(start_addr) = ((uint32_t)((*(buff+1)<<16)&0xffff0000) + ((*buff)&0x0000ffff)); // while(!(CMSDK_MTPREG->MTP_SR&0x00000002)){}; if(HW32_REG(start_addr) != ((uint32_t)(*(buff+1)<<16) + *buff )) { - printf("write error\n"); return -1; } return 0; } int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){ - CMSDK_MTPREG->MTP_CLR = 0xffffffff; //SRĴ - CMSDK_MTPREG->MTP_CR = 0x00000002; //2ȴ - CMSDK_MTPREG->MTP_ACLR = 0x00000000; //дsector0 -sector 6 sector7 Ϊbootloader + CMSDK_MTPREG->MTP_CLR = 0xffffffff; //SR�Ĵ��� + CMSDK_MTPREG->MTP_CR = 0x00000002; //2�ȴ����� + CMSDK_MTPREG->MTP_ACLR = 0x00000000; //����������д��sector0 -sector 6 ��sector7 ��Ϊbootloader���� CMSDK_MTPREG->MTP_KEYR = 0x5a5a5a5a; //key return flash_buff_write(start_addr, buff); } @@ -83,8 +82,8 @@ int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){ int8_t write_data(void){ uint16_t *wr_data = (uint16_t *)malloc(8*sizeof(uint8_t)); memcpy(wr_data , write_current_data, 8); - int8_t val = flash_write_ctrl(wr_data,DATA_SAVE_ADDR); // 0x1BC0 + int8_t val = flash_write_ctrl(wr_data,DATA_SAVE_ADDR); //�� 0x1BC0�� val = flash_write_ctrl(wr_data+2, DATA_SAVE_ADDR + 4); return val; -} +} diff --git a/FWLIB/source/ENS1_SPI.c b/FWLIB/source/ENS1_SPI.c index 3a5a167..ab73a2e 100644 --- a/FWLIB/source/ENS1_SPI.c +++ b/FWLIB/source/ENS1_SPI.c @@ -11,13 +11,13 @@ History: 1.V1.0 Date: Author: - Modification: + Modification: 2023-11-15 */ #include "ENS1_SPI.h" #include "ENS1_GPIO.h" -/*---------------------------------------------------fifoصĺͷ--------------------------------------------------*/ -/*FIFOͼ0*/ +/*---------------------------------------------------fifo????????--------------------------------------------------*/ +/* Clear FIFO and reset to 0 */ uint8_t CLR_TX_FIFO( CMSDK_SPI_TypeDef* SPIx) { return (uint8_t)(SPIx->FCR>>8 & 0x1); @@ -27,47 +27,47 @@ uint8_t CLR_RX_FIFO(CMSDK_SPI_TypeDef* SPIx) { return (uint8_t)(SPIx->FCR>>1 & 0x1); } -/*FIFO ״̬ȡ*/ +/*FIFO ?????*/ uint8_t RX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx) { - return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x001f0000)>>16)):0); //ȡǰFIFOݳ + return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x001f0000)>>16)):0); //??????????FIFO??????? } uint8_t TX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx) { - return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x00001f00)>>8)):0); //ȡǰFIFOݳ + return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x00001f00)>>8)):0); //??????????FIFO??????? } SPI_BUSY_STATE BUSY_STATE(CMSDK_SPI_TypeDef* SPIx) { - return (SPI_BUSY_STATE)((((SPIx->FSR & 0x10) >> 4)==1) ? ( BUSY ) : ( NOTBUSY )); //ȡǰSPIǷæ + return (SPI_BUSY_STATE)((((SPIx->FSR & 0x10) >> 4)==1) ? ( BUSY ) : ( NOTBUSY )); //??????SPI???? } uint8_t RX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx) { - return (uint8_t)((((SPIx->FSR & 0x8)>> 3 )==1) ? (1) : (0)) ; //ǰȡFIFOǷΪ + return (uint8_t)((((SPIx->FSR & 0x8)>> 3 )==1) ? (1) : (0)) ; //??????FIFO???????? } uint8_t RX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx) { - return (uint8_t)((((SPIx->FSR & 0x4) >> 2)==1) ? (1) : (0) ) ; //ǰȡFIFOǷΪգ + return (uint8_t)((((SPIx->FSR & 0x4) >> 2)==1) ? (1) : (0) ) ; //??????FIFO??????? } uint8_t TX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx) { - return (uint8_t)((((SPIx->FSR & 0x2) >> 1)==1) ? (1) : (0)) ; //ǰFIFOǷΪ + return (uint8_t)((((SPIx->FSR & 0x2) >> 1)==1) ? (1) : (0)) ; //???????FIFO???????? } uint8_t TX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx) { - return (uint8_t)(((SPIx->FSR & 0x1)==1) ? (1) : (0)) ; //ǰFIFOǷΪգ + return (uint8_t)(((SPIx->FSR & 0x1)==1) ? (1) : (0)) ; //???????FIFO??????? } -/*FIFOʹ/DMAʹ*/ -uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx) //FIFO +/*FIFO???/DMA???*/ +uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx) //??FIFO???? { return (uint8_t)(SPIx->FCR & 0x1) ; } @@ -97,16 +97,16 @@ uint8_t SPI_FIFODMA_SET(CMSDK_SPI_TypeDef* SPIx ,bool TXDMA_SET ,bool RXDMA_SET) return (uint8_t)((SPIx->CTRL2>>4)&0x3); } -/*------------------------------------------------------fifoصĺβ--------------------------------------------------*/ +/*------------------------------------------------------fifo???????��--------------------------------------------------*/ -/*----------------------------------------------------------SPI-------------------------------------------------------*/ -//ȡǰSPIģʽ +/*----------------------------------------------------------SPI????-------------------------------------------------------*/ +//????????SPI?? uint8_t READ_SPI_MODE(CMSDK_SPI_TypeDef* SPIx) { return ((SPIx->CTRL1 & 0x7000) >> 12); } -//NSSͨѡ +//NSS?????? uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,FunctionalState ENorDIS) { if(ENorDIS == ENABLE) @@ -117,12 +117,12 @@ uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,Functiona return (uint8_t)((SPIx->CTRL2 & 0x0f00) >> 8); } -//spiIJ +//spi????????? uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , struct SPI_ModeConfig_Struct SPI_Config, struct SPI_FIFO_Struct FIFO_Struct) { -/*1GPIO ALTER*/ +/*1??GPIO ALTER*/ if(SPIx == CMSDK_SPI1) { @@ -144,21 +144,21 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , } /* - 2дSPI_CTRL1Ĵ - 1ʱӲBAUD_RATE[2:0] - 2ʱӼԺλ CPOL and CPHA bits - 3ѡģʽ BIDI_EN, BIDI_MODE, UNIDI_MODE bits - 4LSB_SELλ֡ʽ - 5ͨNSS_TOGGLENSS_MST_CTRLNSS_MST_SW bitsѡNSSƷʽ bit11 9 8 - 6ͨMST_SLV_SELλѡģʽģʽ + 2??��SPI_CTRL1????? + ??1??????????????BAUD_RATE[2:0] + ??2???????????????�� CPOL and CPHA bits + ??3????????? BIDI_EN, BIDI_MODE, UNIDI_MODE bits + ??4??????LSB_SEL��?????????? + ??5?????????NSS_TOGGLE??NSS_MST_CTRL??NSS_MST_SW bits?????NSS?????? bit11 9 8 + ??6?????????MST_SLV_SEL��???????????? */ SPIx->CTRL1 = (SPIx->CTRL1&~ 0xffff) | ( SPI_Config.BAUD_FPCLKdivx << 4); SPIx->CTRL1 |= (SPI_Config.SPI_MODE << 2); SPIx->CTRL1 |= (SPI_Config.SPI_TRANS_MODE << 12 ); - SPIx->CTRL1 &=~ (0x1 << 7); //֡ʽĬϴģʽ - SPIx->CTRL1 &=~ (0x1 << 8); //֡ʽĬϴģʽ + SPIx->CTRL1 &=~ (0x1 << 7); //??????????? + SPIx->CTRL1 &=~ (0x1 << 8); //??????????? SPIx->CTRL1 &=~ (1 << 11); - SPIx->CTRL1 |= (1 << 11) ; // ĬӲNSS + SPIx->CTRL1 |= (1 << 11) ; // ??????????NSS if(SPI_Config.MS_SEL == MASTER) { @@ -169,12 +169,12 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , SPIx->CTRL1 &=~ (1<<1); } /* - 3дSPI_CTRL2Ĵ - 1CHAR_LEN[3:0]λѡݳ - 2ѡNSS˿ڡ NSS0_EN, NSS1_EN, NSS2_EN - 3ͨѡʵRXݲɼ׶ SAMP_PHASE(1:0)λ - 4ͨC2T_DELAYT2C_DELAYλԸݴ豸ѡʵC2T/T2Cӳ - 5ͨTXDMA_ENRXDMA_ENλʹܻʹFIFOģʽTX/RX DMA + 3??��SPI_CTRL2????? + ??1??????CHAR_LEN[3:0]��??????????????? + ??2?????NSS???? NSS0_EN, NSS1_EN, NSS2_EN + ??3????????????????????RX????????? SAMP_PHASE(1:0)�� + ??4?????????C2T_DELAY??T2C_DELAY��???????????��?????????????C2T/T2C??? + ??5?????????TXDMA_EN??RXDMA_EN��???????FIFO????TX/RX DMA?? */ SPIx->CTRL2 = (SPIx->CTRL2&~ 0xffff); if(SPI_Config.CHAR_LEN < 4) @@ -190,22 +190,22 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , } SPI_NSS_CHANNEL(SPIx ,SPI_Config.NSSx ,ENABLE); - //rxɼλ ģʽЧĬѡnormal - //C2T_DELAY ,ģʽЧ - //T2C_DELAY, ģʽЧ + //rx???????��?? ??????????????��??????normal + //C2T_DELAY ,????????????�� + //T2C_DELAY, ????????????�� if(SPI_Config.MS_SEL == MASTER) { SPIx->CTRL2 |= (SPI_Config.SAMP_PHASE << 6); - //T2C Transmit-end-to-chip-inactive ӳʱ䣬ĬΪ1T SCK - //C2T Chip-select-active-to-transmit-start ʱ Ĭ1T SCK ,û + //T2C ??Transmit-end-to-chip-inactive ????????????1T SCK + //C2T ??Chip-select-active-to-transmit-start ????? ???1T SCK ,???????????????????? } /* - 4дFIFO Ĵ - 1TX_FIFO_THRX_FIFO_TH崥ֵ - 2ͨTX_FIFO_CLRRX_FIFO_CLRλTX/RX FIFO - 3ͨfif_enλʹܻFIFOģʽ + 4??��FIFO ????? + ??1??????TX_FIFO_TH??RX_FIFO_TH?????��????????? + ??2?????????TX_FIFO_CLR??RX_FIFO_CLR��???TX/RX FIFO + ??3?????????fif_en��???????FIFO?? */ SPIx->FCR |= (FIFO_Struct.TX_FIFO_TH << 9 ); SPIx->FCR |= (FIFO_Struct.RX_FIFO_TH << 2 ); @@ -217,7 +217,7 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , return 0; } -/*---------------------------------------------SPIֹͣ-------------------------------------------------*/ +/*---------------------------------------------SPI????????-------------------------------------------------*/ uint8_t SPI_START(CMSDK_SPI_TypeDef* SPIx ) { SPIx->CTRL1 |= (1); @@ -230,7 +230,7 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx) { if(SPI_FIFO_STATE(SPIx) == 1) { - // RXFIFO ֱ FIFOΪ 0 + //?? RX??FIFO ??? FIFO????? 0 while((RX_FIFO_LEN(SPIx) != 0) || (BUSY_STATE(SPIx) == BUSY)) { //save_data = READ_SPI_RCVBuff(SPIx); @@ -249,7 +249,7 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx) { while((TX_FIFO_LEN(SPIx)!= 0) || (BUSY_STATE(SPIx) == BUSY)); SPIx->CTRL1 &=~ (1); - // RXFIFO ֱ FIFOΪ 0 + //?? RX??FIFO ??? FIFO????? 0 while(RX_FIFO_LEN(SPIx) != 0) { uint16_t save_data = READ_SPI_RCVBuff(SPIx); @@ -264,21 +264,21 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx) return (uint8_t)(SPIx->CTRL1*0x1); } -/*----------------------------------------- / д SPI BUFFER-------------------------------------------------*/ -//յ 16bits +/*-----------------------------------------?? / �� SPI BUFFER??????-------------------------------------------------*/ +//????????????? ???16bits uint16_t READ_SPI_RCVBuff(CMSDK_SPI_TypeDef* SPIx) { return (uint16_t)(SPIx->RBR & 0xffff); } -//д +//��???? void WRITE_SPI_THRBuff(CMSDK_SPI_TypeDef* SPIx,uint8_t data) { SPIx->THR = data; while(BUSY_STATE(SPIx) == BUSY); } -/*------------------------------------------------------SPIж------------------------------------------------------*/ +/*------------------------------------------------------SPI?��?------------------------------------------------------*/ uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET) { NVIC_DisableIRQ(IRQn); @@ -303,22 +303,22 @@ uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET return 0; } -//жϴ +//?��???????? /* -жͣ -1Ͳ жϣû -2ղ жϣ -3շжϣ -4ͻ ж -5ջǿ ж +?��???????????? +1??????????? ???? ?��????????????????? +2??????????? ??? ?��?????????? +3?????????��?? +4????????????? ?��? +5?????????????? ?��? */ void SPI1_Handler(void) { NVIC_ClearPendingIRQ(SPI1_IRQn); uint8_t read_fifo=0; - if((CMSDK_SPI1->INTSTATUS & 0x10 )== UNDERRUN_INT) //-ʱΪʱ + if((CMSDK_SPI1->INTSTATUS & 0x10 )== UNDERRUN_INT) //????-??????????????????????? { - CMSDK_SPI1->INTCLEAR |= (1<<4); //ж + CMSDK_SPI1->INTCLEAR |= (1<<4); //????��? } if((CMSDK_SPI1->INTSTATUS & 0x8) ==OVERRUN_INT) { @@ -338,7 +338,6 @@ void SPI1_Handler(void) while(!RX_FIFO_EMPTY(CMSDK_SPI1)) { read_fifo = READ_SPI_RCVBuff(CMSDK_SPI1); - printf("masterrcv:%d\n",read_fifo); } } @@ -349,9 +348,9 @@ void SPI0_Handler(void) { NVIC_ClearPendingIRQ(SPI0_IRQn); uint8_t read_fifo=0; - if((CMSDK_SPI0->INTSTATUS & 0x10 )== UNDERRUN_INT) //-ʱΪʱ + if((CMSDK_SPI0->INTSTATUS & 0x10 )== UNDERRUN_INT) //????-??????????????????????? { - CMSDK_SPI0->INTCLEAR |= (1<<4); //ж + CMSDK_SPI0->INTCLEAR |= (1<<4); //????��? } if((CMSDK_SPI0->INTSTATUS & 0x8) ==OVERRUN_INT) { @@ -371,7 +370,6 @@ void SPI0_Handler(void) while(!RX_FIFO_EMPTY(CMSDK_SPI0)) { read_fifo = READ_SPI_RCVBuff(CMSDK_SPI0); - printf("masterrcv:%d\n",read_fifo); } } } diff --git a/FWLIB/source/ENS1_TIMER.c b/FWLIB/source/ENS1_TIMER.c index b64fc07..d25d1d2 100644 --- a/FWLIB/source/ENS1_TIMER.c +++ b/FWLIB/source/ENS1_TIMER.c @@ -1,6 +1,7 @@ #include "ENS1_TIMER.h" #include "ENS_CURRENT_CALIBRATION.h" #include "ENS1_CLOCK.h" +#include void TIMER0_Init(uint32_t Int_Period) //定时器中断周期 单位ms { @@ -9,12 +10,9 @@ void TIMER0_Init(uint32_t Int_Period) //定时器中断周期 单位ms NVIC_ClearPendingIRQ(TIMER0_IRQn); uint32_t reload_value = (uint32_t)(APB_Clock_Freq / 1000 * Int_Period); - printf("TIMER0重装载值: %d\n", reload_value); CMSDK_timer_Init(CMSDK_TIMER0, reload_value, 1); // NVIC_EnableIRQ(TIMER0_IRQn); - - printf("TIMER0_Init完成,中断周期: %d ms\n", Int_Period); } void TIMER1_Init(uint32_t Int_Period) diff --git a/FWLIB/source/ENS1_UART.c b/FWLIB/source/ENS1_UART.c index 7a2e693..347fe07 100644 --- a/FWLIB/source/ENS1_UART.c +++ b/FWLIB/source/ENS1_UART.c @@ -35,13 +35,18 @@ ENS1 uart特性说明 #include "ENS1_GPIO.h" UART_FifoStructrue UART1_Fifo = { .level = bytes_8 , - .DMA_Enable = 0 , - .FIFO_Enable = 1 , + .DMA_Enable =0 , + .FIFO_Enable =1 , }; UART_InitStructure UART1_Init = { - .UART_BaudRate = 115200 , //计算出来的DLL DLH不为整数, 1、需要校准RC精确度,2、需要调整此处的波特率 - .UART_HardwareFlowControl = 0, + .UART_BaudRate = 110000 , //计算出来的DLL DLH不为整数, 1、需要校准RC精确度,2、需要调整此处的波特率 + .UART_HardwareFlowControl =0, .FifoSetting = &UART1_Fifo , + .stop_len = StopLen_1, //固定停止位1位 + .Word_len = WordLen_8, //数据位8位 + .Stick_EN = Stick_RESET, //禁用固定奇偶校验 + .Even_EN = Even_SET, //奇偶校验选择 + .Parity_EN = Parity_RESET, //禁用奇偶检验 }; UART_ITStructure UART1_ITSet = { .UartIntModel = RLSI_EN | RDAI_EN , @@ -185,19 +190,36 @@ void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX){ { overSamp_mode = 13; } + //波特率校准,反推处DLL和DLH,(外设时钟主频/设置波特率/过采样模式)-1, divisor_value = (uint16_t)((uint32_t)(APB_Clock_Freq / uart_paraX->UART_BaudRate / overSamp_mode) - 1); - CMSDK_UART->DLL = (uint8_t)(divisor_value & 0x0011); - CMSDK_UART->DLH = (uint8_t)((divisor_value & 0x1100)>>8); + CMSDK_UART->DLL = (uint8_t)(divisor_value & 0x00FF); + CMSDK_UART->DLH = (uint8_t)((divisor_value & 0xFF00)>>8); /*FCR配置 FIFO control*/ - CMSDK_UART->FCR |= (uart_paraX->FifoSetting->level <<6); + CMSDK_UART->FCR |= (uart_paraX->FifoSetting->level <<6);//接收多少字节后触发中断 if(uart_paraX->FifoSetting->FIFO_Enable == 1) { CMSDK_UART->FCR |= (1); } + //配置停止位 + CMSDK_UART->LCR &= ~(0x01 << 2); + CMSDK_UART->LCR |= uart_paraX->stop_len<<2; - /*LCR配置,不做配置,默认N 8 1 */ + //配置数据位 + CMSDK_UART->LCR &= ~(0x03 << 0); + CMSDK_UART->LCR |= uart_paraX->Word_len<<0; + //配置是否启用校验位 + CMSDK_UART->LCR &= ~(0x01 << 3); + CMSDK_UART->LCR |= uart_paraX->Parity_EN<<3; + + //启用校验位 + if(uart_paraX->Parity_EN==Parity_SET) + { + CMSDK_UART->LCR &= ~(0x03 << 4); + CMSDK_UART->LCR |= uart_paraX->Even_EN<<4; + CMSDK_UART->LCR |= uart_paraX->Stick_EN<<5; + } /*MCR自动流控配置*/ if(uart_paraX->UART_HardwareFlowControl == 1) @@ -239,6 +261,18 @@ unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch) WRITE_UART_THRBuff(CMSDK_UART,my_ch); return (my_ch); } +//串口发送一定字节的数据 +void Uart_Send(CMSDK_UART_TypeDef *CMSDK_UART ,uint8_t *data, uint8_t len) +{ + uint8_t t; + for(t=0;tWAVE_GEN_DRV_REST_T_REG = 100; //死区时间10ms //交替模式下,死区时间失效,即使CONFIG_REG使能了死区时间也无效 - //CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_SILENT_T_REG = 200; //静默时间20ms - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 0x00000020; //32MHz ==PCLK - - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 32; //32MHz ==PCLK //MHz为单位 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = 100; //正半周期脉宽10ms,有交替方波 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = 100; //负半周期脉宽10ms,无交替方波 - - #if 1//无需静默时间 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x00000050; //bit 0:rest enable , 正半周期和负半周期中间的休息时间 - //1:negative enable , 负半周期发生使能,如果不使能,则没有负半周期的波形(注意交替模式只会对正半周期起作用) - //2: silent enable , 负半周期结束后的静默时间 - //3: source B enable ,负脉宽方向使能位,1负脉宽在负半周期,0负脉宽在正半周期 - - //4: alternating the positive side ,正极交替产生包络 - //5: continue mode ,连续模式 - //6: multi-electrode ,多电极模式 - #else //需要静默时间 - /*交替模式下config寄存器说明: - 正脉宽交替,无负脉宽,无死区时间,无静默时间:0x50 或 0x51 或 0x58 或 0x59 - 正脉宽交替,无死区时间,无负脉宽,有静默时间:0x54 或 0x55 或 0x5C 或 0x5D - 正脉宽交替,无死区时间,负脉宽不交替但有波形,无静默时间 :0x5A 或 0x5B - 正脉宽交替,无死区时间,负脉宽不交替但有波形且波形在正脉宽上(因为源B失能了),无静默时间 :0x52 或 0x53 - 正脉宽交替,无死区时间,负脉宽不交替但有波形且波形在正脉宽上(因为源B失能了),有静默时间 :0x56 或 0x57 - 正脉宽交替,无死区时间,负脉宽不交替但有波形,有静默时间 : 0x5E 或 0x5F - */ - // CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x5F; //bit 0:rest enable , 正半周期和负半周期中间的死区时间 - //1:negative enable , 负半周期发生使能,如果不使能,则没有负半周期的波形 - //2: silent enable , 负半周期结束后的静默时间 - //3: source B enable - //4: alternating the positive side ,正极交替产生包络 - //5: continue mode ,连续模式 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x34; //静默时间、交替模式和多电极使能 //6: multi-electrode ,多电极模式 + printf("\n驱动器A正弦波测试\n"); - #endif - - CMSDK_WAVEGEN_DRVA ->WAVE_GEN_DRV_ISEL_REG = 0x04; // 总电流 = 单元电流ISEL * WAVE_GEN_DRV_IN_WAVE_REG + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_REST_T_REG = 100; // 死区时间10ms //交替模式下,死区时间失效,即使CONFIG_REG使能了死区时间也无效 + // CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_SILENT_T_REG = 200; //静默时间20ms + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 0x00000020; // 32MHz ==PCLK - for(int i=0; i<64; i++){ - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i; - //CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = sine_data[i]; //正弦波数据数组,根据数组中的点描绘正半周期的波形 - // CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = saw_data[i]; //三角波数据 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = incount; //方波数据(固定值0x80) + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 32; // 32MHz ==PCLK //MHz为单位 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = 100; // 正半周期脉宽10ms,有交替方波 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = 100; // 负半周期脉宽10ms,无交替方波 + +#if 1 // 无需静默时间 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x00000050; // bit 0:rest enable , 正半周期和负半周期中间的休息时间 + // 1:negative enable , 负半周期发生使能,如果不使能,则没有负半周期的波形(注意交替模式只会对正半周期起作用) + // 2: silent enable , 负半周期结束后的静默时间 + // 3: source B enable ,负脉宽方向使能位,1负脉宽在负半周期,0负脉宽在正半周期 + + // 4: alternating the positive side ,正极交替产生包络 + // 5: continue mode ,连续模式 + // 6: multi-electrode ,多电极模式 +#else // 需要静默时间 + /*交替模式下config寄存器说明: + 正脉宽交替,无负脉宽,无死区时间,无静默时间:0x50 或 0x51 或 0x58 或 0x59 + 正脉宽交替,无死区时间,无负脉宽,有静默时间:0x54 或 0x55 或 0x5C 或 0x5D + 正脉宽交替,无死区时间,负脉宽不交替但有波形,无静默时间 :0x5A 或 0x5B + 正脉宽交替,无死区时间,负脉宽不交替但有波形且波形在正脉宽上(因为源B失能了),无静默时间 :0x52 或 0x53 + 正脉宽交替,无死区时间,负脉宽不交替但有波形且波形在正脉宽上(因为源B失能了),有静默时间 :0x56 或 0x57 + 正脉宽交替,无死区时间,负脉宽不交替但有波形,有静默时间 : 0x5E 或 0x5F + */ + // CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x5F; //bit 0:rest enable , 正半周期和负半周期中间的死区时间 + // 1:negative enable , 负半周期发生使能,如果不使能,则没有负半周期的波形 + // 2: silent enable , 负半周期结束后的静默时间 + // 3: source B enable + // 4: alternating the positive side ,正极交替产生包络 + // 5: continue mode ,连续模式 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x34; // 静默时间、交替模式和多电极使能 //6: multi-electrode ,多电极模式 + +#endif + + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ISEL_REG = 0x04; // 总电流 = 单元电流ISEL * WAVE_GEN_DRV_IN_WAVE_REG + + for (int i = 0; i < 64; i++) + { + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i; + // CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = sine_data[i]; //正弦波数据数组,根据数组中的点描绘正半周期的波形 + // CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = saw_data[i]; //三角波数据 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = incount; // 方波数据(固定值0x80) } - - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_LIM_REG = 3200;// 3200 需要设置一个正半周期下需要再生成多少个周期波形。设置10kHz=0.1ms=100us,100us=A*(1/32us),所以A=3200。 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_SILENT_LIM_REG = 0; // 交替后静默的时钟数(无死区时间设置)。在这种情况下,驱动器B连续交替。//包络下波形的静默时间 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_DELAY_LIM_REG = 0x00000000; // 延迟时钟数 - - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_SCALE_REG = 0x00000001; //负半周期幅值倍乘系数,如超过255,则从0开始增长 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_OFFSET_REG = 0x00000000; //负半周期幅值偏移量,如超过255,则从0开始增长, - //如正半周期幅值为250,此处设置为10,则负半周期幅值为5 !!! - - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_INT_REG = 0x0;// 中断寄存器设置为0 - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CTRL_REG = 0x00000001; //使能驱动器 + + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_LIM_REG = 3200; // 3200 需要设置一个正半周期下需要再生成多少个周期波形。设置10kHz=0.1ms=100us,100us=A*(1/32us),所以A=3200。 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_SILENT_LIM_REG = 0; // 交替后静默的时钟数(无死区时间设置)。在这种情况下,驱动器B连续交替。//包络下波形的静默时间 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_DELAY_LIM_REG = 0x00000000; // 延迟时钟数 + + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_SCALE_REG = 0x00000001; // 负半周期幅值倍乘系数,如超过255,则从0开始增长 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_OFFSET_REG = 0x00000000; // 负半周期幅值偏移量,如超过255,则从0开始增长, + // 如正半周期幅值为250,此处设置为10,则负半周期幅值为5 !!! + + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_INT_REG = 0x0; // 中断寄存器设置为0 + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CTRL_REG = 0x00000001; // 使能驱动器 /* 生成返回值 */ - if (err_code != 0) { - puts("\n错误 : 驱动器A测试失败\n"); - return_val = 1; - err_code = 0; + if (err_code != 0) + { + printf("\n错误 : 驱动器A测试失败\n"); + return_val = 1; + err_code = 0; } - return(return_val); + return (return_val); } void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA) { - CMSDK_WAVEGEN_DRVA ->WAVE_GEN_DRV_ISEL_REG = 0; //范围 0x00 - 0x07 - - for(int i=0; i<64; i++){ - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i; - CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = 0; //最大值0xff + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ISEL_REG = 0; // 范围 0x00 - 0x07 + + for (int i = 0; i < 64; i++) + { + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i; + CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = 0; // 最大值0xff } } @@ -118,18 +127,20 @@ void wavegen_Init(void) { // 设置MTP等待周期 CMSDK_MTPREG->MTP_CR = 0x00000002; - + // 注意:时钟配置已在ClockInit()中完成,这里不再重复配置 // 使用HSI作为主频 32MHz // CMSDK_SYSCON->HSI_CTRL = (CMSDK_SYSCON->HSI_CTRL & ~CMSDK_SYSCON_HSI_FREQ_Msk) | (0x3 << CMSDK_SYSCON_HSI_FREQ_Pos); //HSI=32MHz - + // 使能UART和WAVE_GEN外设时钟(不覆盖TIMER0时钟) - CMSDK_SYSCON->APB_CLKEN |= 0x1003|0x4000; // 使用|=而不是=,避免覆盖其他时钟使能 - + CMSDK_SYSCON->APB_CLKEN |= 0x1003 | 0x4000; // 使用|=而不是=,避免覆盖其他时钟使能 + // 升压电压选择 - boost_voltage_select_26V(); - - puts("ENS1 - WAVE_GENERATOR_DRIVER_A_Test - $Revision: R001\n"); + //boost_voltage_select_11V(); + //boost_voltage_select_15V(); + //boost_voltage_select_26V(); + //boost_voltage_select_45V(); + boost_voltage_select_55V(); } // 启动波形生成器 @@ -137,12 +148,26 @@ void wavegen_Start(void) { g_ems_running = 1; g_ems_count = 0; + + // 初始化缓进缓出控制 + if (g_ems_config.enable_ramp) + { + g_current_intensity = 0; // 从0开始 + g_ramp_phase = 0; // 缓进阶段 + g_wave_counter = 0; // 重置方波计数器 + g_ramp_step_counter = 0; // 重置步进计数器 + } + else + { + g_current_intensity = g_ems_config.intensity; // 直接使用设定强度 + } } // 电刺激参数配置 void EMS_Configure(EMS_Config_TypeDef *config) { - if(config != NULL) { + if (config != NULL) + { g_ems_config = *config; } } @@ -151,16 +176,18 @@ void EMS_Configure(EMS_Config_TypeDef *config) void EMS_Start(void) { wavegen_Start(); - printf("电刺激已启动\n"); } // 停止电刺激 void EMS_Stop(void) { g_ems_running = 0; - g_ems_count = 0; // 重置计数器 + g_ems_count = 0; // 重置计数器 + g_current_intensity = 0; // 重置强度 + g_ramp_phase = 0; // 重置渐进阶段 + g_wave_counter = 0; // 重置方波计数器 + g_ramp_step_counter = 0; // 重置步进计数器 wavegen_Stop(WAVE_GEN_DRVA_BLK0); - printf("电刺激已停止\n"); } // 更新电刺激强度 @@ -169,23 +196,125 @@ void EMS_UpdateIntensity(uint16_t intensity) g_ems_config.intensity = intensity; } +// 缓进缓出处理函数(在电刺激处理中调用) +void EMS_Process_Ramp(void) +{ + if (!g_ems_config.enable_ramp || !g_ems_running) + { + return; // 如果未启用缓进缓出或未运行,直接返回 + } + + // 计算每个强度步进需要的方波周期数 + // 2秒 = 2000000微秒,每个方波周期100微秒,所以2秒内有20000个方波周期 + // 需要从0增加到128,所以每156.25个方波周期增加1个强度单位 + uint32_t waves_per_step = 0; + uint32_t total_waves_ramp_up = g_ems_config.ramp_up_time * 5; // 缓进阶段总方波周期数 + uint32_t total_waves_ramp_down = g_ems_config.ramp_down_time * 1; // 缓出阶段总方波周期数 + uint32_t total_waves_hold = g_ems_config.hold_time * 5; // 保持阶段总方波周期数 + + if (g_ems_config.intensity > 0) + { + waves_per_step = total_waves_ramp_up / g_ems_config.intensity; // 每个强度步进需要的方波周期数 + } + + g_wave_counter++; // 每次调用增加一个方波周期计数 + + switch (g_ramp_phase) + { + case 0: // 缓进阶段 + if (g_ramp_step_counter < total_waves_ramp_up) + { + // 检查是否需要增加强度 + if (g_wave_counter >= waves_per_step) + { + g_wave_counter = 0; // 重置方波计数器 + if (g_current_intensity < g_ems_config.intensity) + { + g_current_intensity++; + } + } + g_ramp_step_counter++; + } + else + { + // 缓进完成,进入保持阶段 + g_ramp_phase = 1; + g_ramp_step_counter = 0; + g_current_intensity = g_ems_config.intensity; // 确保达到最大强度 + } + break; + + case 1: // 保持阶段 + if (g_ramp_step_counter < total_waves_hold) + { + // 保持最大强度 + g_current_intensity = g_ems_config.intensity; + g_ramp_step_counter++; + } + else + { + // 保持完成,进入缓出阶段 + g_ramp_phase = 2; + g_ramp_step_counter = 0; + g_wave_counter = 0; // 重置方波计数器 + } + break; + + case 2: // 缓出阶段 + if (g_ramp_step_counter < total_waves_ramp_down) + { + // 检查是否需要减少强度 + if (g_wave_counter >= waves_per_step) + { + g_wave_counter = 0; // 重置方波计数器 + if (g_current_intensity > 0) + { + g_current_intensity--; + } + } + g_ramp_step_counter++; + } + else + { + // 缓出完成,停止电刺激 + g_current_intensity = 0; + + // 这里不直接停止,让主循环控制停止 + } + break; + } +} + // 电刺激主循环处理函数(在主循环中调用) void EMS_Process(void) { - if(g_ems_running) { + if (g_ems_running) + { g_ems_count++; - + + // 处理缓进缓出控制 + EMS_Process_Ramp(); + + // 使用当前缓进缓出的强度 + uint16_t current_intensity = g_current_intensity; + // 根据配置生成不同强度的方波 - if(g_ems_count < 1280) { - wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, g_ems_config.intensity); - } else if(g_ems_count < 1280*256) { + if (g_ems_count < 1280) + { + wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity); + } + else if (g_ems_count < 1280 * 256) + { // 休息时间 - } else if(g_ems_count < 1280*2) { - wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, g_ems_config.intensity); - } else { + } + else if (g_ems_count < 1280 * 2) + { + wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity); + } + else + { // 重置计数器,开始新的周期 g_ems_count = 0; } } } - diff --git a/FWLIB/source/ENS_ADC.c b/FWLIB/source/ENS_ADC.c index d222ba1..973b9ca 100644 --- a/FWLIB/source/ENS_ADC.c +++ b/FWLIB/source/ENS_ADC.c @@ -11,86 +11,86 @@ History: 1.V1.0 Date: Author: -Modification: +Modification: ���� */ #include "ENS1_ADC.h" #include "ENS1_GPIO.h" #include "ENS1_CLOCK.h" #include "ENS1_ANAC.h" -/* һĴ˵ -ADCãתģʽ ݸģʽ ȴģʽ -ADCƣ ADCʹ ADC -ADCжʹܣ EOCжʹ ݸжʹ -ADCж״̬ EOCжϷ ݸжϷ -ADC״̬ EOC־ ADCлæ״̬ -ADCʱӷƵ Ƶֵ 2 4 6 8 10 12 16 32 -ADCʱ ADCʱʱ 2 3 4 5 -ADCݣ -ADCͨѡ -ADCEOC ģʽ ǷڽյEOC־´ת +/* һ���Ĵ���˵���� +ADC���ã�ת��ģʽ ���ݸ���ģʽ �ȴ�ģʽ +ADC���ƣ� ADCʹ�� �� ADC���� +ADC�ж�ʹ�ܣ� EOC�ж�ʹ�� ���ݸ����ж�ʹ�� +ADC�ж�״̬�� EOC�жϷ��� ���ݸ����жϷ��� +ADC״̬ �� EOC��־ ADC���л�æ״̬ +ADCʱ�ӷ�Ƶ ����Ƶֵ 2 4 6 8 10 12 16 32 +ADC����ʱ�� ��ADC����ʱ��ʱ���� 2 3 4 5 +ADC���ݣ� +ADCͨ��ѡ�� �� +ADCEOC���� ��������ģʽ�� �� �Ƿ��ڽ��յ�EOC��־�����´�ת�� */ -/* תģʽ - *ADC ADC_START λ0 յEOCEOC_WAIT_COUNT_DONE һȵ - *ֱEOC_WAIT_COUNT_DONE ûнյEOC ݽᱻ - *ADCֹͣתͨûADC_CTRL_REG ADC_EN λ Ϊ1 - *ڲתڼ䣬ADC_EN λΪ0 ڽеתȻ EOC/EOC_WAIT_COUNT_DONE ֹͣת - *ݻEOC +/* ��������ת��ģʽ + *ADC�������� ��ADC_START λ��0 �����յ�EOC����EOC_WAIT_COUNT_DONE �� ������һ���ȵ��� + *���ֱ��EOC_WAIT_COUNT_DONE ��û�н��յ�EOC �����ݽ����ᱻ���� + *ADC��ֹͣת����ͨ���û�����ADC_CTRL_REG �� ADC_EN λ Ϊ1 + *����ڲ�����ת���ڼ䣬ADC_EN λ��Ϊ0 ����������������ڽ��е�ת����Ȼ����� EOC/EOC_WAIT_COUNT_DONE ֹͣת�� + *���ݻ���EOC ��������� -ADCת̣ -1õת޵ȴģʽ -2ADC_CONFIG_reg bit0 = 0 bit2 = 0 -3ת -4ת ݱADC_Data register -5һADC_EOC_IEжɣ -6ʹ IERĴ EOC_INT_EN OVER_RUN_INT_EN λϵͳж -7ӲֹͣADC +ADC����ת�����̣� +1�����õ���ת�����޵ȴ�ģʽ�� +2������ADC_CONFIG_reg bit0 = 0 bit2 = 0 +3������ת������ +4��ת�������� ���ݱ�����ADC_Data register +5��һ��ADC_EOC_IE�ж����ɣ� +6�����ʹ���� IER�Ĵ����� EOC_INT_EN ��OVER_RUN_INT_EN λ����ϵͳ�����ж� +7��Ӳ��ֹͣADC */ -/*תģʽ -1ADC_CONFIG_reg bit0 = 1 -2λ1 ADC_EN bit and ADC_START bits -3ÿת֮󣬻adc_eoc_config_regsiter[0] ´ת - Adc_eoc_config_register[0] =1 յEOCʼ´ת - ݱ浽Ĵ -4ADC_EOC_IE ж -5ʹ IERĴ EOC_INT_EN OVER_RUN_INT_EN λϵͳж +/*��������ת��ģʽ +1������ADC_CONFIG_reg bit0 = 1 +2������λ��1 ADC_EN bit and ADC_START bits +3����ÿ��ת�����֮�󣬻���adc_eoc_config_regsiter[0] �����´�ת���� + ���Adc_eoc_config_register[0] =1 �� ����յ�EOC��ʼ�´�ת�� + ���ݱ��浽�Ĵ����� +4��ADC_EOC_IE �ж����� +5�����ʹ���� IER�Ĵ����� EOC_INT_EN ��OVER_RUN_INT_EN λ����ϵͳ�����ж� -ע⣺ADC_eoc_config_regĴ-ǵȴģʽЧ 0ģʽEOCʼһת - 1ģʽյEOCʼһת --ȴģʽ£ADC_eoc_config_regӦñΪ0 +ע�⣺ADC_eoc_config_reg�Ĵ�����������������-�ǵȴ�ģʽ����Ч ����0������ģʽ������EOC����ʼ������һ��ת�� + 1������ģʽ���յ�EOC��ʼ������һ��ת�� +����������-�ȴ�ģʽ�£�ADC_eoc_config_regӦ�ñ�����Ϊ0 ������ */ -/*ġȴģʽ -1ADC_CONFIG_reg bit2 = 1 ʹܵȴģʽ -2ת -3תɺ - ADCݵӦĴ - ADC_EOC_IE ж - ʹ IERĴ EOC_INT_EN OVER_RUN_INT_EN λϵͳж -4ADC뵽ADC_WAIT ȴ״ֱ̬EOCжϱ ADCݱϵͳ -5һEOCжϱADCʼһεת +/*�ġ��ȴ�ģʽ +1������ADC_CONFIG_reg bit2 = 1 ��ʹ�ܵȴ�ģʽ�� +2����������ת�� +3����ת����ɺ� + ��ADC���ݵ���Ӧ�Ĵ����� + ADC_EOC_IE �ж����� + ���ʹ���� IER�Ĵ����� EOC_INT_EN ��OVER_RUN_INT_EN λ����ϵͳ�����ж� +4��ADC���������뵽ADC_WAIT �ȴ�״ֱ̬��EOC�жϱ���� ���� ADC���ݱ�ϵͳ���� +5��һ��EOC�жϱ������ADC��ʼ��һ�ε�ת�� */ -/*塢 -1ADCյEOCݽ -2 OVERRUNģʽʹܣµתݽᱻ overrun ״̬ +/*�塢���������� +1����ADC���������յ�EOC�����ݽ������� +2����� OVERRUNģʽ��ʹ�ܣ��µ�ת�����ݽ��ᱻ���� ���� overrun ����״̬��� -ע⣺ overrun ģʽûбʹܣ µĻ߾ɵתݽoverrun ״̬ѡ - overrun ݽᱻ - ûoverrun ݽ +ע�⣺ ���overrun ģʽû�б�ʹ�ܣ� �µĻ��߾ɵ�ת�����ݽ�����overrun ����״̬ѡ�������� + ���� ���overrun �����������ݽ����ᱻ���� + ���û��overrun �������������ݽ������� */ -/*ж˵ -1յEOC EOC_IR -2OVERRUNOVERRUN_IR -3EOC_IR overrun ΪADCжϱ ͨϵͳ - ϵͳͨ data_reg ȡadcݺ EOC_IR EOC_IR_CLEAR +/*�����ж�˵�� +1�����յ�EOC�� EOC_IR ���� +2��OVERRUN��������OVERRUN_IR ���� +3��EOC_IR ��overrun ��ΪADC�жϱ� ͨ����ϵͳ + ��ϵͳͨ�� data_reg ��ȡ��adc���ݺ� EOC_IR �� EOC_IR_CLEAR ��� */ -/*overrun - ˴ָǣ ADCϵͳȡADCǰһEOC_IRǰյµEOC +/*overrun ���� + �˴���ָ���ǣ� ADC��������ϵͳ��ȡ��ADC����ǰ�����������һ��EOC_IRǰ�������յ��µ�EOC */ @@ -148,13 +148,13 @@ uint8_t ENS1_ADC_CONFIG(ENS_ADC_SEL channelx , CMSDK_ADC->ADC_SAMP_TIME = (CMSDK_ADC->ADC_SAMP_TIME &~ 0x3) | SIMLING_TIME; - //ADC_eoc_config_regĴ-ǵȴģʽЧ + //����ADC_eoc_config_reg�Ĵ���������������������-�ǵȴ�ģʽ����Ч�� if( ((MODE_SEL & 0X1 )== 1 ) && (MODE_SEL & 0X4) == 0) { CMSDK_ADC->ADC_EOC_CONFG = (CMSDK_ADC->ADC_EOC_CONFG &~ (0x1)) | EOC_CONFIG; } - //жʹ + //�ж�ʹ�� CMSDK_ADC->ADC_IER = (CMSDK_ADC->ADC_IER &~ (0x3)) | ( INT_MODE_SEL ); return CMSDK_ADC->ADC_CONFG; } @@ -176,11 +176,11 @@ uint8_t ENS1_ADC_STOP(ENS_ADC_SEL channelx) return 0; } -//ȡ -//ADCڲͬģʽвͬIJɼʽAdc_config_registeròͬ8ģʽ +//������ȡ���� +//ADC�ڲ�ͬģʽ���в�ͬ�IJɼ���ʽ������Adc_config_register�����ò�ͬ����8��ģʽ uint16_t save_data; uint8_t ADC_CONFIG_READ; -//˺δɣʹɼ+жģʽ˺ʱò +//�˺���δ��ɣ�����ʹ�������ɼ�+�ж�ģʽ���˺�����ʱ�ò��� uint16_t ADC_READ_DATA(void) { @@ -188,8 +188,8 @@ uint16_t ADC_READ_DATA(void) ADC_CONFIG_READ = CMSDK_ADC->ADC_CONFG; switch(ADC_CONFIG_READ & 0x7) { case single_mode_without_overrun_without_wait : - while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //ȴжEOCĵ - ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //жϷѾADCˣʱٽ״̬лȴһ + while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //�ȴ����ж���EOC�ĵ��� + ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //�жϷ������Ѿ���ADC�������ˣ���ʱ�ٽ�״̬�л����ȴ���һ������ break; @@ -230,12 +230,11 @@ uint16_t ADC_READ_DATA(void) //ADC interrupt handler void ADC_Handler(void) __irq { - if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //յEOC + if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //���յ�EOC { CMSDK_ADC->ADC_INT_CLR = (0x01<<0); ADC_READ_STATUS = ADC_READ_DATA_IS_READY; - save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //ݺ󣬿Խһβɼ - printf("%d\n",save_data); + save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //�������ݺ󣬿��Խ�����һ�βɼ� ADC_UART_BYTE_LOW = save_data&0xff; ADC_UART_BYTE_HIGH = (save_data&0x0f00)>>8; } diff --git a/FWLIB/source/ENS_CURRENT_CALIBRATION.c b/FWLIB/source/ENS_CURRENT_CALIBRATION.c index 55829d4..261f443 100644 --- a/FWLIB/source/ENS_CURRENT_CALIBRATION.c +++ b/FWLIB/source/ENS_CURRENT_CALIBRATION.c @@ -11,106 +11,106 @@ History: 1.V1.0 Date: Author: - Modification: + Modification: ���� */ #include "ENS_CURRENT_CALIBRATION.h" #include "ENS1_MTP.h" #include "ENS1_UART.h" #include "ENS1_TIMER.h" -/*--------------------------------βijʼֵṹ-----------------------------*/ +/*--------------------------------���β����ij�ʼ����ֵ�ṹ��-----------------------------*/ STRUCT_WAVEFORM_PARA ParaSet_waveform[4] = { - /*ͨ1 -- ST0 ST1 */ + /*ͨ��1 -- ST0 ST1 */ { - .Type = SQUARE_WAVE , //ѡ - .PositivePulseWidth = 100 , //-΢ - .DeadTime = 10, //ʱ-΢ - .NegativePulseWidth = 100 , //-΢ - .ClientTime = 1000 , //Ĭʱ-΢ - .DelayOutputTime_US = 0, //ӳʱ-΢ - .OtherWaveformPara.AlternatingFreq_HZ = 0, //沨Ƶ // - .OtherWaveformPara.TotalOutputTime_S = 0, //ʱ - .OtherWaveformPara.NumOfPulseGroups = 0, //Ⱥģʽµÿ - .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //Ⱥģʽµʱ + .Type = SQUARE_WAVE , //��������ѡ�� + .PositivePulseWidth = 100 , //������������-΢�� + .DeadTime = 10, //����ʱ��-΢�� + .NegativePulseWidth = 100 , //������������-΢�� + .ClientTime = 1000 , //��Ĭʱ��-΢�� + .DelayOutputTime_US = 0, //�ӳ����ʱ��-΢�� + .OtherWaveformPara.AlternatingFreq_HZ = 0, //���沨��Ƶ�� // + .OtherWaveformPara.TotalOutputTime_S = 0, //���������ʱ�� �� + .OtherWaveformPara.NumOfPulseGroups = 0, //����Ⱥģʽ�µ�ÿ���������� + .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //����Ⱥģʽ�µ�����ʱ�� ���� }, - /*ͨ2 -- ST2 ST3 */ + /*ͨ��2 -- ST2 ST3 */ { - .Type = TRIANGULAR_WAVE , //ѡ - .PositivePulseWidth = 0 , //-΢ - .DeadTime = 0, //ʱ-΢ - .NegativePulseWidth = 0 , //-΢ - .ClientTime = 0 , //Ĭʱ-΢ - .DelayOutputTime_US = 0, //ӳʱ-΢ - .OtherWaveformPara.AlternatingFreq_HZ = 0, //沨Ƶ // - .OtherWaveformPara.TotalOutputTime_S = 0, //ʱ - .OtherWaveformPara.NumOfPulseGroups = 0, //Ⱥģʽµÿ - .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //Ⱥģʽµʱ + .Type = TRIANGULAR_WAVE , //��������ѡ�� + .PositivePulseWidth = 0 , //������������-΢�� + .DeadTime = 0, //����ʱ��-΢�� + .NegativePulseWidth = 0 , //������������-΢�� + .ClientTime = 0 , //��Ĭʱ��-΢�� + .DelayOutputTime_US = 0, //�ӳ����ʱ��-΢�� + .OtherWaveformPara.AlternatingFreq_HZ = 0, //���沨��Ƶ�� // + .OtherWaveformPara.TotalOutputTime_S = 0, //���������ʱ�� �� + .OtherWaveformPara.NumOfPulseGroups = 0, //����Ⱥģʽ�µ�ÿ���������� + .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //����Ⱥģʽ�µ�����ʱ�� ���� }, - /*ͨ3 -- ST4 ST5 */ + /*ͨ��3 -- ST4 ST5 */ { - .Type = TRIANGULAR_WAVE , //ѡ - .PositivePulseWidth = 0 , //-΢ - .DeadTime = 0, //ʱ-΢ - .NegativePulseWidth = 0 , //-΢ - .ClientTime = 0 , //Ĭʱ-΢ - .DelayOutputTime_US = 0, //ӳʱ-΢ - .OtherWaveformPara.AlternatingFreq_HZ = 0, //沨Ƶ // - .OtherWaveformPara.TotalOutputTime_S = 0, //ʱ - .OtherWaveformPara.NumOfPulseGroups = 0, //Ⱥģʽµÿ - .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //Ⱥģʽµʱ + .Type = TRIANGULAR_WAVE , //��������ѡ�� + .PositivePulseWidth = 0 , //������������-΢�� + .DeadTime = 0, //����ʱ��-΢�� + .NegativePulseWidth = 0 , //������������-΢�� + .ClientTime = 0 , //��Ĭʱ��-΢�� + .DelayOutputTime_US = 0, //�ӳ����ʱ��-΢�� + .OtherWaveformPara.AlternatingFreq_HZ = 0, //���沨��Ƶ�� // + .OtherWaveformPara.TotalOutputTime_S = 0, //���������ʱ�� �� + .OtherWaveformPara.NumOfPulseGroups = 0, //����Ⱥģʽ�µ�ÿ���������� + .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //����Ⱥģʽ�µ�����ʱ�� ���� }, - /*ͨ4 -- ST6 ST7 */ + /*ͨ��4 -- ST6 ST7 */ { - .Type = TRIANGULAR_WAVE , //ѡ - .PositivePulseWidth = 0 , //-΢ - .DeadTime = 0, //ʱ-΢ - .NegativePulseWidth = 0 , //-΢ - .ClientTime = 0 , //Ĭʱ-΢ - .DelayOutputTime_US = 0, //ӳʱ-΢ - .OtherWaveformPara.AlternatingFreq_HZ = 0, //沨Ƶ // - .OtherWaveformPara.TotalOutputTime_S = 0, //ʱ - .OtherWaveformPara.NumOfPulseGroups = 0, //Ⱥģʽµÿ - .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //Ⱥģʽµʱ + .Type = TRIANGULAR_WAVE , //��������ѡ�� + .PositivePulseWidth = 0 , //������������-΢�� + .DeadTime = 0, //����ʱ��-΢�� + .NegativePulseWidth = 0 , //������������-΢�� + .ClientTime = 0 , //��Ĭʱ��-΢�� + .DelayOutputTime_US = 0, //�ӳ����ʱ��-΢�� + .OtherWaveformPara.AlternatingFreq_HZ = 0, //���沨��Ƶ�� // + .OtherWaveformPara.TotalOutputTime_S = 0, //���������ʱ�� �� + .OtherWaveformPara.NumOfPulseGroups = 0, //����Ⱥģʽ�µ�ÿ���������� + .OtherWaveformPara.TimeOfPulseGroups_MS = 0, //����Ⱥģʽ�µ�����ʱ�� ���� }, }; /*-------------------------------------------------------------------------------------*/ -/*-------------------------ȡFTԺʵʲԪֵ---------------------------*/ -uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //ڱFTȡ -uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //Զ嵥Ԫֵ -uint8_t unit_current[4] ={0,0,0,0}; //õʵʵԪֵ -uint8_t GET_FT_CURRENT(void) //ã208*4 +/*-------------------------��ȡ��FT���Ժ��ʵ�ʲ�����Ԫ����ֵ---------------------------*/ +uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //���ڱ���FT��ȡ�������� +uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //�����Զ��嵥Ԫ����ֵ +uint8_t unit_current[4] ={0,0,0,0}; //�������õ�ʵ�ʵ�Ԫ����ֵ +uint8_t GET_FT_CURRENT(void) //�������ã�208*4 { - //ҪʹFTоƬʱעͣ ʱԶ㵥Ԫ - //ֶУ׼ʱ޸CUSTOM_UNIT_CURRENT[4] еݣ4ע͵ -// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//MTPеʵʼֵڼʵʵԪ -// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//MTPеʵʼֵڼʵʵԪ -// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//MTPеʵʼֵڼʵʵԪ -// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//MTPеʵʼֵڼʵʵԪ + //����Ҫʹ��FT���оƬʱ����ע�ͣ� ��ʱ�Զ����㵥Ԫ���� + //���ֶ�У׼ʱ���޸�CUSTOM_UNIT_CURRENT[4] �����е����ݣ���������4��ע�͵� +// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//����������MTP�е�ʵ�ʼ�����ֵ���ڼ���ʵ�ʵ�Ԫ���� +// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//����������MTP�е�ʵ�ʼ�����ֵ���ڼ���ʵ�ʵ�Ԫ���� +// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//����������MTP�е�ʵ�ʼ�����ֵ���ڼ���ʵ�ʵ�Ԫ���� +// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//����������MTP�е�ʵ�ʼ�����ֵ���ڼ���ʵ�ʵ�Ԫ���� for(int i = 0 ;i<4;i++) { if(FT_CURRENT_SAVE[i] != 0) - unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //ʵʵԪ + unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //����ʵ�ʵ�Ԫ���� else unit_current[i] = CUSTOM_UNIT_CURRENT[i] ; } return 0; } -/*-------------------------------------С--------------------------------*/ -//Ҳֵ +/*-------------------------------------���������С����--------------------------------*/ +//���Ҳ������������ֵ double sin_cal(uint8_t angle) //0-180 { double radian = angle*PI/180; return sin(radian); } -//㲻ͬµĵ64ֵǰзҲDz -uint16_t unit_t[4]; //ĵԪϵ0-7 ĸͨ -uint32_t isel_t[4][64]; //õĵλ0-255ĸͨ +//���㲻ͬ�����µĵ�64�����ֵ����ǰ�з��������Ҳ������Dz� +uint16_t unit_t[4]; //��������ĵ�Ԫ����ϵ����0-7�� ���ĸ�ͨ�� +uint32_t isel_t[4][64]; //��������õ��ĵ�����λ��0-255�����ĸ�ͨ�� BasicWaveformType wavePara_type[4]; uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType type, uint16_t* unit , uint32_t (*isel)[64]) // uint16_t read_current_data { @@ -134,7 +134,7 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t { if(type == SQUARE_WAVE) { - //,ڸصļĴֵ + //���������,���ڸ�������صļĴ�����ֵ *(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7 for(int i = 0 ;i<64;i++) { @@ -143,37 +143,35 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t } else if(type== SINE_WAVE) { - //,ڸصļĴֵ + //���������,���ڸ�������صļĴ�����ֵ *(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7 for(int i = 0 ;i<64;i++) { *(isel[0]+CHANNEL_X*64+i) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X) + 1)*unit_current[CHANNEL_X])*sin_cal(i*2.85714)); // 0 - 255 } } - else //Dzֵ(type == TRIANGULAR_WAVE ) + else //���Dz���ֵ(type == TRIANGULAR_WAVE ) { - //,ڸصļĴֵ + //���������,���ڸ�������صļĴ�����ֵ *(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7 *(isel[0]+CHANNEL_X*64) = 0; *(isel[0]+CHANNEL_X*64+63) = 0; for(int j = 1 ; j<32 ; j++) { - *(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255 - // printf("%d\n",*(isel[0]+CHANNEL_X*64+j)); + *(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255 } for(int k = 32 ; k<63 ; k++) { - *(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ; - // printf("%d\n",*(isel[0]+CHANNEL_X*64+k)); + *(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ; } } } return 0; } -/*ʼ*/ -/*CONFIGĴ*/ +/*��ʼ������*/ +/*CONFIG�Ĵ�������*/ uint8_t ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT) { CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK; @@ -223,7 +221,7 @@ uint8_t ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT) } -/*---------------------------̼йصļĴijʼ--------------------------------*/ +/*---------------------------��̼��йصļĴ����ij�ʼ��--------------------------------*/ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X) { //uint32_t WaveformFreq=0; @@ -232,9 +230,9 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X) else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1; else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2; else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; - //config + //config ���� ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,DISABLE_ALL_BIT); - //1 ʱ䲻Ϊ0βΪsine ,ʹREST + //1 �� ����ʱ�䲻Ϊ0�����β�Ϊsine�� ,ʹ��REST if((ParaSet_waveform[CHANNEL_X].DeadTime > 0)){ ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,REST_BIT); } @@ -242,13 +240,13 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X) { ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,REST_BIT); } - //2 0 ʹ NEGATIVE_BIT SOURCE_B_BIT + //2 �� ����������������0 ʹ�� NEGATIVE_BIT �� SOURCE_B_BIT if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth > 0) { - ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEBʹ򸺰ڵЧ=0 + ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEB��ʹ���򸺰����ڵ�������Ч��=0�� ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,NEGATIVE_BIT ); } - //3Ĭʱ䲻Ϊ0SILENT_BIT + //3����Ĭʱ�䲻Ϊ0������SILENT_BIT if(ParaSet_waveform[CHANNEL_X].ClientTime>0) { ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SILENT_BIT); @@ -258,13 +256,13 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X) ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SILENT_BIT); } - //4ģʽALTERNATING_POSITIVE_BIT + //4������ģʽALTERNATING_POSITIVE_BIT if(ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ > 0 ) { ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,ALTERNATING_POSITIVE_BIT); ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SOURCE_B_BIT); ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,NEGATIVE_BIT); - //ʱƵй,IJΪƵʣҪתΪʱӸʱӸܳ2^16 + //����ʱ������Ƶ�й�,����IJ���Ϊ����Ƶ�ʣ���Ҫת��Ϊʱ�Ӹ�����ʱ�Ӹ������ܳ���2^16 WAVE_GEN_BLK ->WAVE_GEN_DRV_ALT_LIM_REG =(uint16_t)(ParaSet_waveform[CHANNEL_X].PositivePulseWidth / (uint16_t)ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ * (uint16_t)(APB_Clock_Freq/1000000)) ; ParaSet_waveform[CHANNEL_X].NegativePulseWidth = 0; } @@ -274,37 +272,37 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X) } ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,CONTINUE_REPEATING_BIT); - //ӳʱ λus + //�ӳ����ʱ����� ��λus WAVE_GEN_BLK->WAVE_GEN_DRV_DELAY_LIM_REG = (uint8_t)(APB_Clock_Freq/1000000)*ParaSet_waveform[CHANNEL_X].DelayOutputTime_US; - //ݳʼSTRUCT_WAVEFORM_PARAṹӦļĴֵ + //���ݳ�ʼ�����STRUCT_WAVEFORM_PARA�ṹ�����Ӧ�ļĴ�����ֵ WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].NegativePulseWidth; WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].PositivePulseWidth; WAVE_GEN_BLK->WAVE_GEN_DRV_CLK_FREQ_REG = (uint32_t)(APB_Clock_Freq/1000000); // WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = ParaSet_waveform[CHANNEL_X].ClientTime; WAVE_GEN_BLK->WAVE_GEN_DRV_REST_T_REG = ParaSet_waveform[CHANNEL_X].DeadTime; - WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //ĴĬΪ0 д0 + WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //�Ĵ���Ĭ��Ϊ0�� ����д����0���� WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_OFFSET_REG = 0; //WaveformFreq = (uint32_t)(1000000 / (wavePara.ClientTime + wavePara.DeadTime +wavePara.NegativePulseWidth + wavePara.PositivePulseWidth)); - //沨 + //���沨���������� wavePara_type[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].Type; TOTAL_TIME_THRESHOLD_VALUE[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TotalOutputTime_S * 1000; if( (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS > 0) || (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups >0)) { - TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //ʱ + TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //���ʱ������ TRIGGER_TIME_THRESHOLD_VALUE[CHANNEL_X]=ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS ; NUM_OF_PULSES_THRESHOLD[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups ; WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001; } uint8_t returnValue = cal_output_current_mA(CHANNEL_X,0, wavePara_type[CHANNEL_X], unit_t , isel_t) ; - return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //زεƵ + return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //���ز��ε�Ƶ�� } -/*-------------------------------------------------------------------------------*/ -volatile uint8_t statics_config=0; //ȷǰмͨ 0 / 1 / 2 /4 / 8 +/*--------------------------------------�������-----------------------------------------*/ +volatile uint8_t statics_config=0; //��ȷ��ǰ�м���ͨ������� 0 / 1 / 2 /4 / 8 void StartStimulatorOut(CHANNEL_NUM CHANNEL_X) { CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK; @@ -314,11 +312,11 @@ void StartStimulatorOut(CHANNEL_NUM CHANNEL_X) else {WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; statics_config |= (1<<3) ;} if(statics_config > 1) { - ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //缫ʹ + ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //��缫ʹ�� } WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG = 1; } -/*--------------------------------------ֹͣ----------------------------------------*/ +/*--------------------------------------ֹͣ���----------------------------------------*/ void StopStimulatorOut(CHANNEL_NUM CHANNEL_X) { CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK; @@ -333,8 +331,8 @@ void StopStimulatorOut(CHANNEL_NUM CHANNEL_X) } } -/*-----------------------------̼еĵƵ-------------------------------*/ -/*С޸*/ +/*-----------------------------��̼������еĵ�����Ƶ������-------------------------------*/ +/*���������С�޸�*/ uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA) { CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK; @@ -347,18 +345,18 @@ uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA) WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0; StopStimulatorOut(CHANNEL_X); cal_output_current_mA(CHANNEL_X,mA, wavePara_type[CHANNEL_X], unit_t , isel_t) ; - WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //Χ 0x00 - 0x07 Ԫ + WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //��Χ 0x00 - 0x07 ��Ԫ���� for(int i=0; i<64; i++){ WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i; - WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //0xff λ + WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //���0xff ������λ } WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001; NVIC_EnableIRQ(WG_DRV_IRQn); StartStimulatorOut(CHANNEL_X); - return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //״̬ + return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //����״̬ } -/*Ƶʵʵʱ޸ģʱƵ=(1000000/( + + ʱ + Ĭʱ))*/ +/*�������Ƶ�ʵ�ʵʱ�޸ģ����ʱ������Ƶ��=(1000000/(������������ + ������������ + ����ʱ�� + ��Ĭʱ��))*/ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq) { uint32_t Pulse_Width = 0; @@ -371,16 +369,16 @@ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq) freq = 50000; else if(freq < 10) freq = 10; - //ֵĶĬʱ䲻Ϊ0 ͨ޸ľĬʱ޸IJƵ ĬʱΪ0޸/޸Ƶ + //������ֵ���Ķ��������Ĭʱ�䲻Ϊ0 ����ͨ���޸ľ�Ĭʱ���޸IJ���Ƶ�� �������Ĭʱ��Ϊ0�����޸���������/�������������޸�Ƶ�� if(ParaSet_waveform[CHANNEL_X].ClientTime > 0) { - Pulse_Width/*Ĭʱ*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth); + Pulse_Width/*��Ĭʱ��*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth); WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = Pulse_Width; return Pulse_Width; } else if(ParaSet_waveform[CHANNEL_X].ClientTime == 0) { - Pulse_Width/*+*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ; + Pulse_Width/*��+������*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ; if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth == 0) WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = Pulse_Width; else @@ -397,7 +395,7 @@ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq) } -//̼ʱʱ +//��̼�ʱ���ʱ uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE) { @@ -406,20 +404,20 @@ uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE) { count_time = *(CHANNEL_TIME_COUNT+CHANNEL_X) ; } - else //MODE == TRIGGER_TIME_MODE ʱ + else //MODE == TRIGGER_TIME_MODE ���ʱ�� { count_time = *(TRIGGER_TIME_COUNT+CHANNEL_X); } return count_time; } -//صǰη˶ٴΣҪηжϣ +//���ص�ǰ���η����˶��ٴΣ���Ҫ�������η��������жϣ� uint32_t waveformOccurreCount(CHANNEL_NUM CHANNEL_X) { return (uint32_t)(wave_gen_irq_occurred[CHANNEL_X]/4); } -/*-------------------------------̼жϴ-----------------------*/ +/*-------------------------------��̼��������жϴ�������-----------------------*/ volatile uint32_t NUM_OF_PULSES_THRESHOLD[4]={0,0,0,0}; volatile uint32_t wave_gen_irq_occurred[4]={0,0,0,0}; void WG_DRV_Handler(void) @@ -433,9 +431,9 @@ void WG_DRV_Handler(void) else if(i==2){ DRVA= WAVE_GEN_DRVA_BLK2; } else if(i==3){ DRVA= WAVE_GEN_DRVA_BLK3; } - if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //жĸͨж + if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //�ж��ĸ�ͨ���������ж� { - if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//һжϵ㷢ж + if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//��һ�жϵ㷢���ж� { if(((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Msk)>>CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Pos) == 0) { @@ -448,7 +446,7 @@ void WG_DRV_Handler(void) { DRVA->WAVE_GEN_DRV_INT_REG = (31 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (0 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk; } - if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //Ҫܲſ + if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //��Ҫ����������ܲſ������� wave_gen_irq_occurred[i]++; @@ -459,8 +457,8 @@ void WG_DRV_Handler(void) DRVA->WAVE_GEN_DRV_INT_REG = CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk; NVIC_DisableIRQ(WG_DRV_IRQn); DRVA->WAVE_GEN_DRV_INT_REG = 0; - TRIGGER_TIME_COUNT_FLAG |= (1<a8pDs2Sh!11q4M)QIsPn3Ucv29Z*mx6ht&D?AXny%%GKR zFEv_|Wf#i{m8Q|6d8X2-nY3)CdbFsfspfGeyG)?m-tTYkz3_O(d7sbw&wFa^y}!TP z`mNu(uf6d?kM(SywK-i}5MN$-INoNkmnUmRB2y1G|sP#_>VfF`+zHV7R%z7$_ z*^`4?{*)G19?tAd3Uioqx6U!=vN?TUU-|DhL9KCol46_OuXM1B>HV!MOerSIW(TwH zYHhI&;T9)jjwEr&FNf!gAN>|{hnQzuuKds|4%)8gABeAPlRd$S2`--7-x=9sKd~9& z_M?My*=FV(bviPaRn3SA&$E@Wi=(^3a?MS4P%H`lN>jG^{RCG?F2AUBhjj$#RC7~y z;0HE5p9GW(ZQ+B571WTHc zyY<#PSWeXRT?G zv(+)jaG*GdC+69L_@}}LvakzG;l48K#J{%0QYcqIfGTz}P8)S>@Q0VPP6<5gUi1V%HK^;m(9Z`>RhdJ+L z85$X?-2}VrVon!w+RA3+gI{;l?6NufJO9!jiR&@#y03pr!YSqljsDIJm&#^YTs$$^ zWkz$_)k9Kk{dFgj$Tn<<$AY3pln}_Rn{z$x_M_GW6GR&?*%B1oH(#=!AbPg=IH)x= z8&A3vOA3Uke(`wlLjF(jUGPwTO8AG&;;)POA(LbG^#y_3)JJu<)$i_X%Nde>q>rv! z#1kRmp1plmgQsXb(N}i@-43nK>UY=mWJ*79OBR%)->_KNZ z&;#I-)e+!Qo(a8WH?{kuPH39dQPxqF+;|_eX-`{G?L?_=)Ui!UY&oS#IJaycFHLp5&umkF6%}3OiCc~$oazz_LZdxvFMWCAlQ*IwyGFYv!ffTG zRW~LAzhvNFT>7&5$?E>jXAE3=X;pP1@IC|2zw~9*lQ5?mIOo!;szl(2y3o-R?MK61 zb{Eg<>vZ?qPcU{d%YL-K^A5OX@RD7juD;HNVA_xRB`9;5!`}}Tfri3OjG5-z(F;OB zx$}~+hoyKL&}O=h4t9mO%q}*<)G@_%cuqyk+877Mv#v8v7xH9Et|>3K-0rZI*UbsP z*`KivHiMdWkn8i8X&me~T1V62{?5;O`a63saR*CaEz0mgF5aRvhok1d?Pdvd7d_+i z#zUvFZ+za^-2O408GY1HM)vl1F6w0$8+()Ig}mb@%+LG%m-%3S=cAYVJJ)s3=s@lC zil~UO6+_X1Z7#NXkTc-i5Pc9sOT#Eq*Wc;t?(f`m+1`P1V{?Sl|6B;}+-XBQ#n=J< z)NW(Ys3T7bdN4e!XRn{Y&|yOqsC_$dKN~Nej@ZvX6>}nQi8#~O-?_7I*x`#OsFD8x zXh)wo8~GSNAl45~tKd9haHblZV|_N)dX{Hv4{7(~vz#vJ##4}O>J^Tt z!JZv`JdrYbe^y^-Utj9nw0V7<_xDl5>w~8((FuHKpP!2;tfQjC)M9rH1#fHLRF`RQ zUuPqDrbPdiBEO`0PFE^88~XfO0-F=(I_71%{CD?t-UJEW5#TB$y*<(SL6M9LWIle+G=RN){=4RdIhvLnl6Fe{VrnxL| z;MbZ|vdfOVTYIf8rR6$TvMYEG;pcmGjeU?+AiJ~If3F!{?d!F)gzXvBJO+J;!l06# z>#f`nFmwo?zEhur0d>K_IhtBB~Zu+(Qxb8>ow0d%WvnNbgjaKcX*G&M0KSn(v$2WK^~t61-*G+|hbqT^Z!oO> z+`V{ikQg2lK5|Eox!KgRaBk5&|J}im`l8#UX$SYly-&S)8-|OrZm}Z9>Awc9kn(rp z!I-6sCu!!WT6M+yyV;1*E+;yG1(lZ3L#=h>+>wM)DdT!D(lwK`j)xewhW1dW>FbQ` zVOk}x5z}Ia`M+#s>?fo+Q64+Q@`IVNSHzasVLVvuj!p15yQwqlZTGEiz1B{4`?pY0 zgN+t>vYQ&vgxmmlW6|1d^5v;okN9o39;TNd!CR<1>!o_BTfbkr%!ixdJ4@W_m+9j0 z{Sj1NaPw4no=Wwc*tw_Mq6OmkC9~Fz?>0{WHspmkVb_+8BEI%;(VqS+;h593lj(=R(we>A~> z=fN!NuwVsc$(>P+`z)Gr`a82P(#j(Usu_~M~CYCzH z++8#)Kn{xRLKw5#6PTTh*ioP!V33)@NSv|5hx9wyWhR|y(Kxu6L~261n2`|DTA2`F zwUBPGNF8;ZI6TU1xeTNbvNl2VLRjnNQFHnHGAuPd1@;S`8BX~JB6T7Cj1A8qFT5#~ z*^%b}|AN7f0qtF+C3a@-5-rKY6lNDMCP#agKp_r{ncA2sDvEwU7NWUA=&PYmzTjm^vQpce|hKr8zn>`;t~SULd#prK2T+r%YA?!&|4Otm8^^sCX{*QR`Nf zv9U3&uCzN9rHYGx=EsX~({BolKm$38S{nVH5-iFx$`-}dm#?jJZ>)1SRIjaM_FRMt z>*2Vn+M0^1NCCQFMeWV&uA&FVRjw;vSySmIJ5oPLv}X)eCYr?gj0dbG$nxZ{)^(H8 zL#^p}E*#c+aL$8@H3g+B3lP`MeaZS5#wlk|>&3Y}T!}El*?X;BXxTC0;{>W1Qm`i-j^Hr7|NumcKTswAKE z)7+?TaEqXVIn(bm@tc+PR8=W%SM};z25rs_0vTXowWceClHy8G5O?bD?1*S7*d4tm zl3@e6292XZYpV_RHQ+Yb7jrSA@B!;_bfFg_TF(@YH}kI_E}g``7L!Ypa9vTFNrY(e zQfUof%pxMrT$GIKO^bGoZpKo_Z1&r@ZbS8&b(Iy4>U9mk7P=+c4`Y-|v`-13>tDpU z#gAHZ;g3B~oLc-k|3=)mE2N;r6hLL$C_KaB!upt+U*J;7K%kwj-@TL9-5XKGRx!%Z7%^ zwOS={ohwqy5AquENqLN49jqV|k+2~~1Xb28p+UI>19u&WS)X$LgksH^U+gZduU%ES zVFTlmPlM&)^IU;w5z?|%8|&*U*EP5i_exYn!z~OI%UA})=r>mUVoj5WW`tWYTlA3e zLkd61y^XtzXdL2Fh-zxt&E=aaH@NF6>)j{=1}SPXPY|P_wxPVnt+S1BQ0MNrCYJ_3 zHe6G`%~ya1OkKAMf#@#ZF`8zycBDX@XJoZ^(u|d>@Ekwj5(m!S>T>sv}h)?&w%SKU=IF{ zldKbISv3pW$!^zkLx!{Qgm~a*wzwAO=VhXNU;T=d@ulO+iO@)sVy=&q# zCG#n0|HqtvCT8`zRka&25NJ*DBT-T{MYFtpz?C#EnSVfK6nah6=+7#S34bo4pWxJF-CqVdagzSdsrs>(ND*47QK z)EQKt?p3vu;4>yiyKc0?ONlxG1g_$v(ZV>E8>qclv8TE^j23;fkuotfX0>xZ$*R8B z$Rk5CG8Qo|nGuS3;-(!VX~8&`h6{`_d58JxkxW}d63K~CsrGIVrs<-z*sMo7tc%VB zN0JIjbQuVhx+twv_aK=un8Io-IFhuPL^D8mP!XYPcZ{Va?o^~D5Y1}i{0Eb@ByWCB zQK~z)d|gEi;=rZIei5>^c`U7!JID<~;Y&jy<%)t7IU?R!+Z;}d?OY@~&K0Nsne$Vo z2sN~b4^HOxsiX9@II+*du^Zg(`pOL(YtUqf#S68K+Ho=S#%M@Y>Ki*S51z00i^>P&b(-YrnsW3W8oe#1LeW$2;3Xn< z!}eMEXr?QW>M#QvgUxg-r^Z@V*KKTA#duf?lOpZp)~YH7QXf68X7*Q|n5)Hw4F_W$ z$CJgBu4U-PTv1UC-*sZ9INb1%i*{~DkZ@+^0%lw*r<937_phE= znC*rHhO@$gVm%INW^vEP=ajA>k-BM^QfL+nHtkdjgT+^yh7YMDomu$>v*yhzSm4T= z!|V?wGxnT_zxkaZNt#)leS^+odrDi>st{3jOVlt4&r$Akup)6U!Cq%PV|`}fzIA&RBm-gmER55nvx8eT zp`ywSl???O8xUj0$s7sAV645$Myf^JaO?Itv_p0vIk8vDdYkk63?o?LNfT0Jwy%k$ zAn3o3#F@?a45HolX{1KGXumBoQ^Fcwy`4nJ&6|^3Tc2OB81ujw#_k-j^;gXn?d<0w zePkDpH6}(&c+l6@YvQBECq0Fbd>T2Ygd)!Wt?)#f770X5?}qjuv`r~=&ez5-t?(yr zL2Z3OX$iAG4{x>-MKe)Qa!VZs^8I5OD<2>hmKM%t_5{#o5v?Grw4|^U+nmCj9MFFO z`UH)xlM69pGW$hPhY>Yr!OZOZoZ9*Y1;{KGnc1u&^Y$liIEOVx8p<&iM*`EkIgjwy z9GF?t;M%xuRYP^{I-|`@$(+d2%E*#Ysr{Sghy0 zq)i8sWXG_tO$Q_V9^SfRB%Q_FfV5wiq}f1{GD(tVgZY{yo#Jdm`bn3h$v~3INRlRl zjeb}ijilvo799qCgOrQmChH{Uzg4WX@9>%rq(l?6m(^Epa#xf$lPH75eAKcmRx7{H_;`>W4@|hdyAWfu!nJCATHeXOVm1++ek-{Mb>AWU*K9{ z-FYSY%8+p>kx%OS;C;pB{X`ttFQSsqAfp^m@fQM`W7kfDEo{Ic3jmG#AR_^`IN!Z>+2FTT6yq0kG6H=Q0P4Mhw6 zob#RHp>5GaC3P&BCFjxPC?eTnOH;Hsw{2SiMfp~wM(AaI#Q7@g;-b8g95)HOOLB{{ zH?CgIxRjz9*xSy1gs-%LP5$E7_dXa(e$apKk}u~tpC$^LB8N)qV?H)shA%H>4#OVH zV!~jGd5iK+)kgb^S%(Q)eZ2sFAF@!fq<{t})R_WMhc zXi2HG)D7ORyb7`FA+~H_V%)&&6%!cyUNqgmPkALsBtP&M-X!?;oLua_xWy7-4Y&AP z6RhD@C!Uh5gEdUoAnQ0>gRP^$o1kHO8jUB5b(n=mDBQ|859H$Z?bEc~mxY_K=`w7N zw8le{o6a(8yd~Cj#1n2wq`Z=>4qW4{^b9+=YPsWiJgg%J;2F3ESrc&$)jW&FQ>5li z5P4}$K?02uX~Wt1x;)wT;YR93@im45L&Y!#BeABXJ7ZMs0g_DnC4 zmLt3-&%Kj{Tcfd(<5+a??bD-aM+P-)(~LlHDywMhtB1&^SD>XkqZTM&g-U zMPWCf2kC*T`^9K1w=vgdFqG9tqY*X<8B1XiHdx zmJ8J;6~#&xtPu#ji6~x{2gB}dhFLUuV(MWfEm9h+U7(`H#2O95gY~9HaVf!cZ(`z? z4^2*_orc9^noK@u?LZ5&7QK_2)Cm#t_+Sy#93p;vJYD>2Zy1)&xgi@G>ao=tUxn8m zj9INBp=G9WeULcbT%=S4342SCvOP!??u!tcTc+8ZSRY#y(+}cAOQG!~CK*e#=?fA0 z@RA5x^&@b9Fd@Fw5#ZbJ#hI4tZM0ekW0!dI;dUFXz7eMf#Dii8PDH>@|Awq^lT{0y zq7_*-m!ecam7g?DaKa8-a^;HeT6of?NI(##ld}zHk#Z3o)%;GH~Q1WgfiW!h+pqt zj^?eQ3nJo)e11-x*?*mlrUOfX>7aP(iD}ExDy(ynsG_O+jYUyS)XOaj^?0oZ6Pj>n5o@TO&e;t_0lSRtYkrQYT3DDY^Mf26Fc|zll z*^2&0@)}pM4zbuwbH%2o6Gi(Wf3fqB-9qQ_OT?##;tJ@6g~GOA&eVTS+`>TPY_TLI z4v-c}620uwrAj3Us}7LFXNO{Wl6d1_xac_;$ZgtF%(KBlc_xjgi94Q-7wu0+v{pUy zJI*u3m}lc~g&P{N@!6>sXBW(P`%?w{GZJS5nHLdBeEMQ6B6i_fx<tUz~>nZ-;XuPVF+?4aq4>G8w5Shb;*SlE zswtX1(^n^z@pWSUv3Oo9)*g$&$aw#;5q!Nkd@PaIiw};C=8dB7SQ6hNhPNg0+eI#} z9g>SJtY-U%(p*I-hGn@;d$mVv~>* zR+g$}6!Oe@Non-05o0@%yw5oS*>EItyvhx_^|Z-mnm_I%=*{cP!-bb~>A(UxH>W zf4X{NAs?>TveYkdxBNbfv5(a9A|9c}74dM(V>58xqvQG8xh;@1vCD)XD`u)U6!DQt zRJOXUh&z<7Z1rFfAEETjQr|1$3zWi9YJ4#-jf=?93%(0l`d*uCjM8lUl%qae%#)Ra zF7-q)Y&6eNKPyI=X6LH?#qj<5JTw$3`3Pq- zVjYErR0sC|v^+E3MSMR1wY{8TR`-?iD5b1e{Y@!_zC=Aw_pTC^FG3alRH`}_@x;WB z5OF(dmi*8bnwmCwp@;ID#cIVOg!0`b>h?u^lyY#XdK7v}(=zqrMSMCxu0}29dzBT- z)uW5~@V37!=5KNjot={j>Y+GlV044A=&B_=*?LxC^7MA?7m^V6Q9-?-uw&iD#}1Zc(LCBW$H zQ)1%Nx#mrGmutKzmGyHNF?NBY)Q9MIeD@FHD->cwx-}FHHP{c)yMtetMUp_w5qX!&xs( z`t-hE@)yz5-@FJ~240x>VOXe21>)1^0}|5%oux}m{QPir$1nJJ4{i3m=}WvYF&d+; z=D+KOiGMNXYW|AYE13BC*dln_FY&@)c-W&}1age_6jFg6=-rRR#Ha0w#PmR~lO!fS zZ8jvP2YLk~F$PL@_A0DKyLnn9ZF5P6zDL4TsmTPZHN8nq$_;fHYTQc!!^+oGnh-t1Qa<+P)DU-k?2xyysL%>A^ zGMX~+7XizrO?V|?qa_kv3ruTOnZa~CU@CINsZW&gF)QUbO`@kDD#vBQp8?BZnD9S= z<*-YbUWd|2t~4Epoe!PLN*oVt4^qdMW4(|Rq~1`@7ieE1Nj|xfq@F0}6GG{*+?$-P z_LlQ3j~sm|H>!zgUXg4EmV+ztsU|AD_*4`0@&-38vQ!ffdhrV|`^r&~^vi(dC`fpn ziLD$M^@!ksfE?urtH5$pBm6wD9K{Gz@#w7sEz(VBJih~;vGlXrX%jaQ3ms$H3o#<=99W(lGH2LI|TU$Js^j2~$k5PiH>@cX{D1V4LF# zzZW*t_Uz+1ABes>ENC|ZX>72!9N1aS&8sD;GyX1ap2QvdbPgi`~Is5 z|DUl3A@p_NTb~mCzv4kSQkOrfqTxQ6s;I(mz1Rto9k^jVR^x`kRhW;)u z{(2w&J;3yZAk2HT3?2tTE>$SQqrmiOp>*Jn!1M{C#D4>pOBa%7)E|u>l{gBRJ}D#; z@yGb^rvcL!hLpc1FyBXjx?LT*36aTw+lRj%SS~TH#rN$+n<3whUO@v9$+rNXCQRcG z5uTF-VCvVt23`gK_g)5k`M&rA$e)Bf%xU(0`4Vg6ABF6~|Ds^=*9}7K|7wsjBztj? zrxFsT0?G^}-@y9#OA3?!7X{yerV#S-NBY{(>ec9KeE8da@B!e!aL*MFX>4y``s6@k zdn*Jarpd>*TTzBTdu8~lPX@mHkHMGgd5XwaB(IlW4;d*OFD!g>`)34@tNM>{Q2^d0$sZBQeFV1n z;QQ3y)bI(OH+;yS_~0Lb+YP&9R?$wK^zI*u<#-@4_*&oyM+3iM;4t6>A3O&5%`1El zn+C$ED+IR42e0(O>wRz|@EI@t2Ym2e;19v4-ku1Do&`P+Obe|<#e)$VgwF;DoV^YF zxflKb_)9PR1@Kp1_y^#xfhkCoL7xu}!ye0_ivA8bRT_AYUR52jVK!S`q(8+V1EVVsUg0S)H? ze{Y1C8r5P0k44A{W8c7Hu?(QzP55R5QGa(;LgBA%qZ4jiwF(3REZ~+u( z(j)l~4J_rq^1=TCE{1%VA#cH_IF-PEH*gqmDF)m`8Z^mZ90*%Lh%)dP;N8G!2A%@^ zAt@NxWne%}zZkd^e2H%`F#UZ8*{=Z(#en>jfwur31@_QKpd@fV2)$-}6J!Xe!2TG4 zB|ZQ=6!;GY|7GBBfn^oEZeXxAdv5_pVmusa;J*N4-qW@Vl;2l6_6&I32|_sp9EO4! z9KwK_LE0zW;bkz^z>+^2_!;n@G~`o(^YCs?Mj#uw5*Rh3*~&;)!yCu|&UNWs5%KQ^-ia+G4J?Fr06z{a8=(q(9+*z}iGL6n-=q(; ziQ~WvJs{8-1PPo1;Sdf0q=65CKLmCf2EGLD1;$O2{|OJF*pf?Z3S|s~%RnOy1bzZo z7AOk%H^9>2;lLjH*DYkDO9SCs;7lWf>A=Z2Sd^`JK5!1O>;ELDHEx@u7`=ca;A+E_sg`xj>6A~fN0)g>{0DW`y2C!BIST;-p{s-_2 z#0Q=Syc@H)Rt3Q2z=wdf5Ch)~eAJ8oAn==B_$dzvAA_K^N+=u${)faU(R;w%z%*M? z3BLgD_2ORw4#JkuYVa-LXk@^$#Bsp%Zwtsak_1fujLD~lyeAoir8vR-2`etBM z4o0$#5~cw^4lKJ-7Vw+EX@&t9XOY;o4>s^J;Bmk!4cq`+=g=b(iUQsRycrm5lnR?> z6@*<^2ssH7uhIS{%dLMSzDD~q2l=rrGkD&gf~)Ut;a{p}Z|Ap~ zSC-dTss$cCUUl5bZEXiU{0DQ}>23Tj^Ho{5EqH+6!NW@P?L3H z`ovXU;Y z8Ix15&gY3|AZ<#^n4~N3ex64vZ7&_-N!*%NvHGga)gy=aOmVRwME&RUd`jDx!~C#f zDW4+kwZZQ{o2=>S6_TQtkGGW9G|IQkdnEXvl#LrT#b2+ b+bs^@E;aQvK0GSwIA@PROa3sIXutmhq2eZI delta 18796 zcmcJ13s_ZE`uAG>9M@l5l4&+|Rcw`-rh ze(!C)>-Mh8-gv3Ybfd#m7t!y+Tb$j%ttd<#%dCvE7-nGstg`;z3hzRHX8AqtYxQde zm`?gJOKG3_kH!poJeXN36=pT2ZJuFFV>7z0_5OFruW=9`raNK{O*oYc!1s9)J_7|cAdPs z?N?vFv-#?&H?P*ce)WmN`Q;3kE=q@1uD#baYuztk)|V!lEJ(5AKL%*YcIO= z8!f)qm8g8m_9V9&)6W&48c{Fze*Oa;RG{wG&bESSsx8)LMm~*g zJUZ6qhYA|h8Di~jZS0P+d4v9PTV+!O6)AmoYIedmkL|er(j(WKnyzj>GtoM<$cK?l z7tfwvURr(i*!Hit)qQtn`&Xx5`+E0lSL+Xdz5jWVw60zYVa7DiM4^B1&{^bZTIGzf zcv?=Hq72CUN}D-K!SmBLOB2y2iU$A2z==q?q}UKY_;y(=37E^@7q18Oudmv;mwxe ztfkNJkhIbgs^d+!C)ikBck71R$%7s>zZqyvNVYBu6m6EF3u89$7(=tQ)EZ@;W-Yv} zIYL#gxC78`5g1(h=x3pimpX?Vpr)0m;`VK*<_ zwwy7aF&+<}QG-!5O1vBRki&duqU~d5p7>ID{}RWb#c*YIn<;vdO-%c?S&1Kf(HI|i z(G(xwJi>Ml^10Ra<*FA~b+=AxbK!5=mamEizDLJjw0&9nVrh5lNF9IHw!AbNc(9I} z+rBJ$5qS*I@%h}gt*mP zC%vMS3}*HA>TV6VV`<_B#ta!WHUdF0-4Wrz3628PQuoOn$Bi~N)YLLG#^<7CZ$Lxc zjG~Cu5mt=pADd%rfyZw)vEe)_ErU5(i`TTGh{3gHn|0EjWXsgnW@~L+Ojxtg>NTyP zwkTpmj9;_=o}vil9IN-Q^KD@bKGAchB}_;TFN$Dw)>>{$nBX1zug}PK^Ti@ZjQL_| zjOk)c%pg7E)e(zZe60QrypEsuuV*pJpOdGKj#64CsK(19qgL4htI&&D+PsVxtx>Jl ze2@9o_i15Kcdqs7v|i&4U9D<&LgKnXiIps-wb^iZ^8jlCudDUqm)RbUe#`23!?vmX zua4yYtOfmKIIAW_ahwpjKiSY0&MkT!_bvDhE4s4WS# zmc8pDTyzdP2mOaDMG?iVr|&a4G%*gH+v%rvqv)Wh+NpcI}Q z_sx@$Cw3p-YV)%xwtmls?=jS+i|6}3%+ti+kO%rs>gsOo?i_%=M8RMz(CtofJY+u? zVs>aE?<*XkkMP%p8WyWob#}K-7x#oEhU6lZ*s0q5Z7h1;%qW|APgmXSs(|2^C1#A7+0|OxMMIc)EIJ0bvdhax6xLGIVyL&+`hi#8HPL3+*M->VWiv#3 z*JpbTnHghC1gEgetKP3JI>S11yv-Xua^X0L@cPJ%NL^qqR5?_WK=(zRdDnY2_@RKJ zlMVH^#n`;|`R(m$O%Sh!59M!*=J0z4cy}p~%>IH8W!BN^D^tDxe6Q|)nTYJSF!p>W zWtm{>vrpNpBFllDB+sl@5iY)K_pUeAxoo~CUg#I^c(!wlO-26CYf`Z`3-W%U(_~ZX zCt)h{-%Gfm)1|QkvI=A$?)2VggjYK{)%u{lK6N7zjHntOAwAn~(*ls6DXMmQck8nD zF}6uIhCE#o)tyY!tb}BMZKSQA!xp4v@yiZ%pASqHA&W^cb*#g(*9&UWbYABhb6E5} zs2-&b&UScdX7+V3s~56FYt(nOj)z+cY>b7wT! z=2g$?9?#gOH+EMCwe_PJkLmn>cevU*x#QuPKc613cVBpaN6F$6c;2DZdDk1@!o%$< zN=@bPYGA-4J2psBNQT)AqN_Cubw%YH*g+k{m3|ARsRy1y%`os9J6v^fQY%Wo1`OxA z09!aLp6F1J!z7#E-hK_?dmLS@&vm#u_~8ykGy6UIh<_c?CfKMa?(d+s^4{kUvtPC6 zX7sVuPqqFfd+L#JWtyeg)m$4pjCF?kxf$6ry&L?YbFtl^+3M&R^f8U}n}{+W+_`(u ztzt7~W{a5-A>Q-hELs1nD2-T{J4DNm?7D2#wzHulY%v%wDjIok2leh@8N&#p5eIZ2 zVAhee3#+;hW1f@Om2lu2MbQ z?s{Ik!v`DTJB!}uHQq+k(-t(gf89iQo=7pk(Ymc&)hgmhn^7C~Rl3RYb{5^2Vo$rt zX4uom#?+L4-XSbD=t=^5w*gi6$M){l32jEKmk|5gB=sERd5f_nHr&@X#^#Eg3)(5- zT~H9PwRM9L65Xv2+_BaUEW+ZJ#oTW8L5r=yVqp~G`R$V?#PY6IMbr;UbnI!1L9f6P zgp?hYlZw@Z<*+F&xfIW7M$C7J>UWF>x?7uQVUnOEGo~aPu-;CcGcVCP+M1iPAk{u2 zbxvw_N=|0BeR_8Kg4Aq#ian=zZ8g|KvWwT1t}U%7pJ>faNJzvIms_#mu5|4OD$O(W z4S`6Fj8!&ti^|9}Wq!B#Rb-y%Z+&|Fr}{*M%>w%>kXa^2F$>aGKa}+1U(_|kJ zHzIn`5Fcg<0*PGKT=Hd>Avzv{is=BR>LNbj>pGU^&jQDQmlEuNahF^c5*9ykWJE^D zc6dXgvV7I3ISZ9fSVxAdm%vRUG;w<$mz?yHvZES34EixQvs;0wM#(1ePxy(QBSYtx zfb3q1T8~P}^1v}}n9LNwEy_|hOm!r)ETe`IexuBz^MOLam1S-j#4J`|PiLn?&R?XA ziWHS`MzsJH?@ukKZbPa+rTX7C-`yCpmamAU` zG#7BAw3b<@=9J*|Th&L5j~X6B+olAs%Jd2Td5SNZN|!4^52U(J3EqgVy4AE(oe})= z_cg@4{SD%!xCfMrfnrd6sCouH-lF+?R7*w02di~Gse?$FMRRO$$Z43Q7MFGP74T85 zuFk}p)je=}s)nw_TNPtaV^@4RSGHM1dE#zUwUe>!{TqG8Y*Dbp+cEY@KQo*g+mEpk zZQMr;xwl{-%SxR+&pxf9d`0O>d(H!u#nX#du%KOxkH&^Y{CMw^rZlL;^lyB0+}J=< z4ARH@HJ+WZLotnlPq)3ryo}dPdoaw;`Zk(pc5r?`B+jskp|eX&KcM5B2*d(&mm&7L zB4%gi1`p;uPKmv3s41+fwpSKb6*7xBmAP#AZLSRVW6?n+JZpYRc8<0MpI2Q~v%I>d zs+a|B;rw1D_OembWo6zUs_=Qr8WKye+e%kdFlceE6KLsmNby7Ei3UWF3x?@bR5g;@xhIS*>OfJjq4VS!|(4F48iY>1>-eJ zf02}1hSbqqqBiHo;cZ-pwJc}|=YeCh(lgz$SeKu`gT%}EBYCj+WBwR4ylF`+4-pAVCh$

EI2@PVpmpqR3?#MFWcN(dCzf)M}pn7X4a z;|J1j{Xj9ZU{lanVK_5Ecjzr+<6jCs;6n~#s2|0hkLpf3&UuPy-UDl^i&twc!(Ci) ze%ayZJj8!q>0(Z+s4AXTR%*Ei?L=4mNVZWmIjsv(l&LudNUTt7^h2ivJ1sbaWiuhbg~Nc$D}*t0KK6 zbBG9B6&^;}tb?7>((>gMH5en7T%bHL{bv(2GnabuO$A-ME{Qib3>2GI{7eii3z$Ho zS2Yx&n=D*uFJ8UYUR6_GURu7AS+>HoN-H19(KC2Lqvwdv%610P{8NV8j6s`pmh<5z z=NmhDNWhqJ3()X7a~BtL%Xbc=xoaHm8<0&u&i4*MIMhjp;akON5Sm<~H0>?Los88k zL~Fp2q>CiF6NIap=x~}bAH}`PB{~-zNxDsQX55>hb{fCziWlVB%kjYZJy{dR^O&OYySUgLi20J6(t#~x}Ftit7L3NX| zY~p;6!Q_nE!9#qxmB} z+o#dmZYyWa#m>g9|F)iWuQOx`RnVIXay+l%5Z}}u z8CHjdR?-`s&opUK-4(ZrP6lR_3&s(=zAS z(q}Nsd&99@5f5+pus>EnaM8uIfiqwLIc^12By5ZpPyBr42&^hCeQ_V}gFgFP&PRIB z&dIWu(yD-K%^(HR#DI;@-%qP)T46J+@RJ}exYrEKr}oTs#Z_2(lrt_R@{RCIhI$xXb*-_6G+HkZ`}J${R-U(bgfPGKH4;e(>`wW&AtNALk~` zI2J3JHPvW8#-+&no@PEXitU?r&fWtPXK?oofQe5yf6!$?s!R3_PxTPQvC_2k8EF+& zvodp;B{u0HIynD%~h{>B@bWDce)5!iDvY+x7g-4q; z8C0IDwJm+naimbbr;R~~V5RAEDylN)=P=9XaDfp;Gm%NlP|Rc_82h3}FKd3*bY__k z+IvLHOq!pQH9yBbFDo?_^m@==*XS;C7A7<7t41=MFhM$XPRi6-sTEaoGLhL_WVTHe z`yYDIhxTfNP>%O4B5g}#e+eh|xT3dpm3U}NsQOt9V|KBB%ZtOQhehN5G#GLIb!|$J zq&nzoQ^Fw=!}KwfR#L-h&zOOG6t)_Wr+Gn=PLn*%3%~D`A4Yr5D%_i0@-#U}QVYq` zylw)KIsBNYz#KCmmr>Wj`Ie^M9X8hSwTve5r`L66|b`w6;@;IO>rsKO9Zae z+?+vsUy{tj`k3rI;2&N;Xghudwv61|vn*a-Qdq^N z+~)iS515bDPnIiGJx7kxFlTnU~l*y9{ zKPWTNLW<T4~pz z8ekr=pJWozz_h2sMuZsQ;& zT0ScE)u9KJ7HBSm=Axdtb}h5ijb?0(xUu7T1t$eNc7DQZ1+Sknh4vaMH((3GRkg1v zSoJnpO~IxZr23df;nzaHrqLQ6hEyC<+!TQ&5$6SDVi@f~U;_IRmkCpUh`|&+A=+OP z%_Gr4v;l!Ab|tzf_TNl{|_#O9agaX)cM`yIb~u9;TY@azXszdOr(0#RD+ zZ}>`lvpdgB%VIcnL8Lp=%(TJ<*ee>GXU()=MY(r~!aZTUTFl-(*?fsKxhY7zv!~yH z@$feaH}x458FVXE92&1g6Q;!{^sh9IZm8nCy79o?M6PW2Yy9KBYOdhuFa6m}<*cvR z`|K*^y00)jm#uX8ibZ(r@fF9OTcix}5kAi^P;dsh?D;#&Iq$}$2i9?~Gg{%_MBzil ztruz-Id3&dYv4-+lNBE-$tjbigLv$*nlwAgZV4ENXg*2c?6 zFLS)7ef8KN{4Q-A)Oh{a95v=3EGXQw(h~#uK~eTP{q8;S zUdRkT;%jTlTE~Adh8y22Cj* z(qkA;%buR%X(W;H4AJ~nB%dj6y%m8yivO9Re6|>SCYsL?xo1Wo4sAIzgfA2?<9Cs` zfZxU97JiqAu%_Yo;3>IjG`EY2rZ|Mk=kZ%8{?L>tx|1}PLFkdOV6YCIs?|Y%V@~T19_oj*c7Uv~Gxs|K z^Y}2Oc8YUC9=9raNzTQ2e5jJ2?A(&a=O|l;IzP_i^9NO@&{qw3p@G}A+d~51QIOL) zQ=O>`d8}fd=B!-Et*JMs;TRSiWXF1UV*of~BKd>UT}S(O@o9pkD^3&HpX$84kS8d4 zHmBDjK2WjFa1L99`nW#BnXw4&ok(-8S%ea9PIvBJ1h?}uoTnG@n4!~WVvmW%&C{@Q z*Y1E!57tZ{oaIy(^Py8GqrnbhYrPsb&GP!$?xr57?JAz?h1wc`>{vBBXEU8;i{aAt zEN2~_QF(K*^+&$||q;>I}Z08?IeEd9T>ta60H!TNyTyWv3bM6ivthLEd5EM3Q zzB4JG4_C|!oF(~G=mpO0`Fsj5aekQ3_bF#`oh3{7;8WX|@b|fcPAVxE8m8ESGMd9R z2uuk&Zj_k#v>cF_5_EPcG4W|jA~7Xsw<0m|X_F=~5)MZDH%TA?+JQ+-3EHwrOnllV zN=ymbQA$jF+W$&S3EJmMOnlmKmxSkmY5Q>Z<3h!be1MDCFrP4V&cXeVw>|8%sA+@Op-~A z)*TX4g3jM0CO*yH5>tXUjuI1}W?6|TK|3soiBEI6#7H<8?T#dY1ZXuNF(o#;Vd8Id z!^CfK!^Ho}4HN$W-h|}T(goVIb=8|GPPf5%g~Y41YQ%K4n|^T2XQ5k3YiM-bt+f#rxH z{Ci;9AWQGQ0WM<9inqono`HSqhB+|2b+9Z5(9sKZr*;SsMh{@*t~bs;F^a7qYnV=c z$=Yeg&ayBD}s5Z(u9ws;s2 zz%nY5JjH?-E8aTk`VHU{rYgY^3fm7n-VMLt03pqd@C)EP-~?UaFz`0u7#({$a0GmL zQH`7fKFfNWfX<)gMf|Tlu)~P1A;T_}z*E4Nx{iL40jiOkZW#>!34VlYsi@Up+E4J4 zd-)FLX`s|Y;s1u8fINM)LOxOf_5jnzE)u^C9H@W%LNWMmdyZS(cN6~q;}h-$bf8Kv zxfA{$@Q)t){yj&)6s%oMR@7VNEXIxRkOFuU+EZoj0+Nq6l|B5aZU!VDU(odM^F8=< zB2FI$$tKwbtS^EbTALjJfxaP<0;hrL>mrGpf#srz+W4Qq@*)T5aFxC?lJcQ6;Ps36 zbh<59Wu!m8hmY}30yJ)qW0(=01n4kZUc}D_mWz*{;(HFm<&Zy%en^3fa` zOzV9L44wuKLEwEi1y8;wejD=VAWu$HhMs&+{E044`TwNCOet2o$j1$;NY7 zQHK9^%kYp#2A=%)!IxVFYLbgTA%6lBd`}Jh<0k~d)n2}l=288UHE`XH?>Q{BdDla} zugNu+kV7M3PiudYkp}VV&@u#=1b(W@3&1D&|Hj|!#vk(&4*$Z9Kij7_f6akh4~1pG z^ffN6pDDxjz~2MYijVMiVC}nG9UpSjw-)gE|@ zb95Dtcl^eK{5KDbvz_gi%{UVRU zJ@9Z3oalikdEitJJl_MCx?u-pxXFz`c$)`q@W6*WaFYlA!~=iffp7F;ht^lydkGru zL!-p4M#6y4y5V6izBVTXVkep4;%lRs@D$*8^#~pWoa%uyfq$d%5j02ue?QF5yD4n& zz>j+1XFTu$;AS`d*FEq%z?Z?NDJUBG;cu1MUx5`0T15B^gwKhf<9`Bw;f7m*zjVVU zeCcu34Tl0>1ExwMd(j>kJLkLj={nYeCMo242o!tZ^&a>!58U8^k9goF4}8&uU6Up` z@TG^qzdf*mvbmSg-vjsez@t3ycn^%T0oX(TlT|j?Ltv=~UJZOpuVU&mKiBan7$CeI zcp%oMH02Q9r(?2D_*D=57I2CK3TRqQ-~%G)i(69ovj_eMa3=V)5+i<_j%5bkfiAwp z{eb5|K1i331uh2uhmOYqJLY2<5UmrYg76@4xQ;V{8-T~?cnR=jH~CdM23vDzJ#Z`d z5^vElz5~$sSU9sltP&3D_=P~!|49(&+ZQU)F$i=TU4M>1_$^>;oN;XJ;-3fZ2mFDK z{{;LEuxx@abquy%i{< z$LI?G2L1+^s)!W4g3&~7I21S#=RUGiMgs2umIW9Id=9s@!8+g_z%m1zU$R$#kLmi)0@FVSQKsWpf$5)y$k*}z0FTDG zA+4{16pX(QLAbAnfKUva0-U2OTmwdQ>*=+(fK#zU8>I8^051oY4)%d(rND9&_0uuL zwHg@ejvc6ycn}_kLYyuz0r-D_wI;yQFa!81@KNFe=K8Ldca5?ZHV6BRQw*tTB z#@`FvZU&}4g#L$PO%Sf?1Ztxz!2bfK$%ycGz(2b2P56#X#r}gf>%aXKeQfgN}WFrDR+y)xh$;AJ{~6!^H+RYQTW_YCl9U~SW2fx;^we5w%;;DO%; zMtfRu#>fKkFOHlCM)g{$M1(H^qkXMZLxfv^;k>p1Bm5n(75`HwBYYbeL8^z(;b{V4 z>Xjtm4Z?Icfq}pn5j_gSfoHklNx*q-cqTAx^~f&Y8P1$Ou>R?(|jR^yiLb)c-G zd?jwj%DZ!PQCHsOt1i0IUa`Eo*H&*yS1+rsSl{bld5=u57nMD<%Hpc!#rWe4y-FQ; z7UR#hitvTFtdkY^`k%g(*1u(xmEW7;+R_chYb)IGHc#jWY>7!rog$ZpB!?yt-obvL5yIrA5^x@U^#`wWpqYj6Y&LHFi7S$onKRyFJm> zg@z=adT$3e@G$yz!}TeJ_Q_yn#d=1a^VFw1`3Qc>SjWFJ7?u?$IGdgPx2MkR;(-Q3 z(fIMF052=2UfIhBbLF0K&Wlcd;nd#!`0F{tJ>zw_`v4zdFecu&LR0?m)Kdp}0@!1g zll1RSJ${(S8w}&ek0sL|o_g#kwSfT;$52{shl}#j)cw zo!_21becyRRs7K{OLLw-!)NeMoqYl*oumhaR+c5MCyhrhNj(D3#tL!-G&n2oK z{_ymS^8qCLoWnP)HxYd(9H%>9d7BR~ov!7qB-Hr)7arT3=-#hqL NB;hURly`XO{{o2S#=`&r diff --git a/Objects/ENS001_BASIC_PRJ.build_log.htm b/Objects/ENS001_BASIC_PRJ.build_log.htm index e98a420..9f338fe 100644 --- a/Objects/ENS001_BASIC_PRJ.build_log.htm +++ b/Objects/ENS001_BASIC_PRJ.build_log.htm @@ -26,19 +26,22 @@ Project File Date: 08/15/2025

Output:

*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin' -Build target 'ENS001_BASIC_PRJ' +Rebuild target 'ENS001_BASIC_PRJ' +assembling startup_CMSDK_CM0.s... compiling mian.c... -USER\mian.c(31): warning: #223-D: function "GPIO_IO_Init" declared implicitly - GPIO_IO_Init(GPIO_19, OUTPUT, 0x00, 0x02, 0x00, 0x00, ENABLE); -USER\mian.c: 1 warning, 0 errors +compiling ENS1_GPIO.c... +compiling system_CMSDK_CM0.c... +compiling retarget.c... +compiling ENS1_BOOST.c... +compiling ENS1_CLOCK.c... +compiling ENS1_MTP.c... +compiling ENS1_UART.c... compiling ENS1_WAVEGEN.c... -.\FWLIB\include\ENS1_BOOST.h(37): warning: #1-D: last line of file ends without a newline - #endif -FWLIB\source\ENS1_WAVEGEN.c: 1 warning, 0 errors +compiling ENS1_TIMER.c... linking... -Program Size: Code=8028 RO-data=380 RW-data=100 ZI-data=524 +Program Size: Code=7956 RO-data=388 RW-data=120 ZI-data=528 FromELF: creating hex file... -".\Objects\ENS001_BASIC_PRJ.axf" - 0 Error(s), 2 Warning(s). +".\Objects\ENS001_BASIC_PRJ.axf" - 0 Error(s), 0 Warning(s).

Software Packages used:

diff --git a/Objects/ENS001_BASIC_PRJ.hex b/Objects/ENS001_BASIC_PRJ.hex index 601893a..ab84ac7 100644 --- a/Objects/ENS001_BASIC_PRJ.hex +++ b/Objects/ENS001_BASIC_PRJ.hex @@ -1,19 +1,19 @@ :020000041000EA -:1000000070020020D5000010DD000010DF0000109D +:1000000088020020D5000010DD000010DF00001085 :1000100000000000000000000000000000000000E0 :10002000000000000000000000000000E1000010DF :100030000000000000000000E3000010E5000010D8 :10004000E7000010E7000010E7000010E7000010D4 :10005000E7000010E7000010E7000010E7000010C4 :10006000E7000010E7000010E7000010E7000010B4 -:10007000610E0010CD0E0010E7000010E700001028 +:10007000210F00108D0F0010E7000010E7000010A6 :10008000E7000010E7000010E7000010E700001094 -:10009000E7000010B50C0010690D0010E70000101B +:10009000E7000010C90D0010290E0010E700001045 :1000A000E7000010E7000010000000000000000062 :1000B0000000000000000000000000000000000040 -:1000C0000348854600F0BAFA00480047891300103B -:1000D000700200200448804704480047FEE7FEE71E -:1000E000FEE7FEE7FEE7FEE7A50C0010C1000010EA +:1000C0000348854600F0BAFA004800476113001063 +:1000D000880200200448804704480047FEE7FEE706 +:1000E000FEE7FEE7FEE7FEE7B90D0010C1000010D5 :1000F00030B50B46014600202022012409E00D46C0 :10010000D5409D4205D31D469540491B2546954047 :1001100040191546521E002DF1DC30BD03460B433D @@ -49,7 +49,7 @@ :1002F0000843194610BD10B5002B08DA0024401C35 :10030000614192185B411A4301D14008400010BD81 :10031000F0B51FB482B005460C0003D0084600F0CB -:10032000B3FE02E000F0B0FE20300246009021460D +:1003200037FF02E000F034FF203002460090214603 :10033000284600F095F9049B059A04460F46184399 :100340001143084314D0184610431BD00098402195 :100350000A1A18460599FFF7BDFF05460E46009A92 @@ -100,7 +100,7 @@ :100620008C412146002B04DB1C460123DB07524290 :10063000A341994200D1904210BD0000064C012513 :10064000064E05E0E36807CC2B430C3C984710347A -:10065000B442F7D3FFF738FDB8200010D8200010BF +:10065000B442F7D3FFF738FD78200010982000103F :1006600010B5202A04DB0146203A9140002010BD3D :10067000914020239C1A0346E3401943904010BD4B :1006800010B5202A06DBCB170846203A1041C117C7 @@ -118,418 +118,415 @@ :100740007141FFF7D8FDB6E710B5134600224160AE :100750008160002B01D0082422430124224302603F :1007600010BD000010B5034800F008F80249086009 -:1007700010BD0000200000201C000020F0B587B054 +:1007700010BD00002800002024000020F0B587B044 :100780000446002754480068217809040843524968 :100790000860207800281AD108464068617809016D :1007A00008434D4948606178881CFFF753FD0246B5 -:1007B0000B460591049000200121890700F05EFEA0 +:1007B0000B460591049000200121890700F04CFEB2 :1007C0000546FFF769FDC7B244494F4328E020784A :1007D000012803D1A77841494F4321E0207802281E :1007E00001D187031CE02078032801D1A78817E0F6 :1007F00039484068617809010843374948606178A1 :10080000881CFFF727FD02460B4605910490002047 -:100810000121890700F032FE0546FFF73DFDC7B212 +:100810000121890700F020FE0546FFF73DFDC7B224 :100820002D480068A17908432B49086000BF2A4879 :1008300000684007C00F0028F9D127480068217AD6 :10084000090208432449086008460068E179090361 :10085000084321490860207A00281BDD217AC81E40 :10086000FFF7F8FC05462A460B46002001218907C0 -:1008700000F004FE039102903846FFF7FFFC01915F +:1008700000F0F2FD039102903846FFF7FFFC019172 :100880000090039B029AFFF76DFC05910490FFF71F :1008900003FD0746E07900281BDDE179C81EFFF75C :1008A000D9FC05462A460B4600200121890700F0A5 -:1008B000E5FD039102903846FFF7E0FC01910090BE +:1008B000D3FD039102903846FFF7E0FC01910090D0 :1008C000039B029AFFF74EFC05910490FFF7E4FCAE :1008D0000746384607B0F0BD0000024040420F0016 -:1008E00010B50446002C04D00A2221460148FFF727 -:1008F00015FC10BD6400002010B5154800780028D4 -:1009000024D014480068401C12490860084600685A -:1009100005210902884205D20F4881880F4801F05D -:1009200029FB13E00B4800680521090488420DD318 -:1009300008480068C911884205D2074881880748DD -:1009400001F018FB02E000200249086010BD000021 -:1009500050000020540000206400002000C000402F -:1009600010B501F0EFFA02A000F07EFB10BD000010 -:10097000E794B5E588BAE6BF80E5B7B2E590AFE5A4 -:100980008AA85C6E0000000010B5002005490870C0 -:1009900005490860054801F0E1FA05A000F064FB94 -:1009A00010BD0000500000205400002000C0004096 -:1009B000E794B5E588BAE6BF80E5B7B2E5819CE685 -:1009C000ADA25C6E0000000010B502460F2A14DDD7 -:1009D0001348806B1346103B5C000323A3409843ED -:1009E0000F4B98631846806B1346103B5C000B4618 -:1009F000A34018430A4B98630FE00948406B54002A -:100A00000323A3409843064B58631846406B540099 -:100A10000B46A3401843024B5863002010BD000052 -:100A20000010024001460448406801228A401040FC -:100A3000C840C0B27047000000100240FFB5044635 -:100A40000D461E460B9F00212046FFF7BDFF012DDE -:100A500010D1012F0ED14F4800690121A1408843D8 -:100A60004C490861084640690121A14008434949B1 -:100A700048613BE0012D10D1002F0ED1454800699F -:100A80000121A1408843434908610846406901218A -:100A9000A14088433F49486128E0002D14D1012F2F -:100AA00012D13C4840690121A1408843394948613D -:100AB000084600690121A1400843364908610998A8 -:100AC00048620298086311E0002D0FD1002F0DD16C -:100AD000304800690121A14088432E490861084639 -:100AE00040690121A14088432A494861022E0ED164 -:100AF000284880690121A140884326498861084629 -:100B0000C1690120A04081432248C1611FE0002E3D -:100B10000ED1204880690121A14008431D49886108 -:100B20000846C0690121A14088431A49C8610EE006 -:100B3000012E0CD1174881690120A040814315483E -:100B40008161C0690121A14008431249C86111486F -:100B5000816A0120A04081430E488162806A0A991F -:100B6000C907C90FA14008430A4988620846C06AFC -:100B70000121A14088430749C8620846C06A0A9912 -:100B80008907C90FA14008430249C862002004B088 -:100B9000F0BD000000100240012907D1074A526849 -:100BA000012383401A43054B5A6006E0034A52680A -:100BB000012383409A43014B5A6070470010024062 -:100BC00000B503461846FFF72DFF012803D118464C -:100BD00000F00AF807E01846FFF724FF002802D1CA -:100BE000184600F00BF800BD034949680122824015 -:100BF0009143014A5160704700100240034949681F -:100C0000012282401143014A5160704700100240A6 -:100C100000207047C206D20E01219140014A1160A6 -:100C20007047000080E200E0C206D20E0121914030 -:100C3000014A11607047000080E200E0C206D20E57 -:100C400001219140014A11607047000080E100E0FD -:100C5000C206D20E01219140014A11607047000086 -:100C600080E100E0C206D20E01219140014A1160EC -:100C70007047000000E100E0C206D20E0121914061 -:100C8000014A11607047000000E100E0014604489D -:100C9000406901228A401043014A50610020704798 -:100CA00000000240014802490860704700E1F50574 -:100CB0005C00002000B501200449C86004480068B9 -:100CC000401C0349086000F06FF800BD0080004040 -:100CD0004400002070B504460820FFF7D7FF152018 -:100CE000FFF7B6FF1520FFF79FFF7D21C9000B48D6 -:100CF0000068FFF7FDF960430546294608A000F0AB -:100D0000B3F9012229460C48FFF71EFD1520FFF715 -:100D1000B3FF214609A000F0A7F970BD1C00002018 -:100D200054494D455230E9878DE8A385E8BDBDE5BE -:100D300080BC3A2025640A000080004054494D459B -:100D400052305F496E6974E5AE8CE68890EFBC8CDA -:100D5000E4B8ADE696ADE591A8E69C9F3A202564FF -:100D6000206D730A0000000001200449C860044897 -:100D70000068401C02490860704700000090004075 -:100D80004C000020004870473400002010B50621B8 -:100D90000348FFF7DCF908210248FFF7D8F910BD36 -:100DA000340000203A0000202B480078401C2A49DB -:100DB000087008464078401C487008468078401CFF -:100DC00088700846C078401CC87008460079401CEE -:100DD00008710846C088401CC88008460078022870 -:100DE00004DB0020087001201C4908701A48407874 -:100DF000062805DB00201849487001201749487073 -:100E0000154880780A2805DB0020134988700120E6 -:100E1000124988701048C078142805DB00200E495C -:100E2000C87001200D49C8700B480079642805DBA3 -:100E30000020094908710120084908710648C08846 -:100E40007D21C900884205DB00200349C8800120BC -:100E500002494871704700003A0000203400002029 -:100E600010B500240C20FFF7D5FE0120800700F00C -:100E700062F8032806D101208007406804218843D6 -:100E8000090748600120800700F055F8022805D0C6 -:100E90000120800700F04FF8062816D101208007B6 -:100EA0004068400840000121890748600846006802 -:100EB000C4B221460120800700F0C4F80120800759 -:100EC0004068012108438907486010BD10B500241F -:100ED0000D20FFF79FFE144800F02DF8032805D1E0 -:100EE00011484068042188430F4948600E4800F0CB -:100EF00022F8022804D00C4800F01DF8062812D170 -:100F000009484068400840000749486008460068B2 -:100F1000C4B22146044800F095F803484068012116 -:100F200008430149486010BD00100040014648696F -:100F30008006C00F7047014688680007400F704761 -:100F400070B504460D461348844206D10D20FFF7C4 -:100F500075FE0D20FFF75EFE09E001208007844248 -:100F600005D10C20FFF76AFE0C20FFF753FE6068E6 -:100F70002978084360600748844203D10D20FFF7B9 -:100F800071FE06E001208007844202D10C20FFF7A9 -:100F900069FE70BD00100040F8B504460D46012002 -:100FA000800784420BD10020FFF770FE0121022050 -:100FB000FFF70AFD01210320FFF706FD0DE01F48A2 -:100FC00084420AD10120FFF761FE01210C20FFF7C6 -:100FD000FBFC01210D20FFF7F7FC606BC007C00F81 -:100FE000002801D1102700E00D2715486968006826 -:100FF000FFF77EF839460090FFF77AF8401E86B278 -:101000001120304020621120000230400012606246 -:10101000A068E968097889010843A060E8688078D9 -:10102000012803D1A06801210843A060287A012883 -:1010300003D12069202108432061F8BD0010004041 -:101040001C00002000B503460A4600BF1846FFF703 -:101050006DFF0028FAD01146184600F002F810463D -:1010600000BD0160704700000FB410B503A9044B28 -:10107000044A029800F0CCF810BC08BC04B0184731 -:10108000751300102C0000202021020C01D010212B -:101090001046020A01D010460839020901D0104654 -:1010A000091F820801D01046891E420801D0881EFF -:1010B0007047081A704700004900CA020243100036 -:1010C00000D004204A0D01D001221043044A490DEA -:1010D000914201D102210843012800D10520704727 -:1010E000FF070000F8B504464F1EC8000838211855 -:1010F00015461E46086849683A4606239A4310D0AA -:101100002A463346FFF708FA3A46D200083AA318AF -:101110001A687F1E5B68FFF74DF906223B46934332 -:10112000EED1022F23D0042F11D0062F2FD12A4623 -:101130003346FFF7F1F9E36AA26AFFF73BF92A4663 -:101140003346FFF7E9F9636A226AFFF733F92A4663 -:101150003346FFF7E1F9E369A269FFF72BF92A4665 -:101160003346FFF7D9F963692269FFF723F92A4665 -:101170003346FFF7D1F9E368A268FFF71BF92A4667 -:101180003346FFF7C9F963682268FFF713F9F8BD22 -:10119000002210B5134610460149FEF7E3FF10BDCB -:1011A0000000F03F10B5FFF705F910BD002210B5A3 -:1011B000134610461146FEF7D5FF10BD10B50721A6 -:1011C000024A00200907FFF70FFA10BD01030000D3 -:1011D000034A10B500201107FFF706FA10BD000002 -:1011E00001FDFFFF02E008C8121F08C1002AFAD162 -:1011F00070477047002001E001C1121F002AFBD197 -:10120000704700000149086070470000600000203E -:10121000FFB58DB00446002506E025280AD0109AB7 -:101220000F999047641C6D1C20780028F5D1284642 -:1012300011B0F0BD00270121484A009700E00743A4 -:10124000641C23780846203B98401042F7D1207850 -:101250002E2817D1042007436078641C2A280CD15B -:101260000E98641C02C800910E900BE000990A22AF -:10127000514330394018641C0090207801463039C1 -:101280000929F3D920780028D1D0642808D069280A -:1012900006D075281ED0109A0F9990476D1C5BE000 -:1012A0000A200E99019001C90E91002802DA4042ED -:1012B0002D2102E0390504D52B216A461172012146 -:1012C00003E0F90704D02021F7E70BAE0B910DE006 -:1012D0000021FAE70A200E99019001C90E91F7E763 -:1012E0000199FEF705FF3031761E31700028F7D1E5 -:1012F00003A8801B20300190780701D5009801E0F9 -:10130000012000900199884201DD401A00E0002090 -:101310000027009006E002A8109AC05D0F99904740 -:101320006D1C7F1C0B988742F5DB04E0109A30207F -:101330000F9990476D1C0099481E00900029F5DC1C -:1013400005E03078109A761C0F9990476D1C019932 -:10135000481E01900029F4DC641C65E7092801009F -:101360000248034948611020086170471372070062 -:1013700000E0004070B504460D46E1B20148FFF7B9 -:1013800061FE70BD0010004086B0FFF741FCFFF722 -:10139000E9F901200021009102230A4601910290FF -:1013A0001320FFF74BFB00211320FFF7F5FB2D491E -:1013B0002D48FFF7F1FD2D492B48FFF7C1FD012016 -:1013C000FFF788FCFFF7E2FC00F08AFD284A07CA15 -:1013D00003AB07C303A8FFF783FAFFF7C1FA40E0A6 -:1013E000FFF7D0FC04462078002801D000202070B0 -:1013F000A078002801D00020A0702079002801D01A -:1014000000202071607900282AD01A480078401CFA -:1014100018490870084600780A280BDC164800783E -:10142000002804D1012014490870FFF799FAFFF74A -:1014300063FA10E00F480078142809DC0E480078A1 -:10144000012808D100200C490870FFF79DFA02E03E -:101450000020084908701320FFF7B2FB00206071DC -:1014600000BFBDE708000020001000401800002069 -:101470001C2000100000002001000020F0B51FB467 -:1014800096B084460C460246199D18980390490070 -:1014900068006300490840080193002A01D0012632 -:1014A00000E000269E19FE4BF6185B109E422BD3DF -:1014B0006E00039F0296002F00D00127F719F84E07 -:1014C000F84BBE199E421FD3039E0346F64F33438B -:1014D00009D03B469C4201D1002A04D0019B002A3E -:1014E00005D0012604E0002039461BB0F0BD0026DF -:1014F0009E19EE4B9E4207D8039F029E002F00D0FC -:101500000127F6199E4207D92B4660462146189AB4 -:10151000FFF748FE1BB0F0BD0023002C29DAE44E93 -:10152000B04226DAE34EB04201DB022321E0DE4E78 -:10153000B0421EDBE04E070DBE19142E09DD342724 -:10154000BF1B039EFE400196BE40039FBE420BD0D0 -:101550000FE0039F002F0CD11427BF1B0646FE404F -:101560000196BE40864204D1019BDE07F60F02239E -:101570009B1B0E46164318D1002D16DA002C03D003 -:10158000022B01D0012B06D00220FFF73BFEFFF714 -:10159000FFFD1BB0F0BD0220FFF734FEFFF7F8FDA2 -:1015A0000122D20751401BB0F0BD039E002E61D135 -:1015B000BF4EB04220D1C148844201D1002A08D098 -:1015C000B948814209DB002D10DB189829461BB071 -:1015D000F0BD0020B4491BB0F0BD002D06DA012299 -:1015E0002946D207189851401BB0F0BDB449794440 -:1015F000086849681BB0F0BDAB4FB84225D1002D3B -:101600001FDA002904D0B14212D1002A09D018E013 -:10161000002A72D1A649E20F0020D20711431BB065 -:10162000F0BD0020E20F0146D20711431BB0F0BD10 -:10163000B14206DA234600203946FEF793FD1BB07F -:10164000F0BD104621461BB0F0BDB14212DA0126B2 -:10165000B607B54203D1234610461946FEE3994E1C -:10166000B54207D1261E05DB1046314600F014FCBA -:101670001BB0F0BD67007F081646002A40D1002944 -:101680000AD08B4A914229D1002C0EDD002D1CDBA3 -:10169000002011461BB0F0BD022B16D0002C14D038 -:1016A000012B12D1002C14DB0FE0002C28DA002DC6 -:1016B00009DB012B03D000207D491BB0F0BD0020C9 -:1016C00081491BB0F0BD012B03D0002001461BB0A7 -:1016D000F0BD00200121C9071BB0F0BD724A914244 -:1016E0000ED1002C01DA002B17D0022B06D00020DF -:1016F000C043FEF7AFFD1BB0F0BD90E20120F8E75C -:10170000E217521C94461A4307D000220892664CF6 -:1017100062465B1E1A4307D009E00120FFF772FD05 -:10172000FFF744FD1BB0F0BD0022644C0892674AED -:1017300090427DDD664B674A98421FDD914202DC94 -:10174000002D05DB4DE05848814217DB002D48DDB8 -:101750000220FFF757FDFFF731FD05460E46002238 -:10176000534B21460898FEF7D7FE084671004908FA -:10177000C00FC007014328461BB0F0BD914215DAE7 -:10178000002D2EDA0220FFF73DFDFFF717FD05467D -:101790000E460022464B21460898FEF7BDFE720019 -:1017A0005208C80FC0070243114617E03E4B99424A -:1017B00023DD002D15DD0220FFF724FDFFF7FEFCE1 -:1017C00005460E4600223A4B21460898FEF7A4FE35 -:1017D000084671004908C00FC007014328461BB0E6 -:1017E000F0BD0220FFF70EFDFFF7F2FC49004908AB -:1017F000E20FD20711431BB0F0BD0022304639463C -:10180000FEF77CFE012205460E46D243FEF7ECFEB3 -:10181000314A324BFEF778FE2A463346FEF77CFE0D -:101820000022284BFEF770FE07462A46334600E0AA -:1018300064E0039110461946FEF76EFE3A46039B9C -:10184000FEF76AFE0746032209915207244B2846F9 -:101850003146FEF761FE07910C90224A204B384634 -:101860000999FEF759FE074601911F4A1F4B28466A -:101870003146FEF751FE3A46019BFEF73FFE074612 -:101880000B460246099107990C98FEF793FD002537 -:101890000E462846079B0C9AFEF730FE3A4627E094 -:1018A000FFFF1F00FFFF0F000000F03F0000E0FF00 -:1018B0000000F07F0000404301FCFFFF0000F0BF8C -:1018C000BE0A00000000E03F0000F0FF0000E04121 -:1018D0000000F043FFFFEF3F555555555555D53F97 -:1018E0004715F73FFE822B6544DF5DF80BAE543E93 -:1018F000099BFEF709FE02460B4652E10125002036 -:101900002D05A94207DA352230463946FEF76CFE2E -:1019100006463420C0430A151218FE4810180390DA -:101920000803FD49000B01430F46FC49884201DCD6 -:10193000002003E0FA49884202DA0120119005E014 -:10194000002011900398401C7F1B0390119805976D -:10195000C200F4480F927844801843680268394600 -:1019600030460D930292FEF7C9FD07910C90304668 -:101970000D9B029A0599FEF71DFD02460B460020BD -:10198000E549FEF7EFFB09910490079B0C9AFEF7DF -:10199000C3FD129000201090E3480D467844006883 -:1019A0000E90012178104907084311990D9B890475 -:1019B00040180121C90447183946029A0E98FEF7CB -:1019C0009DFD3246059BFEF79FFD02460B462946CC -:1019D0001098FEF7A1FD064602913B4629460E9A55 -:1019E0001098FEF799FD079B0C9AFEF78DFD324685 -:1019F000029BFEF783FD099B049AFEF78DFD05917E -:101A0000129A0A902B4610461946FEF785FD0646A7 -:101A10000246C6480F460B4606217844FFF762FB94 -:101A200032463B460091049010461946FEF774FD7D -:101A3000009B049AFEF770FD06460F462B4619469A -:101A4000129A1098FEF7B6FC059B0A9AFEF764FD01 -:101A500032463B46FEF7AEFC109A079104902B46A7 -:101A600010461946FEF758FDB14E00223346099143 -:101A70000290FEF79FFC079B049AFEF79BFC002058 -:101A80000746024633460091FEF738FD099B029A4D -:101A9000FEF734FD079B049AFEF736FD06460D91CE -:101AA0003A462946009B1098FEF736FD07910C90A8 -:101AB0002B463046129A0D99FEF72EFD05460E462E -:101AC0003A46009B05990A98FEF726FD33462A46BA -:101AD000FEF770FC02460B460746099107990C98E1 -:101AE000FEF768FC00250E462846079B0C9AFEF779 -:101AF00005FD3A46099BFEF707FD074607220991B7 -:101B000052078C4B31462846FEF706FD07910090A0 -:101B1000894A884B38460999FEF7FEFC0746019131 -:101B2000864A874B31462846FEF7F6FC3A46019B2B -:101B3000FEF740FC834B7B440F9A9B181A685B6846 -:101B4000FEF738FC029009910398FEF783FB05919C -:101B50000490099B029A07990098FEF72BFC7A4B98 -:101B60007B440F9A9B181A685B6817460393FEF72D -:101B700021FC059B049AFEF71DFC0E462846059B9A -:101B8000049AFEF7BBFC3A46039BFEF7B7FC079BA3 -:101B9000009AFEF7B3FC099B029AFEF7B5FC0246D9 -:101BA0000B46199900200C900F461898FEF7B4FCCC -:101BB000029104903B460C9A19991898FEF79EFCE6 -:101BC0002A463346FEF7A8FC029B049AFEF7F2FB76 -:101BD00009910E902A46334639460C98FEF79CFC34 -:101BE00006460F46099B0E9AFEF7E4FB574A0D4640 -:101BF000914220DB5242AA18024310D132463B46A2 -:101C0000FEF77CFC04900391514A524B09990E98BF -:101C1000FEF7D0FB039B049AFEF7FCFC1ED20220C9 -:101C2000FFF7F0FAFFF7CAFA49004908E20FD207B6 -:101C300011431BB0F0BD6A00474B52089A420DD3C6 -:101C4000464AAA18024300D0CBE532463B46FEF78F -:101C500055FC099B0E9AFEF7DDFCF5D968000023C0 -:101C600040082C490393020D3D4B5218984223DD46 -:101C700001200005521CD04042195000400D401870 -:101C800038497944096813468C463749C1408B432B -:101C900012030121120B090551181422101AC14018 -:101CA0000391002D01DA48420390624630463946DE -:101CB000FEF724FC06460F4632463B4609990E982D -:101CC000FEF778FB00252A46284B28460591FEF7AB -:101CD00023FC07910C90264A264B28460599FEF7CF -:101CE0001BFC0091029032463B4628460599FEF7C0 -:101CF00005FC099B0E9AFEF707FC1F4A1F4BFEF7D7 -:101D00000BFC009B029AFEF755FB07460B4602466A -:101D1000099135E001FCFFFF0000F03F8E980300C1 -:101D20007AB60B00CE060000100700003A0600004D -:101D30000000084009C7EE3FFD033ADCF5015B14E3 -:101D4000E02F3EBE0E050000D404000000009040CD -:101D5000FE822B654715973C00CC904000346F3FC6 -:101D60000000E03F2A040000FFFF0F00432EE63F83 -:101D7000396CA80C615C20BEEF39FAFE422EE63FBA -:101D800007990C98FEF716FB05460E46079B0C9A22 -:101D9000FEF7B4FB3A46099BFEF7B6FB09912A46CB -:101DA00033460E9010461946FEF7B6FB074602462C -:101DB0002F480B46059105217844FFF793F93A46E1 -:101DC000059BFEF7A9FB2A463346FEF79DFB074617 -:101DD000019128463146099B0E9AFEF79DFB099B0F -:101DE0000E9AFEF7E7FA012304910C9000229B075C -:101DF00038460199FEF782FB05910E903A46284637 -:101E00003146019BFEF788FB059B0E9AFEF7AAF967 -:101E1000049B0C9AFEF772FB2A463346FEF76EFBD4 -:101E20000022144BFEF770FB064603980D46000592 -:101E300041190915002912DC30462946039AFEF79C -:101E4000D3FBFFF739F9042801D1FFF7C1F9304678 -:101E50002946039AFEF7C8FB064601E004E029186C -:101E60000B46324621460898FEF756FB1BB0F0BDE4 -:101E7000CC0200000000F03F10B5044601E0FFF77F -:101E800079FA2078641C03490028F8D10A20FFF76A -:101E900071FA10BD2C000020F8B506460C46FEF77E -:101EA00002FC051E0F4600D00120014349000B48EB -:101EB0004908411AC90F0DD0002E01D0012100E0C0 -:101EC00000210C4361004908401AC00F02D10120D3 -:101ED000FFF798F928463946F8BD00000000F07F6A -:101EE00010B50220064908600648406906490843C3 -:101EF00004494861FFF734FA04A0FFF7BDFF10BDA5 -:101F0000003002400000024003500000454E5331B3 -:101F1000202D20574156455F47454E455241544F6D -:101F2000525F4452495645525F415F546573742075 -:101F30002D20245265766973696F6E3A20523030D5 -:101F4000310A00000120034908700020024908609E -:101F50007047000050000020540000200021C163A1 -:101F600000BF03E0C16100220262491C4029F9DB85 -:101F700070470000F8B504460D460026002716A05D -:101F8000FFF77AFF6420A0602020A061A061642098 -:101F900020616061502020600420E063002002E0A6 -:101FA000E0612562401C4028FADB1920C001606214 -:101FB0000020A062E0620120206300206063A06333 -:101FC00001206060002F04D00BA0FFF755FF012611 -:101FD00000273046F8BD00000AE9A9B1E58AA8E566 -:101FE00099A841E6ADA3E5BCA6E6B3A2E6B58BE8A9 -:101FF000AF955C6E000000000AE99499E8AFAF204D -:102000003A20E9A9B1E58AA8E599A841E6B58BE8A7 -:10201000AF95E5A4B1E8B4A50A0000006400E803A8 -:102020008000640032000000000000000000F03F6B -:10203000000000000000F83F000000000000000069 -:102040000000004003B8E23F000000000000000074 -:1020500006D0CF43EBFD4C3E033333333333E33F02 -:10206000FFAB6FDBB66DDB3F4D268F515555D53F2E -:1020700001411DA96074D13F65DBC9934A86CD3FFC -:10208000EF4E454A287ECA3F3E5555555555C53FEA -:1020900093BDBE166CC166BF2CDE25AF6A56113FDC -:1020A000F16BD2C541BDBBBED0A4BE726937663EDE -:1020B0000000000000000000D820001000000020F8 -:1020C00064000000E41100103C21001064000020B6 -:1020D0000C020000F41100100000000002000100DA -:1020E0000000000000C20100000000000400002009 -:1020F00005000000000000000003000000000000D8 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:0C21300000E1F50500E1F50500000000ED +:1008E00010B50446002C04D00E2221460148FFF723 +:1008F00015FC10BD7800002010B5164800780028BF +:1009000027D015480068401C1349086000F02AF8F9 +:10091000124804881048006805210902884204D260 +:1009200021460F4801F002FB12E00B480068052148 +:10093000090488420CD308480068C911884204D2CF +:100940002146074801F0F2FA02E00020024908605F +:1009500000BF10BD580000205C0000206000002097 +:1009600000C00040F8B54548407B002803D044480B +:100970000078002800D1F8BD00244048807A81002A +:1009800045183E48067BC07A810047183B4880885E +:10099000002805DD394881882846FFF7A9FB044671 +:1009A00038480068401C37490860374800780028FC +:1009B00004D0012829D002285CD13DE033480068EA +:1009C000A84217D22F480068A0420DD300202D491D +:1009D00008602A4880882E490988884204DD2C480E +:1009E0000088401C2A49088028480068401C274984 +:1009F000086009E0012024490870002023490860AC +:100A00001E4880882249088034E020480068B842A7 +:100A100009D21A4880881E4908801C480068401C7A +:100A20001A49086007E0022017490870002017499A +:100A30000860144908601DE014480068B04215D2EF +:100A400010480068A0420BD300200E4908601048EF +:100A50000088002804DD0E480088401E0C490880EC +:100A60000A480068401C0949086002E00020084963 +:100A7000088000BF00BF00BF7DE7000078000020B5 +:100A80005800002064000020620000206800002060 +:100A90006000002000B501F015FA00BD00B500208F +:100AA0000749087007490860074908800749087026 +:100AB0000749086007490860074801F02BFA00BDA4 +:100AC000580000205C000020600000206200002030 +:100AD000640000206800002000C0004010B50246FD +:100AE0000F2A14DD1348806B1346103B5C00032370 +:100AF000A34098430F4B98631846806B1346103BF6 +:100B00005C000B46A34018430A4B98630FE009486A +:100B1000406B54000323A3409843064B5863184688 +:100B2000406B54000B46A3401843024B586300200F +:100B300010BD000000100240014604484068012238 +:100B40008A401040C840C0B2704700000010024008 +:100B5000FFB504460D461E460B9F00212046FFF7B9 +:100B6000BDFF012D10D1012F0ED14F480069012189 +:100B7000A14088434C490861084640690121A140D1 +:100B80000843494948613BE0012D10D1002F0ED1A7 +:100B9000454800690121A14088434349086108464E +:100BA00040690121A14088433F49486128E0002D68 +:100BB00014D1012F12D13C4840690121A140884342 +:100BC00039494861084600690121A1400843364976 +:100BD0000861099848620298086311E0002D0FD15E +:100BE000002F0DD1304800690121A14088432E49D2 +:100BF0000861084640690121A14088432A494861AB +:100C0000022E0ED1284880690121A140884326493F +:100C100088610846C1690120A04081432248C16122 +:100C20001FE0002E0ED1204880690121A140084319 +:100C30001D4988610846C0690121A14088431A49BD +:100C4000C8610EE0012E0CD1174881690120A04037 +:100C5000814315488161C0690121A14008431249BF +:100C6000C8611148816A0120A04081430E48816219 +:100C7000806A0A99C907C90FA14008430A498862D6 +:100C80000846C06A0121A14088430749C862084656 +:100C9000C06A0A998907C90FA14008430249C8627E +:100CA000002004B0F0BD000000100240012907D16F +:100CB000074A5268012383401A43054B5A6006E0F5 +:100CC000034A5268012383409A43014B5A6070479C +:100CD0000010024000B503461846FFF72DFF01281B +:100CE00003D1184600F00AF807E01846FFF724FF82 +:100CF000002802D1184600F00BF800BD03494968EE +:100D0000012282409143014A516070470010024025 +:100D100003494968012282401143014A51607047EA +:100D20000010024000207047C206D20E01219140FF +:100D3000014A11607047000080E200E0C206D20E56 +:100D400001219140014A11607047000080E200E0FB +:100D5000C206D20E01219140014A11607047000085 +:100D600080E100E0C206D20E01219140014A1160EB +:100D70007047000080E100E0C206D20E01219140E0 +:100D8000014A11607047000000E100E0C206D20E87 +:100D900001219140014A11607047000000E100E02C +:100DA00001460448406901228A401043014A5061CB +:100DB0000020704700000240014802490860704767 +:100DC00000E1F5057000002000B501200449C8606D +:100DD00004480068401C0349086000F045F800BD65 +:100DE000008000404C00002070B504460820FFF74A +:100DF000D7FF1520FFF7B6FF1520FFF79FFF7D21D6 +:100E0000C90007480068FFF773F9604305460122EF +:100E100029460448FFF798FC1520FFF7B7FF70BD7F +:100E2000240000200080004001200449C8600448DC +:100E30000068401C024908607047000000900040B4 +:100E400054000020004870473C00002010B50621E7 +:100E50000348FFF77CF908210248FFF778F910BD35 +:100E60003C000020420000202B480078401C2A490A +:100E7000087008464078401C487008468078401C3E +:100E800088700846C078401CC87008460079401C2D +:100E900008710846C088401CC880084600780228AF +:100EA00004DB0020087001201C4908701A484078B3 +:100EB000062805DB002018494870012017494870B2 +:100EC000154880780A2805DB002013498870012026 +:100ED000124988701048C078142805DB00200E499C +:100EE000C87001200D49C8700B480079642805DBE3 +:100EF0000020094908710120084908710648C08886 +:100F00007D21C900884205DB00200349C8800120FB +:100F10000249487170470000420000203C00002058 +:100F200010B500240C20FFF7FFFE0120800700F021 +:100F300062F8032806D10120800740680421884315 +:100F4000090748600120800700F055F8022805D005 +:100F50000120800700F04FF8062816D101208007F5 +:100F60004068400840000121890748600846006841 +:100F7000C4B221460120800700F0EEF8012080076E +:100F80004068012108438907486010BD10B500245E +:100F90000D20FFF7C9FE144800F02DF8032805D1F5 +:100FA00011484068042188430F4948600E4800F00A +:100FB00022F8022804D00C4800F01DF8062812D1AF +:100FC00009484068400840000749486008460068F2 +:100FD000C4B22146044800F0BFF80348406801212C +:100FE00008430149486010BD0010004001464869AF +:100FF0008006C00F7047014688680007400F7047A1 +:1010000070B504460D461348844206D10D20FFF703 +:101010009FFE0D20FFF788FE09E001208007844233 +:1010200005D10C20FFF794FE0C20FFF77DFE6068D1 +:101030002978084360600748844203D10D20FFF7F8 +:101040009BFE06E001208007844202D10C20FFF7BE +:1010500093FE70BD00100040F8B504460D46012017 +:10106000800784420BD10020FFF79AFE0121022065 +:10107000FFF734FD01210320FFF730FD0DE0344878 +:1010800084420AD10120FFF78BFE01210C20FFF7DB +:1010900025FD01210D20FFF721FD606BC007C00F6A +:1010A000002801D1102700E00D272A486968006850 +:1010B000FFF71EF839460090FFF71AF8401E86B277 +:1010C000F0B22062FF200002304000126062A0688F +:1010D000E968097889010843A060E86880780128F8 +:1010E00003D1A06801210843A060E068042188437F +:1010F000E060E068297C89000843E060E0688008DF +:101100008000E060E068697C0843E060E0680821F6 +:101110008843E060E068297DC9000843E060287DDD +:1011200001280DD1E06830218843E060E068E97C67 +:1011300009010843E060E068A97C49010843E060D8 +:10114000287A012803D12069202108432061F8BDB5 +:10115000001000402400002000B503460A4600BFEE +:101160001846FFF743FF0028FAD01146184600F052 +:1011700002F8104600BD01607047000010B5024A39 +:10118000024900F0C9F810BD4D13001034000020D2 +:101190002021020C01D010211046020A01D0104675 +:1011A0000839020901D01046091F820801D01046F3 +:1011B000891E420801D0881E7047081A7047000037 +:1011C0004900CA020243100000D004204A0D01D099 +:1011D00001221043044A490D914201D102210843E2 +:1011E000012800D105207047FF070000F8B504462C +:1011F0004F1EC8000838211815461E460868496861 +:101200003A4606239A4310D02A463346FFF784F91C +:101210003A46D200083AA3181A687F1E5B68FFF7A7 +:10122000C9F806223B469343EED1022F23D0042F68 +:1012300011D0062F2FD12A463346FFF76DF9E36A06 +:10124000A26AFFF7B7F82A463346FFF765F9636AE3 +:10125000226AFFF7AFF82A463346FFF75DF9E369E4 +:10126000A269FFF7A7F82A463346FFF755F96369E5 +:101270002269FFF79FF82A463346FFF74DF9E368E6 +:10128000A268FFF797F82A463346FFF745F96368E7 +:101290002268FFF78FF8F8BD002210B513461046FC +:1012A0000149FEF75FFF10BD0000F03F10B5FFF7EA +:1012B00081F810BD002210B5134610461146FEF706 +:1012C00051FF10BD10B50721024A00200907FFF7A2 +:1012D0008BF910BD01030000034A10B5002011076F +:1012E000FFF782F910BD000001FDFFFF02E008C812 +:1012F000121F08C1002AFAD170477047002001E090 +:1013000001C1121F002AFBD170470000014908608B +:101310007047000074000020F8B516460F460446DA +:10132000002503E03946B047641C6D1C2078002876 +:10133000F8D12846F8BD0000024803494861102052 +:10134000086170471377090000E0004070B504465B +:101350000D46E1B20148FFF7FFFE70BD00100040EE +:1013600088B0FFF7DFFCFFF7FDF9012000210091B5 +:1013700002230A46019102901320FFF7E9FB0021A6 +:101380001320FFF793FC2E492E48FFF765FE2E49E8 +:101390002C48FFF735FE0120FFF726FDFFF756FD2D +:1013A00000F07CFD294B0FCB079304AB07C304A8C7 +:1013B000FFF796FAFFF76EFB40E0FFF743FD0446A8 +:1013C0002078002801D000202070A078002801D0CB +:1013D0000020A0702079002801D0002020716079C1 +:1013E00000282AD01A480078401C1949087008467D +:1013F00000780A280BDC17480078002804D1012067 +:1014000014490870FFF746FBFFF776FA10E0104822 +:101410000078142809DC0F480078012808D1002042 +:101420000C490870FFF73AFB02E0002008490870F9 +:101430001320FFF74FFC0020607100BFBDE70000E4 +:10144000080000200010004020000020D41F0010E1 +:101450000000002001000020F0B51FB496B08446C3 +:101460000C460246199D18980390490068006300D5 +:10147000490840080193002A01D0012600E0002617 +:101480009E19FE4BF6185B109E422BD36E00039FF5 +:101490000296002F00D00127F719F84EF84BBE191D +:1014A0009E421FD3039E0346F64F334309D03B466B +:1014B0009C4201D1002A04D0019B002A05D00126BC +:1014C00004E0002039461BB0F0BD00269E19EE4B0B +:1014D0009E4207D8039F029E002F00D00127F619D5 +:1014E0009E4207D92B4660462146189AFFF7DEFE3A +:1014F0001BB0F0BD0023002C29DAE44EB04226DAFE +:10150000E34EB04201DB022321E0DE4EB0421EDB9F +:10151000E04E070DBE19142E09DD3427BF1B039EB4 +:10152000FE400196BE40039FBE420BD00FE0039FDA +:10153000002F0CD11427BF1B0646FE400196BE406B +:10154000864204D1019BDE07F60F02239B1B0E4649 +:10155000164318D1002D16DA002C03D0022B01D02F +:10156000012B06D00220FFF7D1FEFFF795FE1BB03E +:10157000F0BD0220FFF7CAFEFFF78EFE0122D20760 +:1015800051401BB0F0BD039E002E61D1BF4EB04252 +:1015900020D1C148844201D1002A08D0B9488142F3 +:1015A00009DB002D10DB189829461BB0F0BD002088 +:1015B000B4491BB0F0BD002D06DA01222946D2073E +:1015C000189851401BB0F0BDB44979440868496887 +:1015D0001BB0F0BDAB4FB84225D1002D1FDA00295A +:1015E00004D0B14212D1002A09D018E0002A72D1E9 +:1015F000A649E20F0020D20711431BB0F0BD002026 +:10160000E20F0146D20711431BB0F0BDB14206DA2A +:10161000234600203946FEF7A5FD1BB0F0BD10465D +:1016200021461BB0F0BDB14212DA0126B607B54221 +:1016300003D1234610461946FEE3994EB54207D121 +:10164000261E05DB1046314600F004FC1BB0F0BD41 +:1016500067007F081646002A40D100290AD08B4A2D +:10166000914229D1002C0EDD002D1CDB00201146FB +:101670001BB0F0BD022B16D0002C14D0012B12D1C0 +:10168000002C14DB0FE0002C28DA002D09DB012BE5 +:1016900003D000207D491BB0F0BD002081491BB064 +:1016A000F0BD012B03D0002001461BB0F0BD00208F +:1016B0000121C9071BB0F0BD724A91420ED1002C26 +:1016C00001DA002B17D0022B06D00020C043FEF712 +:1016D000C1FD1BB0F0BD90E20120F8E7E217521CFB +:1016E00094461A4307D000220892664C62465B1E5D +:1016F0001A4307D009E00120FFF708FEFFF7DAFDE3 +:101700001BB0F0BD0022644C0892674A90427DDD18 +:10171000664B674A98421FDD914202DC002D05DBD3 +:101720004DE05848814217DB002D48DD0220FFF7CD +:10173000EDFDFFF7C7FD05460E460022534B21463F +:101740000898FEF7E9FE084671004908C00FC00777 +:10175000014328461BB0F0BD914215DA002D2EDA68 +:101760000220FFF7D3FDFFF7ADFD05460E46002230 +:10177000464B21460898FEF7CFFE72005208C80F6C +:10178000C0070243114617E03E4B994223DD002D6E +:1017900015DD0220FFF7BAFDFFF794FD05460E4662 +:1017A00000223A4B21460898FEF7B6FE0846710023 +:1017B0004908C00FC007014328461BB0F0BD0220F6 +:1017C000FFF7A4FDFFF788FD49004908E20FD207A3 +:1017D00011431BB0F0BD002230463946FEF78EFEA5 +:1017E000012205460E46D243FEF7FEFE314A324B39 +:1017F000FEF78AFE2A463346FEF78EFE0022284B6D +:10180000FEF782FE07462A46334600E064E0039175 +:1018100010461946FEF780FE3A46039BFEF77CFE13 +:101820000746032209915207244B28463146FEF70A +:1018300073FE07910C90224A204B38460999FEF717 +:101840006BFE074601911F4A1F4B28463146FEF7A3 +:1018500063FE3A46019BFEF751FE07460B460246E1 +:10186000099107990C98FEF7A5FD00250E4628461C +:10187000079B0C9AFEF742FE3A4627E0FFFF1F0047 +:10188000FFFF0F000000F03F0000E0FF0000F07FCE +:101890000000404301FCFFFF0000F0BFA20A00006F +:1018A0000000E03F0000F0FF0000E0410000F043D6 +:1018B000FFFFEF3F555555555555D53F4715F73F58 +:1018C000FE822B6544DF5DF80BAE543E099BFEF7AC +:1018D0001BFE02460B4652E1012500202D05A942C0 +:1018E00007DA352230463946FEF77EFE06463420BA +:1018F000C0430A151218FE48101803900803FD494A +:10190000000B01430F46FC49884201DC002003E044 +:10191000FA49884202DA0120119005E00020119076 +:101920000398401C7F1B039011980597C200F44850 +:101930000F927844801843680268394630460D9308 +:101940000292FEF7DBFD07910C9030460D9B029A48 +:101950000599FEF72FFD02460B460020E549FEF7EC +:1019600001FC09910490079B0C9AFEF7D5FD12909B +:1019700000201090E3480D46784400680E90012145 +:1019800078104907084311990D9B890440180121DB +:10199000C90447183946029A0E98FEF7AFFD324641 +:1019A000059BFEF7B1FD02460B4629461098FEF74F +:1019B000B3FD064602913B4629460E9A1098FEF763 +:1019C000ABFD079B0C9AFEF79FFD3246029BFEF78C +:1019D00095FD099B049AFEF79FFD0591129A0A90C6 +:1019E0002B4610461946FEF797FD06460246C648A6 +:1019F0000F460B4606217844FFF7F8FB32463B467C +:101A00000091049010461946FEF786FD009B049A4B +:101A1000FEF782FD06460F462B461946129A10988D +:101A2000FEF7C8FC059B0A9AFEF776FD32463B4658 +:101A3000FEF7C0FC109A079104902B4610461946F9 +:101A4000FEF76AFDB14E0022334609910290FEF77F +:101A5000B1FC079B049AFEF7ADFC00200746024646 +:101A600033460091FEF74AFD099B029AFEF746FDB8 +:101A7000079B049AFEF748FD06460D913A46294613 +:101A8000009B1098FEF748FD07910C902B463046BE +:101A9000129A0D99FEF740FD05460E463A46009B08 +:101AA00005990A98FEF738FD33462A46FEF782FC70 +:101AB00002460B460746099107990C98FEF77AFCF7 +:101AC00000250E462846079B0C9AFEF717FD3A465E +:101AD000099BFEF719FD07460722099152078C4B17 +:101AE00031462846FEF718FD07910090894A884B39 +:101AF00038460999FEF710FD07460191864A874B43 +:101B000031462846FEF708FD3A46019BFEF752FC97 +:101B1000834B7B440F9A9B181A685B68FEF74AFC5C +:101B2000029009910398FEF795FB05910490099B9B +:101B3000029A07990098FEF73DFC7A4B7B440F9A76 +:101B40009B181A685B6817460393FEF733FC059BE6 +:101B5000049AFEF72FFC0E462846059B049AFEF7D2 +:101B6000CDFC3A46039BFEF7C9FC079B009AFEF7A3 +:101B7000C5FC099B029AFEF7C7FC02460B46199961 +:101B800000200C900F461898FEF7C6FC02910490B6 +:101B90003B460C9A19991898FEF7B0FC2A46334632 +:101BA000FEF7BAFC029B049AFEF704FC09910E9022 +:101BB0002A46334639460C98FEF7AEFC06460F46D9 +:101BC000099B0E9AFEF7F6FB574A0D46914220DB21 +:101BD0005242AA18024310D132463B46FEF78EFC11 +:101BE00004900391514A524B09990E98FEF7E2FB7B +:101BF000039B049AFEF70EFD1ED20220FFF786FB20 +:101C0000FFF760FB49004908E20FD20711431BB000 +:101C1000F0BD6A00474B52089A420DD3464AAA18B3 +:101C2000024300D0CBE532463B46FEF767FC099BFA +:101C30000E9AFEF7EFFCF5D96800002340082C4906 +:101C40000393020D3D4B5218984223DD01200005FD +:101C5000521CD04042195000400D40183849794478 +:101C6000096813468C463749C1408B431203012152 +:101C7000120B090551181422101AC1400391002DAE +:101C800001DA48420390624630463946FEF736FC98 +:101C900006460F4632463B4609990E98FEF78AFBE8 +:101CA00000252A46284B28460591FEF735FC07916A +:101CB0000C90264A264B28460599FEF72DFC0091EC +:101CC000029032463B4628460599FEF717FC099BD1 +:101CD0000E9AFEF719FC1F4A1F4BFEF71DFC009BD6 +:101CE000029AFEF767FB07460B460246099135E06C +:101CF00001FCFFFF0000F03F8E9803007AB60B0056 +:101D0000B2060000F40600001E06000000000840B5 +:101D100009C7EE3FFD033ADCF5015B14E02F3EBE40 +:101D2000F2040000B804000000009040FE822B6521 +:101D30004715973C00CC904000346F3F0000E03FD7 +:101D40000E040000FFFF0F00432EE63F396CA80C85 +:101D5000615C20BEEF39FAFE422EE63F07990C98EF +:101D6000FEF728FB05460E46079B0C9AFEF7C6FBBE +:101D70003A46099BFEF7C8FB09912A4633460E9066 +:101D800010461946FEF7C8FB074602462F480B4689 +:101D9000059105217844FFF729FA3A46059BFEF79D +:101DA000BBFB2A463346FEF7AFFB074601912846A8 +:101DB0003146099B0E9AFEF7AFFB099B0E9AFEF780 +:101DC000F9FA012304910C9000229B0738460199EF +:101DD000FEF794FB05910E903A4628463146019B4A +:101DE000FEF79AFB059B0E9AFEF7BCF9049B0C9A32 +:101DF000FEF784FB2A463346FEF780FB0022144B95 +:101E0000FEF782FB064603980D46000541190915A9 +:101E1000002912DC30462946039AFEF7E5FBFFF75E +:101E2000CFF9042801D1FFF757FA30462946039A23 +:101E3000FEF7DAFB064601E004E029180B463246BD +:101E400021460898FEF768FB1BB0F0BDB002000009 +:101E50000000F03FF8B506460C46FEF724FC051ED0 +:101E60000F4600D00120014349000B484908411AA0 +:101E7000C90F0DD0002E01D0012100E000210C433C +:101E800061004908401AC00F02D10120FFF73EFA55 +:101E900028463946F8BD00000000F07F10B502204A +:101EA00005490860054840690549084303494861F8 +:101EB000FFF742FA10BD000000300240000002406F +:101EC0000350000001200C49087000200B490860F5 +:101ED0000B48407B002809D000200A4908800A49A5 +:101EE00008700A4908600A49086003E004488088CD +:101EF0000449088070470000580000205C00002062 +:101F000078000020600000206200002064000020B3 +:101F1000680000200021C16300BF03E0C16100220E +:101F20000262491C4029F9DB70470000F8B50446FD +:101F30000D460026002716A0FFF720F96420A060B8 +:101F40002020A061A0616420206160615020206099 +:101F50000420E063002002E0E0612562401C40288C +:101F6000FADB1920C00160620020A062E06201205B +:101F7000206300206063A06301206060002F04D014 +:101F80000BA0FFF7FBF8012600273046F8BD000044 +:101F90000AE9A9B1E58AA8E599A841E6ADA3E5BC9F +:101FA000A6E6B3A2E6B58BE8AF955C6E0000000034 +:101FB0000AE99499E8AFAF203A20E9A9B1E58AA8E7 +:101FC000E599A841E6B58BE8AF95E5A4B1E8B4A5DD +:101FD0000A0000006400E80380006400320002068A +:101FE0000201000000000000000000000000F03FBF +:101FF000000000000000F83F0000000000000000AA +:102000000000004003B8E23F0000000000000000B4 +:1020100006D0CF43EBFD4C3E033333333333E33F42 +:10202000FFAB6FDBB66DDB3F4D268F515555D53F6E +:1020300001411DA96074D13F65DBC9934A86CD3F3C +:10204000EF4E454A287ECA3F3E5555555555C53F2A +:1020500093BDBE166CC166BF2CDE25AF6A56113F1C +:10206000F16BD2C541BDBBBED0A4BE726937663E1E +:102070000000000000000000982000100000002078 +:1020800078000000EC1200101021001078000020F1 +:1020900010020000FC12001000000000020001000D +:1020A00000000000B0AD01000000000004000020AE +:1020B0000003000100000000050000000000000017 +:1020C000000300000000000000000000000000000D +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:102100000000000000E1F50500E1F5050000000019 :04000005100000C126 :00000001FF diff --git a/Objects/ENS001_BASIC_PRJ.htm b/Objects/ENS001_BASIC_PRJ.htm index 36eebfa..95d0111 100644 --- a/Objects/ENS001_BASIC_PRJ.htm +++ b/Objects/ENS001_BASIC_PRJ.htm @@ -3,9 +3,9 @@ Static Call Graph - [.\Objects\ENS001_BASIC_PRJ.axf]

Static Call Graph for image .\Objects\ENS001_BASIC_PRJ.axf


-

#<CALLGRAPH># ARM Linker, 5060750: Last Updated: Wed Aug 20 11:01:24 2025 +

#<CALLGRAPH># ARM Linker, 5060750: Last Updated: Fri Aug 29 11:28:15 2025

-

Maximum Stack Usage = 360 bytes + Unknown(Cycles, Untraceable Function Pointers)

+

Maximum Stack Usage = 368 bytes + Unknown(Cycles, Untraceable Function Pointers)

Call chain for Maximum Stack Depth:

main ⇒ ClockInit ⇒ ClockInitSet ⇒ pow ⇒ __kernel_poly ⇒ __aeabi_dmul ⇒ _double_epilogue ⇒ _double_round

@@ -56,7 +56,7 @@ Function Pointers

  • UART1_Handler from ens1_uart.o(i.UART1_Handler) referenced from startup_cmsdk_cm0.o(RESET)
  • WG_DRV_Handler from startup_cmsdk_cm0.o(.text) referenced from startup_cmsdk_cm0.o(RESET)
  • __main from entry.o(.ARM.Collect$$$$00000000) referenced from startup_cmsdk_cm0.o(.text) -
  • fputc from retarget.o(i.fputc) referenced from printf1.o(i.__0printf$1) +
  • fputc from retarget.o(i.fputc) referenced from printfb.o(i.__0printf$bare)
  • main from mian.o(i.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B)

    @@ -196,12 +196,12 @@ Global Symbols

    __aeabi_uidiv (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED) -

    __aeabi_uidivmod (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text)) +

    __aeabi_uidivmod (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text))

    [Stack]

    • Max Depth = 12
    • Call Chain = __aeabi_uidivmod

    [Called By]
    • >>   UART_Init -
    • >>   TIMER0_Init -
    • >>   _printf_core +
    • >>   TIMER0_Init +
    • >>   EMS_Process_Ramp

    __aeabi_memcpy (Thumb, 36 bytes, Stack size 0 bytes, memcpya.o(.text)) @@ -399,7 +399,7 @@ Global Symbols

    CMSDK_timer_Init (Thumb, 26 bytes, Stack size 8 bytes, ens1_timer.o(i.CMSDK_timer_Init))

    [Stack]

    • Max Depth = 8
    • Call Chain = CMSDK_timer_Init
    -
    [Called By]