From 543b4f2ff5460dafdfc20e83ddcd7151b507ddaf Mon Sep 17 00:00:00 2001 From: zhangsan Date: Thu, 17 Sep 2020 13:21:25 +0800 Subject: [PATCH] v1.0 --- .gitignore | 33 + docs/加密流程图-v0.1-20200917.eddx | Bin 0 -> 31504 bytes docs/加密流程图-v0.2-20200917.eddx | Bin 0 -> 31866 bytes keilp/cc_as_stc02_ps5ws.uvprojx | 427 +++++ si4/keywords.txt | 152 ++ si4/ps5ws.si4project/soft_ps5ws.sip_sym | Bin 0 -> 312092 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xab | Bin 0 -> 122880 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xad | Bin 0 -> 1528 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xc | Bin 0 -> 55160 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xf | Bin 0 -> 55160 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xm | Bin 0 -> 108 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xr | Bin 0 -> 55160 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsb | Bin 0 -> 61440 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsd | Bin 0 -> 848 bytes si4/ps5ws.si4project/soft_ps5ws.siproj | Bin 0 -> 9368 bytes .../soft_ps5ws.siproj_settings.xml | 22 + si4/ps5ws.si4project/soft_ps5ws.siwork | Bin 0 -> 16454 bytes source/33.txt | 141 ++ source/app/common.c | 75 + source/app/common.h | 78 + source/app/main.c | 153 ++ source/app/main.h | 82 + source/app/source.lnk | Bin 0 -> 1615 bytes source/bsp/bsp_config.h | 343 ++++ source/bsp/bsp_config0.h | 202 ++ source/clib/bit.h | 405 ++++ source/clib/clib.c | 1676 +++++++++++++++++ source/clib/clib.h | 112 ++ source/clib/type.h | 316 ++++ source/cpu/STARTUP.A51 | 198 ++ source/cpu/STC_stc8a8k.H | 617 ++++++ source/cpu/c51_macro.H | 301 +++ source/ctask/task.c | 288 +++ source/ctask/task.h | 288 +++ source/ctask/tick.c | 133 ++ source/ctask/tick.h | 210 +++ source/msp/UART0.C | 448 +++++ source/msp/UART0.h | 152 ++ source/msp/msp_eeprom.c | 170 ++ source/msp/msp_eeprom.h | 47 + source/msp/msp_id.c | 49 + source/msp/msp_id.h | 40 + source/msp/time.c | 255 +++ source/msp/time.h | 55 + source/tpc/tpc_modbus.c | 77 + source/tpc/tpc_modbus.h | 57 + source/tpc/tpc_uart.c | 192 ++ source/tpc/tpc_uart.h | 409 ++++ 48 files changed, 8203 insertions(+) create mode 100644 .gitignore create mode 100644 docs/加密流程图-v0.1-20200917.eddx create mode 100644 docs/加密流程图-v0.2-20200917.eddx create mode 100644 keilp/cc_as_stc02_ps5ws.uvprojx create mode 100644 si4/keywords.txt create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_sym create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xab create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xad create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xc create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xf create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xm create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xr create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xsb create mode 100644 si4/ps5ws.si4project/soft_ps5ws.sip_xsd create mode 100644 si4/ps5ws.si4project/soft_ps5ws.siproj create mode 100644 si4/ps5ws.si4project/soft_ps5ws.siproj_settings.xml create mode 100644 si4/ps5ws.si4project/soft_ps5ws.siwork create mode 100644 source/33.txt create mode 100644 source/app/common.c create mode 100644 source/app/common.h create mode 100644 source/app/main.c create mode 100644 source/app/main.h create mode 100644 source/app/source.lnk create mode 100644 source/bsp/bsp_config.h create mode 100644 source/bsp/bsp_config0.h create mode 100644 source/clib/bit.h create mode 100644 source/clib/clib.c create mode 100644 source/clib/clib.h create mode 100644 source/clib/type.h create mode 100644 source/cpu/STARTUP.A51 create mode 100644 source/cpu/STC_stc8a8k.H create mode 100644 source/cpu/c51_macro.H create mode 100644 source/ctask/task.c create mode 100644 source/ctask/task.h create mode 100644 source/ctask/tick.c create mode 100644 source/ctask/tick.h create mode 100644 source/msp/UART0.C create mode 100644 source/msp/UART0.h create mode 100644 source/msp/msp_eeprom.c create mode 100644 source/msp/msp_eeprom.h create mode 100644 source/msp/msp_id.c create mode 100644 source/msp/msp_id.h create mode 100644 source/msp/time.c create mode 100644 source/msp/time.h create mode 100644 source/tpc/tpc_modbus.c create mode 100644 source/tpc/tpc_modbus.h create mode 100644 source/tpc/tpc_uart.c create mode 100644 source/tpc/tpc_uart.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd151ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +### vim +*.swp +*.swo +*~ + +### Keil5 +/keil/* +/keilp/* +!*.sct +!*.uvprojx + +### Source Insight +*.IAB +*.IAD +*.IMB +*.IMD +*.PFI +*.PO +*.PR +*.PRI +*.PS +*.WK3 +*.SearchResults +*.bookmarks.xml +*.snippets.xml +si/**/cache/ +si/**/Backup/ +si4/**/cache/ +si4/**/Backup/ + +### Source file +source/bak/ +/out/ diff --git a/docs/加密流程图-v0.1-20200917.eddx b/docs/加密流程图-v0.1-20200917.eddx new file mode 100644 index 0000000000000000000000000000000000000000..935cd92362b032f3caa85322764ff73b76e20edd GIT binary patch literal 31504 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 literal 0 HcmV?d00001 diff --git a/docs/加密流程图-v0.2-20200917.eddx b/docs/加密流程图-v0.2-20200917.eddx new file mode 100644 index 0000000000000000000000000000000000000000..857f55cb94c9b91249bcc98436b8232e388ebf27 GIT binary patch literal 31866 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 literal 0 HcmV?d00001 diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx new file mode 100644 index 0000000..2dc42ef --- /dev/null +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -0,0 +1,427 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + STC8F2K16S2 + 0x0 + MCS-51 + 0 + + + STC8F2K64S4 + STC + IRAM(0-0xFF) XRAM(0-0x07FF) IROM(0-0xFFF8) CLOCK(35000000) MODP2 + + "LIB\STARTUP.A51" ("Standard 8051 Startup Code") + + 63032 + STC8.H + + + + + + + + + + + 0 + 0 + d:\Keil\C51\BIN\ + + + STC\ + STC\ + + 0 + 0 + 0 + 0 + 1 + + ..\out\ + cc_stc02_ps5ws + 1 + 0 + 1 + 1 + 1 + ..\out\ + 0 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + 65535 + + + S8051.DLL + + DP51.DLL + -pDP8051 + S8051.DLL + + TP51.DLL + -p51 + + + + 0 + 0 + 0 + 0 + 16 + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + "" () + + + + + 0 + + + + 2 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0xffff + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0xfff9 + + + 0 + 0x0 + 0x100 + + + 0 + 0x0 + 0x800 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 0 + 0 + 0 + 1 + 3 + 2 + 2 + 0 + 1 + 0 + 0 + + + + + + + + + 0 + 1 + 0 + 0 + + + + + + + + + 0 + 0 + 1 + 0 + 2 + 1 + + REMOVEUNUSED + + + + + + + + + + + + + + + + + + + + + + + + + + + app + + + main.c + 1 + ..\source\app\main.c + + + common.c + 1 + ..\source\app\common.c + + + + + cpu + + + STARTUP.A51 + 2 + ..\source\cpu\STARTUP.A51 + + + + + msp + + + time.c + 1 + ..\source\msp\time.c + + + UART0.C + 1 + ..\source\msp\UART0.C + + + msp_eeprom.c + 1 + ..\source\msp\msp_eeprom.c + + + msp_id.c + 1 + ..\source\msp\msp_id.c + + + + + bsp + + + ctask + + + task.c + 1 + ..\source\ctask\task.c + + + tick.c + 1 + ..\source\ctask\tick.c + + + + + tpc + + + tpc_modbus.c + 1 + ..\source\tpc\tpc_modbus.c + + + + + clib + + + clib.c + 1 + ..\source\clib\clib.c + + + + + + + +
diff --git a/si4/keywords.txt b/si4/keywords.txt new file mode 100644 index 0000000..d39a8c6 --- /dev/null +++ b/si4/keywords.txt @@ -0,0 +1,152 @@ +#define, Keyword +#elif, Directive +#else, Directive +#endif, Directive +#if, Directive +#ifdef, Directive +#ifndef, Directive +#include, Keyword +#pragma, Keyword +#undef, Keyword +(, Delimiter +), Delimiter +",", Delimiter +;, Delimiter +abstract, Keyword +__abstract, Keyword +alignas, Keyword +alignof, Keyword +asm, Keyword +__asm, Keyword +assert, Debug +Assert, Debug +async, Keyword +auto, Keyword +bool, Keyword +break, Control +case, Control +catch, Control +cdecl, Keyword +__cdecl, Keyword +char, Keyword +class, Control +coclass, Control +const, Keyword +constexpr, Keyword +const_cast, Keyword +continue, Control +cout, Keyword +decltype, Keyword +default, Control +__delegate, Keyword +delete, Control +do, Control +double, Keyword +DWORD, Keyword +dynamic_cast, Keyword +each, Control +else, Control +enum, Control +__event, Keyword +except, Control +__except, Control +exception, Keyword +explicit, Keyword +export, Keyword +extern, Keyword +FALSE, Boolean +false, Boolean +FAR, Keyword +far, Keyword +final, Keyword +__finally, Control +float, Keyword +for, Control +fortran, Keyword +for_each, Control +friend, Keyword +__gc, Keyword +goto, Control +HUGE, Keyword +huge, Keyword +if, Control +inline, Keyword +INT, Keyword +int, Keyword +int16_t, Keyword +int32_t, Keyword +int64_t, Keyword +int8_t, Keyword +interface, Control +LONG, Keyword +long, Keyword +mutable, Keyword +namespace, Control +near, Keyword +NEAR, Keyword +new, Control +noexcept, Keyword +NULL, Null Value +nullptr, Null Value +__nullptr, Null Value +operator, Keyword +override, Keyword +pascal, Keyword +PASCAL, Keyword +private, Keyword +__property, Keyword +protected, Keyword +public, Keyword +ref, Keyword +REGISTER, Keyword +register, Keyword +reinterpret_cast, Keyword +return, Control +sealed, Keyword +short, Keyword +SHORT, Keyword +signed, Keyword +sizeof, Keyword +static, Keyword +static_cast, Keyword +struct, Control +__super, Keyword +switch, Control +template, Control +this, Keyword +thread_local, Keyword +throw, Control +TRUE, Boolean +true, Boolean +try, Control +__try, Control +TTSS_step01, Highlight +TTSS_Task_end, Highlight +TTSS_Task_init, Highlight +TTSS_Task_step, Highlight +TTSS_step01, Highlight +TTSS_step02,Highlight +TTSS_step03,Highlight +TTSS_step04,Highlight +TTSS_step05,Highlight +TTSS_step06,Highlight +TTSS_step07,Highlight +TTSS_Task_step, Highlight +typedef, Control +typeid, Keyword +typename, Keyword +UINT, Keyword +union, Control +unsigned, Keyword +using, Keyword +virtual, Keyword +VOID, Keyword +void, Keyword +volatile, Keyword +wchar_t, Keyword +while, Control +WORD, Keyword +{, Delimiter +[, Delimiter +], Delimiter +}, Delimiter diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym new file mode 100644 index 0000000000000000000000000000000000000000..1b9f150ee94b29a8ca49a90b93fec972a50a0e75 GIT binary patch literal 312092 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

>2d1vzOAYVhifqV=34)Q(Z`Q(SmkCUG! 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 literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad new file mode 100644 index 0000000000000000000000000000000000000000..4f3302b0654beedcbaf1d865d9c8cecfb416f42f GIT binary patch literal 1528 zcmc(eJ!lj`6vyA)?VW)rtY{-x9Acr}MiGM5B{5%qF5X6Mggr?tBwSXL2uU@a34~;c zHU~zovc6uyORJ(MHX_?HA4zKV0b2iYaTyFkt=hO$gpZ{I;gGo8>kN_7Kc-5LB!D{wu|Q zzpJkJ;eXc)G1r_qnXf&VBl46If(ujbUM9~I zvz}gfkz52WO1UCJzcJjouN$uwmLC1=B`R%9w9pKihlc;N!&RQ0aNJj?ZC?K3n76$+ cKBGN3F#o#86P_)Koa{XqqGk8(;Eas@0d-rE^8f$< literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xc b/si4/ps5ws.si4project/soft_ps5ws.sip_xc new file mode 100644 index 0000000000000000000000000000000000000000..c10b9f551925a34c6e78fe317a820f9e2428ac3c GIT binary patch literal 55160 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 N+Xe|+8ai=y{BPD?f$0DM literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xm b/si4/ps5ws.si4project/soft_ps5ws.sip_xm new file mode 100644 index 0000000000000000000000000000000000000000..3a6d71d4bd71a7ef5b16087e6bb15f4d1069ac3d GIT binary patch literal 108 zcmWl~1rC4!5Wuj*-JSnGl(M8*9uYkmB`GH_Ge<;K_`=G>z|BL#-$+MI#m>e>OT!0D C9|30o literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xr b/si4/ps5ws.si4project/soft_ps5ws.sip_xr new file mode 100644 index 0000000000000000000000000000000000000000..46b54efbc5eaf7c9ecba3a9593b94f12927f6322 GIT binary patch literal 55160 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 literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb new file mode 100644 index 0000000000000000000000000000000000000000..bbee17a6caef5b91a0150e56565ce81724ee824b GIT binary patch literal 61440 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 literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd new file mode 100644 index 0000000000000000000000000000000000000000..3bcc96203d5e053dab072b68c7bfcaa6037da1af GIT binary patch literal 848 zcmc(cu}Z{15QZmfB8MnMxCcmSnFw0PsD+5IU?7$3SzaL=USV^^s)dcnAqWSe_z1Rw zU~MBlLcqco5CpMs{z*3B3hNu#fB&8NvXkAt?h+jk`Q*_|Bjo+hM_K~71(Zi|RvqbZfX33H`hChXb%!M#@cnxQ>om{vNlp^M$ zn&IipYx>fb(W|IfNX(pkg$0pPQ`|aozmSx<6sC$?(USB1Vb+KLfoSG5OcghC6x7!0 zBoTWK?J?JrrAXIr&Oy4^TSM{!GGJ~1Q^j#W%g&pjkxmmNEOXXXh+b8@Uy&O*?-R;n z=Ef}t_suu&^NhFB{8rKSq$9+;sK`-!4k~u@O(b6+<(o$(OdJ31_t-MdxxVTB$S?0k GSkfQk5IUj& literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.siproj b/si4/ps5ws.si4project/soft_ps5ws.siproj new file mode 100644 index 0000000000000000000000000000000000000000..1254b64cd987d08f2a4ca60b4a4a9ec04638a8e3 GIT binary patch literal 9368 zcmeI1TWkzb7{||2cctoH!4j&ZEp>@1AuLG~^g)T2VY5Bm#Av5G-Q7M^JP{!w4T-wE ziMYkB?&3j|5F)%Nn@HRuBs_T%NrUzOcFsogW%@GHm$Uqne|OG)$znd!vA|sl@SWnuBoXtmMkulvMkydm1QwI+LVa3#AVb- zBxN|-B;&1i(okQ?WF*mGBu&{+zD;{hC5O^`3iqc1g#(0mfu|Xze0_rZqfwm8KS#-L zsogls@oAnAd+_TElyBz?K}*U+_Cyrt^2jk_+lGu;R;;O9e~!aKPu5*KkP7VRC&XF+ z0?v$I4RkmL88nJ>dE_V?%{qhre@J8~Fx#!VFC^2jl1O9KvDvHH4} zgyz|89zJ!L`kqqsJxc&+ta3NTZlX9>-*A-twpxwb-aMZFVn-@a3~uZ3%f~2RLITs= zo6eqw;#?j%()ze*<%W&(G@ptY9H-kHj`y)X9>X_9%A3b?TF#i_T)sJm_#O2dcTH>m zauw@iJ2-ZtUQ^#q{xR37InUW6@xGkGJ~$>#E1C<_QA{tsxS|W|;|%2WVlWx4T+++> zNO3NY9Hrf2$VC-lDHzo~D(|p{E4W9{?)b5a%Z{@U{F~zt%a-=$w$!onUwL_!Pa{8Vk=Hg?tKBmACt&SL~{K4%7nTqu> zN948sE2MSw>&p|!>(}5|0YJl)XM!WOKD=L~IG4w~&hD>UB60oSo!zT?hrkPXE{Dp97h5Y`ORcb%NbLQ%OgkHUuX9-x|eH_-Ot>_ V`Y16Uk=_{_L8s>IX3!|k^#_|DkxT#p literal 0 HcmV?d00001 diff --git a/si4/ps5ws.si4project/soft_ps5ws.siproj_settings.xml b/si4/ps5ws.si4project/soft_ps5ws.siproj_settings.xml new file mode 100644 index 0000000..837f22c --- /dev/null +++ b/si4/ps5ws.si4project/soft_ps5ws.siproj_settings.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/si4/ps5ws.si4project/soft_ps5ws.siwork b/si4/ps5ws.si4project/soft_ps5ws.siwork new file mode 100644 index 0000000000000000000000000000000000000000..c3b9118858f08425708b401faa44c7abdace69b8 GIT binary patch literal 16454 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 WBP;8eo!=GQ%BHiHAzL~9zVd&bEyZ8} literal 0 HcmV?d00001 diff --git a/source/33.txt b/source/33.txt new file mode 100644 index 0000000..ad7917e --- /dev/null +++ b/source/33.txt @@ -0,0 +1,141 @@ +#define, Keyword +#elif, Directive +#else, Directive +#endif, Directive +#if, Directive +#ifdef, Directive +#ifndef, Directive +#include, Keyword +#pragma, Keyword +#undef, Keyword +(, Delimiter +), Delimiter +",", Delimiter +;, Delimiter +abstract, Keyword +__abstract, Keyword +alignas, Keyword +alignof, Keyword +asm, Keyword +__asm, Keyword +assert, Debug +Assert, Debug +async, Keyword +auto, Keyword +bool, Keyword +break, Control +case, Control +catch, Control +cdecl, Keyword +__cdecl, Keyword +char, Keyword +class, Control +coclass, Control +const, Keyword +constexpr, Keyword +const_cast, Keyword +continue, Control +cout, Keyword +decltype, Keyword +default, Control +__delegate, Keyword +delete, Control +do, Control +double, Keyword +DWORD, Keyword +dynamic_cast, Keyword +each, Control +else, Control +enum, Control +__event, Keyword +except, Control +__except, Control +exception, Keyword +explicit, Keyword +export, Keyword +extern, Keyword +FALSE, Boolean +false, Boolean +FAR, Keyword +far, Keyword +final, Keyword +__finally, Control +float, Keyword +for, Control +fortran, Keyword +for_each, Control +friend, Keyword +__gc, Keyword +goto, Control +huge, Keyword +HUGE, Keyword +if, Control +inline, Keyword +INT, Keyword +int, Keyword +int16_t, Keyword +int32_t, Keyword +int64_t, Keyword +int8_t, Keyword +interface, Control +long, Keyword +LONG, Keyword +mutable, Keyword +namespace, Control +near, Keyword +NEAR, Keyword +new, Control +NULL, Null Value +nullptr, Null Value +__nullptr, Null Value +operator, Keyword +override, Keyword +PASCAL, Keyword +pascal, Keyword +private, Keyword +__property, Keyword +protected, Keyword +public, Keyword +ref, Keyword +register, Keyword +REGISTER, Keyword +reinterpret_cast, Keyword +return, Control +sealed, Keyword +short, Keyword +SHORT, Keyword +signed, Keyword +sizeof, Keyword +static, Keyword +static_cast, Keyword +struct, Control +__super, Keyword +switch, Control +template, Control +this, Keyword +thread_local, Keyword +throw, Control +TRUE, Boolean +true, Boolean +try, Control +__try, Control +ttss_task_init, Highlight +typedef, Control +typeid, Keyword +typename, Keyword +UINT, Keyword +union, Control +unsigned, Keyword +using, Keyword +value, Keyword +virtual, Keyword +VOID, Keyword +void, Keyword +volatile, Keyword +wchar_t, Keyword +while, Control +WORD, Keyword +[, Delimiter +{, Delimiter +], Delimiter +}, Delimiter diff --git a/source/app/common.c b/source/app/common.c new file mode 100644 index 0000000..762b98e --- /dev/null +++ b/source/app/common.c @@ -0,0 +1,75 @@ +#include "common.h" +//#include "../tpc/tpc_uart.h" +#include "../msp/msp_eeprom.h" +#include "../msp/msp_id.h" + +struct global_param G; +struct ts_eeprom_param eep_param; + +#define EEP_SECTOR_SIZE 0x200 +#define EEP_PARAM_ADDR (EEP_SECTOR_SIZE * 0) +#define ENC_KEY 0x01010101 + +#if 0 +void L3_eeprom_read(void) +{ + U8 dlen = 0; + L0_Iap_Read_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + EEPROM_PARAM_DATA_MAX + 2); + if(eep_param.filter == EEPROM_PARAM_FILTER) + { + dlen = eep_param.len - 2; + crc16(eep_param.crc,(U8*)&eep_param,2+dlen); + if(eep_param.crc[0] == eep_param.buf[dlen] && eep_param.crc[1] == eep_param.buf[dlen+1]) + { + L0_uart0_uc('#'); + Lc_buf_copy_uc((U8*)&G.p,(U8*)eep_param.buf,dlen); + } + } +} +#endif + +void L3_eeprom_persist(void) +{ + U8 dlen = MCU_ID_KEY_LEN + MCU_ID_LEN; + eep_param.filter = EEPROM_PARAM_FILTER; + eep_param.len = dlen + 2; + Lc_buf_copy_uc((U8*)eep_param.enc_key,(U8*)&G.enc_key,MCU_ID_KEY_LEN); + Lc_buf_copy_uc((U8*)eep_param.enc_val,(U8*)&G.mcu_enc_id,MCU_ID_LEN); + crc16(eep_param.crc, &eep_param, 2+dlen); + + L0_Iap_Erase(EEP_PARAM_ADDR); + L0_Iap_Program_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + dlen + 2); +} + + +void L3_chip_encrypt_main(void) +{ + U8 i = 0; + + //1.获取MCU_ID + L0_id_get_rom(G.mcu_id); + + for(i=0;i> 24 & 0xFF; + G.enc_key[1] = ENC_KEY >> 16 & 0xFF; + G.enc_key[2] = ENC_KEY >> 8 & 0xFF; + G.enc_key[3] = ENC_KEY >> 0 & 0xFF; + //eeprom中读取持久化的值 + //L3_eeprom_read(); +} + diff --git a/source/app/common.h b/source/app/common.h new file mode 100644 index 0000000..ff89038 --- /dev/null +++ b/source/app/common.h @@ -0,0 +1,78 @@ +#ifndef APP_COMMON_H +#define APP_COMMON_H + +#include "../clib/type.h" + +#define APP_VERSION 0x10 +#define P485_SLAVER_ID 0x01 +#define D_ADC_CHANNEL_MAX 4 + +#define D_MCU_BIGENDIAN 1 +// #define D_MCU_LITTLEENDIAN 1 + +#define D_COUNT_WEIGHT(adc,zadc) ((S32)((1.0 * G.p.ratio * G.p.weight_max * (adc - zadc)) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * G.p.lmd))) +//#define D_COUNT_WEIGHT(adc,zWeight) ((S32)((1.0 * G.p.ratio * G.p.weight_max * (adc)) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * G.p.lmd)) - zWeight) + +#define MCU_ID_LEN 7 +#define MCU_ID_KEY_LEN 4 + +enum tp_handle +{ + TP_HANDLED, + TP_UNHANDLE +}; + +/** + * EEPROM 存储结构 + */ +#define EEPROM_PARAM_DATA_MAX 64 +#define EEPROM_PARAM_FILTER 0xAA +typedef struct ts_eeprom_param +{ + U8 filter; + U8 len; + U8 enc_key[MCU_ID_KEY_LEN]; + U8 enc_val[MCU_ID_LEN]; + U8 crc[2]; +}EEPROM_PARAM; + +/** + * 用户协议 + */ + + +//协议类型: MODBUS RTU模式 +#define D_s_PH4_modbus_max (12) +typedef struct ts_ph4_modbus +{ + U8 salver; //从机地址 + U8 oper; //功能码 + U8 buf[D_s_PH4_modbus_max]; + U8 crc[2]; + U8 num; +}TS_PH4_modbus; + +/** + * Register Map + */ +typedef struct global_param +{ + U16 reserved; + U8 enc_key[MCU_ID_KEY_LEN]; + U8 mcu_id[MCU_ID_LEN]; + U8 mcu_enc_id[MCU_ID_LEN]; +}GlobalParam; + +extern struct global_param G; +extern void L3_reg_init(void); +extern void L3_chip_encrypt_main(void); + +//寄存器内存基地址 +#define REG_MEM_BASE ((U16*)(&G)) //寄存器基础地址(本文件外部不应该使用该宏定义) +//变量地址转寄存器 +#define MEM_2_REG(mem) (((U16*)(mem) - REG_MEM_BASE) + 1) +//寄存器转变量地址 +#define REG_2_MEM(reg) (REG_MEM_BASE + (U16)((reg) - 1)) + +#endif + diff --git a/source/app/main.c b/source/app/main.c new file mode 100644 index 0000000..88de581 --- /dev/null +++ b/source/app/main.c @@ -0,0 +1,153 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// @note +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180903 +/// @note cc_gsm_PD03SM_vh03_m10_debug01 +//20160413 CC-ACC-VH02 +//20170111 CC-ls_02 +// +//20170608 cc_as_stc01_main +// +//20180903 cc_gsm_PD03SM_vh03_m10_debug01 +// +// +/// @version 1.3 CCsens technology +/// @author CC +/// @date 20180903 +/// @note add calibrationg function +/// @version 1.4 CCsens technology +/// @author CC +/// @date 20190101 +/// @note add calibrationg function + +////////////////////////////////////////////////////////////////////////// + + +/// 下面是一个含有两个参数的函数的注释说明(简述) +/// +/// 这里写该函数的详述信息 +/// @param a 被测试的变量(param描述参数) +/// @param s 指向描述测试信息的字符串 +/// @return 测试结果(return描述返回值) +/// @see Test() (本函数参考其它的相关的函数,这里作一个链接) +/// @note (note描述需要注意的问题) +/************************************************ +stc5ac32s +程序结构 + + +有动静 + 并且采集的值小于c200 设置采集间隔缩短 + 采集值 在 c200^nqjlGnp!@3ffCucYUQf2_S!`@cgiq}OBQQlWv)8OYGM@q=uPya zpO%za_JFdtR8;h^LX!fuhzNpyXrVz^L{R76ot@DV`qd2Q%$a-7`R+IOerH?&f-ENT zz&+uy{2+oMQM~Ny*xHFHT|rGh!X7xYx`Mj9ZFT%zOwxRiKVSD#Mp+Q2ymxoT_u4i~ zCwqc1N0#fOFwbdYdXf?3BU!vWP%gR5NSQDDyp>yFM+iov|89b7Qg)kidukHp^ohJs zqf|tfuk|7Y^C80rFDkK>MkBCVN8J}A!Q-*YRvB2Np_VI;V%n6a0=4}JhZ!ZX440Mr z1RlDrgv*U%uG27Elzt|`xjNhBDs-#@7HgTykJNuu#KoQBn&6xF6Szq0Dh2+i+{^R_Ij`$k)(Xm5gu+ z12yeOM@&dXwu z6H(rtSg3S9#h@~pRrK>22$N8*rukF^*bPO?c)`of0>f~Lr_3lPyfivZAnW3v^85`+55}#EFyeiV8 z2UJSx0cyymk#S}4XDS)Ls>veBxCRH=f*js-s#;W-Op>LZ(OQD}Ma%-aV{LDrpS{|` zt~~DQxqAL)=i_gT9|{wD=???MO-Q19gMW#J0($bxx4Epy>r>}i<>d65(o*b*SSr8m zNLyb2D(YR&uf4rtC+sVentRPR8-AX%)ZKsiulaHG`v?IV>IpkJPs#f%-+8kH`yFS# zcTR3pi)ZYn@glx(9N7Z0fF9zJKwV)2`=gK9unuH@bq>=s&xR8NaoLK6A1;@U-? zlas&9zR~Z9mQH^$Z8&ti@4|E%AI~#5Io@8JoN;_WIE@L}*eQTBNBk0_C>+h-c@+=# zZW_!@U+d2f;}do={f9~MX)?Zk(-u!c*0Go7YhAeKejVAlpT=X!1X3nF|L=wj-KIak s6iBD_Imycr+m>EDT<$#Mv?n!YRUe9>@e(p32bgAlsNgYn3O~&K28m=(rT_o{ literal 0 HcmV?d00001 diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h new file mode 100644 index 0000000..9cd3b27 --- /dev/null +++ b/source/bsp/bsp_config.h @@ -0,0 +1,343 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, ؿƼ All rights reserved. +///------------------------------------------------------------------------- +/// @file hard_config.h +/// @brief hard config include +/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE +/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED +/// @info ǶʽĿ ȷϵ· Ȼȷcpu оƬͺ Ȼȷϱ ֮ Ӧó +/// @info bsp_CONFIG Ϊͷļʼ TYPE_BOARD_xx +///------------------------------------------------------------------------- +/// @version 1.1 +/// @author CC +/// @date 20180308 +/// @note +////////////////////////////////////////////////////////////////////////////// +/// @version 5.1 +/// @author CC +/// @date 20200301 +/// @note +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +#ifndef _BSP_CONFIG_H +#define _BSP_CONFIG_H +#include + + +#include "bsp_config0.h" + +#define D_version_v 'L' + + +#if 0 + +#define D_leda_OFF(); D_P35_OFF(); +#define D_leda_ON(); D_P35_ON(); +#define D_leda_REV(); D_P35_REV(); +#define D_ledb_OFF(); D_P34_OFF(); +#define D_ledb_ON(); D_P34_ON(); +#define D_ledb_REV(); D_P34_REV(); + +#else +#define D_leda_OFF(); ///D_P35_OFF(); +#define D_leda_ON(); ///D_P35_ON(); +#define D_leda_REV(); ///D_P35_REV(); +#define D_ledb_OFF(); ///D_P34_OFF(); +#define D_ledb_ON(); ///D_P34_ON(); +#define D_ledb_REV(); ///D_P34_REV(); + +#endif + + +#if 0 +#define D_debug_sim +#endif +//#define D_iic_inspect +#define D_open_save_f + +#define TYPE_UASER_BOARD ccSensor_WS_ps5ws //CC_SE_paper_main_m10_smt01.sch + +//STEP 2 TYPE_UASER_BOARD CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#if(TYPE_UASER_BOARD == ccSensor_WS_ps5ws)///-------TYPE_UASER_BOARD----------------TYPE_UASER_BOARD---------- +//2.0-5.5 8K 2kram 4k eeprom spi iic 2uart tssop20 stc8f2k08s2 1.2yuan +//2.0-5.5 16K 2kram 4k eeprom spi iic 2uart tssop20 stc8f2k16s2 1.4yuan + + +//1.7-5.5 8K 1kram 3k eeprom spi iic 2uart tssop20 stc8f2k16s2 1.1yuan + + + +#define D_version_h 0x37 +#define D_version_L 0x38 + + + #define TYPE_MCU TYPE_MCU_STC + #define TYPE_IDE TYPE_IDE_KEIL + + #include + #include + #include + + #include "../cpu/STC_stc8a8k.h" + +#if 0//// д + . ڲIRCƵ: 22.128MHz + . 绽ѶʱƵ: 35.575KHz + . Ŵʹ + . P3.2P3.3´޹ + . ϵ縴λʱӶĸλʱ + . λͨI/O + . ⵽ѹʱλ,ѹж + . ѹżѹ : 2.20 V + . ϵ縴λʱ,ӲڲŹ + . ϵԶڲŹʱԤƵΪ : 256 + . ״̬ʱŹʱֹͣ + . Ź,޸ķƵ,ܹرտŹ + . ´ûʱ,ûEEPROMһ + . ´ûʱ,ûصĶ˿ڿ485 + . ´ʱҪУؿ + . TXDֱͨRXDŵĵƽ + . оƬλ,TXDΪǿ + . оƬλ,P2.0ߵƽ + . ڲοѹ: 1341 mV (οΧ: 1270~1410mV) + . ڲŲʱ: 2018113 + + . оƬк : F64181C6219784 + Ƭͺ: STC8F2K08S2 + ̼汾: 7.3.10U + + . û趨Ƶ: 22.118MHz + . ںƵ: 22.128MHz + . Ƶʵ: 0.043% + + + ɹ !(2019-02-24 18:16:24) + +õƬĹ: 2.0-5v 8kflash 2kram DPTR EEPROM 4K + SPI IIC T0-T4 5ʱ 绽רöʱ Ƚ ڲѹж Ź tssop20 1.2Ԫ +#endif + + #include "../cpu/c51_macro.h" +#define D_MCLKO_DIV2 2 +#define D_MCLKO_DIV4 4 +#define D_MCLKO_DIV8 6 +#define D_MCLKO_DIV16 8 +#define D_MCLKO_DIV32 10 +#define D_MCLKO_DIV64 12 + +#define D_CPUfamily_type D_CPUfamily_8bits + + #define D_uart0_BRT BRT_115200 + #define D_uart0_SBIT SBIT_1 +#ifdef D_debug115200 + #if 0 + #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)/// + #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// + #else + + #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)// + #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// + #endif + +#else + #define L2_task_L0_uart0_uc(x) //L0_uart0_uc_debug(x)/////// + #define L2_task_L0_uart0_uchex(x) // L0_uart0_uchex(x)///// + + + #define GC032a_L0_uart0_uc(x) //L0_uart0_uc_debug(x)///// + #define GC032a_L0_uart0_uchex(x) //L0_uart0_uchex(x)//// + + + #define GC032a_L0_uart0_sendArray(x,Y) //L0_uart0_uchex(Y)// + #define GC032a_L0_uart0_us(x) //L0_uart0_us(x)*/ + +#endif +///#define D_sys_MainFre MainFre_16M2 +#define D_sys_MainFre MainFre_11M +///#define D_sys_MainFre MainFre_22M + +#if(MainFre_5M == D_sys_MainFre) + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21תʱⶨ 500k 2us һָ +#elif(MainFre_22M == D_sys_MainFre) + +#define D_Cdelay_200us 10 +#define D_Cdelay_1us 10 ////while p21תʱⶨ 500k 2us һָ +#define D_Cdelay_1ms 36// 500 14ms 360--10ms +#define D_Cdelay_5ms 180// 500 14ms 360--10ms +#define D_Cdelay_15ms 900 +#define D_Cdelay_30ms 2400 + +#define L0_delay_1us() Lc_delay_nop(2) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(20) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us + + + +// 0x01/#define D_MCLKO_set D_MCLKO_DIV16 //1.389MHz/800ns@MCU.22MHz- +#define D_MCLKO_set D_MCLKO_DIV8 ////2.778MHz/400ns@MCU.22MHz- +///#define D_MCLKO_set D_MCLKO_DIV4 ////5.556MHz/ @MCU.22MHz- +///#define D_MCLKO_set D_MCLKO_DIV2 ////5.556MHz/ @MCU.22MHz- +#define D_0xfa 0x33 +//#define D_0xfa 0x11 + +/******************* +#define D_0xf7 0x01 +#define D_0xf8 0x02 + +#define D_P00x46 0x26////pclk /////cccc201805 hs low polarity +#define D_P00x4c 0x00 +#define D_P00x4d 0x04 +#define D_P00x43 0x10 ///EABLE CrCb fixed en 02 +#define D_P00x4a 0x83 ///div_gate+clk_en 82 + +#define D_P00xda 0xff /// Cr fixed +#define D_P00xdb 0xff /// Cb fixed + +#define D_0xfa 0x22 //00000000000000 + + +P0:0x4d Debug_mode3 8 0x04 RW +[7:4] test_image_fix_value + +[3] fix_value_mode +[2] remove_ff_mode +[1] subsample extend opclk disable when SPI +[0] clk2x_bypass +*******************/ + +#elif(MainFre_27M == D_sys_MainFre) + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21תʱⶨ 500k 2us һָ + +#else ///MainFre_11M + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 + +#define D_Cdelay_1ms 36// +#define D_Cdelay_5ms 180// +#define D_Cdelay_15ms 900 +#define D_Cdelay_30ms 2400 +#if 0 +#define L0_delay_1us() Lc_delay_nop(5) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(40) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(150) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us +#else +#define L0_delay_1us() Lc_delay_nop(0) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us //示波器测试结果 +#define L0_delay_40us() Lc_delay_nop(18) // 5nop() 100ns 50nop() 1us (20)=10us (2)1.5us +#endif + +#endif//D_sys_MainFre) +/*******>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +1 +1ѡʱ2Ϊʷ + AUXR &= 0xFB; //ʱ2ʱΪFosc/12,12T, +2 timer0 Ϊtaskʹ +L1_tick_tick +3 + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<****/ + +#define D_IO_LED1_OFF() D_P35_OFF() +#define D_IO_LED2_OFF() D_P34_OFF() +#define D_IO_485_RE_OFF() D_P33_OFF() +#define D_IO_485_DE_OFF() D_P32_OFF() +#define D_IO_LED1_INIT() ///D_P35_INIT() +#define D_IO_LED2_INIT() ///D_P34_INIT() +#define D_IO_485_RE_INIT() ///D_P33_INIT() +#define D_IO_485_DE_INIT() ///D_P32_INIT() +#define D_IO_LED1_ON() D_P35_ON() +#define D_IO_LED2_ON() D_P34_ON() +#define D_IO_485_RE_ON() D_P33_ON() +#define D_IO_485_DE_ON() D_P32_ON() + + +////////////////////////////////sim iic config +//schĶ +#define L0_IIC_SIM_INIT() BITN_0(P3M1,5);BITN_0(P3M0,5);\ + BITN_0(P3M1,4);BITN_0(P3M0,4); +///stc10 +#define L0_IIC_SIM_close() BITN_1(P3M1,5);BITN_0(P3M0,5);\ + BITN_1(P3M1,4);BITN_0(P3M0,4); + +#if 10 +#define L0_SDA_ON() D_P34_ON() +#define L0_SDA_OFF() D_P34_OFF() +#define L0_SDA_AT() D_P34_AT() +#define L0_SCL_ON() D_P35_ON() +#define L0_SCL_OFF() D_P35_OFF() +#else + +#define L0_SDA_ON() //D_P34_ON() +#define L0_SDA_OFF() //D_P34_OFF() +#define L0_SDA_AT() //D_P34_AT() +#define L0_SCL_ON() //D_P35_ON() +#define L0_SCL_OFF() //D_P35_OFF() + +#endif + + +#if(BRT_4800 == D_uart0_BRT) +#define D_txd4_wakeup() P31 = 1 // >750us +#define D_txd4_low() P31 = 0 +////ΪӦ433 ģĹ +////debugʱм ˴ԴӰ lowЧķͲʹ,wakeup + + +#else +#define D_txd4_wakeup() //P31 = 1 // >750us +#define D_txd4_low() //P31 = 0 + + +#endif + + +#define DR_who_wakeup22 i2ctxd + + +///// DR: Define Register DRB:bit of Define Register +#define DR_isr_times SADDR + +#define DR_who_wakeup SADEN +#define DRB_who_wakeup_timer0 BITN0 +#define DRB_who_wakeup_action BITN1 +#define DRB_who_wakeup_voice BITN2 +#ifdef doc342343 +BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); +BITN_0(DR_who_wakeup, DRB_who_wakeup_timer0); + +if(BITN_G(DR_who_wakeup, DRB_who_wakeup_timer0)) +{ + +} +#endif + + + + +#elif(TYPE_UASER_BOARD == TYPE_BOARD_TI26_MT01_M178)///-------TYPE_UASER_BOARD----------------TYPE_UASER_BOARD---------- + #define TYPE_MCU TYPE_MCU_STC + #define TYPE_IDE TYPE_IDE_KEIL + + #include + #include + #include + + #include "../cpu/STC_stc8a8k.h" + + #define D_CPUfamily_type D_CPUfamily_8bits + +#elif(TYPE_UASER_BOARD == TYPE_BOARD_SMMM_MB_VH032_0E) + +#endif + +#endif//_BSP_CONFIG_H +/*********************************end file*********************************************/ + + diff --git a/source/bsp/bsp_config0.h b/source/bsp/bsp_config0.h new file mode 100644 index 0000000..dd08e90 --- /dev/null +++ b/source/bsp/bsp_config0.h @@ -0,0 +1,202 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, ؿƼ All rights reserved. +///------------------------------------------------------------------------- +/// @file hard_config.h +/// @brief hard config include +/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE +/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED +/// @info ǶʽĿ ȷϵ· Ȼȷcpu оƬͺ Ȼȷϱ ֮ Ӧó +/// @info bsp_CONFIG Ϊͷļʼ TYPE_BOARD_xx +///------------------------------------------------------------------------- +/// @version 1.1 +/// @author CC +/// @date 20180308 +/// @note +/// @version 1.6 +/// @author CC +/// @date 20190714 +/// @note add TTSS_tick TYPE +/// @version 1.7 +/// @author CC +/// @date 20191226 +/// @note gsensor + 485 + + +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +#ifndef _BSP_CONFIG0_H +#define _BSP_CONFIG0_H +#include + +#include "../clib/Type.h" +#include "../clib/bit.h" +#include "../ctask/task.h" + +#include "../clib/clib.h" +////#define D_debug115200/// + + +//#define D_cameralIndex 0 +//#define D_cameralIndex 1 +//#define D_cameralIndex 2 +#define D_cameralIndex 3 +//#define D_cameralIndex 4 +//#define D_cameralIndex 5 + + +#define SBIT_1 1 //1 stop bit +#define SBIT_2 2 //2 stop bit + + +#define BRT_115200 115200 +#define BRT_19200 19200 +#define BRT_9600 9600 +#define BRT_4800 4800 +#define BRT_SIM 900 +#define MainFre_5M 0 +#define MainFre_11M 1 +#define MainFre_22M 2 +#define MainFre_27M 3 +#define MainFre_24M 4 +#define MainFre_33M 5 +#if 0 + +#define D_leda_OFF(); D_P35_OFF(); +#define D_leda_ON(); D_P35_ON(); +#define D_leda_REV(); D_P35_REV(); +#define D_ledb_OFF(); D_P34_OFF(); +#define D_ledb_ON(); D_P34_ON(); +#define D_ledb_REV(); D_P34_REV(); + +#else +#define D_leda_OFF(); ///D_P35_OFF(); +#define D_leda_ON(); ///D_P35_ON(); +#define D_leda_REV(); ///D_P35_REV(); +#define D_ledb_OFF(); ///D_P34_OFF(); +#define D_ledb_ON(); ///D_P34_ON(); +#define D_ledb_REV(); ///D_P34_REV(); + +#endif + + + +#if 0 +#define D_debug_sim +#endif +//#define D_iic_inspect +#define D_open_save_f + +//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE +#define TYPE_BOARD_hhnew 16 +#define TYPE_BOARD_st_sleep04_01 4 +#define TYPE_BOARD_st_sleep03 5 +#define TYPE_BOARD_SMMM_MB_VH032_0E 6 +#define TYPE_BOARD_LPC17xx_ 8 +#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036 +#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551 +#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7 +#define TYPE_BOARD_TI26_MT01_M178 0x178 //ʱv TI26_MT01-M178 +#define TYPE_BOARD_stc5as32_WIFIBV01 532 +#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32 + +#define TYPE_BOARD_paper6133_m0a6 0xa6 //ֽŴ +#define TYPE_BOARD_paper_main_m10 0x10 //ֽŴ2 CC_SE_paper_main_m10_smt01.sch +#define ccSensor_CG_V02_m08_debug 0x0208 //CG2 +#define TYPE_BOARD_cc_Light_Speed0B 0x11b //LR2 + +#define TYPE_BOARD_cc_G0A03 0x123 //Ǹ2 +#define ccSensor_WS_ps5ws 0x0258 ///ش + + +/************************************* +оƬͺ : IRC15W207S +HSY037.XA +ڴоƬҪ˵: + жʱ0Ͷʱ2 (ע:޶ʱ1) + бȽ (ɵһ·ADCʹ) +************************/ +///cc_gsm_paper6133_m0a6_debug01 +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE + + +// BORAD, +// MCU:SHC6601 +// IDE :KEIL +//>>>>>>>>>>>>>>>>>>>>>>mcu TYPE +#define TYPE_MCU_SHC6601 66 +#define TYPE_MCU_STC 51 +#define TYPE_MCU_LPC17xx 3217 +#define TYPE_MCU_STM32 3232 + +#define D_CPUfamily_8bits 8 +#define D_CPUfamily_16bits 16 +#define D_CPUfamily_32bits 32 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>IDE TYPE + +#define TYPE_IDE_KEIL 1 +#define TYPE_IDE_MDK 2 +#define TYPE_IDE_IAR 3 + +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE + +#define TYPE_ASENSOR_ADXL362 362 +#define TYPE_ASENSOR_MSA300 362 +#define TYPE_ASENSOR TYPE_ASENSOR_MSA300 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>TTSS_tick TYPE + +#define D_TTSS_tick_5ms 5 +#define D_TTSS_tick_10ms 10 +#define D_TTSS_tick_25ms 25 + + +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +//#define TYPE_UASER_BOARD TYPE_BOARD_SMMM_MB_VH032_0E +//#define TYPE_UASER_BOARD TYPE_BOARD_stc90c516rd +//#define TYPE_UASER_BOARD TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 +//#define TYPE_UASER_BOARD TYPE_BOARD_stc5as32_WIFIBV01 +//#define TYPE_UASER_BOARD TYPE_BOARD_hhnew +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +//>>>>>>>>>>>>>>>>>>>>>>TTSS_tick TYPE + +#define D_TTSS_tick_5ms 5 +#define D_TTSS_tick_10ms 10 +#define D_TTSS_tick_25ms 25 + + +//<<<<<<<<<<<<<<<<<<<<<= ul2fun2[m]) u32i = ul2fun2[m] - 1; + for(m = 0;m > 4;m ++) + {// 43210 + d = (u32i /ul2fun2[m])%10; + if (d > 0) + str[n] = d; + n ++; + } + + if (n == point_num) + { + str[n] ='.'; + n ++; + } + + + str[n] = i%10 + +} + +void L0_Delay_ms(unsigned int time) +{ + unsigned int j; + for(;time > 0;time --) + { + j = D_l0_delay_ms; + while(j--) + ; + } +} + + +//22m 50ms --delay ms 100 j=150 +void L1_delay_test(void) +{ + while(9) + { + L0_Delay_ms(100); + P2 = !P2; + } + +}void Lc_delay_us(unsigned int n) +{ +// unsigned char j; + for(;n > 0;n --) + { + //j = 2; + // while(j--) + // ; + }65 300 +} +#endif + +void Lc_delay_us(vU16 i) +{ + vU16 m; + i=i/10; + for(m=i;m>0;m--) + { + Lc_delay_1us(); + } +} + +void Lc_delay_nop(U8 i) +{ + U8 m; + for(m=i;m>0;m--) + { + NOP(); + } +} + + + + +// D_1ms_delay_para +///22m 300 +/// 22M 100ns 5个100ns 20ns +void Lc_delay_ms(vU16 i) +{ + vU16 m,n; + for(m=i;m>0;m--) + { + #ifdef D_debug_time + ; + #else + //D_debug_time_using + for(n= 85;n > 0;n--) + { + L0_delay_10us();//10us + } + #endif + } +} + +void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num) +{ + U16 i; + for(i = 0; i < num; i ++) + { + *(d+i) = *(s+i); + } + +} + +vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) +{ + if(a > b) + { + if(b > c) + { + return b; + }else + {// b a) + {/// a a) + {// a b) + { + if(b > c) + { + return b; + } + else + {// b a) + {/// a a) + {// a arr[j+1]) + { + ok = 0; + tmp = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = tmp; + } + } + if(ok) + { + break; + } + } +} + +vS32 Lc_S32_media(vS32 val[],S16 num) +{ + if(num <= 1) + { + return val[0]; + } + else + { + Lc_array_sort(val,num); + return val[num/2]; + } +} + + +///// 0 1 (1-0)+1 +//// 把buf中的数据从[usStart]到[usEnd] 共 usEnd-usStart+1 的数据转换成ascii +/// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii) +{ + vU16 t = 0,m = 0; + for(t = 0;t < len;t ++) + { + + #if 1 + ascii[m] = cguHex2Char[D_uc_high(buf[t])][1]; + m ++; + ascii[m] = cguHex2Char[D_uc_low (buf[t])][1]; + m ++; + ascii[m] =0x20; + m ++; + #else + + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + + + #endif + } +} + +/// cguHex2Char[0][0] = 0x00 cguHex2Char[0][1] = 0x30 +unsigned char code cguHex2Char[16][2] +={ + 0x00,'0', + 0x01,'1', + 0x02,'2', + 0x03,'3', + 0x04,'4', + 0x05,'5', + 0x06,'6', + 0x07,'7', + 0x08,'8', + 0x09,'9', + 0x0A,'A', + 0x0B,'B', + 0x0C,'C', + 0x0D,'D', + 0x0E,'E', + 0x0F,'F' +}; + + +void crc16(unsigned char *CRC,void *dat,unsigned int len) +{ + unsigned char *ptr = (unsigned char *)dat; + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} + + +U32 Lc_abs(vS32 a,vS32 b) +{ + if(a >= b) + { + return a - b; + } + return b - a; +} + +void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len) +{ + U8 i = 0,key0,key1,key2,key3; + key0 = enc_key >> 24 & 0xFF; + key1 = enc_key >> 16 & 0xFF; + key2 = enc_key >> 8 & 0xFF; + key3 = enc_key >> 0 & 0xFF; + + for(i=0;i> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U32 htonl(U32 dat) +{ + U32 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U16 ntohs(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} + +U16 htons(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} +#endif + +#if 0///#ifdef D_flash_max + + +// 0--9 '0' +// ABCEDF------0X41-- 87-6= 81 +U8 Lc_Hex2Char(U8 CharStr) +{ + U8 rd; + if (CharStr >9)//A 10-9+ + { + rd = (CharStr - 10 + 'A') ; + } + else + { + rd = (CharStr + '0') ; + } + return rd; +} +// 0x30'0'----'9'--> 0x0----0x09 +//0x61--'a'---'f'--> 0x0a---0x0f +//0x41 'A'--'F'--> 0x0a---0x0f +U8 Lc_Char2Hex(U8 CharStr) +{ + U8 rd; + if (CharStr >= 'a')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'a' + 0x0a) ; + } + else if (CharStr >= 'A')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'A' + 0x0a) ; + } + else + { + rd = (CharStr - '0') ; + } + return rd; +} +//catch_protocol(s,d); +// 从 d中提取出协议,一般用于协议打包后的调试和透传, +// *s="iicsend:12 34 56 78 9a \r\n"; +// i: 012345678 +// 返回协议字节数量 +// extern int strpos (const char *s, char c); +unsigned char catch_protocol (const char *d_src,char d_protocol[]) +{ + unsigned char n = 0,len = 0;//,i = 0; + int i = 0; + i = strpos(d_src, (char)':'); + i ++; + len = strlen (d_src) - 2; + while(i < len) + { + d_protocol[n] = Lc_Char2Hex(*(d_src+i))*16; + i ++; + d_protocol[n] += Lc_Char2Hex(*(d_src+i)); + i ++;i ++; + n ++; + } + return n; +} + +/* + * 函数名:itoa 不同类型的cpu不一样 并且支持的最大数据取决于i = 1000000;D_value_max + * 描述 :将整形数据转换成字符串 + * 输入 :-radix =10 表示10进制,其他结果为0 + * -value 要转换的整形数 + * -buf 转换后的字符串 + * -radix = 10 + * 输出 :无 + * 返回 :无 + * 调用 :被USART1_printf()调用 + + Lc_int2a + + + */ + #define D_value_max 100000 +char *Lc_int2a(vS32 value, char *string, UN_TYPE radix) +{ + vS32 i, d; + UN_TYPE flag = 0; + vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + if (!value) + { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + U16temp = value; + switch(radix) + {//%X2 %X4 %X6 + case '2': + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + case '4': + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + #if 0 + case '8': + *ptr++ = Lc_HexToChar((value>>24)&0x0f); + *ptr++ = Lc_HexToChar((value>>20)&0x0f); + *ptr++ = Lc_HexToChar((value>>16)&0x0f); + *ptr++ = Lc_HexToChar((value>>12)&0x0f); + *ptr++ = Lc_HexToChar((value>>8 )&0x0f); + *ptr++ = Lc_HexToChar((value>>4 )&0x0f); + *ptr++ = Lc_HexToChar((value)&0x0f); + *ptr = 0; + return string; + break; + #endif + case 10: + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + i = D_value_max; + if (value > i) + { + value = i; + } + for (;i > 0; i /= 10) + { + d = value / i; + + if (d || flag) + { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + break; + default: + *ptr++ = 0x30; + *ptr = 0; + return string; + break; + } + + +} /* NCL_Itoa */ +/// bits:生成的字符共几位数据 +void Lc_int2D(vS16 value, char *string,char bits) +{ + vS16 i, d; + UN_TYPE flag = 0; +// vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + +// U16temp = value; + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + value *= -1; + }else + { + *ptr++ = ' '; + + } + + + + i = us2fun2[bits-1]; + for (;i > 0; i /= 10) + { + d = value / i; + if((0 == d)&&(0 == flag)&&(1 != i)) + {/// + *ptr++ = ' '; + + }else + { + flag = 1;///第一个非零的数据出现 + *ptr = (char)(d + 0x30); + *ptr++; + value -= (d * i); + } + } + +} /* NCL_Itoa */ + + +//void (*L0_uart0_uc)(U8 ww); + +// 带buf的printf fixme: 需要精简地方 +void Lc_print_buf(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[64]; ///取决于cpu的内存大小,如果出现问题,请先定位到此处 +// char send[16]; + char n = 0; + char *dat = 0; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; + + dat = dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + ts_uart_send_depot.buf[n ++] = 0x0d;//L0pf_send_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + ts_uart_send_depot.buf[n ++] = 0x0a;//L0pf_send_uc(0x0a); + dat ++; + break; + + case 't': // + ts_uart_send_depot.buf[n ++] = 0x09;//L0pf_send_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + ts_uart_send_depot.buf[n ++] = (char)s;// L0pf_send_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, + + d = va_arg(ap, int); // 0x30 =48d + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + ts_uart_send_depot.buf[n ++] = (*dat++);//L0pf_send_uc( *dat++); + } + }//end while.... + ts_uart_send_depot.max = n; + ts_uart_send_depot.p = ts_uart_send_depot.buf; + L0_uart0_sendbuf(); +}// +#endif + +#ifdef D_use_crc16 +/* +CRC码的步骤为: + +(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器; + +(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器; + +(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位; + +(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或; + +(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; + +(6).重复步骤2到步骤5,进行下一个8位数据的处理; + +(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H) + +*/ + + +/*****************crc校验**********************************************/ + +//crc生成函数,并将crc存储在预先定于的数组中 + +//调用方式crc16(指向数据的指针,需要校验的数据长度) + +unsigned char CRC[2];//定义数组 + +void crc16(unsigned char *ptr,unsigned int len) +{ + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} +code U8 auchCRCHi[]= +{ +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, +0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, +0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40 +}; + +code U8 auchCRCLo[] = +{ +0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, +0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, +0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, +0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, +0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, +0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, +0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, +0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, +0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, +0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, +0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, +0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, +0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, +0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, +0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, +0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, +0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, +0x40 +}; + +U16 N_CRC16(U8 *updata,U8 len) +{ + U8 uchCRCHi=0xff; + U8 uchCRCLo=0xff; + U8 uindex; + while(len--) + { + uindex = uchCRCHi^*updata++; + uchCRCHi = uchCRCLo^auchCRCHi[uindex]; + uchCRCLo = auchCRCLo[uindex]; + } + return (uchCRCHi<<8 | uchCRCLo); +} + +#endif +#if 0 //5436345673456 +/******************************************************************** +* +* 名称: L0_Usend_uc_hex +* 说明: 例如:L0_Usend_uc_hex(0x0c); output " 0c " +* 功能: 发送数据 +* 调用: SendHUc()Lc_HexToChar() +* 输入: +* 返回值: 无 +***********************************************************************/ +void Lc_uc_hex(char ww) +{ + L0_uart0_uc(Lc_Hex2Char((ww>>4)&0x0f)); + L0_uart0_uc(Lc_Hex2Char(ww&0x0f)); +} + +void Lc_us_hex(U16 ww) +{// + U8 t; + t = (U8)(((ww >> 8)&0x00ff)); + Lcp_uc_hex(t); + t = (U8)(((ww )&0x00ff)); + Lcp_uc_hex(t); +} + +void Lc_print_NC(char *dat,...) +{ + +} +// 非缓存模式的打印 fixme: 发送16进制数据时有bug +void Lc_print33333(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[16];//char t; + char *dat = NULL; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat4); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; +dat =dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + L0_uart0_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + L0_uart0_uc(0x0a); + dat ++; + break; + + case 't': // + L0_uart0_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + L0_uart0_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, //#define va_arg(ap,t) (((t *)ap)++[0]) //(((int *)ap)++[0]) + + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + L0_uart0_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + L0_uart0_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + L0_uart0_uc(*dat ++); + //t = *dat; + //L0pf_send_uc = L0_uart0_uc; + //L0pf_send_uc(t); + //L0_uart0_uc(t); + //dat++; + } + }//end while....斯蒂芬 +}// + + + + + +///计算CRC校验码 +unsigned int CRC16(unsigned char *ptr, unsigned char len) +{ + unsigned int crc=0xffff; + unsigned char i; + while(len--) + { + crc ^=*ptr++; + for(i=0;i<8;i++) + { + if(crc & 0x1) + { + crc>>=1; + crc^=0xa001; + } + else + { + crc>>=1; + } + } + } + return crc; +} + + + +///检测CRC校验码是否正确 +unsigned char CheckCRC(unsigned char *ptr,unsigned char len) +{ + unsigned int crc; + crc = (unsigned int)CRC16(ptr,(len-2)); + if(ptr[len-1]==(crc>>8) && ptr[len-2]==(crc & 0x00ff)) + { + return 0xff; + } + else + { + return 0x0; + } +} + + +char *strstr(const char *str1, const char *str2) +{ + char *cp = (char*)str1; + char *s1, *s2; + + if (!*str2) + return((char *)str1); + + while (*cp) + { + s1 = cp; + s2 = (char *)str2; + + while (*s1 && *s2 && !(*s1 - *s2)) + s1++, s2++; + + if (!*s2) + return(cp); + + cp++; + } + return(NULL); +} + + + +//12,34 +void Lc_int2str_2_2(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[4])// 1000 123456 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + + *(d+m) = '.'; + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} + + + +// 123.4 + +void Lc_int2str_3_1(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[4])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = '.'; + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} + + +//-123 +void Lc_sint2str_3(int i_in,char *d) +{ + U8 m = 0;//,i; + U32 ui_in; + if(i_in < 0) + { + ui_in = (U32)(0-i_in); + *(d+m) = '-'; + }else + { + ui_in = (U32)(i_in); + *(d+m) = ' '; + } + m ++; + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +// 12345 + +void Lc_int2str_5(U32 ui_in,char *d) +{ + U8 m = 1;//,i; + *(d+0) = ' '; + if (ui_in >= ul2fun2[4])// 10,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} +//40 +void Lc_int2str_4(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +// 123 +void Lc_int2str_3(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +//Lc_int2str(123456, 5,3,&str[0]'); +/* + + +blank 填充字符 ' '或者其他unsigned char *blank)//保留以后使用 + + +*/ + + + +void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 m = 0,i; + for(i = 0;i < len;i++) + { + if(point != 0) + { + if(point == (len-i+1)) + { + *(d+m) = '.'; + m ++; + } + } + if (ui_in>=ul2fun2[len-i]) + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(len-i));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + } + *(d+m) = 0x30 + Lc_WEI(ui_in,1); + m++; + *(d+m) = 0x00; + //*(d+m) = 'e'; +} + + +// input: 123456d +// output: '1' '2' '3'.... +//对应的点阵 为 0123456789. ,最后为空格,专为显示点阵类的数值使用 +void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 i,m = 0; //uc_temp, + for(i = len+1;i != 0;i--)// len + 1 point 占用一位 + { + if(point == (len-i)) + { + d[len-m] = '.';//'.' + m ++; + } + { + if (ui_in>=ul2fun2[i-1]) + { + d[len-m] = (U8)((ui_in/ul2fun2[i-1])%10); + + } + else + { + d[len-m] = ' ';//' ' + } + m ++; + } + } + d[len-m] = (U8)(ui_in%10); +} + +void Lc_Byte_cp(BYTE *src,BYTE *dis, int len) +{ + int i; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +/* +void Lc_Byte_print(BYTE *src,int len) +{ + int i, d; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +*/ + + +// -10........+10 + +U32 L2_fun_number_show(int i,char str[4]) +{ + U8 c; + int cint; + + if(i >= 0) + { + cint = i; + str[0] =' '; + + } + else + { + cint = 0 - i; + str[0] ='-'; + + + } + c = Lc_WEI(cint,1); + if(0 == c) + { + str[1] =' '; + } + else + { + str[1] = 0x30+ c; + + } + str[2] = 0x30+ Lc_WEI(cint,0); + return 0; +} + +//L1_lkt_write(s_room_val.ui_t3,s_room_val.ui_t3,s_task_lkt.din); +//U_uluiuc + +void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]) +{ +#if 0 + volatile U_uluiuc t; + //s_temp[] + t.uiv[0] = ui_t2; + t.uiv[1] = ui_t3; + + + Lc_Byte_cp(t.dv,out,8); + + out[3] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[0] = D_ul2uc_0( ui_t2); + + + out[7] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[4] = D_ul2uc_0( ui_t3); + + + #else + out[0] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[3] = D_ul2uc_0( ui_t2); + +/* + out[4] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[7] = D_ul2uc_0( ui_t3); +*/ +#endif + +} + +void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3) +{ + #if 0 + volatile U_uluiuc t; + Lc_Byte_cp(in,t.dv,8); + *ui_t2 = t.uiv[0]; + *ui_t3 = t.uiv[1]; + *ui_t2 = 0; + *ui_t2|= (U32)in[3]; + *ui_t2|= (U32)(in[2]<<8); + *ui_t2|= (U32)(in[1]<<16); + *ui_t2|= (U32)(in[0]<<24); + + *ui_t3 = 0; + *ui_t3|= (U32)in[7]; + *ui_t3|= (U32)(in[6]<<8); + *ui_t3|= (U32)(in[5]<<16); + *ui_t3|= (U32)(in[4]<<24); + + #else + + + *ui_t2 = 0; + *ui_t2|= (U32)in[0]; + *ui_t2|= (U32)(in[1]<<8); + *ui_t2|= (U32)(in[2]<<16); + *ui_t2|= (U32)(in[3]<<24); + /* + *ui_t3 = 0; + *ui_t3|= (INT32U)in[4]; + *ui_t3|= (INT32U)(in[5]<<8); + *ui_t3|= (INT32U)(in[6]<<16); + *ui_t3|= (INT32U)(in[7]<<24); + */ + #endif +} + +U32 Lc_abs(vU32 a,vU32 b,vU32 *diff) +{ + if(a >= b) + { + *diff = a-b; + return 1; + }else + { + *diff = b-a; + return 0; + } +} + + + + + + +#endif //#if 0 //5436345673456 + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/clib/clib.h b/source/clib/clib.h new file mode 100644 index 0000000..7aecaf3 --- /dev/null +++ b/source/clib/clib.h @@ -0,0 +1,112 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2009, NXP Semiconductor + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _CLIB_H_ +#define _CLIB_H_ + + +#include +#include +#include "../clib/type.h" +//#include "../clib/Clib.h" +//#include "../debug/debug_drv.h" +//extern char guc_send[128]; +extern unsigned char code cguHex2Char[16][2]; +typedef struct +{ + vU16 up_point; + vU16 down_point; + + +}TS_up_down_p_; + +extern U8 Lc_Hex2Char(U8 CharStr); +//extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +// input: 123456d +// output: '1' '2' '3'.... +//Ӧĵ Ϊ 0123456789. ΪոרΪʾֵʹ +//extern void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +//extern U32 L2_fun_number_show(int i,char str[4]); +#if 0 + +struct _s_temp_ +{ + U8 d[16]; + +}; + +extern struct _s_temp_ s_temp22; +extern U8 s_temp[16]; + +extern U32 ul2fun2[10]; +extern void Lc_Byte_cp(BYTE *src,BYTE *dis, int len); + +extern void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3); + +extern void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]); +extern void Lc_int2str_3(U32 ui_in,char *d); +extern U32 Lc_abs(vU32 a,vU32 b,vU32 *diff); +extern void Lc_int2str_4(U32 ui_in,char *d); + +extern void Lc_sint2str_3(int i_in,char *d); +#define Lc_WEI(WEIx,WEIn) (U8)((WEIx/ul2fun2[WEIn])%10); +#define Lc_eee(WEIn) ul2fun2[WEIn] + + +#endif + +extern char *Lc_int2a(vS32 value, char *string, UN_TYPE radix); + +extern void Lc_int2D(vS16 value, char *string,char bits); + +extern char *strstr(const char *str1, const char *str2); +extern unsigned char catch_protocol (const char d_src[],char d_protocol[]) ; +#define Lc_delay_1us() L0_delay_1us() + + +extern void Lc_delay_us(vU16 i); +extern void Lc_delay_ms(vU16 i); +extern void Lc_delay_nop(U8 i); + +//////////////// + +extern void Lc_uc_hex(char ww); +extern void Lc_us_hex(U16 ww); +//extern void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...); +extern void Lc_print(char *dat4,...); +extern void Lc_print_NC(char *dat,...); +extern void Lc_print_buf(char *dat4,...); + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +extern void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num); + +///void L2_line_algo_media(U8 *buf,vU16 len); +extern vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c); +extern vS32 Lc_S32_media3(vS32 a,vS32 b,vS32 c); +extern vS32 Lc_S32_media(vS32 val[],S16 num); +extern void Lc_array_sort(S32 arr[],int n); + +/// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); +extern void crc16(unsigned char *CRC,void *dat,unsigned int len); +extern int isBigEndianOrder(void); +extern U32 ntohl(U32 dat); +extern U32 htonl(U32 dat); +extern U16 ntohs(U16 dat); +extern U16 htons(U16 dat); +extern U32 Lc_abs(vS32 a,vS32 b); +extern void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len); + +#endif /* end __UART_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/type.h b/source/clib/type.h new file mode 100644 index 0000000..4ae3ebd --- /dev/null +++ b/source/clib/type.h @@ -0,0 +1,316 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, ؿƼ +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// ޶˵汾 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE_H__ +#define __TYPE_H__ + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif +/********************************************************************************************************* + ޹ص +*********************************************************************************************************/ + +typedef unsigned char U8; +typedef unsigned char u8; +typedef volatile U8 vU8; + + + +typedef U8 BOOLEAN; /* */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef signed char *PS8; + + + +#define bit char +//#define code + +typedef unsigned short u16; +typedef unsigned short U16; /* ޷16λͱ */ +typedef volatile U16 vU16; /* ޷16λͱ */ +typedef signed short S16; +typedef volatile S16 vS16; /* з16λͱ */ + +typedef signed long S32; +typedef unsigned long U32; /* ޷32λͱ */ +typedef volatile U32 vU32; /* з32λͱ */ +typedef volatile signed long vS32; + +typedef float FP32; /* ȸ32λȣ */ +typedef double FP64; /* ˫ȸ64λȣ */ + + +//typedef unsigned char BOOLEAN; // +typedef unsigned char INT8U; // ޷8λͱ +typedef signed char INT8S; // з8λͱ +typedef unsigned short INT16U; // ޷16λͱ +typedef signed short INT16S; // з16λͱ +typedef unsigned long INT32U; // ޷32λͱ + +typedef signed long INT32S; // з32λͱ +//typedef float FP32; // ȸ32λȣ +//typedef double FP64; // ˫ȸ64λȣ + +typedef unsigned int FLAG_P; // ׼ +//typedef unsigned char INTU; // ׼8BIT MCU +typedef unsigned int INTU; // ׼32BIT MCU +/****************** +**************************/ + + + +/********************************************************************************************************* + ֵ +*********************************************************************************************************/ +#define ZY_OK 0 /* ɹ */ +#define ZY_NOT_OK 1 /* ʧ */ +#define ZY_PARAMETER_ERR 2 /* */ +#define ZY_NO_FIND_FUNCTION 6 /* ûзָ */ +#define ZY_NO_MEMORY 12 /* ڴ治 */ +#define ZY_TIME_OUT 13 /* ʱ */ +#define ZY_NO_FIND_OBJECT 16 /* ûзֶ */ + +/********************************************************************************************************* + realViewҪӵͷļ +*********************************************************************************************************/ +#include +#include +#include +//#include +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef U8 UN_TYPE; +typedef U8 vtype; + + + +/************* + +******************/ + +//>>>>> + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; +}U_U32; +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 + +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/cpu/STARTUP.A51 b/source/cpu/STARTUP.A51 new file mode 100644 index 0000000..fbe7294 --- /dev/null +++ b/source/cpu/STARTUP.A51 @@ -0,0 +1,198 @@ +$NOMOD51 +;------------------------------------------------------------------------------ +; This file is part of the C51 Compiler package +; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc. +; Version 8.01 +; +; *** <<< Use Configuration Wizard in Context Menu >>> *** +;------------------------------------------------------------------------------ +; STARTUP.A51: This code is executed after processor reset. +; +; To translate this file use A51 with the following invocation: +; +; A51 STARTUP.A51 +; +; To link the modified STARTUP.OBJ file to your application use the following +; Lx51 invocation: +; +; Lx51 your object file list, STARTUP.OBJ controls +; +;------------------------------------------------------------------------------ +; +; User-defined Power-On Initialization of Memory +; +; With the following EQU statements the initialization of memory +; at processor reset can be defined: +; +; IDATALEN: IDATA memory size <0x0-0x100> +; Note: The absolute start-address of IDATA memory is always 0 +; The IDATA space overlaps physically the DATA and BIT areas. +IDATALEN EQU 80H +; +; XDATASTART: XDATA memory start address <0x0-0xFFFF> +; The absolute start address of XDATA memory +XDATASTART EQU 0 +; +; XDATALEN: XDATA memory size <0x0-0xFFFF> +; The length of XDATA memory in bytes. +XDATALEN EQU 0 +; +; PDATASTART: PDATA memory start address <0x0-0xFFFF> +; The absolute start address of PDATA memory +PDATASTART EQU 0H +; +; PDATALEN: PDATA memory size <0x0-0xFF> +; The length of PDATA memory in bytes. +PDATALEN EQU 0H +; +; +;------------------------------------------------------------------------------ +; +; Reentrant Stack Initialization +; +; The following EQU statements define the stack pointer for reentrant +; functions and initialized it: +; +; Stack Space for reentrant functions in the SMALL model. +; IBPSTACK: Enable SMALL model reentrant stack +; Stack space for reentrant functions in the SMALL model. +IBPSTACK EQU 0 ; set to 1 if small reentrant is used. +; IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF> +; Set the top of the stack to the highest location. +IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 +; +; +; Stack Space for reentrant functions in the LARGE model. +; XBPSTACK: Enable LARGE model reentrant stack +; Stack space for reentrant functions in the LARGE model. +XBPSTACK EQU 1 ; set to 1 if large reentrant is used. +; XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF> +; Set the top of the stack to the highest location. +XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1 +; +; +; Stack Space for reentrant functions in the COMPACT model. +; PBPSTACK: Enable COMPACT model reentrant stack +; Stack space for reentrant functions in the COMPACT model. +PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. +; +; PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF> +; Set the top of the stack to the highest location. +PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 +; +; +;------------------------------------------------------------------------------ +; +; Memory Page for Using the Compact Model with 64 KByte xdata RAM +; Compact Model Page Definition +; +; Define the XDATA page used for PDATA variables. +; PPAGE must conform with the PPAGE set in the linker invocation. +; +; Enable pdata memory page initalization +PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. +; +; PPAGE number <0x0-0xFF> +; uppermost 256-byte address of the page used for PDATA variables. +PPAGE EQU 0 +; +; SFR address which supplies uppermost address byte <0x0-0xFF> +; most 8051 variants use P2 as uppermost address byte +PPAGE_SFR DATA 0A0H +; +; +;------------------------------------------------------------------------------ + +; Standard SFR Symbols +ACC DATA 0E0H +B DATA 0F0H +SP DATA 81H +DPL DATA 82H +DPH DATA 83H + + NAME ?C_STARTUP + + +?C_C51STARTUP SEGMENT CODE +?STACK SEGMENT IDATA + + RSEG ?STACK + DS 1 + + EXTRN CODE (?C_START) + PUBLIC ?C_STARTUP + + CSEG AT 0 +?C_STARTUP: LJMP STARTUP1 + + RSEG ?C_C51STARTUP + +STARTUP1: + +IF IDATALEN <> 0 + MOV R0,#IDATALEN - 1 + CLR A +IDATALOOP: MOV @R0,A + DJNZ R0,IDATALOOP +ENDIF + +IF XDATALEN <> 0 + MOV DPTR,#XDATASTART + MOV R7,#LOW (XDATALEN) + IF (LOW (XDATALEN)) <> 0 + MOV R6,#(HIGH (XDATALEN)) +1 + ELSE + MOV R6,#HIGH (XDATALEN) + ENDIF + CLR A +XDATALOOP: MOVX @DPTR,A + INC DPTR + DJNZ R7,XDATALOOP + DJNZ R6,XDATALOOP +ENDIF + +IF PPAGEENABLE <> 0 + MOV PPAGE_SFR,#PPAGE +ENDIF + +IF PDATALEN <> 0 + MOV R0,#LOW (PDATASTART) + MOV R7,#LOW (PDATALEN) + CLR A +PDATALOOP: MOVX @R0,A + INC R0 + DJNZ R7,PDATALOOP +ENDIF + +IF IBPSTACK <> 0 +EXTRN DATA (?C_IBP) + + MOV ?C_IBP,#LOW IBPSTACKTOP +ENDIF + +IF XBPSTACK <> 0 +EXTRN DATA (?C_XBP) + + MOV ?C_XBP,#HIGH XBPSTACKTOP + MOV ?C_XBP+1,#LOW XBPSTACKTOP +ENDIF + +IF PBPSTACK <> 0 +EXTRN DATA (?C_PBP) + MOV ?C_PBP,#LOW PBPSTACKTOP +ENDIF + + MOV SP,#?STACK-1 + +; This code is required if you use L51_BANK.A51 with Banking Mode 4 +; Code Banking +; Select Bank 0 for L51_BANK.A51 Mode 4 +#if 0 +; Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4. +EXTRN CODE (?B_SWITCH0) + CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 +#endif +; + LJMP ?C_START + + END diff --git a/source/cpu/STC_stc8a8k.H b/source/cpu/STC_stc8a8k.H new file mode 100644 index 0000000..7c5ea25 --- /dev/null +++ b/source/cpu/STC_stc8a8k.H @@ -0,0 +1,617 @@ +#ifndef __STC_stc8a8k_H_ +#define __STC_stc8a8k_H_ +// STC_stc8a8k.h +#include +///////////////////////////////////////////////// +//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 +// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 +//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 +// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; + + +///00 准双向口 灌电流20mA 拉电流270-150uS +///01 推挽输出 20mA 加限流 +///10 高阻 +///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + + +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 + +#define TOx12 BITN7 +#define T1x12 BITN6 +#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍 +#define T2R BITN4 //定时器2 运行 =1 +#define T2_C BITN3 //定时器/计数器选择 +#define T2x12 BITN2 +#define EXTRAM BITN1 +#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 + + +sfr VOCTR = 0xBB; //电压控制寄存器 +///BITN_1(VOCTR, BITN7) VOCTR +#define D_VOCTR_SCCIN 0x00 +#define D_VOCTR_SCC 0x80 +#define D_VOCTR_SET(X) VOCTR = (X) + +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +//----------------------------------------------------------------- +sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 +#define EAXFR BITN7 +#define I2C_S1 BITN5 +#define I2C_S2 BITN4 +#define CMPO_S BITN3 +#define S4_S BITN2 +#define S3_S BITN1 +#define S2_S BITN0 + +//----------------------------------------------------------------- + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +/// 不可位寻址 +#define ET4 BITN6 +#define ET3 BITN5 +#define ES4 BITN4 +#define ES3 BITN3 +#define ET2 BITN2 +#define ESPI BITN1 +#define ES2 BITN0 + +sfr IPH = 0xB7; //xxxx,xx00 中断优先级寄存器2 +#define PPCAH BITN7 +#define PLVDH BITN6 +#define PADCH BITN5 +#define PSH BITN4 +#define PT1H BITN3 +#define PX1H BITN2 +#define PT0H BITN1 +#define PX0H BITN0 + + + +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +#define IP2_7 BITN7 +#define PI2C BITN6 +#define PCMP BITN5 +#define PX4 BITN4 +#define PPWMFD BITN3 +#define PPWM BITN2 +#define PSPI BITN1 +#define PS2 BITN0 + +sfr IP2H = 0xB6; //xxxx,xx00 中断优先级寄存器2 +#define IP2_7 BITN7 +#define PI2CH BITN6 +#define PCMPH BITN5 +#define PX4H BITN4 +#define PPWMFDH BITN3 +#define PPWMH BITN2 +#define PSPIH BITN1 +#define PS2H BITN0 + + + + + +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 +#define INT_EX4 BITN6 +#define INT_EX3 BITN5 +#define INT_EX2 BITN4 +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr16 WKTC = 0xAA; +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +sfr SBUF = 0x99; //Serial Data Buffer +sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx +sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 +sfr SADDR = 0xA9; //Slave Address 0000,0000 +//----------------------------------- +// 7 6 5 4 3 2 1 0 Reset Value +sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B +#define S2SM0 BITN7 +#define S2ST4 BITN6 +#define S2SM2 BITN5 +#define S2REN BITN4 +#define S2TB8 BITN3 +#define S2RB8 BITN2 +#define S2TI BITN1 +#define S2RI BITN0 + +sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx +//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 + +//--------------------------------------------------------------- +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +#define S3SM0 BITN7 +#define S3ST4 BITN6 +#define S3SM2 BITN5 +#define S3REN BITN4 +#define S3TB8 BITN3 +#define S3RB8 BITN2 +#define S3TI BITN1 +#define S3RI BITN0 + +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +//--------------------------------------------------------------- +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +#define S4SM0 BITN7 +#define S4ST4 BITN6 +#define S4SM2 BITN5 +#define S4REN BITN4 +#define S4TB8 BITN3 +#define S4RB8 BITN2 +#define S4TI BITN1 +#define S4RI BITN0 + +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 +sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 + + +//sfr P_SW2 = 0xba; +sfr PWMCFG = 0xf1; +sfr PWMIF = 0xf6; +sfr PWMFDCR = 0xf7; +sfr PWMCR = 0xfe; + +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define TADCP (*(unsigned int volatile xdata *)0xfff3) +#define PWM0T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM0T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM0CR (*(unsigned char volatile xdata *)0xff04) +#define PWM0HLD (*(unsigned char volatile xdata *)0xff05) +#define PWM1T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM1T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM1CR (*(unsigned char volatile xdata *)0xff14) +#define PWM1HLD (*(unsigned char volatile xdata *)0xff15) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM2CR (*(unsigned char volatile xdata *)0xff24) +#define PWM2HLD (*(unsigned char volatile xdata *)0xff25) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM3CR (*(unsigned char volatile xdata *)0xff34) +#define PWM3HLD (*(unsigned char volatile xdata *)0xff35) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM4CR (*(unsigned char volatile xdata *)0xff44) +#define PWM4HLD (*(unsigned char volatile xdata *)0xff45) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM5CR (*(unsigned char volatile xdata *)0xff54) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff55) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff60) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff62) +#define PWM6CR (*(unsigned char volatile xdata *)0xff64) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff65) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff70) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff72) +#define PWM7CR (*(unsigned char volatile xdata *)0xff74) +#define PWM7HLD (*(unsigned char volatile xdata *)0xff75) + + +#define CKSEL (*(unsigned char volatile xdata *)0xfE00)//108@ST8.PDF +#define MCLKODIV BIT4 +#define MCLKO_S BITN3 +#define MCLKSEL BIT0 + +#define CLKDIV (*(unsigned char volatile xdata *)0xfE01)//108@ST8.PDF +#define IRC24MCR (*(unsigned char volatile xdata *)0xfE02)//108@ST8.PDF +#define XOSCCR (*(unsigned char volatile xdata *)0xfE03)//108@ST8.PDF +#define IRC32KCR (*(unsigned char volatile xdata *)0xfE04)//108@ST8.PDF + + + +#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF + +#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF + + + +///------------------------------------- + +#define gRccUs01_H (*(unsigned char volatile data *)0xd2) +#define gRccUs01_L (*(unsigned char volatile data *)0xd3) + + + +#define gRccUs01 (*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 (*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs03 (*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +//#define gRccUs03 s_task_GC032A.n + + + +#define gRccUs04 (*(unsigned short volatile data *)0xFA)///351@ST8.PDF +#define gRccUs05 (*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H + +///////////////////////////////////////////////// + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + +sfr AUXINTIF = 0xef; + +#define T2IF 0x01 +#define INT4IF BITN6 +#define INT3IF BITN5 +#define INT2IF BITN4 + +//#define T4IF BITN2 +//#define T3IF BITN1 +//#define T2IF BITN0 + + +/// >>>>> add by cc + +#include "../clib/bit.h" + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + + +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer0 1 +#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer1 3 +#define D_ISR_int2 10 /////只有下降沿 +#define D_ISR_int3 11 /////只有下降沿 +#define D_SERVE_UART 4 +#define D_ISR_int4 16 /////只有下降沿 + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); +#endif //STC_stc8a8k + + + + + + + + diff --git a/source/cpu/c51_macro.H b/source/cpu/c51_macro.H new file mode 100644 index 0000000..5bbfab9 --- /dev/null +++ b/source/cpu/c51_macro.H @@ -0,0 +1,301 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file __C51_MACRO_H_ +/// @brief macro define 和cpu相关,可以和同一个系列的cpu共享 +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __C51_MACRO_H_ +#define __C51_MACRO_H_ + +#include + +#define D_P07_ON() P07 = 1 +#define D_P06_ON() P06 = 1 +#define D_P05_ON() P05 = 1 +#define D_P04_ON() P04 = 1 +#define D_P03_ON() P03 = 1 +#define D_P02_ON() P02 = 1 +#define D_P01_ON() P01 = 1 +#define D_P00_ON() P00 = 1 +#define D_P07_OFF() P07 = 0 +#define D_P06_OFF() P06 = 0 +#define D_P05_OFF() P05 = 0 +#define D_P04_OFF() P04 = 0 +#define D_P03_OFF() P03 = 0 +#define D_P02_OFF() P02 = 0 +#define D_P01_OFF() P01 = 0 +#define D_P00_OFF() P00 = 0 +#define D_P07_AT() (P07) +#define D_P06_AT() (P06) +#define D_P05_AT() (P05) +#define D_P04_AT() (P04) +#define D_P03_AT() (P03) +#define D_P02_AT() (P02) +#define D_P01_AT() (P01) +#define D_P00_AT() (P00) +#define D_P07_REV() P07 = ~P07 +#define D_P06_REV() P06 = ~P06 +#define D_P05_REV() P05 = ~P05 +#define D_P04_REV() P04 = ~P04 +#define D_P03_REV() P03 = ~P03 +#define D_P02_REV() P02 = ~P02 +#define D_P01_REV() P01 = ~P01 +#define D_P00_REV() P00 = ~P00 + + +#define D_P17_ON() P17 = 1 +#define D_P16_ON() P16 = 1 +#define D_P15_ON() P15 = 1 +#define D_P14_ON() P14 = 1 +#define D_P13_ON() P13 = 1 +#define D_P12_ON() P12 = 1 +#define D_P11_ON() P11 = 1 +#define D_P10_ON() P10 = 1 +#define D_P17_OFF() P17 = 0 +#define D_P16_OFF() P16 = 0 +#define D_P15_OFF() P15 = 0 +#define D_P14_OFF() P14 = 0 +#define D_P13_OFF() P13 = 0 +#define D_P12_OFF() P12 = 0 +#define D_P11_OFF() P11 = 0 +#define D_P10_OFF() P10 = 0 +#define D_P17_AT() (P17) +#define D_P16_AT() (P16) +#define D_P15_AT() (P15) +#define D_P14_AT() (P14) +#define D_P13_AT() (P13) +#define D_P12_AT() (P12) +#define D_P11_AT() (P11) +#define D_P10_AT() (P10) +#define D_P17_REV() P17 = ~P17 +#define D_P16_REV() P16 = ~P16 +#define D_P15_REV() P15 = ~P15 +#define D_P14_REV() P14 = ~P14 +#define D_P13_REV() P13 = ~P13 +#define D_P12_REV() P12 = ~P12 +#define D_P11_REV() P11 = ~P11 +#define D_P10_REV() P10 = ~P10 + +#define D_P27_ON() P27 = 1 +#define D_P26_ON() P26 = 1 +#define D_P25_ON() P25 = 1 +#define D_P24_ON() P24 = 1 +#define D_P23_ON() P23 = 1 +#define D_P22_ON() P22 = 1 +#define D_P21_ON() P21 = 1 +#define D_P20_ON() P20 = 1 +#define D_P27_OFF() P27 = 0 +#define D_P26_OFF() P26 = 0 +#define D_P25_OFF() P25 = 0 +#define D_P24_OFF() P24 = 0 +#define D_P23_OFF() P23 = 0 +#define D_P22_OFF() P22 = 0 +#define D_P21_OFF() P21 = 0 +#define D_P20_OFF() P20 = 0 +#define D_P27_AT() (P27) +#define D_P26_AT() (P26) +#define D_P25_AT() (P25) +#define D_P24_AT() (P24) +#define D_P23_AT() (P23) +#define D_P22_AT() (P22) +#define D_P21_AT() (P21) +#define D_P20_AT() (P20) +#define D_P27_REV() P27 = ~P27 +#define D_P26_REV() P26 = ~P26 +#define D_P25_REV() P25 = ~P25 +#define D_P24_REV() P24 = ~P24 +#define D_P23_REV() P23 = ~P23 +#define D_P22_REV() P22 = ~P22 +#define D_P21_REV() P21 = ~P21 +#define D_P20_REV() P20 = ~P20 + + +#define D_P37_ON() P37 = 1 +#define D_P36_ON() P36 = 1 +#define D_P35_ON() P35 = 1 +#define D_P34_ON() P34 = 1 +#define D_P33_ON() P33 = 1 +#define D_P32_ON() P32 = 1 +#define D_P31_ON() P31 = 1 +#define D_P30_ON() P30 = 1 +#define D_P37_OFF() P37 = 0 +#define D_P36_OFF() P36 = 0 +#define D_P35_OFF() P35 = 0 +#define D_P34_OFF() P34 = 0 +#define D_P33_OFF() P33 = 0 +#define D_P32_OFF() P32 = 0 +#define D_P31_OFF() P31 = 0 +#define D_P30_OFF() P30 = 0 +#define D_P37_AT() (P37) +#define D_P36_AT() (P36) +#define D_P35_AT() (P35) +#define D_P34_AT() (P34) +#define D_P33_AT() (P33) +#define D_P32_AT() (P32) +#define D_P31_AT() (P31) +#define D_P30_AT() (P30) +#define D_P37_REV() P37 = ~P37 +#define D_P36_REV() P36 = ~P36 +#define D_P35_REV() P35 = ~P35 +#define D_P34_REV() P34 = ~P34 +#define D_P33_REV() P33 = ~P33 +#define D_P32_REV() P32 = ~P32 +#define D_P31_REV() P31 = ~P31 +#define D_P30_REV() P30 = ~P30 + + +#define D_P47_ON() P47 = 1 +#define D_P46_ON() P46 = 1 +#define D_P45_ON() P45 = 1 +#define D_P44_ON() P44 = 1 +#define D_P43_ON() P43 = 1 +#define D_P42_ON() P42 = 1 +#define D_P41_ON() P41 = 1 +#define D_P40_ON() P40 = 1 +#define D_P47_OFF() P47 = 0 +#define D_P46_OFF() P46 = 0 +#define D_P45_OFF() P45 = 0 +#define D_P44_OFF() P44 = 0 +#define D_P43_OFF() P43 = 0 +#define D_P42_OFF() P42 = 0 +#define D_P41_OFF() P41 = 0 +#define D_P40_OFF() P40 = 0 +#define D_P47_AT() (P47) +#define D_P46_AT() (P46) +#define D_P45_AT() (P45) +#define D_P44_AT() (P44) +#define D_P43_AT() (P43) +#define D_P42_AT() (P42) +#define D_P41_AT() (P41) +#define D_P40_AT() (P40) +#define D_P47_REV() P47 = ~P47 +#define D_P46_REV() P46 = ~P46 +#define D_P45_REV() P45 = ~P45 +#define D_P44_REV() P44 = ~P44 +#define D_P43_REV() P43 = ~P43 +#define D_P42_REV() P42 = ~P42 +#define D_P41_REV() P41 = ~P41 +#define D_P40_REV() P40 = ~P40 + +#define D_P57_ON() P57 = 1 +#define D_P56_ON() P56 = 1 +#define D_P55_ON() P55 = 1 +#define D_P54_ON() P54 = 1 +#define D_P53_ON() P53 = 1 +#define D_P52_ON() P52 = 1 +#define D_P51_ON() P51 = 1 +#define D_P50_ON() P50 = 1 +#define D_P57_OFF() P57 = 0 +#define D_P56_OFF() P56 = 0 +#define D_P55_OFF() P55 = 0 +#define D_P54_OFF() P54 = 0 +#define D_P53_OFF() P53 = 0 +#define D_P52_OFF() P52 = 0 +#define D_P51_OFF() P51 = 0 +#define D_P50_OFF() P50 = 0 +#define D_P57_AT() (P57) +#define D_P56_AT() (P56) +#define D_P55_AT() (P55) +#define D_P54_AT() (P54) +#define D_P53_AT() (P53) +#define D_P52_AT() (P52) +#define D_P51_AT() (P51) +#define D_P50_AT() (P50) +#define D_P57_REV() P57 = ~P57 +#define D_P56_REV() P56 = ~P56 +#define D_P55_REV() P55 = ~P55 +#define D_P54_REV() P54 = ~P54 +#define D_P53_REV() P53 = ~P53 +#define D_P52_REV() P52 = ~P52 +#define D_P51_REV() P51 = ~P51 +#define D_P50_REV() P50 = ~P50 + +#define D_P67_ON() P67 = 1 +#define D_P66_ON() P66 = 1 +#define D_P65_ON() P65 = 1 +#define D_P64_ON() P64 = 1 +#define D_P63_ON() P63 = 1 +#define D_P62_ON() P62 = 1 +#define D_P61_ON() P61 = 1 +#define D_P60_ON() P60 = 1 +#define D_P67_OFF() P67 = 0 +#define D_P66_OFF() P66 = 0 +#define D_P65_OFF() P65 = 0 +#define D_P64_OFF() P64 = 0 +#define D_P63_OFF() P63 = 0 +#define D_P62_OFF() P62 = 0 +#define D_P61_OFF() P61 = 0 +#define D_P60_OFF() P60 = 0 +#define D_P67_AT() (P67) +#define D_P66_AT() (P66) +#define D_P65_AT() (P65) +#define D_P64_AT() (P64) +#define D_P63_AT() (P63) +#define D_P62_AT() (P62) +#define D_P61_AT() (P61) +#define D_P60_AT() (P60) +#define D_P67_REV() P67 = ~P67 +#define D_P66_REV() P66 = ~P66 +#define D_P65_REV() P65 = ~P65 +#define D_P64_REV() P64 = ~P64 +#define D_P63_REV() P63 = ~P63 +#define D_P62_REV() P62 = ~P62 +#define D_P61_REV() P61 = ~P61 +#define D_P60_REV() P60 = ~P60 + +#define D_P77_ON() P77 = 1 +#define D_P76_ON() P76 = 1 +#define D_P75_ON() P75 = 1 +#define D_P74_ON() P74 = 1 +#define D_P73_ON() P73 = 1 +#define D_P72_ON() P72 = 1 +#define D_P71_ON() P71 = 1 +#define D_P70_ON() P70 = 1 +#define D_P77_OFF() P77 = 0 +#define D_P76_OFF() P76 = 0 +#define D_P75_OFF() P75 = 0 +#define D_P74_OFF() P74 = 0 +#define D_P73_OFF() P73 = 0 +#define D_P72_OFF() P72 = 0 +#define D_P71_OFF() P71 = 0 +#define D_P70_OFF() P70 = 0 +#define D_P77_AT() (P77) +#define D_P76_AT() (P76) +#define D_P75_AT() (P75) +#define D_P74_AT() (P74) +#define D_P73_AT() (P73) +#define D_P72_AT() (P72) +#define D_P71_AT() (P71) +#define D_P70_AT() (P70) +#define D_P77_REV() P77 = ~P77 +#define D_P76_REV() P76 = ~P76 +#define D_P75_REV() P75 = ~P75 +#define D_P74_REV() P74 = ~P74 +#define D_P73_REV() P73 = ~P73 +#define D_P72_REV() P72 = ~P72 +#define D_P71_REV() P71 = ~P71 +#define D_P70_REV() P70 = ~P70 + + + +#endif //__C51_MACRO_H_ + + + + + + + diff --git a/source/ctask/task.c b/source/ctask/task.c new file mode 100644 index 0000000..15e272c --- /dev/null +++ b/source/ctask/task.c @@ -0,0 +1,288 @@ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +*============================================================================ +****************************************************************************/ + +#include "task.h" +//: +// 1:һ +/// 0оƬ flash +/// 1оƬӦü save +/// 2Ӧü jilu_save +// +// 2:ڶ/flash/i2c/7290/ȸоƬ +// 3:/ͬоƬ/ +// + +void L1_task_init(TS_task *s) +{ +// s->en = 1; +// s->pfun = 0; + s->sh = 0; + s->sh_next= 0; +/// s->sh_pre= 0; + s->n= 0; +} + + +/////ʾtask ṹʹ ɾ +#define D_task_test_01 0x20 +#define D_task_test_02 0x22 +#define D_task_test_03 0x23 +#ifdef D_debug_task_test +////>>>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>> +struct _s_task_test_ s_task_test; +void L2_task_test_init(void) +{ +ddd + L1_task_init(&s_task_test.task); + L3_task_s_go(s_task_test,D_task_init); +} + + +///L2_task_test_handle(&s_task_test); +void L2_task_test_handle(struct _s_task_test_ *s) +{ + unsigned char d = 0; + TTSS_Task_init(); + L2_task_go(D_task_test_01); + TTSS_Task_step(D_task_test_01): + if(d > 8) + { + d = 0; + L2_task_go(D_task_test_02); + L1_task_Cdelay(D_Cdelay_200us); + }else + { + d ++; + } + TTSS_Task_step(D_task_test_02): + if(d > 4) + { + d = 0; + L2_task_go(D_task_test_01); + L1_task_Tdelay(D_Tdelay_100ms); + }else + { + d ++; + } + + TTSS_Task_end(); +} +#endif//#ifdef D_debug_task_test +////<<<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<< + +/////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ʾtask ṹʹ ɾ + + +//example : +#if 0 + + +//L2_task_voice_handle(&s_task_music.task); +//L1_task_go(D_task_close); +//if(L1_task_busy(s)){ L1_task_goout(s_task_music.task,D_task_voice_send_single) } +void L2_task_voice_handle(struct _s_task_music_ *s) +{ //s_task_music.task.sh + switch(s->task.sh) + { + + case D_task_voice_init:// + + s->sector = 0; + break; + case D_task_voice_cuimian : + s->sector = D_voice_music_wantsleep; + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1); + break; + case D_task_voice_cuimian1:// + L2_task_go(D_task_voice_cuimian2); + + break; + case D_task_voice_cuimian2:// + + if(0 == s->volume_change) + { + //L3_voice_stop(); + s->sector = D_voice_stop; + s->status = D_voice_status_stop; + //L2_task_go(D_task_voice_play); + L2_task_go_son(D_task_voice_play,0); + }else + { + s->volume_change --; + s->volume_temp = s->volume; + s->volume = s->volume_change*s->volume_shop/20;// + if (s->volume_temp != s->volume) + { + s->sector = D_voice_volume|s->volume; + //s->status = D_voice_status_stop; + //L2_task_go(D_task_voice_volume3); + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian2); + } + //else + { + L2_task_delay(D_task_delay_1m); + } + } + break; + + //>>>>>>>>>>>>>>>>>> son function + case D_task_voice_play:// + if(L3_task_s_busy(s_task_wt558d)) + { + }else + { + s_task_wt558d.reg = s_task_music.sector; + L3_task_s_go(s_task_wt558d,D_task_wt558d_fun); + + L2_task_go(D_task_voice_ask); + } + break; + case D_task_voice_ask:// + if(L3_task_s_busy(s_task_wt558d)) + { + + }else + { + + L2_task_go_father();//ص + } + break; + //<<<<<<<<<<<<<<<<<<<<<< son function + //-----------------------task standerd code + case D_task_Tdelay://---- + s->task.n--; + if (s->task.n == 0) + { + s->task.n = 0; + L2_task_delay_over(); + } + break; + + default : + break; + } + L2_task_wt558d_handle(&s_task_wt558d); +} + + +void L2_task_voice_handle(struct _s_task_music_ *s) +{ //s_task_music.task.sh + switch(s->task.sh) + { + + case D_task_voice_init:// + + s->sector = 0; + break; + case D_task_voice_cuimian : + s->sector = D_voice_music_wantsleep; + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1); + break; + case D_task_voice_cuimian1:// + L2_task_go(D_task_voice_cuimian2); + + break; + + //-----------------------task standerd code + case D_task_Tdelay://---- + s->task.n--; + if (s->task.n == 0) + { + s->task.n = 0; + L2_task_delay_over(); + } + break; + + default : + break; + } + L2_task_wt558d_handle(&s_task_wt558d); +} + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//>>>>>>>>>>>>>>>>>>>>>¼task +struct _s_task_4ChuShengRiQi_ +{ + TS_task task; + unsigned char pic_id;//ID + + +}; +extern struct _s_task_4ChuShengRiQi_ s_task_4ChuShengRiQi_; + +#define D_task_4ChuShengRiQi_init 0x10 +#define D_task_4ChuShengRiQi_key 0x11 + + +extern void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s); + +void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s) +{ + switch(s->task.sh) + { + + case D_task_4ChuShengRiQi_init:// + + s->pic_id= 0; + break; + case D_task_4ChuShengRiQi_key : + if(1 == s_task_keyx1.down ) + { + s_task_keyx1.down = 0; + + if(D_keyx_left == s_task_keyx1.key_value) + {} + + + }else if(1 == s_task_keyx_4.down) + { + s_task_keyx_4.down = 0; + + + } + else {} + + //L2_task_go_son(D_task_4ChuShengRiQi_play,D_task_4ChuShengRiQi_cuimian1); + break; + + L0_task_delay(); + } +} + + + +//<<<<<<<<<<<<<<<<<<<¼task + + + + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + + + + +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +*============================================================== +****************************************************************************/ + + + + + + +#endif + + diff --git a/source/ctask/task.h b/source/ctask/task.h new file mode 100644 index 0000000..5b08832 --- /dev/null +++ b/source/ctask/task.h @@ -0,0 +1,288 @@ +/******************************** +2013.7.23 add dictionary and task step by cc + +:task +:task step +־:sh ( struct handle) + +һsh_next +,sh_nextִִsh_pre + +***************************/ +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +*============================================================== + +20190217 and step01 Ұdelay_nű + + + +****************************************************************************/ + +#ifndef _TASK_H_ +#define _TASK_H_ +#include "../clib/type.h" +#include "../msp/time.h" +#include "task.h" +#include "tick.h" + +typedef struct +{ + vU32 n; +/// volatile UN_TYPE en; //ر,ҲΪͣ,ʹidelayĵطʱں̨ʱ˺ͣ,delay൱ͣ + volatile UN_TYPE sh; //ǰ + volatile UN_TYPE sh_next; //һ,һһһ,пмʱ +/// volatile UN_TYPE sh_pre; //ǰһ,һΪʹ +}TS_task; +//extern TS_task ts_task_stcadc; +#define D_task_close 0 + +#define D_task_Tdelay 0x01 +#define D_task_stop 0x04 +#define D_task_Cdelay 0x09 +#define D_task_init 0x10 +#define D_task_quit 0xf0 + +#define TTS_for_add(i,start,len) for((i) = (start); (i) < (len); (i) ++){ +#define TTS_for_add_end() } + + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ڲ s->task +#define L2_task_delay_over() s->task.sh = s->task.sh_next +#define L2_task_go(next) s->task.sh = next +#define L2_task_en(onf) s->task.en = onf + +#define L2_task_busy(s) (D_task_close != s.task.sh) +#define L2_task_free(s) (D_task_close == s.task.sh) + +#define L2_task_go_father() s->task.sh = s->task.sh_pre +#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre + + +//>task ʱ>>>>>>>>>>>>>>TTSS +/// D_task_Tdelay == task timer delay ҪиʱԪ time0ʱ +/// Delay_cycle ʱ̵,һѭȡѭʱ,Tdelay,Cdelayʱʱ +#define L2_task_switch_default_idelay(); \ + case D_task_Tdelay:\ + if (s_nos_tick.t_10ms >= s->task.n)\ + {\ + L2_task_delay_over();\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; +#if 0 + +#define L2_task_switch_default_idelay2(); \ + case D_task_Tdelay:\ + if (s_nos_tick.t_10ms >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart(D_TBH_ch0,3,'i');\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + + +//ڵȴĹüʱ,ʱfunxx +//ڵȴĿʱԶʱʾһЩϢ +//ִ + +#define L2_task_switch_fun_idelay(invent,ch) L2_task_switch_default_idelay() +#define L2_task_switch_fun_idelay0000(chhh,invent,funxx); \ + case D_task_Tdelay:\ + if (s_nos_tick.t_10ms >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart_fun(chhh,invent,funxx);\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + + + +//ڵȴĹüʱ,ʱʾַch +//ڵȴĿʱԶʱʾһЩϢch +// ͨchĿǰеĽ׶κϢ +#define L2_task_switch_flag_idelay(invent,ch) L2_task_switch_default_idelay() +#define L2_task_switch_flag_idelay000(invent,ch); \ + case D_task_Tdelay:\ + if (s_nos_tick.t_10ms >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart(D_TBH_ch0,invent,ch);\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + +TTSS_Task_init, Highlight +TTSS_Task_step, Highlight +TTSS_Task_end, Highlight +L2_task_go, Highlight +L1_task_Tdelay, Highlight +L1_task_Cdelay, Highlight +L2_task_go, Highlight + + + + +#endif + + +//if(delay_n+s_time0.t_10ms > 655340) +//{s_time0.t_10ms = 0;} + +//fix 201312 ֹs_time0.t_10ms +// з +//>>L2_task_delayһҪL2_task_go֮ +#define L1_task_Tdelay(delay_n) s->task.sh_next = s->task.sh;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + s_nos_tick.t_10ms; + + +//>>L2_task_delayһҪL2_task_go֮ +#define L1_task_Cdelay(delay_n) s->task.sh_next = s->task.sh;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ڲ s->task + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ⲿ +#define L2_task_s_go_son(s,fun,pre) (s).task.sh = fun;(s).task.sh_pre = pre; + +#define L3_task_s_time_start(s,delay) (s).task.n = delay+s_nos_tick.t_1s; +#define L3_task_s_go(s,next) (s).task.sh = next; +#define L3_task_s_en(s,onf) (s).task.en = onf; +//L1_task_goout(s_task_music.task,D_task_close); + +#define L3_task_s_busy(s) (D_task_close != (s).task.sh) +#define L3_task_s_free(s) (D_task_close == (s).task.sh) + +#define L3_task_s_step(s) ((s).task.sh) + + +#define D_task_uc unsigned char +#define D_task_ui unsigned int +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define TTSS_Task_init() switch(s->task.sh){\ + case D_task_init + +#define TTSS_Task_step(step) break;\ + case (step) +#define TTSS_step01(step) break;case (step) +#define TTSS_step02(step) break;case (step) +#define TTSS_step03(step) break;case (step) +#define TTSS_step04(step) break;case (step) +#define TTSS_step05(step) break;case (step) +#define TTSS_step06(step) break;case (step) +#define TTSS_step07(step) break;case (step) +#define TTSS_step08(step) break;case (step) +#define TTSS_step09(step) break;case (step) +#define TTSS_step10(step) break;case (step) +#define TTSS_step11(step) break;case (step) +#define TTSS_step12(step) break;case (step) + + + + + + + +#define TTSS_Task_end(); break;\ + L2_task_switch_default_idelay();} + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L1_task_init(TS_task *s); + + + +////>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>>>> + +#ifdef D_debug_task_test + +struct _s_task_test_ +{ + TS_task task; +}; +extern struct _s_task_test_ s_task_test; +extern void L2_task_test_handle(struct _s_task_test_ *s); +extern void L2_task_test_init(void); +#else + +#define L2_task_test_handle(x); +#define L2_task_test_init(); + +#endif//#ifdef D_debug_task_test + +////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<< + + + + + + + + +#endif//_TASK_H_ +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +*============================================================== +****************************************************************************/ + + + diff --git a/source/ctask/tick.c b/source/ctask/tick.c new file mode 100644 index 0000000..0d3d01d --- /dev/null +++ b/source/ctask/tick.c @@ -0,0 +1,133 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2017,SensorControl + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename tick.h tick.c + 2019.03.11 ver 1.30 ʱʱΪ25ms ڽܸŵ +****************************************************************************************/ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +*============================================================================ +****************************************************************************/ + +#include "tick.h" + + +struct _s_nos_tick_ s_nos_tick; + + + +#ifdef D_use_tick_fum +void L1_tick_init(void) +{ + s_nos_tick.tp_count = 0; + + s_nos_tick.n_stamp = 0; + s_nos_tick.t1s_heatbeart= 0; + /***** + s_nos_tick.t1s_flag[0] = 0; + s_nos_tick.t1s_flag[1] = 0; + s_nos_tick.t1s_flag[2] = 0; + s_nos_tick.t1s_flag[3] = 0; + s_nos_tick.t1s_flag[4] = 0; + s_nos_tick.t1s_flag[5] = 0; + if(L2_tick_time_interval(n_stamp,7*D_Tdelay_1s)) + {// ʱ + + + L2_tick_time_stamp(s->t_stamp); + + + ********/ + + s_nos_tick.t_10ms = 0; + s_nos_tick.t_1s = 0; + +/// s_nos_tick.flag_1s = 0; + +/// s_nos_tick.t_n = 0; + //s_nos_tick.tmp = 0; + //L0_timer0_ONF(1); +} + +/// ʱ 10ms һж +/// ʱ 25ms һж +void L1_tick_tick (void) +{ /// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms + ///൱1.39t_10ms ڵعϵͳ ȫ + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000/ + s_nos_tick.tp_count++; + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 ֤ + if(s_nos_tick.t_10ms%D_TIMER0_1S_COUNT == 0) + {// 65535*65535/24/60/60/356/10 =12.7 + s_nos_tick.t_1s ++;//// 65535*65535/24/60/60/356/10 =12.7 + s_nos_tick.flag_1s2 = 1; + s_nos_tick.t1s_heatbeart = 1; + } +//<<<<<<<<<<<<<<<<<<<<<< +} +#else + +#endif + +#if 0 +void L1_tick_tick (void) +{ + s_nos_tick.t_n++; + if (s_nos_tick.t_n >= D_TIMER0_10MS_COUNT)// 5500--- 100 10s--556 + /// s 5ms 65535*65535 /3600/24/365=139nian/s + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000/ + // fixme:˴ һbug:) + { + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 ֤ + if(s_nos_tick.t_10ms%D_TIMER0_1S_COUNT == 0) + {// 65535*65535/24/60/60/356/10 =12.7 + s_nos_tick.t_1s ++;// + + // led_red =~led_red; + //s_nos_tick.t1s_flag[0] = 1; + //s_nos_tick.t1s_flag[1] = 1; + //s_nos_tick.t1s_flag[2] = 1; + //s_nos_tick.t1s_flag[3] = 1; + //s_nos_tick.t1s_flag[4] = 1; + //s_nos_tick.t1s_flag[5] = 1; + s_nos_tick.flag_1s = 1; + s_nos_tick.t1s_heatbeart = 1; + } + s_nos_tick.t_n = 0; + } + /******************* +// 0.2mm 4/0.2 = 20 20/60s = 333ms/maicong +// 0.2mm 60s 60 100 ms +// 0.2 6000ms +// ƽʱΪ1 ˮһΪ0 +// rain = 1;Ҫijʼ + if(0 == rain) + { + if(1 == s_rain.temp) + {// ````\___ + s_rain.pool = s_rain.t; + s_rain.all ++; + s_rain.t = 0; + } + s_rain.temp = 0; + }else + { + s_rain.temp = 1; + } + s_rain.t ++; + + ******/ +//<<<<<<<<<<<<<<<<<<<<<< +} + + +#endif + diff --git a/source/ctask/tick.h b/source/ctask/tick.h new file mode 100644 index 0000000..dafeb42 --- /dev/null +++ b/source/ctask/tick.h @@ -0,0 +1,210 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2017,SensorControl + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename tick.h tick.c +******************************************************************************/ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +*============================================================================ +****************************************************************************/ +#ifndef __tick_H +#define __tick_H +#include "../clib/Type.h" +//#include "../bsp/type_hs.h" +#include "../msp/time.h" +#define D_use_tick_fum + + +struct _s_nos_tick_ +{ + vU32 tp_count; //һνʱ䵽Ŀǰtick +/// vU32 sys_clock; +// vU32 t_n; // noosϵͳʱСԪ + vU32 t_10ms; // noos ϵͳʱ10m +#ifdef D_use_tick_fum + + + //volatile INT32U t_100ms; + vU32 t_1s; +/// vU32 t_10s; +// vU32 t_60s; + vU8 flag_1s; + vU8 flag_1s2; +/// volatile INT32U tmp; +/// volatile INT32U time_left; +/// volatile INT32U h; +/// volatile INT32U m; + vU32 n_stamp; +// vU32 t1s_flag[6]; //fixme: INT32U ݲͬϵͳ + //volatile unsigned char t1s_flag; +/// vU8 ts_flag; + vU32 n_stamp3; +#endif + vU8 t1s_heatbeart; //noos ϵͳʱʱ̱־,Ҫ +}; +extern struct _s_nos_tick_ s_nos_tick; + +#ifdef D_timer0_10ms +//10ms ʹã10msСʱ޷ʹ +#define D_Tdelay_ms D_TIMER0_10MS_COUNT//D_TIMER0_10MS_COUNT +#define D_Tdelay_10ms 2 +#define D_Tdelay_20ms (2+D_Tdelay_ms) +#define D_Tdelay_30ms (3+D_Tdelay_ms) +#define D_Tdelay_40ms (4+D_Tdelay_ms) +#define D_Tdelay_50ms (5+D_Tdelay_ms) +#define D_Tdelay_60ms (6+D_Tdelay_ms) + +#define D_Tdelay_80ms (8+D_Tdelay_ms) + + +#define D_Tdelay_100ms (10+D_Tdelay_ms) + +#else +//10ms ʹã10msСʱ޷ʹ +#define D_Tdelay_ms D_TIMER0_10MS_COUNT//D_TIMER0_10MS_COUNT +#define D_Tdelay_10ms 1 +#define D_Tdelay_20ms (0+D_Tdelay_ms) +#define D_Tdelay_30ms (0+D_Tdelay_ms) +#define D_Tdelay_40ms (2+D_Tdelay_ms) +#define D_Tdelay_50ms (2+D_Tdelay_ms) +#define D_Tdelay_60ms (2+D_Tdelay_ms) + +#define D_Tdelay_80ms (3+D_Tdelay_ms) + +#define D_Tdelay_100ms (4+D_Tdelay_ms) + +#endif + + +#define D_Tdelay_200ms (D_Tdelay_100ms*2) +#define D_Tdelay_300ms (D_Tdelay_100ms*3) +#define D_Tdelay_400ms (D_Tdelay_100ms*4) +#define D_Tdelay_500ms (D_Tdelay_100ms*5) + +#define D_Tdelay_600ms (D_Tdelay_100ms*6) +#define D_Tdelay_700ms (D_Tdelay_100ms*7) +#define D_Tdelay_800ms (D_Tdelay_100ms*8) +#define D_Tdelay_900ms (D_Tdelay_100ms*9) + + +#define D_Tdelay_1s (D_Tdelay_100ms*10) +#define D_Tdelay_1s2 (D_Tdelay_100ms*12) +#define D_Tdelay_1s5 (D_Tdelay_100ms*15) +#define D_Tdelay_2s (D_Tdelay_100ms*20) +#define D_Tdelay_2s5 (D_Tdelay_100ms*25) +#define D_Tdelay_3s (D_Tdelay_100ms*30) +#define D_Tdelay_5s (D_Tdelay_100ms*50) +#define D_Tdelay_8s (D_Tdelay_100ms*80) +#define D_Tdelay_9s (D_Tdelay_100ms*90) +#define D_Tdelay_10s (D_Tdelay_100ms*100) + +#define D_Tdelay_1min (D_Tdelay_1s*60) +#define D_Tdelay_1h (D_Tdelay_1min*60) +#define D_Tdelay_1day (D_Tdelay_1h*24) +#define D_TIMER0_1S_COUNT 100 +//#define D_10mS 1//D_TIMER0_10MS_COUNT +//#define D_100mS (D_10mS*10) +//#define D_1S (D_10mS*100) + + + + +//>> ʱ: ʼ ʱ䵽 +// L0_nos_tick10ms_start(s->times); ʼʼs->times 10msΪһλ +// if( L0_nos_tick10ms_interval(s->times) < 20)// s->times ִ20κ,Ҳ ʱ20*10m + + +// +#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_10ms +#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_10ms - start_n) + + + +#define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s +#define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) + + + +//>>>// +#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_10ms; +#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_10ms - time_stamp) > time_overflow) + + +#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) +#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); + + +//>>>ʾ: +#if 0 +{ + case D_task_init:// + Lc_print_buf(" \r\n YL_ init"); + s->step = D_AT; + L0_esp_open(); + L2_task_go(D_task_YL_ready); + s_uart0_rec.ok = 0; + L2_tick_time_stamp(s->t_stamp); + // L1_task_Tdelay(1*D_Tdelay_1s); //Լ6s + break; + case D_task_YL_ready: + if(1 == s_uart0_rec.ok) + { + if(strstr(s_uart0_rec.array,"ready") != NULL) + { + + Ldi_print("ready..\r\n"); + s->step = D_AT; + L2_task_go(D_task_YL_ask); + } + s_uart0_rec.ok = 0; + } + if(L2_tick_time_stamp(s->t_stamp,1*D_Tdelay_1s)) + {// ʱ + L0_esp_close(); + Ldi_print("fail esp restart.\r\n"); + L2_task_go(D_task_init); + L1_task_Tdelay(2*D_Tdelay_1s); + } + break; +} +#endif + +// t_10ms ,t_10msΪ1ʱΪ(D_TIMER0_10MS_COUNT*ʱ) +/// #define D_TIMER0_10MS_COUNT 1 //ʱΪ 10msһж +#ifdef D_use_tick_fum +extern void L1_tick_init(void); +extern void L1_tick_tick (void); + +#else + + +#define L1_tick_init() +#define L1_tick_tick() s_nos_tick.t_10ms ++; + +#endif + + + +//L2_time_beat_heart(D_TBH_ch1,2,'t') +#define D_TBH_ch0 0 +#define D_TBH_ch1 1 +#define D_TBH_ch2 2 +#define D_TBH_ch3 3 +#define D_TBH_ch4 4 +#define D_TBH_ch5 5 +extern void L2_time_beat_heart(vU32 ch,U8 invent,U8 s); +//void L2_time_beat_heart_fun(INT32U ch,unsigned char invent,void *fun(void)); +extern void L2_time_beat_heart_fun(vU32 ch,U8 invent,void (*fun)(void)); + +#endif /* end __tick_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/msp/UART0.C b/source/msp/UART0.C new file mode 100644 index 0000000..94f1962 --- /dev/null +++ b/source/msp/UART0.C @@ -0,0 +1,448 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: + +/***************************************************************************** +update by cc @201800400 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uart0.h" +//#include "uart2.h" +//#include "uart3.h" +//#include "uart4.h" + #include + #include "../ctask/tick.h" + #include "../app/common.h" + #include "../msp/time.h" + +// TS_Handle_PH1 volatile s_uart0_rec; +// TS_Handle_PH1A volatile s_uart0_rec; +TS_Handle_PH4 volatile s_uart0_rec; + +///struct _s_uart0_send_buf_ ts_uart_send_shop; +//struct _s_uart0_send_buf_ ts_uart_send_depot; +volatile Ts_uart_send_buf ts_uart_send_shop; +////volatile Ts_uart_send_buf ts_uart_send_depot; + +#if(MainFre_5M == D_sys_MainFre) + void L0_uart0_init32K_290BPS(void) //290bps@32kHz + {//定时器2 16位重载 作为串口波特率 + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + BITN_1(AUXR, BITN5);// f/2 + T2L = 0xFE; //设定定时初值 + T2H = 0xFF; //设定定时初值 /// 32K 280---290BPS + AUXR |= 0x10; //启动定时器2 + } + + +#elif(MainFre_27M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) + #if(BRT_115200 == D_uart0_BRT) + void L0_uart0_init(void) //115200bps@22.1184MHz + {//定时器2 16位重载 作为串口波特率 + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T + T2L = 0xFC; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + } + + #elif(BRT_4800 == D_uart0_BRT) + void L0_Uart0_Init(void) //4800bps@22.1184MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR |= 0x04; //定时器2时钟为Fosc,即1T + T2L = 0x80; //设定定时初值 + T2H = 0xFB; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + } + #elif(BRT_SIM == D_uart0_BRT) + void L0_uart0_init(void) + { + SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ + TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ + TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */ + TR1 = 1; /* TR1: timer 1 run */ + TI = 1; /* TI: set TI to send first char of UART */ + EA = 1; + AUXR = 0x40; + // TI = 0; + RI = 0; + D_uart0_ES_INT(1); //打开串口中断 + } + #endif + +#else ///MainFre_11M + + #if(BRT_115200 == D_uart0_BRT && SBIT_1 == D_uart0_SBIT) + void L0_uart0_init(void) //115200bps@11.0592MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T + T2L = 0xFE; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + } + #elif(BRT_19200 == D_uart0_BRT && SBIT_1 == D_uart0_SBIT) + void L0_uart0_init(void) //19200@11.0592MHz + { + xxxx + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR |= 0x04; //定时器2时钟为Fosc,即1T + T2L = 0x70; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + } + #elif(BRT_19200 == D_uart0_BRT && SBIT_2 == D_uart0_SBIT) + void L0_uart0_init(void) //19200@11.0592MHz + { + //使用第9位数据模拟1个停止位,可变波特率;SM2=0, TB8=1(第9bit总为1模拟1个停止位) + SCON = 0xD8; + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR |= 0x04; //定时器2时钟为Fosc,即1T + T2L = 0x70; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + } + #elif (BRT_9600 == D_uart0_BRT) + void L0_uart0_init(void) //9600bps@11.0592MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T + T2L = 0xE8; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + } + #endif +#endif//D_sys_MainFre) +void L1_uart0_buf_init(void) +{ +/// ts_uart_send_depot.p = ts_uart_send_depot.buf; + ts_uart_send_shop.now = 0; + s_uart0_rec.head = 0; + s_uart0_rec.ok = 0; + s_uart0_rec.num = 0; +// L1_s2b_PH4_init(&s_uart0_rec,G.p.slaver_id); +// s_uart0_rec.sp = s_uart0_rec.buf; +// s_uart0_rec.cmd = 0; +// head_0 = D_CMD_Filter1_ff; +// s_uart0_rec.head_1 = D_CMD_Filter2_fe; +// s_uart0_rec.sp = (U8*)&(s_uart0_rec.ts_ccmodbus); + + L0_uart0_init(); + +// L0_uart0_init(); + BITN_0(P3M1,BITN1);BITN_1(P3M0,BITN1);/// p31 01 tuiwan + + ts_uart_send_shop.ok = D_ready; + + D_uart0_ES_INT(1); //打开串口中断 + +} +//115200 0.1ms /Byte 115200/4800=23 0.1*23=2.3ms +/// 4800 uartb波形 2.1ms 一个数据 b8s 共10bits 1000ms 发送480个Bytes 大约就是2.1ms 一个数据 + +//// ````\_b_|___________________________/``s`|```2.1ms 0x00 sscom 测试 + +//// s 1 1 1 1 1 1 1 0 b11111111s + +//// ````\_b_/```````````````````````````|``s`|```200us 0xff + +//// ````\_b_|__/```\__/```\__/```\__/```|``s`|```1.9ms`\0xaa +//// b 1 0 1 0 1 0 1 0 b10101010s + +//// +//// ````\_b_|__/```\__/```\__/```\__/```|``s`|```1.9ms`\0xaa +//// b 1 0 1 0 1 0 1 0 b10101010s + +/// 1.9ms`\0xaa 0xaa 0xaa +//// ````\_b_|__/```\__/```\__/```\__/```|``s`|\_b_|__/```\__/```\__/```\__/```|``s`|\_b_|__/```\__/```\__/```\__/```|``s`| +//// b 1 0 1 0 1 0 1 0 s b 1 0 1 0 1 0 1 0 s b 1 0 1 0 1 0 1 0 s + + +//// ````\_200us_/`````0xff +//// ````\_200us_/`````0xff +void L0_uart0_uc(U8 ww) +{ + L0_uart0_sendArray(&ww,1); +} +extern void L2_waitFree_uart0(void); + + +#define D_waitFree_uart0() L2_waitFree_uart0() + + +/********* +while(ts_uart_send_shop.ok != D_ready)\ + {\ + if(ts_uart_send_shop.over ++ > 600000)\ + {\ + break;\ + }\ + }\ +*********************/ +void L0_uart0_us(vU32 ww) +{ + U_U16 uStemp; + uStemp.word = ww; + L0_uart0_uc(uStemp.BYTE2.h); + L0_uart0_uc(uStemp.BYTE2.l); +} +void L0_uart0_ul(vU32 ww) +{ + L0_uart0_uc(ww >> 24 & 0xFF); + L0_uart0_uc(ww >> 16 & 0xFF); + L0_uart0_uc(ww >> 8 & 0xFF); + L0_uart0_uc(ww >> 0 & 0xFF); +} +void L0_uart0_uchex(U8 ww) +{ + D_waitFree_uart0(); + ts_uart_send_shop.buf3[0] = cguHex2Char[D_uc_high(ww)][1]; + ts_uart_send_shop.buf3[1] = cguHex2Char[D_uc_low(ww)][1]; + L0_uart0_sendArray(ts_uart_send_shop.buf3,2); +} + +// void L0_uart0_ushex(U16 ww) +// { +// L0_uart0_uchex(ww >> 8 & 0xFF); +// L0_uart0_uchex(ww >> 0 & 0xFF); +// } + +void L0_uart0_ulhex(U32 ww) +{ + L0_uart0_uchex(ww >> 24 & 0xFF); + L0_uart0_uchex(ww >> 16 & 0xFF); + L0_uart0_uchex(ww >> 8 & 0xFF); + L0_uart0_uchex(ww >> 0 & 0xFF); +} + +void L0_uart0_uldec(U32 ww) +{ + L0_uart0_uc(ww / 1000000 % 10 + '0'); + L0_uart0_uc(ww / 100000 % 10 + '0'); + L0_uart0_uc(ww / 10000 % 10 + '0'); + L0_uart0_uc(ww / 1000 % 10 + '0'); + L0_uart0_uc(ww / 100 % 10 + '0'); + L0_uart0_uc(ww / 10 % 10 + '0'); + L0_uart0_uc(ww / 1 % 10 + '0'); +} + +/********** +void L0_uart0_uc_debug(U8 ww) +{ + L0_uart0_sendArray(&ww,1); + while(0 != ts_uart_send_shop.now){} +} + +void L0_uart0_ushex(vU16 ww,U8 hex) +{ + U8 buf3[4]; + U_F16 k; + k.us = ww; + if(16 == hex ) + { + buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; + buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1]; + buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; + buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1]; + L0_uart0_sendArray(buf3,4); + + }else if(2 == hex) + { + buf3[0] = (k.BYTE2.H); + buf3[1] = (k.BYTE2.L); + L0_uart0_sendArray(buf3,2); + }else + { + + buf3[0] = 0x55; + buf3[1] = 0x66; + + L0_uart0_sendArray(buf3,2); + + } +} +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + +void L0_uart0_ushex(vU16 ww,U8 hex) +{ + U_F16 k; + k.us = ww; + D_waitFree_uart0(); + if(16 == hex ) + { + ts_uart_send_shop.buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; + ts_uart_send_shop.buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1]; + ts_uart_send_shop.buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; + ts_uart_send_shop.buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1]; + L0_uart0_sendArray(ts_uart_send_shop.buf3,4); + + } + + + /**************** + else if(2 == hex) + { + ts_uart_send_shop.buf3[0] = (k.BYTE2.H); + ts_uart_send_shop.buf3[1] = (k.BYTE2.L); + L0_uart0_sendArray(ts_uart_send_shop.buf3,2); + }else + { + ts_uart_send_shop.buf3[0] = 0x55; + ts_uart_send_shop.buf3[1] = 0x66; + L0_uart0_sendArray(ts_uart_send_shop.buf3,2); + } + + */ +} +void L2_waitFree_uart0(void) +{ + while(ts_uart_send_shop.ok != D_ready) + { + if(ts_uart_send_shop.over ++ > 600000) + { + break; + } + } +} + +void L0_uart0_sendArray(U8 *buf,U16 len) +{ + //D_485_TX(); //切换到输出状态 + + D_waitFree_uart0(); // P31 = 1; + ts_uart_send_shop.over = 0; + ts_uart_send_shop.p = buf; + ts_uart_send_shop.max = len; + ts_uart_send_shop.now = 1; + ts_uart_send_shop.ok = D_clear; + L0_uart0_set(ts_uart_send_shop.p[0]); +} + + +/************************************************* +UART 中断 +*************************************************/ +void INTERRUPT_UART(void) interrupt D_SERVE_UART// using 2 +{ + NOP(); NOP(); NOP(); + if(L0_uart0_IntRI()) //如果是U0接收中断 + { + L0_uart0_IntRIClear(); //清除接收中断标志 + //s_nos_tick.tp_count = 0; + L0_timer1_reset(); + s_uart0_rec.reg = L0_uart0_get(); + L1_s2b_PH4(&s_uart0_rec); + } + if(L0_uart0_IntTI()) //如果是U0发送中断 + { + L0_uart0_IntTIClear(); //清除发送中断标志 + if(ts_uart_send_shop.max != ts_uart_send_shop.now) + { + L0_uart0_set(ts_uart_send_shop.p[ts_uart_send_shop.now]); + ts_uart_send_shop.now ++; + } + else + { + ts_uart_send_shop.ok = D_ready; + ts_uart_send_shop.max = 0; + ts_uart_send_shop.now = 0;//可以发送下一个数据 + // P31 = 0; + //切换到接收状态 + //D_485_RX(); + } + } + else + { + //其他中断 + } + NOP(); NOP(); NOP(); +} + +#if 1 +void timer1_isrHanddle (void) interrupt D_ISR_timer1 +{// + TF1 = 0; + //s_nos_tick.uart0_free = 1; + if(s_uart0_rec.head == 1) //收到一条协议 + { + s_uart0_rec.head = 0; + P10 ^= 1; + if(s_uart0_rec.ok == 0) + { + s_uart0_rec.ok = 1; + //Lc_buf_copy_uc(); + } + } +} + +#else + +void timer1_isrHanddle (void) interrupt D_ISR_timer1 +{// + TF1 = 0; + //s_nos_tick.uart0_free = 1; + if(s_uart0_rec.head == 1) //收到一条协议 + { + s_uart0_rec.head = 0; + s_uart0_rec.ok = 1; + L3_task_uart0_modbus_handler(&s_uart0_rec); + } +} + + + +#endif + + + + diff --git a/source/msp/UART0.h b/source/msp/UART0.h new file mode 100644 index 0000000..3df7585 --- /dev/null +++ b/source/msp/UART0.h @@ -0,0 +1,152 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: cc +/// Modified date: 20190222 +/// Version: +/// Descriptions: 中断的now和max调整类型 可以支持int型的数据一次发送,前提是指向已有的数组 +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart0_H +#define _uart0_H +#include "../bsp/bsp_config.h" +#include "../clib/type.h" +//#include "../debug/debug_drv.h" +//#include "../uartcom/urec2protocol.h" +//?include "../uartcom/uprotocol2app.h" +#include "../tpc/tpc_modbus.h" +#define Ldi_print(x) Lc_print_buf(x) +//#include "../uartcom/UProtocol.h" +#include "../ctask/task.h" +#include "../clib/Clib.h" + + +//extern struct _s_uart_rec_ s_uart0_rec; +// extern TS_Handle_PH1 volatile s_uart0_rec; +//extern TS_Handle_PH1A volatile s_uart0_rec; +extern TS_Handle_PH4 s_uart0_rec; + + +///#define D_s_uart0_rec_close(); s_uart0_rec.ok = 2;// 关闭串口协议解析 +///#define D_s_uart0_rec_open(); s_uart0_rec.ok = 0;// 关闭串口协议解析 +#define D_uart0_free() (0 == ts_uart_send_shop.max) +#define D_uart0_busy() (0 != ts_uart_send_shop.max) + + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +////fixme:和cpu的程序容量息息相关 +#define D_send_buf_max 8 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms + /// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms + /// 128Bytes = 128*0.5ms = 64ms + +#define D_send_buf2_max 6 + +typedef struct _ts_uart0_send_buf_ +{//8byte + U8 num; //接收到的数目注意数据长度的范围 + U8 *p; + vU16 now; /// 当前buf所在的位置 0------(max-1) + vU16 max; /// 当前buf的最大值,也就是需要发送的长度 + vU16 over; /// 当前buf的最大值,也就是需要发送的长度 + U8 ok; /// 当前buf的最大值,也就是需要发送的长度 + U8 buf[D_send_buf_max]; +/// U8 buf2[D_send_buf2_max]; + U8 buf3[D_send_buf2_max]; +//// U8 buf4[D_send_buf_max]; + /// U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度 +}Ts_uart_send_buf; + + +extern volatile Ts_uart_send_buf ts_uart_send_shop; +///extern volatile Ts_uart_send_buf ts_uart_send_depot; + + +#define D_uart0_ES_INT(x) ES = (x) + + +#define L0_uart0_IntRI() (RI)//BITN_G(SCON,U0RI) +#define L0_uart0_IntTI() (TI)//BITN_G(SCON,U0TI) +#define L0_uart0_IntRIClear(); RI = 0;//BITN_0(SCON,U0RI) +#define L0_uart0_IntTIClear(); TI = 0;//BITN_0(SCON,U0TI) +#define L0_uart0_set(x) SBUF = (x); +#define L0_uart0_get() (SBUF) +//#define D_send_us(x) gRccUs01 = x;L0_uart0_uc(gRccUs01_H);L0_uart0_uc(gRccUs01_L); + +#define D_send_ushex(x) L0_uart0_ushex(x,16);///Lc_delay_ms(2);//gRccUs01 = x;L0_uart0_uchex(gRccUs01_H);L0_uart0_uchex(gRccUs01_L); +#define D_uart0_send_over() (D_ready == ts_uart_send_shop.ok) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L1_uart0_buf_init(void); + +extern void L0_uart0_init(void); +extern void L0_uart0_init32K_290BPS(void); + +extern void L0_Uart0_Init4800(void) ; + +extern void L0_uart0_uchex(U8 ww); + +extern void L0_uart0_ulhex(vU32 ww); + +extern void L0_uart0_ul(vU32 ww); +extern void L0_uart0_sendstr(U8 *str); +extern void L0_uart0_0d0a(void); +extern void L0_uart0_uc(U8 ww); +extern void L0_uart0_uc_debug(U8 ww); +extern void L0_uart0_us(vU32 ww); +extern void L0_uart0_ushex(vU16 ww,U8 hex); +extern void L0_uart0_uldec(U32 ww); + +/////////////////////////////////////////////////////////////// +extern void L0_uart0_sendArray(U8 *buf,U16 len); +extern void L0_uart0_sendbuf(void); +///extern void L0_uart0_sendArraylong(U8 *buf,U16 usStart,U16 usEnd); + +#endif //#ifndef _uart0_H + + diff --git a/source/msp/msp_eeprom.c b/source/msp/msp_eeprom.c new file mode 100644 index 0000000..4af41b6 --- /dev/null +++ b/source/msp/msp_eeprom.c @@ -0,0 +1,170 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file msp_eeprom.c +/// @brief msp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20190106 +/// @note cc_AS_stc02 由stc-isp v6.0860 +////////////////////////////////////////////////////////////////////////////// +#include "msp_eeprom.h" + +#include "../tpc/tpc_uart.h" + + +#define WT_30M 0x80 +#define WT_24M 0x81 +#define WT_20M 0x82 +#define WT_12M 0x83 +#define WT_6M 0x84 +#define WT_3M 0x85 +#define WT_2M 0x86 +#define WT_1M 0x87 + + +U_F16 uf_ee_add; + + +void L0_Iap_Idle() +{ + IAP_CONTR = 0; //关闭IAP功能 + IAP_CMD = 0; //清除命令寄存器 + IAP_TRIG = 0; //清除触发寄存器 + IAP_ADDRH = 0x80; //将地址设置到非IAP区域 + IAP_ADDRL = 0; +} + +char L0_Iap_Read(vU16 addr) +{ + char dat; + + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 1; //设置IAP读命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + dat = IAP_DATA; //读IAP数据 + L0_Iap_Idle(); //关闭IAP功能 + + return dat; +} + +void L0_Iap_Program(vU16 addr, char dat) +{ + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 2; //设置IAP写命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_DATA = dat; //写IAP数据 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + L0_Iap_Idle(); //关闭IAP功能 +} + +///每个扇区512字节 +///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 +void L0_Iap_Erase(vU16 addr) +{ + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 3; //设置IAP擦除命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); // + L0_Iap_Idle(); //关闭IAP功能 +} + +void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) +{ + U8 i = 0; + for(i=0;i>8 & 0xFF); + L0_uart0_uchex(i>>0 & 0xFF); + } + } +#endif + Lc_delay_ms(100); + L0_uart0_uc('%'); + + while(1); +} +#endif + + + diff --git a/source/msp/msp_eeprom.h b/source/msp/msp_eeprom.h new file mode 100644 index 0000000..61a56e2 --- /dev/null +++ b/source/msp/msp_eeprom.h @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file msp_eeprom +/// @brief msp_eeprom +/// @info +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20190106 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_eeprom_H_ +#define _msp_eeprom_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../cpu/stc_stc8a8k.h" +#include "../cpu/c51_macro.h" +#include "../bsp/bsp_config.h" + + +#include "uart0.h" + +extern void L3_eeprom_fun(U8 *pPara); + +///每个扇区512字节 +extern void L0_Iap_Erase(vU16 addr); +extern void L0_Iap_Program(vU16 addr, char dat); +extern char L0_Iap_Read(vU16 addr); +extern void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len); +extern void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len); +extern void L1_Iap_main(void); + +#endif// #ifndef _msp_eeprom_H_ + + diff --git a/source/msp/msp_id.c b/source/msp/msp_id.c new file mode 100644 index 0000000..047030c --- /dev/null +++ b/source/msp/msp_id.c @@ -0,0 +1,49 @@ + +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file msp_eeprom.c +/// @brief msp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20190106 +/// @note cc_AS_stc02 由stc-isp v6.0860 +////////////////////////////////////////////////////////////////////////////// +#include "msp_id.h" +#include "../app/common.h" + +void L0_id_get(U8 *id) +{ + U8 i = 0; + char *ID = (char idata *)0xf1; + for(i=0;i>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../cpu/stc_stc8a8k.h" +#include "../cpu/c51_macro.h" +#include "../bsp/bsp_config.h" +#include "uart0.h" + +extern void L0_id_get(U8 *id); +extern void L0_id_get_rom(U8 *id); +extern void L0_id_main(void); + +#endif// #ifndef _msp_eeprom_H_ + + + diff --git a/source/msp/time.c b/source/msp/time.c new file mode 100644 index 0000000..e34f228 --- /dev/null +++ b/source/msp/time.c @@ -0,0 +1,255 @@ +#include "Time.h" + +/*************初始化定时器0由 stc-isp v6.86L定时器计算器生成******************/ +#if(MainFre_5M == D_sys_MainFre) +#elif(MainFre_27M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) +void L0_timer0_Init(void) //25毫秒@22.1184MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0x00; //设置定时初值 + TH0 = 0x4C; //设置定时初值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 + ET0 = 1; //add by cc +} + + +/******************************************** +void L0_timer0_Init(void) //10毫秒@22.1184MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0x00; //设置定时初值 + TH0 = 0xB8; //设置定时初值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 + ET0 = 1; //add by cc +} + +void L0_timer0_Init_32k(void) //4fen@32kHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + #if 0 + TL0 = 0x00; //设置定时初值 + TH0 = 0xB8; //设置定时初值/// 4m20s 71 + #else + TL0 = 0x00; //设置定时初值 + TH0 = 0xcc; //设置定时初值// ff 4s + + + #endif + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 + ET0 = 1; //add by cc + BITN_0(DR_who_wakeup, DRB_who_wakeup_timer0); /// 标志中断类型: 定时器 +} +****************************************************/ + +#else ///MainFre_11M +void L0_timer0_Init(void) //10毫秒@11.0592MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0x00; //设置定时初值 + TH0 = 0xDC; //设置定时初值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 + ET0 = 1; //add by cc +} + +/******************************************** +void L0_timer0_Init(void) //25毫秒@11.0592MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0x00; //设置定时初值 + TH0 = 0xA6; //设置定时初值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 + ET0 = 1; //add by cc +} +****************************************************/ +#endif//D_sys_MainFre) + +//10---87 10s +/********************** Timer0中断函数************************/ +/// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre +/// 默认10ms 作为TTSS系统的定时引擎 +void timer0_isrHanddle (void) interrupt D_ISR_timer0 +{// + NOP(); NOP(); NOP(); + TF0 = 0; +#if 0 + /// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms + ///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足 + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 验证 + +#else + + L1_tick_tick(); ///系统中的1sflag 和以10ms为颗粒的延时使用 为tdelay服务 + +#endif + /// BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); + NOP(); NOP(); NOP(); +} + + + + + + + + + +#if(MainFre_5M == D_sys_MainFre) +#elif(MainFre_27M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) +/****************************** +void L0_Timer1_Init(void) //35毫秒@22.1184MHz +{///自动重载 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x00; //设置定时初值 + T2H = 0x04; //设置定时初值 + AUXR |= 0x10; //定时器2开始计时 + + BITN_1(IE2, ET2);// IE2 = ET2; //使能定时器中断 +} +**********************************/ +#else ///MainFre_11M + +void L0_timer1_Init_7ms(void) //7毫秒@11.0592MHz +{ + AUXR &= 0xBF; //定时器时钟12T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xCD; //设置定时初值 + TH1 = 0xE6; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + +void L0_timer1_Init_5ms(void) //5毫秒@11.0592MHz +{//0x7F示波器测试大约40ms,led闪烁 肉眼可见 + AUXR &= 0xBF; //定时器时钟12T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0x00; //设置定时初值 + TH1 = 0xEE; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + +void L0_timer1_Init_1ms(void) //1毫秒@11.0592MHz +{ + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xCD; //设置定时初值 + TH1 = 0xD4; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + +void L0_timer1_Init(void) //600微秒@11.0592MHz +{ + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0x14; //设置定时初值 + TH1 = 0xE6; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + + +//0x7F示波器测试大约40ms,led闪烁 肉眼可见 +void L0_timer1_reset(void) +{ + TR1 = 0; + TL1 = 0x14; //设置定时初值 + TH1 = 0xE6; //设置定时初值 + TR1 = 1; + TF1 = 0; +} + +#endif//D_sys_MainFre) + + +#if 0 +void L0_Timer1Init(void) +{ + #if 0 + + //30毫秒@22.1184MHz + AUXR &= 0xBF; //定时器时钟12T模式 + TMOD &= 0x0F; //设置定时器模式 + TMOD |= 0x10; //设置定时器模式 + TL1 = 0x00; //设置定时初值 + TH1 = 0x28; //设置定时初值 + TF1 = 0; //清除TF1标志 +#else + TMOD = 0x40; //外部计数模式 + TL1 = (0xff-10); + TH1 = 0xff; + + + #endif +// TR1 = 1; //定时器1开始计时 + L0_TIMER1_start(); + //L0_TIMER1_end(); + L0_TIMER1_isr_CLOSE(); +/// ET1 = 1; // add by cc 启动定时器1的中断 +} + +void L0_timer1_Init(void) //计数器1初始化 +{ + + TMOD = 0x40; //外部计数模式 + TL1 = 0x9c; + TH1 = 0xff; + // TR1 = 1; //启动定时器 + ET1 = 1; //使能定时器中断 + // EA = 1; +} +#define L0_timer1_on(); TR1 = 1; //启动计数器 +#define L0_timer1_off(); TR1 = 0; //关闭计数器 //启动计数器 + +//10---87 10s +/********************** Timer0中断函数************************/ +/// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre +/// 默认10ms 作为TTSS系统的定时引擎 +void timer1_inr (void) interrupt 3 +{ + +/******* + s_task_GC032A.usN ++; + s_task_GC032A.buf[s_task_GC032A.usN] = P1; + if(s_task_GC032A.usN < D_row_max) + { + + }else + { + s_task_GC032A.status = 1; + } +// task_handler.line_camera++; +****************/ +} + +#endif + + + + + + + + +/******************************END*********************************/ + + + + diff --git a/source/msp/time.h b/source/msp/time.h new file mode 100644 index 0000000..1f49191 --- /dev/null +++ b/source/msp/time.h @@ -0,0 +1,55 @@ +#ifndef INIT_TIMER0_H +#define INIT_TIMER0_H + +#include "../clib/type.h" + +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" + + +extern void L0_timer1_Init(void); +extern void L0_timer1_reset(void); +extern void L0_timer1_off(void); +extern void L0_timer1_on(void); +extern void L0_Timer1Init(void); +extern void L0_timer0_Init(void); +extern void L0_timer0_Init_32k(void) ; +#define L0_timer0_open(x) TR0 = x // + +// 他和t_10ms 关联,如果t_10ms递增为1时间隔为(D_TIMER0_10MS_COUNT*定时器间隔) +//#define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 + +#define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 + +/**************** + +#if(MainFre_5M == D_sys_MainFre) + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#elif(MainFre_22M == D_sys_MainFre) + +#define L0_delay_1us() Lc_delay_nop(2) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(20) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us + +#define D_Cdelay_1ms 500 +#define D_Cdelay_15ms 1200 + + +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 + +#elif(MainFre_11M == D_sys_MainFre) +等待 +#define L0_delay_1us() NOP();NOP(); // 11.05926M + + +#endif +**********/ + + + +#endif + + + diff --git a/source/tpc/tpc_modbus.c b/source/tpc/tpc_modbus.c new file mode 100644 index 0000000..54b7561 --- /dev/null +++ b/source/tpc/tpc_modbus.c @@ -0,0 +1,77 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_modbus.h" + +void L1_s2b_PH4_init(TS_Handle_PH4 *p,U8 slaver) +{ + p->max = 0; + p->ok = 0; + p->head = 0; + p->num = 0; + p->slaver = slaver; + p->error = 0; +} + +void L1_s2b_PH4(TS_Handle_PH4 *p) +{ + if(p->head == 0) + { + if(p->reg == p->slaver) + { + p->head = 1; + p->error = 0; + p->max = D_s_PH4_modbus_max; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + else + { + //P10 ^= 1; + p->error = 1; + } + } +} + + + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_modbus.h b/source/tpc/tpc_modbus.h new file mode 100644 index 0000000..37605e9 --- /dev/null +++ b/source/tpc/tpc_modbus.h @@ -0,0 +1,57 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_MODBUS_H_ +#define __TPC_MODBUS_H_ + +#include "../clib/Type.h" +#include "../bsp/bsp_config.h" +#include "../app/common.h" + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +typedef struct +{ + U8 reg; + U8 max; //接收到的数目的最大值 + U8 slaver; + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 error; //错误 + vU8 *sp; + U8 buf[D_s_PH4_modbus_max + 8]; + vU8 crc[2]; +}TS_Handle_PH4; + +extern void L1_s2b_PH4_init(TS_Handle_PH4 *p,U8 slaver); +extern void L1_s2b_PH4(TS_Handle_PH4 *p); + +#endif /* end __TPC_UART_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/tpc_uart.c b/source/tpc/tpc_uart.c new file mode 100644 index 0000000..52af7b7 --- /dev/null +++ b/source/tpc/tpc_uart.c @@ -0,0 +1,192 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_uart.h" + + +//NUM: 0 1 2 3 4 +// Fx R1 R2 R3 ocr +// F+从机 R1 R2 R3 校验 + + + + +/// 实践中发现 如果收到多个以0d0a结束的短协议时,如果 +/// 协议之间间隔时间太短,ok处理不及时 会出现丢失协议的 +/// 的情况,所以 对于短暂的多个协议 应该有一定容量的缓冲 +/// 保留 ,同时 处理完协议后,应该清除接收缓冲,否则缓冲 +/// 会在自身满了后自动清除 +//_s_HRTU_P_rf_ +/// _s_HRTU_Pfx_ +/// fx 11 22 33 oc -- oc = 11+ 22+33 +//buf 0 1 2 3 [4] +// +//// protocol hex 1 serial to buff +#ifdef D_use_uart_rx +void L1_s2b_PH1 (TS_Handle_PH1 *p)// reentrant +{ + if (0 == p->head) + { + if (D_HETU_FX_fi == (p->reg&D_HETU_FX_H4)) + {//p->ok = 1;p->head = 0; + p->head = 1; + p->num = 0; + //p->ocx = 0; + p->buf[p->num]=p->reg; + } + }else + { + p->num ++; + p->buf[p->num] = p->reg; + + if(p->num >= D_HETU_FX_buf_max) // [4] + { + ///p->ocr = p->buf[1]; p->ocr += p->buf[2];p->ocr += p->buf[3]; + ///if(p->ocr == p->buf[D_HETU_FX_buf_max]) + { + // if (p->ok != 1) + { + // D_led_D2_ON(); + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + // D_led_D2_OFF(); + } + } + p->num = 0; //放在if (p->ok != 1) 外 + p->head = 0; //放在if (p->ok != 1) 外 + //p->max = 0; + } + } +} +#endif + +////485 +//// 带地址判定的 +void L1_s2b_PH1A (TS_Handle_PH1A *p)// reentrant +{ + if (0 == p->head) + { + if (D_HETU_FXA == p->reg) + {//p->ok = 1;p->head = 0; + p->head = 1; + p->num = 0; + //p->ocx = 0; + p->buf[p->num]=p->reg; + } + }else + { + p->num ++; + p->buf[p->num] = p->reg; + if(p->num >= D_HETU_FXA_buf_max - 1) // [4] + { + ///p->ocr = p->buf[1]; p->ocr += p->buf[2];p->ocr += p->buf[3]; + ///if(p->ocr == p->buf[D_HETU_FX_buf_max]) + { + //if (p->add == p->buf[1])///地址不匹配 + { + // D_led_D2_ON(); + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + // D_led_D2_OFF(); + } + // p->ok = 1; + } + p->num = 0; //放在if (p->ok != 1) 外 + p->head = 0; //放在if (p->ok != 1) 外 + //p->max = 0; + } + } +} + + +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 1 2 3 4 5 6 7 8 +/// 0 1 2 3 4 5 6 7 8 9 10 +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F + +void L1_s2b_PH3_init(TS_Handle_PH3 *p) +{ + p->max = 0; + p->ok = 0; + p->num = 0; + p->head = 0; + p->head_0 = TS_PH3_FILTER0; + p->head_1 = TS_PH3_FILTER1; +} + +void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant +{ + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + if (0 == p->head) + { + if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) + { + p->head = 1; + p->max = D_s_PH3_ccmodbus_max - 1; + p->sp = p->buf; + p->sp[0] = p->head_0; + p->sp[1] = p->head_1; + p->num = 1; + } + } + else + { + p->num ++; + p->sp[p->num] = p->cashe[0]; + if(p->num == 2)//数量 第3个数据 + { + p->max = p->reg + 2;// + if(p->max >= D_s_PH3_ccmodbus_max) + { + p->max = D_s_PH3_ccmodbus_max - 1; + } + } + if(p->num >= p->max) + { + //p->ts_ccmodbus.crc = (p->sp[p->num-1] | p->sp[p->num]) & 0xFFFF; + if(/*crc()==p->ts_ccmodbus.crc*/ 1) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->num = 0; + p->head = 0; + } + } +} + + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_uart.h b/source/tpc/tpc_uart.h new file mode 100644 index 0000000..cddf610 --- /dev/null +++ b/source/tpc/tpc_uart.h @@ -0,0 +1,409 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +/***************************************************************************** +@version 1.2 +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/uartlib.c: +公用的函数 和硬件无关 +接收各类协议的处理函数 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + + +----------------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + + + +#ifndef __TPC_UART_H_ +#define __TPC_UART_H_ + +#include "../clib/Type.h" +#include "../bsp/bsp_config.h" + + +// 20170609 + +///----------------------------------------------------- + + + +//L0_type_byte(ts_cmd_pro0)[] +//#define D_CMD_Filter1 0xA5 +//#define D_CMD_Filter2 0x5A +#define D_CMD_Filter1 0x0a +#define D_CMD_Filter2 0x0d + +#define D_CMD_Filter1_ff 0xFF +#define D_CMD_Filter2_fe 0xFE + + + +///协议类型: 十六进制协议1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为有fx开头的十六进制的短协议,和长协议的区别除了帧头简化为1个字节外,数据的长度也是比较精简,大部分按位操作的,适合低波特率rf433之类的传播 +///定长5个 适合于传感器定时上传 +/// R1 +///位数 7 6 5 4 3 2 1 0 +///定义 动作传感器AS1 (0---15) 动作传感器AS2 (0---15) + +/// R2 +///位数 7 6 5 4 3 2 1 0 +///定义 气压Press (0---15) open mic + +/// R3 +///位数 7 6 5 4 3 2 1 0 +///定义 Temp (0---15) Gsensor(0---15) + +typedef struct +{//8byte +///////// + vU8 as2:4; + vU8 as1:4; +///////// + vU8 mic:3; + vU8 open:1; + vU8 press:4; +//////////////// + vU8 Gsensor:4; + vU8 temp:4; +/////////// +}TS_P_pc_dat; + +typedef struct +{//8byte + ///////// + U8 cameraBoardPower; //当前行第4个点采集的图像数据 + vU16 paperNum:10; //10bit纸张数据 表示最大量程1024 实际170张 + vU16 cameraIndex:4; //摄像头编号 + vU16 cameraWorking:1; //是否正常工作 + vU16 LowPower:1; // =1 lowPower 提醒需要充电,或者未连接电池 +}TS_P_paper; + +//NUM: 0 1 2 3 4 +// Fx R1 R2 R3 ocr +// F+从机 R1 R2 R3 校验 +typedef struct _s_P_rf_ +{//8byte + vU8 slave:4; + vU8 filter1:4; +//////////////// + TS_P_paper r123; + vU8 ocr; +}TS_P_rf; + +typedef struct _s_P_rf433_ +{//8byte + vU8 ha; +// vU8 hb; + + vU8 slave:4; + vU8 filter1:4; +//////////////// + TS_P_paper r123; + vU8 ocr; +/// vU8 hc; +}TS_P_rf433; + +//NUM: 0 1 2 3 4 +// Fx R1 R2 R3 ocr +// F+从机 R1 R2 R3 校验 + +typedef struct +{//8byte + vU8 slave:4; + vU8 filter1:4; +//////////////// + vU8 G1; +//////////////// + vU8 G2; +//////////////// + vU8 Tmp:4; + vU8 Press:4; +//////////////// + vU8 ocr; +}TS_P_as; + +typedef struct +{//8byte + vU8 slave:4; + vU8 filter1:4; +//////////////// + vU8 cmd; +//////////////// + vU8 R2; +//////////////// + vU8 R3; +//////////////// + vU8 ocr; +}TS_P_debug; + + +#define D_HETU_FX_fi 0xa0 ///2018.7.7 +#define D_HETU_FX_H4 0xf0 ///2018.7.7 + +#define D_HETU_FX_buf_max 4 //max 是是指实际的数量,num或者cnt是指当时的 +/// Hex RTU Protocol 0xFx +typedef struct +{//8byte + vU8 reg; + vU8 n; + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; +// vU8 cmd; + vU8 ocr; +// vU8 *sp; + U8 buf[D_HETU_FX_buf_max+1]; +}TS_Handle_PH1; + + +extern void L1_s2b_PH1 (TS_Handle_PH1 *p);// reentrant; + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +///协议类型: 十六进制协议2->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为有ff fe开头的十六进制的长协议,内有数据数量 +///FF FE 52 03 98 77 88 99 地址为0x52的从机, 向PC发送了3个数据0x77,0x88,0x99 + +///FF FE 06 03 e5 77 88 99 命令(0x06)携带了3个数据0x77,0x88,0x99;校验为0x98(=0x06+0x03+0x77+0x88+0x99三个数据的和) +///附:校验位=0x12+0x34+0x56=0x9c;取低位字节得到OCR=0x9c + +typedef struct +{//8byte + vU8 filter1; + vU8 filter2; + vU8 addr; //发送方的地址或命令 + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 ocr; + vU8 buf[4];//--->_s_P_pc_dat_ +}TS_P_pc; + +// FF FE 10 02 0C 51 03 +// cashe[1] cashe[0] 本机 数量 校验 数据1 从机 数据2 命令 +// filter2 filter1 +struct _s_PH2_FFFE_ +{//8byte + vU8 cashe[2]; + vU8 reg; + vU8 max; //接收到的数目的最大值 + vU8 head_0; + vU8 head_1; + // vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 *sp; + TS_P_pc s_FF; + // U8 pro[16]; ///解析协议用 +}; + +extern void L1_s2b_PH2(struct _s_PH2_FFFE_ *p);// reentrant; + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +/// 校验码的范围为 +#define TS_PH3_FILTER0 0xFF +#define TS_PH3_FILTER1 0xFE + +#define D_s_PH3_ccmodbus_max (16 + 8) +typedef struct +{ + U8 filter0; + U8 filter1; + U8 num; + U8 src; //源设备ID + U8 dst; //目标设备ID + U8 oper; + U8 buf[D_s_PH3_ccmodbus_max - 8]; + U8 crc[2]; +}TS_PH3_ccmodbus; + +typedef struct +{//8byte + U8 cashe[2]; + U8 reg; + U8 max; //接收到的数目的最大值 + U8 head_0; + U8 head_1; + // vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 *sp; + U8 _buf[D_s_PH3_ccmodbus_max]; ///解析协议用 + U8 buf[D_s_PH3_ccmodbus_max]; +}TS_Handle_PH3; + +extern void L1_s2b_PH3_init(TS_Handle_PH3 *p); +extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant; +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +///协议类型: 字符型协议1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为以回车换行(即0x0a 0x0d)为结尾的字符型长协议,内有意义比较明确的命令字符和对应的数据,适合debug和速率要求不高,数据量 +/// 不大的场合 + +///----------------------------------------------------------------------------------------- +#define D_s_SSTR_0D0A_len 16 //str类的协议需要长度大一些,容易bug的地方,限制为接收64bytes的数据 +struct _s_PC1_0D0A_ +{//8byte + vU8 reg; + // vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + + vU8 cashe[2]; + //vU8 filter1; + //vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + + vU8 ok; //接收协议ok标志 + vU8 max; //接收到的数目的最大值 + vU8 buf[D_s_SSTR_0D0A_len+1];//buffer 的第一位是 长度 + // U8 pro[16]; ///解析协议用 +}; +extern void L1_s2b_PC1(struct _s_PC1_0D0A_ *p);// reentrant; +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + + +///modebus协议通讯使用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#ifdef doc_98098908 +///Modbus网络上以RTU模式通信,在消息中的每个8Bit字节按照原值传送,不做处理,如63H,RTU将直接发送01100011。 +////这种方式的主要优点是:数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快 [1] 。 +////ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译码和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送, +///用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较慢的机器 +///01 16 1000 1234 ABCD +///这段代码的意思 是 向 地址 01 的 控制器 写入 1000 1234 。 就是这么简单 +////地址域 就是指 从站的地址,比如一个变频器,或者是一个仪表,这个地址就是它的通讯地址 +///功能码 就是你要做的事情,通讯的目的 就是读写数据,所以 MODBUS 功能码虽然很多,但是只有两个是我们常用的,就是读和写。 +///读的功能码是03 写的功能码是16,注意,这里的读写都是一次性写16个位,也就是一个WORD. +///Address Function Data Check +///8-Bits 8-Bits N x 8-Bits 16-Bits +/// 功能(Function)域 +/// 功能域代码告诉了被寻址到的终端执行何种功能。下表列出了该系列仪表用到的功能码,以及它们的意义和功能。 +/// 代码 意义 行为 +/// 03 读数据寄存器 获得一个或多个寄存器的当前二进制值 +/// 16 预置多寄存器 设定二进制值到一系列多寄存器中(不对ACRXXXE开放) + + +///离散量、开关量、数字量都是对同一类型信号的不同说法, +///0表示断开,1表示接通,在PLC和类似控制设备中,都是一种布尔型的变量? +///T谧远///像PLC中的Y/Q,均是这种类型的信号 + + + + +///cc改进版的modebus协议,添加了一个帧头 +/// ff fe num add function dat check +#endif + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + + +///协议通讯使用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define D_s_protocol_len 32 +struct _s_protocol_ +{//8byte + vU8 rbr; + vU8 reg; + vU8 cashe[3]; + vU8 filter1; + vU8 filter2; + vU8 (*pfun_get)(void); + vU8 num; //接收到的数目注意数据长度的范围 + vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 data_ok; //接收协议ok标志 + vU8 ucXor; + vU8 array[D_s_protocol_len];//buffer 的第一位是 长度 + vU8 buf[D_s_protocol_len];//buffer 的第一位是 长度 + vU8 buf2[12];//buffer 的第一位是 长度 +}; + +extern void L1_uart_2buf(struct _s_protocol_ *p); + + + +//485 +///协议类型: 十六进制协议2 带地址判定的 第二个是地址->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define D_HETU_FXA 0xaa + +#define D_HETU_FXA_buf_max 8 //max 是是指实际的数量,num或者cnt是指当时的 +/// Hex RTU Protocol 0xFx +typedef struct +{//8byte + vU8 reg; + vU8 n; + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 add; ///数据地址 + vU8 ocr; +// vU8 *sp; + U8 buf[D_HETU_FXA_buf_max + 1]; +}TS_Handle_PH1A; + +typedef struct +{ + vU8 filter; + vU8 src; + vU8 dst; + vU8 dat[4]; + vU8 ocr; +}TS_PH1A_DAT; + +extern void L1_s2b_PH1A (TS_Handle_PH1A *p); + + +#endif /* end __TPC_UART_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + +