Compare commits
7 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
0802617137 | |
|
|
9ca4aad163 | |
|
|
0f75f951b7 | |
|
|
b84ae4b6c7 | |
|
|
83d56969fb | |
|
|
77e6088821 | |
|
|
8a454bcd9e |
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"ens1_gpio.h": "c",
|
||||||
|
"ens1_boost.h": "c",
|
||||||
|
"ens_current_calibration.h": "c",
|
||||||
|
"ens1_timer.h": "c",
|
||||||
|
"my_header.h": "c",
|
||||||
|
"ens1_wavegen.h": "c"
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -27,6 +27,7 @@
|
||||||
<ToolsetName>ARM-ADS</ToolsetName>
|
<ToolsetName>ARM-ADS</ToolsetName>
|
||||||
<TargetOption>
|
<TargetOption>
|
||||||
<CLKADS>12000000</CLKADS>
|
<CLKADS>12000000</CLKADS>
|
||||||
|
<pArmCC>5060960::V5.06 update 7 (build 960)::.\ARMCC</pArmCC>
|
||||||
<OPTTT>
|
<OPTTT>
|
||||||
<gFlags>1</gFlags>
|
<gFlags>1</gFlags>
|
||||||
<BeepAtEnd>1</BeepAtEnd>
|
<BeepAtEnd>1</BeepAtEnd>
|
||||||
|
|
@ -100,9 +101,6 @@
|
||||||
<tRSysVw>1</tRSysVw>
|
<tRSysVw>1</tRSysVw>
|
||||||
<sRunDeb>0</sRunDeb>
|
<sRunDeb>0</sRunDeb>
|
||||||
<sLrtime>0</sLrtime>
|
<sLrtime>0</sLrtime>
|
||||||
<bEvRecOn>1</bEvRecOn>
|
|
||||||
<bSchkAxf>0</bSchkAxf>
|
|
||||||
<bTchkAxf>0</bTchkAxf>
|
|
||||||
<nTsel>4</nTsel>
|
<nTsel>4</nTsel>
|
||||||
<sDll></sDll>
|
<sDll></sDll>
|
||||||
<sDllPa></sDllPa>
|
<sDllPa></sDllPa>
|
||||||
|
|
@ -140,7 +138,7 @@
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>JL2CM3</Key>
|
<Key>JL2CM3</Key>
|
||||||
<Name>-U941000024 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC2000 -FN1 -FF0NNC_ENS1_0x000_0x5F00 -FS010000000 -FL05F00</Name>
|
<Name>-U941000024 -O78 -S6 -ZTIFSpeedSel500 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8013 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC2000 -FN1 -FF0NNC_ENS1_0x000_0x5F00 -FS010000000 -FL05F00</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
|
|
@ -152,7 +150,7 @@
|
||||||
<Bp>
|
<Bp>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Type>0</Type>
|
<Type>0</Type>
|
||||||
<LineNumber>39</LineNumber>
|
<LineNumber>36</LineNumber>
|
||||||
<EnabledFlag>1</EnabledFlag>
|
<EnabledFlag>1</EnabledFlag>
|
||||||
<Address>0</Address>
|
<Address>0</Address>
|
||||||
<ByteObject>0</ByteObject>
|
<ByteObject>0</ByteObject>
|
||||||
|
|
@ -197,6 +195,22 @@
|
||||||
<ExecCommand></ExecCommand>
|
<ExecCommand></ExecCommand>
|
||||||
<Expression>\\ENS001_BASIC_PRJ\USER/mian.c\36</Expression>
|
<Expression>\\ENS001_BASIC_PRJ\USER/mian.c\36</Expression>
|
||||||
</Bp>
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>3</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>431</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>0</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>0</BreakIfRCount>
|
||||||
|
<Filename>.\FWLIB\source\ENS1_TIMER.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression></Expression>
|
||||||
|
</Bp>
|
||||||
</Breakpoint>
|
</Breakpoint>
|
||||||
<WatchWindow1>
|
<WatchWindow1>
|
||||||
<Ww>
|
<Ww>
|
||||||
|
|
@ -262,16 +276,6 @@
|
||||||
<LintExecutable></LintExecutable>
|
<LintExecutable></LintExecutable>
|
||||||
<LintConfigFile></LintConfigFile>
|
<LintConfigFile></LintConfigFile>
|
||||||
<bLintAuto>0</bLintAuto>
|
<bLintAuto>0</bLintAuto>
|
||||||
<bAutoGenD>0</bAutoGenD>
|
|
||||||
<LntExFlags>0</LntExFlags>
|
|
||||||
<pMisraName></pMisraName>
|
|
||||||
<pszMrule></pszMrule>
|
|
||||||
<pSingCmds></pSingCmds>
|
|
||||||
<pMultCmds></pMultCmds>
|
|
||||||
<pMisraNamep></pMisraNamep>
|
|
||||||
<pszMrulep></pszMrulep>
|
|
||||||
<pSingCmdsp></pSingCmdsp>
|
|
||||||
<pMultCmdsp></pMultCmdsp>
|
|
||||||
</TargetOption>
|
</TargetOption>
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
|
|
@ -286,6 +290,7 @@
|
||||||
<FileNumber>1</FileNumber>
|
<FileNumber>1</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\USER\mian.c</PathWithFileName>
|
<PathWithFileName>.\USER\mian.c</PathWithFileName>
|
||||||
|
|
@ -305,7 +310,21 @@
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>2</FileNumber>
|
<FileNumber>2</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>1</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>.\FWLIB\source\ENS1_TIMER.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>ENS1_TIMER.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>3</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\FWLIB\source\ENS1_UART.c</PathWithFileName>
|
<PathWithFileName>.\FWLIB\source\ENS1_UART.c</PathWithFileName>
|
||||||
|
|
@ -315,9 +334,10 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>3</FileNumber>
|
<FileNumber>4</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\FWLIB\source\ENS1_GPIO.c</PathWithFileName>
|
<PathWithFileName>.\FWLIB\source\ENS1_GPIO.c</PathWithFileName>
|
||||||
|
|
@ -327,9 +347,10 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>4</FileNumber>
|
<FileNumber>5</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\FWLIB\source\ENS1_MTP.c</PathWithFileName>
|
<PathWithFileName>.\FWLIB\source\ENS1_MTP.c</PathWithFileName>
|
||||||
|
|
@ -339,9 +360,10 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>5</FileNumber>
|
<FileNumber>6</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\FWLIB\source\ENS1_CLOCK.c</PathWithFileName>
|
<PathWithFileName>.\FWLIB\source\ENS1_CLOCK.c</PathWithFileName>
|
||||||
|
|
@ -351,9 +373,10 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>6</FileNumber>
|
<FileNumber>7</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\FWLIB\source\retarget.c</PathWithFileName>
|
<PathWithFileName>.\FWLIB\source\retarget.c</PathWithFileName>
|
||||||
|
|
@ -363,13 +386,27 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>7</FileNumber>
|
<FileNumber>8</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>1</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\FWLIB\source\ENS1_TIMER.c</PathWithFileName>
|
<PathWithFileName>.\FWLIB\source\ENS1_BOOST.c</PathWithFileName>
|
||||||
<FilenameWithoutPath>ENS1_TIMER.c</FilenameWithoutPath>
|
<FilenameWithoutPath>ENS1_BOOST.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>9</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>.\FWLIB\source\ENS1_WAVEGEN.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>ENS1_WAVEGEN.c</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
|
|
@ -399,9 +436,10 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>8</FileNumber>
|
<FileNumber>10</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\CORE\system_CMSDK_CM0.c</PathWithFileName>
|
<PathWithFileName>.\CORE\system_CMSDK_CM0.c</PathWithFileName>
|
||||||
|
|
@ -411,9 +449,10 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>9</FileNumber>
|
<FileNumber>11</FileNumber>
|
||||||
<FileType>2</FileType>
|
<FileType>2</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
|
<Focus>1</Focus>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>.\CORE\ARM\startup_CMSDK_CM0.s</PathWithFileName>
|
<PathWithFileName>.\CORE\ARM\startup_CMSDK_CM0.s</PathWithFileName>
|
||||||
|
|
|
||||||
|
|
@ -10,15 +10,13 @@
|
||||||
<TargetName>ENS001_BASIC_PRJ</TargetName>
|
<TargetName>ENS001_BASIC_PRJ</TargetName>
|
||||||
<ToolsetNumber>0x4</ToolsetNumber>
|
<ToolsetNumber>0x4</ToolsetNumber>
|
||||||
<ToolsetName>ARM-ADS</ToolsetName>
|
<ToolsetName>ARM-ADS</ToolsetName>
|
||||||
<pArmCC>5060750::V5.06 update 6 (build 750)::.\ARM_Compiler_5.06u7</pArmCC>
|
<pArmCC>5060960::V5.06 update 7 (build 960)::.\ARMCC</pArmCC>
|
||||||
<pCCUsed>5060750::V5.06 update 6 (build 750)::.\ARM_Compiler_5.06u7</pCCUsed>
|
|
||||||
<uAC6>8</uAC6>
|
|
||||||
<TargetOption>
|
<TargetOption>
|
||||||
<TargetCommonOption>
|
<TargetCommonOption>
|
||||||
<Device>ARMCM0</Device>
|
<Device>ARMCM0</Device>
|
||||||
<Vendor>ARM</Vendor>
|
<Vendor>ARM</Vendor>
|
||||||
<PackID>ARM.Cortex_DFP.1.1.0</PackID>
|
<PackID>ARM.CMSIS.5.8.0</PackID>
|
||||||
<PackURL>https://www.keil.com/pack/</PackURL>
|
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||||
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
|
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
|
||||||
<FlashUtilSpec></FlashUtilSpec>
|
<FlashUtilSpec></FlashUtilSpec>
|
||||||
<StartupFile></StartupFile>
|
<StartupFile></StartupFile>
|
||||||
|
|
@ -127,6 +125,47 @@
|
||||||
<HexOffset>0</HexOffset>
|
<HexOffset>0</HexOffset>
|
||||||
<Oh166RecLen>16</Oh166RecLen>
|
<Oh166RecLen>16</Oh166RecLen>
|
||||||
</OPTHX>
|
</OPTHX>
|
||||||
|
<Simulator>
|
||||||
|
<UseSimulator>0</UseSimulator>
|
||||||
|
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
|
||||||
|
<RunToMain>1</RunToMain>
|
||||||
|
<RestoreBreakpoints>1</RestoreBreakpoints>
|
||||||
|
<RestoreWatchpoints>1</RestoreWatchpoints>
|
||||||
|
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
|
||||||
|
<RestoreFunctions>1</RestoreFunctions>
|
||||||
|
<RestoreToolbox>1</RestoreToolbox>
|
||||||
|
<LimitSpeedToRealTime>0</LimitSpeedToRealTime>
|
||||||
|
<RestoreSysVw>1</RestoreSysVw>
|
||||||
|
</Simulator>
|
||||||
|
<Target>
|
||||||
|
<UseTarget>1</UseTarget>
|
||||||
|
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
|
||||||
|
<RunToMain>1</RunToMain>
|
||||||
|
<RestoreBreakpoints>1</RestoreBreakpoints>
|
||||||
|
<RestoreWatchpoints>1</RestoreWatchpoints>
|
||||||
|
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
|
||||||
|
<RestoreFunctions>0</RestoreFunctions>
|
||||||
|
<RestoreToolbox>1</RestoreToolbox>
|
||||||
|
<RestoreTracepoints>1</RestoreTracepoints>
|
||||||
|
<RestoreSysVw>1</RestoreSysVw>
|
||||||
|
</Target>
|
||||||
|
<RunDebugAfterBuild>0</RunDebugAfterBuild>
|
||||||
|
<TargetSelection>4</TargetSelection>
|
||||||
|
<SimDlls>
|
||||||
|
<CpuDll></CpuDll>
|
||||||
|
<CpuDllArguments></CpuDllArguments>
|
||||||
|
<PeripheralDll></PeripheralDll>
|
||||||
|
<PeripheralDllArguments></PeripheralDllArguments>
|
||||||
|
<InitializationFile></InitializationFile>
|
||||||
|
</SimDlls>
|
||||||
|
<TargetDlls>
|
||||||
|
<CpuDll></CpuDll>
|
||||||
|
<CpuDllArguments></CpuDllArguments>
|
||||||
|
<PeripheralDll></PeripheralDll>
|
||||||
|
<PeripheralDllArguments></PeripheralDllArguments>
|
||||||
|
<InitializationFile></InitializationFile>
|
||||||
|
<Driver>Segger\JL2CM3.dll</Driver>
|
||||||
|
</TargetDlls>
|
||||||
</DebugOption>
|
</DebugOption>
|
||||||
<Utilities>
|
<Utilities>
|
||||||
<Flash1>
|
<Flash1>
|
||||||
|
|
@ -185,16 +224,12 @@
|
||||||
<hadXRAM>0</hadXRAM>
|
<hadXRAM>0</hadXRAM>
|
||||||
<uocXRam>0</uocXRam>
|
<uocXRam>0</uocXRam>
|
||||||
<RvdsVP>0</RvdsVP>
|
<RvdsVP>0</RvdsVP>
|
||||||
<RvdsMve>0</RvdsMve>
|
|
||||||
<RvdsCdeCp>0</RvdsCdeCp>
|
|
||||||
<nBranchProt>0</nBranchProt>
|
|
||||||
<hadIRAM2>0</hadIRAM2>
|
<hadIRAM2>0</hadIRAM2>
|
||||||
<hadIROM2>0</hadIROM2>
|
<hadIROM2>0</hadIROM2>
|
||||||
<StupSel>8</StupSel>
|
<StupSel>8</StupSel>
|
||||||
<useUlib>1</useUlib>
|
<useUlib>1</useUlib>
|
||||||
<EndSel>1</EndSel>
|
<EndSel>1</EndSel>
|
||||||
<uLtcg>0</uLtcg>
|
<uLtcg>0</uLtcg>
|
||||||
<nSecure>0</nSecure>
|
|
||||||
<RoSelD>3</RoSelD>
|
<RoSelD>3</RoSelD>
|
||||||
<RwSelD>3</RwSelD>
|
<RwSelD>3</RwSelD>
|
||||||
<CodeSel>0</CodeSel>
|
<CodeSel>0</CodeSel>
|
||||||
|
|
@ -328,15 +363,9 @@
|
||||||
<uThumb>0</uThumb>
|
<uThumb>0</uThumb>
|
||||||
<uSurpInc>0</uSurpInc>
|
<uSurpInc>0</uSurpInc>
|
||||||
<uC99>1</uC99>
|
<uC99>1</uC99>
|
||||||
<uGnu>0</uGnu>
|
|
||||||
<useXO>0</useXO>
|
<useXO>0</useXO>
|
||||||
<v6Lang>1</v6Lang>
|
<v6Lang>1</v6Lang>
|
||||||
<v6LangP>1</v6LangP>
|
<v6LangP>1</v6LangP>
|
||||||
<vShortEn>1</vShortEn>
|
|
||||||
<vShortWch>1</vShortWch>
|
|
||||||
<v6Lto>0</v6Lto>
|
|
||||||
<v6WtE>0</v6WtE>
|
|
||||||
<v6Rtti>0</v6Rtti>
|
|
||||||
<VariousControls>
|
<VariousControls>
|
||||||
<MiscControls></MiscControls>
|
<MiscControls></MiscControls>
|
||||||
<Define></Define>
|
<Define></Define>
|
||||||
|
|
@ -354,7 +383,6 @@
|
||||||
<NoWarn>0</NoWarn>
|
<NoWarn>0</NoWarn>
|
||||||
<uSurpInc>0</uSurpInc>
|
<uSurpInc>0</uSurpInc>
|
||||||
<useXO>0</useXO>
|
<useXO>0</useXO>
|
||||||
<ClangAsOpt>1</ClangAsOpt>
|
|
||||||
<VariousControls>
|
<VariousControls>
|
||||||
<MiscControls></MiscControls>
|
<MiscControls></MiscControls>
|
||||||
<Define></Define>
|
<Define></Define>
|
||||||
|
|
@ -395,6 +423,11 @@
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>FWLIB</GroupName>
|
<GroupName>FWLIB</GroupName>
|
||||||
<Files>
|
<Files>
|
||||||
|
<File>
|
||||||
|
<FileName>ENS1_TIMER.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\FWLIB\source\ENS1_TIMER.c</FilePath>
|
||||||
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>ENS1_UART.c</FileName>
|
<FileName>ENS1_UART.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
|
|
@ -421,9 +454,14 @@
|
||||||
<FilePath>.\FWLIB\source\retarget.c</FilePath>
|
<FilePath>.\FWLIB\source\retarget.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>ENS1_TIMER.c</FileName>
|
<FileName>ENS1_BOOST.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>.\FWLIB\source\ENS1_TIMER.c</FilePath>
|
<FilePath>.\FWLIB\source\ENS1_BOOST.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>ENS1_WAVEGEN.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\FWLIB\source\ENS1_WAVEGEN.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
@ -452,19 +490,4 @@
|
||||||
</Target>
|
</Target>
|
||||||
</Targets>
|
</Targets>
|
||||||
|
|
||||||
<RTE>
|
|
||||||
<apis/>
|
|
||||||
<components/>
|
|
||||||
<files/>
|
|
||||||
</RTE>
|
|
||||||
|
|
||||||
<LayerInfo>
|
|
||||||
<Layers>
|
|
||||||
<Layer>
|
|
||||||
<LayName>ENS001_BASIC_PRJ</LayName>
|
|
||||||
<LayPrjMark>1</LayPrjMark>
|
|
||||||
</Layer>
|
|
||||||
</Layers>
|
|
||||||
</LayerInfo>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,37 @@
|
||||||
|
/*
|
||||||
|
*Copyright (C),2023 , NANOCHAP
|
||||||
|
*File name: ENS1_BOOST.H
|
||||||
|
*Author:
|
||||||
|
*Version: V1.0
|
||||||
|
*Date: 2023-11-
|
||||||
|
*Description: 升压电压选择功能
|
||||||
|
*Function List:
|
||||||
|
1 void boost_voltage_select_11V(void);
|
||||||
|
2 void boost_voltage_select_15V(void);
|
||||||
|
3 void boost_voltage_select_26V(void);
|
||||||
|
4 void boost_voltage_select_45V(void);
|
||||||
|
5 void boost_voltage_select_55V(void);
|
||||||
|
History:
|
||||||
|
1.V1.0
|
||||||
|
Date:
|
||||||
|
Author:
|
||||||
|
Modification: 初版
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef ENS1_BOOST_H
|
#ifndef ENS1_BOOST_H
|
||||||
#define ENS1_BOOST_H
|
#define ENS1_BOOST_H
|
||||||
|
|
||||||
|
#include "CMSDK_CM0.h"
|
||||||
|
|
||||||
#include "my_header.h"
|
//32MHz频率下,设置升压电压为11V
|
||||||
|
void boost_voltage_select_11V(void);
|
||||||
extern uint8_t Boost_Voltage_Sel(uint8_t VOLTAGE_XV);
|
//32MHz频率下,设置升压电压为15V
|
||||||
|
void boost_voltage_select_15V(void);
|
||||||
#define VOLTAGE_11V 0x0
|
//32MHz频率下,设置升压电压为26V
|
||||||
#define VOLTAGE_15V 0x1
|
void boost_voltage_select_26V(void);
|
||||||
#define VOLTAGE_26V 0x2
|
//32MHz频率下,设置升压电压为45V
|
||||||
#define VOLTAGE_45V 0x3
|
void boost_voltage_select_45V(void);
|
||||||
#define VOLTAGE_55V 0x4
|
//32MHz频率下,设置升压电压为55V
|
||||||
|
void boost_voltage_select_55V(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -19,13 +19,14 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 놓경
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
#ifndef ENS1_GPIO_H
|
#ifndef ENS1_GPIO_H
|
||||||
#define ENS1_GPIO_H
|
#define ENS1_GPIO_H
|
||||||
#include "my_header.h"
|
#include "my_header.h"
|
||||||
#include "CMSDK_CM0.h"
|
#include "CMSDK_CM0.h"
|
||||||
extern uint8_t GPIO_AltFunction(GPIO_NUM GPIO_X , GPIO_AltFuncSel GPIO_AltFuncSelx);
|
extern uint8_t GPIO_AltFunction(GPIO_NUM GPIO_X , GPIO_AltFuncSel GPIO_AltFuncSelx);
|
||||||
|
extern int8_t GPIO_IO_Init(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,GPIOOType_TypeDef GPIO_OType,GPIO_PUPD_TypeDef GPIO_PUPD,OUTPUT_SPEED_TypeDef OUTPUT_SPEED,OUTPUT_PDRV_TypeDef OUTPUT_PDRV,FunctionalState ENABLEorNOT);
|
||||||
extern int8_t GPIO_IO_Select(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,FunctionalState ENABLEorNOT);
|
extern int8_t GPIO_IO_Select(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,FunctionalState ENABLEorNOT);
|
||||||
extern uint8_t GPIO_GetInputValue(GPIO_NUM GPIO_X);
|
extern uint8_t GPIO_GetInputValue(GPIO_NUM GPIO_X);
|
||||||
extern uint8_t GPIO_GetOutputValue(GPIO_NUM GPIO_X);
|
extern uint8_t GPIO_GetOutputValue(GPIO_NUM GPIO_X);
|
||||||
|
|
|
||||||
|
|
@ -96,9 +96,9 @@ struct SPI_FIFO_Struct //
|
||||||
{
|
{
|
||||||
uint8_t TX_FIFO_TH; // 0 - 16 char
|
uint8_t TX_FIFO_TH; // 0 - 16 char
|
||||||
uint8_t RX_FIFO_TH; // 0 - 16 char
|
uint8_t RX_FIFO_TH; // 0 - 16 char
|
||||||
bool FIFO_ENABLE_SET;
|
int FIFO_ENABLE_SET;
|
||||||
bool TXDMA_SET; //选择是否启动DMA(fifo开启的前提下)
|
int TXDMA_SET; //选择是否启动DMA(fifo开启的前提下)
|
||||||
bool RXDMA_SET;
|
int RXDMA_SET;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 中断类型使能结构体
|
/* 中断类型使能结构体
|
||||||
|
|
@ -193,7 +193,7 @@ extern uint8_t TX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx) ; //
|
||||||
extern uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx);
|
extern uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx);
|
||||||
extern uint8_t SPI_FIFO_ENABLE(CMSDK_SPI_TypeDef* SPIx ); //FIFO功能使能
|
extern uint8_t SPI_FIFO_ENABLE(CMSDK_SPI_TypeDef* SPIx ); //FIFO功能使能
|
||||||
extern uint8_t SPI_FIFO_DISABLE(CMSDK_SPI_TypeDef* SPIx ); //FIFO功能失能
|
extern uint8_t SPI_FIFO_DISABLE(CMSDK_SPI_TypeDef* SPIx ); //FIFO功能失能
|
||||||
extern uint8_t SPI_FIFODMA_SET(CMSDK_SPI_TypeDef* SPIx ,bool TXDMA_SET ,bool RXDMA_SET); //DMA设置
|
extern uint8_t SPI_FIFODMA_SET(CMSDK_SPI_TypeDef* SPIx ,int TXDMA_SET ,int RXDMA_SET); //DMA设置
|
||||||
extern uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,FunctionalState ENorDIS); //nss通道选择
|
extern uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,FunctionalState ENorDIS); //nss通道选择
|
||||||
extern uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , struct SPI_ModeConfig_Struct SPI_Config ,struct SPI_FIFO_Struct FIFO_Struct); //spi的初始配置
|
extern uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx , struct SPI_ModeConfig_Struct SPI_Config ,struct SPI_FIFO_Struct FIFO_Struct); //spi的初始配置
|
||||||
extern uint8_t SPI_START(CMSDK_SPI_TypeDef* SPIx);
|
extern uint8_t SPI_START(CMSDK_SPI_TypeDef* SPIx);
|
||||||
|
|
@ -202,6 +202,6 @@ extern uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx);
|
||||||
extern uint16_t READ_SPI_RCVBuff(CMSDK_SPI_TypeDef* SPIx );
|
extern uint16_t READ_SPI_RCVBuff(CMSDK_SPI_TypeDef* SPIx );
|
||||||
//写数据
|
//写数据
|
||||||
extern void WRITE_SPI_THRBuff(CMSDK_SPI_TypeDef* SPIx,uint8_t data);
|
extern void WRITE_SPI_THRBuff(CMSDK_SPI_TypeDef* SPIx,uint8_t data);
|
||||||
extern uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET);
|
extern uint8_t SPI_INT_SET(IRQn_Type IRQn, int SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,31 @@
|
||||||
#define ENS1_TIMER_H
|
#define ENS1_TIMER_H
|
||||||
#include "CMSDK_CM0.h"
|
#include "CMSDK_CM0.h"
|
||||||
#include "my_header.h"
|
#include "my_header.h"
|
||||||
typedef enum {TOTAL_TIME_MODE = 0 , TRIGGER_TIME_MODE=1}TIME_COUNT_MODE; //选择为总时间或有效运行时间
|
extern uint8_t ems_control_count; // 电刺激控制计数器
|
||||||
|
extern uint8_t ems_state ; // 电刺激状态:0=关闭,1=开启
|
||||||
|
extern uint8_t led_state;
|
||||||
|
// 时间管理标志位结构体
|
||||||
|
typedef struct {
|
||||||
|
uint8_t T_1ms; // 1ms周期标志
|
||||||
|
uint8_t T_2ms; // 2ms周期标志
|
||||||
|
uint8_t T_6ms; // 6ms周期标志
|
||||||
|
uint8_t T_10ms; // 10ms周期标志
|
||||||
|
uint8_t T_20ms; // 20ms周期标志
|
||||||
|
uint8_t T_100ms; // 100ms周期标志
|
||||||
|
uint8_t T_1s; // 1s周期标志
|
||||||
|
} Time_Flag_TypeDef;
|
||||||
|
|
||||||
|
// 时间管理计数器结构体
|
||||||
|
typedef struct {
|
||||||
|
uint8_t t_1ms; // 1ms计数器
|
||||||
|
uint8_t t_2ms; // 2ms计数器
|
||||||
|
uint8_t t_6ms; // 6ms计数器
|
||||||
|
uint8_t t_10ms; // 10ms计数器
|
||||||
|
uint8_t t_20ms; // 20ms计数器
|
||||||
|
uint8_t t_100ms; // 100ms计数器
|
||||||
|
uint16_t t_1s; // 1s计数器
|
||||||
|
} Time_Counter_TypeDef;
|
||||||
|
typedef enum {TOTAL_TIME_MODE = 0 , TRIGGER_TIME_MODE=1}TIME_COUNT_MODE; //ѡ<><D1A1>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||||
extern void TIMER0_Init(uint32_t Int_Period);
|
extern void TIMER0_Init(uint32_t Int_Period);
|
||||||
extern void TIMER1_Init(uint32_t Int_Period);
|
extern void TIMER1_Init(uint32_t Int_Period);
|
||||||
extern volatile uint32_t CHANNEL_TIME_COUNT[4];
|
extern volatile uint32_t CHANNEL_TIME_COUNT[4];
|
||||||
|
|
@ -38,6 +62,13 @@ extern void CMSDK_dualtimer_setup_oneshot(CMSDK_DUALTIMER_TypeDef *CMSDK_DUALTIM
|
||||||
extern void CMSDK_RTC_Init_Calender(uint16_t prescaler, uint8_t data_mode, uint8_t hour_mode, uint32_t init_time, uint32_t init_date);
|
extern void CMSDK_RTC_Init_Calender(uint16_t prescaler, uint8_t data_mode, uint8_t hour_mode, uint32_t init_time, uint32_t init_date);
|
||||||
extern void CMSDK_RTC_Config_Alarm(uint16_t prescaler, uint8_t data_mode, uint8_t hour_mode, uint32_t init_time, uint32_t init_date, uint32_t alarm_time, uint32_t alarm_date) ;
|
extern void CMSDK_RTC_Config_Alarm(uint16_t prescaler, uint8_t data_mode, uint8_t hour_mode, uint32_t init_time, uint32_t init_date, uint32_t alarm_time, uint32_t alarm_date) ;
|
||||||
extern void CMSDK_RTC_Config_PeriodWake(uint8_t clock_sel, uint16_t prescaler, uint16_t period_time);
|
extern void CMSDK_RTC_Config_PeriodWake(uint8_t clock_sel, uint16_t prescaler, uint16_t period_time);
|
||||||
|
extern void Fuse_result(void);
|
||||||
|
// 时间管理函数声明
|
||||||
|
extern void Time_Manager_Init(void);
|
||||||
|
extern void Time_Manager_Process(void);
|
||||||
|
extern Time_Flag_TypeDef* Time_Manager_GetFlags(void);
|
||||||
|
extern void Time_Manager_ClearFlags(void);
|
||||||
|
extern void Time_Manager_Reset(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,9 @@
|
||||||
|
|
||||||
History:
|
History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date: -z
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
#ifndef _ENS1_UART_H_
|
#ifndef _ENS1_UART_H_
|
||||||
#define _ENS1_UART_H_
|
#define _ENS1_UART_H_
|
||||||
|
|
@ -37,7 +37,42 @@ Modification:
|
||||||
#define InterruptEnable __enable_irq
|
#define InterruptEnable __enable_irq
|
||||||
typedef enum uartRcvfifoTrigger{byte_1=0 , bytes_4=1,bytes_8=2,bytes_14=3}uartRcvTrigger;
|
typedef enum uartRcvfifoTrigger{byte_1=0 , bytes_4=1,bytes_8=2,bytes_14=3}uartRcvTrigger;
|
||||||
typedef enum {OverSamp_16 = 0,OverSamp_13}UART_OverSamp;
|
typedef enum {OverSamp_16 = 0,OverSamp_13}UART_OverSamp;
|
||||||
/*uart参数设置结构体*/
|
// 外部变量声明(在main.c中定义)
|
||||||
|
extern uint8_t uart_rx_buffer[64];
|
||||||
|
extern uint8_t uart_rx_count;
|
||||||
|
extern volatile uint8_t uart_data_ready;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
StopLen_1 = 0,
|
||||||
|
StopLen_Other
|
||||||
|
}UART_StopLen;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
WordLen_5,
|
||||||
|
WordLen_6,
|
||||||
|
WordLen_7,
|
||||||
|
WordLen_8
|
||||||
|
}UART_WordLen;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
Stick_RESET = 0,
|
||||||
|
Stick_SET
|
||||||
|
}UART_Stick_EN;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
Odd_SET = 0,
|
||||||
|
Even_SET
|
||||||
|
}UART_Even_EN;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
Parity_RESET = 0,
|
||||||
|
Parity_SET
|
||||||
|
}UART_Parity_EN;
|
||||||
|
|
||||||
|
/*uart<72><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýṹ<C3BD><E1B9B9>*/
|
||||||
|
|
||||||
typedef struct uart_fifo{
|
typedef struct uart_fifo{
|
||||||
uartRcvTrigger level;
|
uartRcvTrigger level;
|
||||||
|
|
@ -48,8 +83,13 @@ typedef struct uart_fifo{
|
||||||
typedef struct uart_para{
|
typedef struct uart_para{
|
||||||
uint8_t UART_OverSampMode;
|
uint8_t UART_OverSampMode;
|
||||||
uint32_t UART_BaudRate;
|
uint32_t UART_BaudRate;
|
||||||
uint8_t UART_HardwareFlowControl; //硬件流控是否开启
|
uint8_t UART_HardwareFlowControl; //Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
UART_FifoStructrue* FifoSetting ;
|
UART_FifoStructrue* FifoSetting ;
|
||||||
|
UART_StopLen stop_len; //停止位长度
|
||||||
|
UART_WordLen Word_len; //数据位长度
|
||||||
|
UART_Stick_EN Stick_EN; //固定奇偶校验使能
|
||||||
|
UART_Even_EN Even_EN; //奇偶校验选择
|
||||||
|
UART_Parity_EN Parity_EN; //奇偶校验使能
|
||||||
}UART_InitStructure;
|
}UART_InitStructure;
|
||||||
|
|
||||||
extern UART_FifoStructrue UART0_Fifo;
|
extern UART_FifoStructrue UART0_Fifo;
|
||||||
|
|
@ -58,19 +98,19 @@ extern UART_FifoStructrue UART1_Fifo;
|
||||||
extern UART_InitStructure UART1_Init;
|
extern UART_InitStructure UART1_Init;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
中断资源说明:
|
<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Դ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
1、THREINT THR发送寄存器或发送FIFO空
|
1<EFBFBD><EFBFBD>THREINT THR<EFBFBD><EFBFBD><EFBFBD>ͼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO<EFBFBD><EFBFBD>
|
||||||
2、RDAINT 接收寄存器数据可用 ,FIFO模式下触发接收阈值
|
2<EFBFBD><EFBFBD>RDAINT <EFBFBD><EFBFBD><EFBFBD>ռĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>FIFOģʽ<EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
3、RTOINT FIFO模式下接收超时:在最后四个字节时间内没有字节移除或者输入,在这个时间内至少有一个字节在接收FIFO中
|
3<EFBFBD><EFBFBD>RTOINT FIFOģʽ<EFBFBD>½<EFBFBD><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD>ֽ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD>FIFO<EFBFBD><EFBFBD>
|
||||||
4、RLSINT 接收线路状态:发生了溢出错误,校验错误,帧错误或者中断
|
4<EFBFBD><EFBFBD>RLSINT <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
5、MSIINT 调制解调器状态:CTS更改状态(禁用autoflow),DSR/RI/DCD更改状态
|
5<EFBFBD><EFBFBD>MSIINT <EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>CTS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>autoflow<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DSR/RI/DCD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||||
*/
|
*/
|
||||||
/*中断使能*/
|
/*<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>*/
|
||||||
#define MSI_EN (uint8_t)0X8
|
#define MSI_EN (uint8_t)0X8
|
||||||
#define RLSI_EN (uint8_t)0X4
|
#define RLSI_EN (uint8_t)0X4
|
||||||
#define THRE_EN (uint8_t)0X2
|
#define THRE_EN (uint8_t)0X2
|
||||||
#define RDAI_EN (uint8_t)0X1
|
#define RDAI_EN (uint8_t)0X1
|
||||||
/*中断信息*/
|
/*<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Ϣ*/
|
||||||
#define INT_MODEM_STATUS (uint8_t)0X0
|
#define INT_MODEM_STATUS (uint8_t)0X0
|
||||||
#define INT_THR_EMPTY (uint8_t)0X1
|
#define INT_THR_EMPTY (uint8_t)0X1
|
||||||
#define INT_RCV_DATA_AVAILABLE (uint8_t)0X2
|
#define INT_RCV_DATA_AVAILABLE (uint8_t)0X2
|
||||||
|
|
@ -78,8 +118,8 @@ extern UART_InitStructure UART1_Init;
|
||||||
#define INT_CHAR_TIMEOUT_INDICATION (uint8_t)0X6
|
#define INT_CHAR_TIMEOUT_INDICATION (uint8_t)0X6
|
||||||
|
|
||||||
typedef struct uart_it_para{
|
typedef struct uart_it_para{
|
||||||
uint8_t UartIntModel ; //选择中断的模式
|
uint8_t UartIntModel ; //ѡ<EFBFBD><EFBFBD><EFBFBD>жϵ<EFBFBD>ģʽ
|
||||||
uint8_t UartDMAEnable; //选择是否开启DMA
|
uint8_t UartDMAEnable; //ѡ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>DMA
|
||||||
}UART_ITStructure;
|
}UART_ITStructure;
|
||||||
|
|
||||||
extern UART_ITStructure UART0_ITSet;
|
extern UART_ITStructure UART0_ITSet;
|
||||||
|
|
@ -91,34 +131,34 @@ extern UART_ITStructure UART1_ITSet;
|
||||||
#define UART_WordLength_8b ((uint8_t)0x03)
|
#define UART_WordLength_8b ((uint8_t)0x03)
|
||||||
|
|
||||||
#define UART_NO_PARITY ((uint8_t)0x00 & 0xff)
|
#define UART_NO_PARITY ((uint8_t)0x00 & 0xff)
|
||||||
#define UART_LOGIC_1_ODD_NUM ((uint8_t)0x08 & 0xff) //逻辑1奇数个
|
#define UART_LOGIC_1_ODD_NUM ((uint8_t)0x08 & 0xff) //<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
#define UART_LOGIC_1_EVEN_NUM ((uint8_t)0x18 & 0xff) //逻辑1偶数个
|
#define UART_LOGIC_1_EVEN_NUM ((uint8_t)0x18 & 0xff) //<EFBFBD><EFBFBD>1ż<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
#define UART_STICK_PARITY_AS1 ((uint8_t)0x28 & 0xff) //固定奇偶校验为1
|
#define UART_STICK_PARITY_AS1 ((uint8_t)0x28 & 0xff) //<EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD>żУ<EFBFBD><EFBFBD>Ϊ1
|
||||||
#define UART_STICK_PARITY_AS0 ((uint8_t)0x38 & 0xff)
|
#define UART_STICK_PARITY_AS0 ((uint8_t)0x38 & 0xff)
|
||||||
|
|
||||||
|
|
||||||
/*中断信息读取*/
|
/*<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>ȡ*/
|
||||||
/*中断挂起*/
|
/*<EFBFBD>жϹ<EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
uint8_t UART_INT_PEND(CMSDK_UART_TypeDef* UARTx); //为0时有UART的中断挂起
|
uint8_t UART_INT_PEND(CMSDK_UART_TypeDef* UARTx); //Ϊ0ʱ<EFBFBD><EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD>жϹ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
/*中断状态判断*/
|
/*<EFBFBD>ж<EFBFBD>״̬<EFBFBD>ж<EFBFBD>*/
|
||||||
uint8_t UART_INT_TYPE(CMSDK_UART_TypeDef* UARTx);
|
uint8_t UART_INT_TYPE(CMSDK_UART_TypeDef* UARTx);
|
||||||
/*fifo 使用指示器*/
|
/*fifo ʹ<EFBFBD><EFBFBD>ָʾ<EFBFBD><EFBFBD>*/
|
||||||
uint8_t UART_FIFO_USE(CMSDK_UART_TypeDef* UARTx); //0:非fifo模式 1:fifo 使能
|
uint8_t UART_FIFO_USE(CMSDK_UART_TypeDef* UARTx); //0:<EFBFBD><EFBFBD>fifoģʽ 1<><31>fifo ʹ<><CAB9>
|
||||||
/*清除传输FIFO*/
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO*/
|
||||||
void UART_TXCLR(CMSDK_UART_TypeDef* UARTx);
|
void UART_TXCLR(CMSDK_UART_TypeDef* UARTx);
|
||||||
/*清除接收FIFO*/
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO*/
|
||||||
void UART_RXCLR(CMSDK_UART_TypeDef* UARTx);
|
void UART_RXCLR(CMSDK_UART_TypeDef* UARTx);
|
||||||
/*FIFO使能*/
|
/*FIFOʹ<EFBFBD><EFBFBD>*/
|
||||||
void UART_FIFOEnable(CMSDK_UART_TypeDef* UARTx);
|
void UART_FIFOEnable(CMSDK_UART_TypeDef* UARTx);
|
||||||
/*FIFO关闭*/
|
/*FIFO<EFBFBD>ر<EFBFBD>*/
|
||||||
void UART_FIFODisable(CMSDK_UART_TypeDef* UARTx);
|
void UART_FIFODisable(CMSDK_UART_TypeDef* UARTx);
|
||||||
|
|
||||||
/*接收数据*/
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
uint8_t READ_UART_RCVBuff(CMSDK_UART_TypeDef* UARTx );
|
uint8_t READ_UART_RCVBuff(CMSDK_UART_TypeDef* UARTx );
|
||||||
/*发送数据*/
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
void WRITE_UART_THRBuff(CMSDK_UART_TypeDef* UARTx ,uint8_t data);
|
void WRITE_UART_THRBuff(CMSDK_UART_TypeDef* UARTx ,uint8_t data);
|
||||||
|
|
||||||
/*FIFO状态获取*/
|
/*FIFO״̬<EFBFBD><EFBFBD>ȡ*/
|
||||||
uint8_t UART_RX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ;
|
uint8_t UART_RX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ;
|
||||||
uint8_t UART_TX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ;
|
uint8_t UART_TX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ;
|
||||||
uint8_t UART_RX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ;
|
uint8_t UART_RX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ;
|
||||||
|
|
@ -126,20 +166,34 @@ uint8_t UART_RX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ;
|
||||||
uint8_t UART_TX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ;
|
uint8_t UART_TX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ;
|
||||||
uint8_t UART_TX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ;
|
uint8_t UART_TX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ;
|
||||||
|
|
||||||
/*收发线状态获取*/
|
/*<EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>ȡ*/
|
||||||
uint8_t UARTLine_RCVError(CMSDK_UART_TypeDef* UARTx);
|
uint8_t UARTLine_RCVError(CMSDK_UART_TypeDef* UARTx);
|
||||||
|
|
||||||
/*判断发送缓存是否为空*/
|
/*<EFBFBD>жϷ<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD>*/
|
||||||
uint8_t UARTLine_TRANSEmpty(CMSDK_UART_TypeDef* UARTx);
|
uint8_t UARTLine_TRANSEmpty(CMSDK_UART_TypeDef* UARTx);
|
||||||
|
|
||||||
/*判断THR是否为空*/
|
/*<EFBFBD>ж<EFBFBD>THR<EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD>*/
|
||||||
uint8_t UARTLine_THREmpty(CMSDK_UART_TypeDef* UARTx);
|
uint8_t UARTLine_THREmpty(CMSDK_UART_TypeDef* UARTx);
|
||||||
|
|
||||||
/*UART初始化*/
|
/*UART<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>*/
|
||||||
void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX);
|
void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX);
|
||||||
void UART_ITConfig(CMSDK_UART_TypeDef *CMSDK_UART, UART_ITStructure* uart_paraX);
|
void UART_ITConfig(CMSDK_UART_TypeDef *CMSDK_UART, UART_ITStructure* uart_paraX);
|
||||||
unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch);
|
unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch);
|
||||||
|
void Uart_Send(CMSDK_UART_TypeDef *CMSDK_UART ,uint8_t *data, uint8_t len);
|
||||||
|
typedef struct {
|
||||||
|
uint16_t function_code; // 功能码 (0x0003)
|
||||||
|
uint16_t data_length; // 数据长度 (0x0001)
|
||||||
|
uint8_t switch_type; // 开关状态以及电刺激类型
|
||||||
|
uint8_t intensity; // 强度值
|
||||||
|
uint16_t frequency; // 频率值
|
||||||
|
uint16_t duration; // 总持续时间 (ms)
|
||||||
|
uint16_t rest_time; // 休息时间 (ms)
|
||||||
|
uint16_t silent_time; // 静默时间 (ms)
|
||||||
|
uint8_t ramp_up_time; // 缓进时间
|
||||||
|
uint8_t hold_time; // 保持时间
|
||||||
|
uint8_t ramp_down_time; // 缓出时间
|
||||||
|
uint16_t crc16; // CRC16校验
|
||||||
|
} UART_EMS_Packet_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
*Copyright (C),2023 , NANOCHAP
|
||||||
|
*File name: ENS1_WAVEGEN.H
|
||||||
|
*Author:
|
||||||
|
*Version: V1.0
|
||||||
|
*Date: 2023-11-
|
||||||
|
*Description: 波形生成器电刺激功能
|
||||||
|
*Function List:
|
||||||
|
1 int wavegen_driverA_sine_test(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t incount);
|
||||||
|
2 void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA);
|
||||||
|
3 void wavegen_Init(void);
|
||||||
|
4 void wavegen_Start(void);
|
||||||
|
History:
|
||||||
|
1.V1.0
|
||||||
|
Date:
|
||||||
|
Author:
|
||||||
|
Modification: 初版
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ENS1_WAVEGEN_H
|
||||||
|
#define ENS1_WAVEGEN_H
|
||||||
|
|
||||||
|
#include "CMSDK_CM0.h"
|
||||||
|
#include "my_header.h"
|
||||||
|
|
||||||
|
// 波形生成器驱动器A正弦波测试
|
||||||
|
int wavegen_driverA_sine_test(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t incount);
|
||||||
|
|
||||||
|
// 停止波形生成器
|
||||||
|
void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA);
|
||||||
|
|
||||||
|
// 初始化波形生成器
|
||||||
|
void wavegen_Init(void);
|
||||||
|
|
||||||
|
// 启动波形生成器
|
||||||
|
void wavegen_Start(void);
|
||||||
|
|
||||||
|
// 电刺激参数配置
|
||||||
|
typedef struct {
|
||||||
|
uint16_t frequency; // 频率 (Hz)
|
||||||
|
uint16_t duration; // 持续时间 (ms)
|
||||||
|
uint16_t intensity; // 强度 (0-255)
|
||||||
|
uint16_t rest_time; // 休息时间 (ms)
|
||||||
|
uint16_t silent_time; // 静默时间 (ms)
|
||||||
|
|
||||||
|
// 缓进缓出控制参数
|
||||||
|
uint8_t ramp_up_time; // 缓进时间:2秒
|
||||||
|
uint8_t hold_time; // 保持时间:6秒
|
||||||
|
uint8_t ramp_down_time; // 缓出时间:2秒
|
||||||
|
uint8_t enable_ramp; // 启用渐进控制
|
||||||
|
} EMS_Config_TypeDef;
|
||||||
|
extern uint16_t time_count;
|
||||||
|
extern float waves_per_step;
|
||||||
|
extern EMS_Config_TypeDef g_ems_config;
|
||||||
|
// 电刺激控制函数
|
||||||
|
void EMS_Configure(EMS_Config_TypeDef *config);
|
||||||
|
void EMS_Start(void);
|
||||||
|
void EMS_Stop(void);
|
||||||
|
void EMS_UpdateIntensity(uint16_t intensity);
|
||||||
|
void EMS_Process(void);
|
||||||
|
void EMS_Process_Ramp(void); // 缓进缓出处理函数
|
||||||
|
extern EMS_Config_TypeDef ems_config;
|
||||||
|
#endif
|
||||||
|
|
@ -1,38 +1,58 @@
|
||||||
|
/*
|
||||||
|
*Copyright (C),2023 , NANOCHAP
|
||||||
|
*File name: ENS1_BOOST.C
|
||||||
|
*Author:
|
||||||
|
*Version: V1.0
|
||||||
|
*Date: 2023-11-
|
||||||
|
*Description: 升压电压选择功能实现
|
||||||
|
*Function List:
|
||||||
|
1 void boost_voltage_select_11V(void);
|
||||||
|
2 void boost_voltage_select_15V(void);
|
||||||
|
3 void boost_voltage_select_26V(void);
|
||||||
|
4 void boost_voltage_select_45V(void);
|
||||||
|
5 void boost_voltage_select_55V(void);
|
||||||
|
History:
|
||||||
|
1.V1.0
|
||||||
|
Date:
|
||||||
|
Author:
|
||||||
|
Modification: 初版
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include "ENS1_BOOST.h"
|
#include "ENS1_BOOST.h"
|
||||||
#include "ENS1_CLOCK.h"
|
|
||||||
|
|
||||||
|
//占空比:1-20%=80% ,256分频 ,10.5A ,11V , 关闭功率,电压,内部升压使用
|
||||||
|
void boost_voltage_select_11V(void)
|
||||||
/*--------------------ÄÚ˛żBOOST_SET-----------------------*/
|
|
||||||
uint8_t Boost_Voltage_Sel(uint8_t VOLTAGE_XV)
|
|
||||||
{
|
{
|
||||||
PCLK_Enable(ANALOG_PCLK_EN);
|
CMSDK_ANAC->BOOST_CTRL =0x77013;//内部升压
|
||||||
switch (VOLTAGE_XV){
|
|
||||||
case VOLTAGE_11V :
|
|
||||||
CMSDK_ANAC->BOOST_CTRL =0x71013;//ÄÚ˛żboost
|
|
||||||
CMSDK_ANAC->PMU_CTRL = 0x10;
|
CMSDK_ANAC->PMU_CTRL = 0x10;
|
||||||
break;
|
}
|
||||||
|
|
||||||
case VOLTAGE_15V :
|
//占空比:1-20%=80% ,256分频 ,10.5A,15V 关闭功率,电压,内部升压使用
|
||||||
CMSDK_ANAC->BOOST_CTRL =0x71113;//ÄÚ˛żboost
|
void boost_voltage_select_15V(void)
|
||||||
|
{
|
||||||
|
CMSDK_ANAC->BOOST_CTRL =0x77113;
|
||||||
CMSDK_ANAC->PMU_CTRL = 0x10;
|
CMSDK_ANAC->PMU_CTRL = 0x10;
|
||||||
break;
|
|
||||||
case VOLTAGE_26V :
|
|
||||||
CMSDK_ANAC->BOOST_CTRL =0x71213;//ÄÚ˛żboost
|
|
||||||
CMSDK_ANAC->PMU_CTRL = 0x10;
|
|
||||||
break;
|
|
||||||
case VOLTAGE_45V :
|
|
||||||
CMSDK_ANAC->BOOST_CTRL =0xc1413;//
|
|
||||||
CMSDK_ANAC->PMU_CTRL = 0x10;
|
|
||||||
break;
|
|
||||||
case VOLTAGE_55V :
|
|
||||||
CMSDK_ANAC->BOOST_CTRL =0xc1713;//ÄÚ˛żboost
|
|
||||||
CMSDK_ANAC->PMU_CTRL = 0x10;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
CMSDK_ANAC->BOOST_CTRL =0x71013;//ÄÚ˛żboost
|
|
||||||
CMSDK_ANAC->PMU_CTRL = 0x10;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
//占空比:1-20%=80% ,256分频 ,10.5A ,26V,关闭功率,电压,内部升压使用
|
||||||
|
void boost_voltage_select_26V(void)
|
||||||
|
{
|
||||||
|
//占空比64分频 10.5A 26V 关闭功率 内部升压
|
||||||
|
CMSDK_ANAC->BOOST_CTRL =0x77213;//内部升压
|
||||||
|
CMSDK_ANAC->PMU_CTRL = 0x10;
|
||||||
|
}
|
||||||
|
|
||||||
|
//占空比:1-10%=90% ,16分频 ,10.5A ,45V,关闭功率,电压,内部升压使用
|
||||||
|
void boost_voltage_select_45V(void)
|
||||||
|
{
|
||||||
|
CMSDK_ANAC->BOOST_CTRL =0x97413;//内部升压
|
||||||
|
CMSDK_ANAC->PMU_CTRL = 0x10;
|
||||||
|
}
|
||||||
|
|
||||||
|
//占空比:1-10%=90% ,16分频 ,10.5A ,55V,关闭功率,电压,内部升压使用
|
||||||
|
void boost_voltage_select_55V(void)
|
||||||
|
{
|
||||||
|
CMSDK_ANAC->BOOST_CTRL =0x97713;//内部升压
|
||||||
|
CMSDK_ANAC->PMU_CTRL = 0x10;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,14 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "ENS1_CLOCK.h"
|
#include "ENS1_CLOCK.h"
|
||||||
|
|
||||||
uint32_t APB_Clock_Freq =0;
|
uint32_t APB_Clock_Freq =0;
|
||||||
//设置后的时钟频率请查看时钟树计算
|
//<EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鿴ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
Clock_ConfigStructure CLOCKCFG=
|
Clock_ConfigStructure CLOCKCFG=
|
||||||
{
|
{
|
||||||
.MCO_SEL = MCO_HSI ,
|
.MCO_SEL = MCO_HSI ,
|
||||||
|
|
@ -34,8 +34,8 @@ Clock_ConfigStructure CLOCKCFG=
|
||||||
uint32_t ClockInitSet(Clock_ConfigStructure* CLOCKCONFIG)
|
uint32_t ClockInitSet(Clock_ConfigStructure* CLOCKCONFIG)
|
||||||
{
|
{
|
||||||
uint32_t clockfreq = 0;
|
uint32_t clockfreq = 0;
|
||||||
//配置系统各时钟初始化
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>ʱ<EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
|
||||||
//1 确定输入频率
|
//1 ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>
|
||||||
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->MCO_SEL<<16);
|
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->MCO_SEL<<16);
|
||||||
if(CLOCKCONFIG->MCO_SEL == MCO_HSI)
|
if(CLOCKCONFIG->MCO_SEL == MCO_HSI)
|
||||||
{
|
{
|
||||||
|
|
@ -59,39 +59,40 @@ uint32_t ClockInitSet(Clock_ConfigStructure* CLOCKCONFIG)
|
||||||
CMSDK_SYSCON->HSI_CTRL |= (CLOCKCONFIG->HSI_FREQ << 4);
|
CMSDK_SYSCON->HSI_CTRL |= (CLOCKCONFIG->HSI_FREQ << 4);
|
||||||
clockfreq = (uint8_t)pow(2,CLOCKCONFIG->HSI_FREQ+2);
|
clockfreq = (uint8_t)pow(2,CLOCKCONFIG->HSI_FREQ+2);
|
||||||
}
|
}
|
||||||
//2 选择系统的时钟源
|
//2 ѡ<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Դ
|
||||||
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->SYSCLK_SEL);
|
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->SYSCLK_SEL);
|
||||||
while((CMSDK_SYSCON->CLK_CFG >> 2 ) & 0x1);
|
while((CMSDK_SYSCON->CLK_CFG >> 2 ) & 0x1);
|
||||||
//3 基于系统时钟源的频率设置分频系数
|
//3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Ƶϵ<EFBFBD><EFBFBD>
|
||||||
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->ENS1_AHB_PCLK_DIV_x << 8);
|
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->ENS1_AHB_PCLK_DIV_x << 8);
|
||||||
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->ENS1_APB_PCLK_DIV_x << 12);
|
CMSDK_SYSCON->CLK_CFG |= (CLOCKCONFIG->ENS1_APB_PCLK_DIV_x << 12);
|
||||||
if(CLOCKCONFIG->ENS1_AHB_PCLK_DIV_x > 0)
|
if(CLOCKCONFIG->ENS1_AHB_PCLK_DIV_x > 0)
|
||||||
clockfreq = (uint32_t)(clockfreq / pow(2,CLOCKCONFIG->ENS1_AHB_PCLK_DIV_x-3));
|
clockfreq = (uint32_t)(clockfreq / pow(2,CLOCKCONFIG->ENS1_AHB_PCLK_DIV_x-3));
|
||||||
if(CLOCKCONFIG->ENS1_APB_PCLK_DIV_x > 0)
|
if(CLOCKCONFIG->ENS1_APB_PCLK_DIV_x > 0)
|
||||||
clockfreq = (uint32_t)(clockfreq / pow(2,CLOCKCONFIG->ENS1_APB_PCLK_DIV_x-3));
|
clockfreq = (uint32_t)(clockfreq / pow(2,CLOCKCONFIG->ENS1_APB_PCLK_DIV_x-3));
|
||||||
return clockfreq; //返回时钟频率(分频后的APB上的时钟频率)
|
return clockfreq; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>APB<EFBFBD>ϵ<EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockInit(void)
|
void ClockInit(void)
|
||||||
{
|
{
|
||||||
APB_Clock_Freq = ClockInitSet(&CLOCKCFG);
|
APB_Clock_Freq = ClockInitSet(&CLOCKCFG);
|
||||||
CMSDK_SYSCON->APB_CLKEN = 0;
|
// 不清零APB时钟使能,避免影响其他外设
|
||||||
|
// CMSDK_SYSCON->APB_CLKEN = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//PCLK时钟使能
|
//PCLKʱ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||||
uint8_t PCLK_Enable(uint8_t APB_CLKEN_POS)
|
uint8_t PCLK_Enable(uint8_t APB_CLKEN_POS)
|
||||||
{
|
{
|
||||||
CMSDK_SYSCON->APB_CLKEN |= (0x1 << APB_CLKEN_POS);
|
CMSDK_SYSCON->APB_CLKEN |= (0x1 << APB_CLKEN_POS);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//PCLK时钟关闭
|
//PCLKʱ<EFBFBD>ӹر<EFBFBD>
|
||||||
uint8_t PCLK_Disable(uint8_t APB_CLKEN_POS)
|
uint8_t PCLK_Disable(uint8_t APB_CLKEN_POS)
|
||||||
{
|
{
|
||||||
CMSDK_SYSCON->APB_CLKEN &=~ (0x1 << APB_CLKEN_POS);
|
CMSDK_SYSCON->APB_CLKEN &=~ (0x1 << APB_CLKEN_POS);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//配置外部晶振,配置前请保留足够延时,否则无法二次烧录程序
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>뱣<EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
void HSE_ClockInit(uint32_t Clock_Freq)
|
void HSE_ClockInit(uint32_t Clock_Freq)
|
||||||
{
|
{
|
||||||
CMSDK_GPIO->IE = (CMSDK_GPIO->IE & ~(0x01ul << 0)) | (0x01 << 0);
|
CMSDK_GPIO->IE = (CMSDK_GPIO->IE & ~(0x01ul << 0)) | (0x01 << 0);
|
||||||
|
|
@ -99,5 +100,5 @@ void HSE_ClockInit(uint32_t Clock_Freq)
|
||||||
CMSDK_SYSCON->CLK_CFG = (CMSDK_SYSCON->CLK_CFG & ~CMSDK_SYSCON_SYSCLK_SEL_Msk) | (0x1 << CMSDK_SYSCON_SYSCLK_SEL_Pos);
|
CMSDK_SYSCON->CLK_CFG = (CMSDK_SYSCON->CLK_CFG & ~CMSDK_SYSCON_SYSCLK_SEL_Msk) | (0x1 << CMSDK_SYSCON_SYSCLK_SEL_Pos);
|
||||||
while (((CMSDK_SYSCON->CLK_CFG & CMSDK_SYSCON_SYSCLK_SWSTS_Msk) >> CMSDK_SYSCON_SYSCLK_SWSTS_Pos) != 0x01) { }
|
while (((CMSDK_SYSCON->CLK_CFG & CMSDK_SYSCON_SYSCLK_SWSTS_Msk) >> CMSDK_SYSCON_SYSCLK_SWSTS_Pos) != 0x01) { }
|
||||||
CMSDK_SYSCON->HSI_CTRL = (CMSDK_SYSCON->HSI_CTRL & ~CMSDK_SYSCON_HSI_EN_Msk);
|
CMSDK_SYSCON->HSI_CTRL = (CMSDK_SYSCON->HSI_CTRL & ~CMSDK_SYSCON_HSI_EN_Msk);
|
||||||
APB_Clock_Freq = Clock_Freq;//外部时钟频率
|
APB_Clock_Freq = Clock_Freq;//<EFBFBD>ⲿʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ENS1_IIC.h"
|
#include "ENS1_IIC.h"
|
||||||
|
|
@ -33,37 +33,37 @@ IIC_ConfigStructure IIC1_Config =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//bus error 判断(ITERREN使能)
|
//bus error <EFBFBD>жϣ<EFBFBD>ITERRENʹ<EFBFBD>ܣ<EFBFBD>
|
||||||
bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 8)&0x1) ? true :false);}
|
bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 8)&0x1) ? true :false);}
|
||||||
//应答错误判断
|
//Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 10)&0x1) ? true :false);}
|
bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 10)&0x1) ? true :false);}
|
||||||
//仲裁
|
//<EFBFBD>ٲ<EFBFBD>
|
||||||
bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 9)&0x1) ? true :false);}
|
bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 9)&0x1) ? true :false);}
|
||||||
//溢出/下溢错误
|
//<EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 11)&0x1) ? true :false);}
|
bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 11)&0x1) ? true :false);}
|
||||||
|
|
||||||
//ITEVFEN使能后有如下事件
|
//ITEVFENʹ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
//起始状态,起始位发送(主机模式)
|
//<EFBFBD><EFBFBD>ʼ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
|
||||||
bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS)&0x1) ? true :false);}
|
bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS)&0x1) ? true :false);}
|
||||||
//地址发送(主机模式) / 地址匹配(从机事件)
|
//<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD> / <20><>ַƥ<D6B7>䣨<EFBFBD>ӻ<EFBFBD><D3BB>¼<EFBFBD><C2BC><EFBFBD>
|
||||||
bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 1)&0x1) ? true :false);}
|
bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 1)&0x1) ? true :false);}
|
||||||
//主机模式下,主机已发送10bit地址数据的第一个字节!!!
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><EFBFBD><EFBFBD>10bit<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ݵĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 3)&0x1) ? true :false);}
|
bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 3)&0x1) ? true :false);}
|
||||||
//从机模式下,停止条件被接收到
|
//<EFBFBD>ӻ<EFBFBD>ģʽ<EFBFBD>£<EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
|
||||||
bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 4)&0x1) ? true :false);}
|
bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 4)&0x1) ? true :false);}
|
||||||
//数据字节传输成功
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
|
||||||
bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 2)&0x1) ? true :false);}
|
bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 2)&0x1) ? true :false);}
|
||||||
|
|
||||||
//ITEVFEN 且 ITBUFEN 使能后,有如下事件
|
//ITEVFEN <EFBFBD><EFBFBD> ITBUFEN ʹ<>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
//数据寄存器非空(接受器读到数据)
|
//<EFBFBD><EFBFBD><EFBFBD>ݼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿգ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||||
bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 5)&0x1) ? true :false);}
|
bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 5)&0x1) ? true :false);}
|
||||||
//数据寄存器空(传输完数据)
|
//<EFBFBD><EFBFBD><EFBFBD>ݼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||||
bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 6)&0x1) ? true :false);}
|
bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 6)&0x1) ? true :false);}
|
||||||
|
|
||||||
//总线状态:繁忙与否
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>æ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (uint8_t)(((CMSDK_I2Cx->I2C_STS >> 13)&0x1) ? 1 :0);};
|
uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (uint8_t)(((CMSDK_I2Cx->I2C_STS >> 13)&0x1) ? 1 :0);};
|
||||||
|
|
||||||
//模式确认
|
//ģʽȷ<EFBFBD><EFBFBD>
|
||||||
bool IIC_MASTER_MODE(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 12)&0x1) ? true :false);}
|
bool IIC_MASTER_MODE(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 12)&0x1) ? true :false);}
|
||||||
|
|
||||||
uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* IIC_Para )
|
uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* IIC_Para )
|
||||||
|
|
@ -80,7 +80,7 @@ uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* II
|
||||||
}
|
}
|
||||||
if(IIC_Para->MODE == IIC_SLAVE)
|
if(IIC_Para->MODE == IIC_SLAVE)
|
||||||
{
|
{
|
||||||
// CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//中断使能--bit8:buffer中断 / bit7:事件中断 / bit6:错误中断
|
// CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
CMSDK_I2Cx->I2C_CR1|=(1);
|
CMSDK_I2Cx->I2C_CR1|=(1);
|
||||||
CMSDK_I2Cx->I2C_OAR = IIC_Para->OWN_ADDRESS ;
|
CMSDK_I2Cx->I2C_OAR = IIC_Para->OWN_ADDRESS ;
|
||||||
if(IIC_Para->ACK_EN == true)
|
if(IIC_Para->ACK_EN == true)
|
||||||
|
|
@ -90,9 +90,9 @@ uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* II
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
IIC master transmitter:
|
IIC master transmitter:
|
||||||
IIC_CR2:配置中断时钟频率
|
IIC_CR2:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>
|
||||||
IIC_CR1:使能IIC接口
|
IIC_CR1:ʹ<EFBFBD><EFBFBD>IIC<EFBFBD>ӿ<EFBFBD>
|
||||||
IIC_CR1:配置START 位 IIC主机
|
IIC_CR1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>START λ IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
CMSDK_I2Cx->I2C_CR2 |= IIC_Para->IIC_SPEED ;
|
CMSDK_I2Cx->I2C_CR2 |= IIC_Para->IIC_SPEED ;
|
||||||
CMSDK_I2Cx->I2C_CR1 |= (1) ;
|
CMSDK_I2Cx->I2C_CR1 |= (1) ;
|
||||||
|
|
@ -125,7 +125,7 @@ void IIC_ITConfig(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint16_t IIC_IT_SEL ,Functional
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //使能IIC外设
|
void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //ʹ<EFBFBD><EFBFBD>IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
if(CMSDK_I2Cx ==CMSDK_I2C0)
|
if(CMSDK_I2Cx ==CMSDK_I2C0)
|
||||||
{
|
{
|
||||||
|
|
@ -157,8 +157,8 @@ void IIC_GenerateSTOP(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||||||
CMSDK_I2Cx->I2C_CR1 |= (1<<4);
|
CMSDK_I2Cx->I2C_CR1 |= (1<<4);
|
||||||
}
|
}
|
||||||
|
|
||||||
//general call 用于向总线所有设备发送消息,用于初始化从设备与设备同步
|
//general call <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD>豸ͬ<EFBFBD><EFBFBD>
|
||||||
//主设备通过向总线发送0x00地址来触发GENERAL CALL
|
//<EFBFBD><EFBFBD><EFBFBD>豸ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><EFBFBD><EFBFBD>0x00<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GENERAL CALL
|
||||||
void IIC_GeneralCallCmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
void IIC_GeneralCallCmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -172,7 +172,7 @@ void IIC_Send7bitAddress(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint8_t Address)
|
||||||
void IIC_SendData(CMSDK_I2C_TypeDef* CMSDK_I2Cx , uint8_t data)
|
void IIC_SendData(CMSDK_I2C_TypeDef* CMSDK_I2Cx , uint8_t data)
|
||||||
{
|
{
|
||||||
CMSDK_I2Cx->I2C_DR = data;
|
CMSDK_I2Cx->I2C_DR = data;
|
||||||
while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //字节传输完成
|
while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //<EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t IIC_ReadData(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
uint8_t IIC_ReadData(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
|
||||||
|
|
@ -211,9 +211,9 @@ void I2C0_Event_Handler(void)
|
||||||
}
|
}
|
||||||
if(IIC_STOPF_EVENT(CMSDK_I2C0) == true)
|
if(IIC_STOPF_EVENT(CMSDK_I2C0) == true)
|
||||||
{
|
{
|
||||||
//如果不再接收,则关闭IIC!!!
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><EFBFBD>գ<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>IIC!!!
|
||||||
IIC_Cmd(CMSDK_I2C0 ,DISABLE) ;
|
IIC_Cmd(CMSDK_I2C0 ,DISABLE) ;
|
||||||
CMSDK_I2C0->I2C_CR2|=(1<<7); //中断使能--bit8:buffer中断 / bit7:事件中断 / bit6:错误中断
|
CMSDK_I2C0->I2C_CR2|=(1<<7); //<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
CMSDK_I2C0->I2C_CR1|=(1);
|
CMSDK_I2C0->I2C_CR1|=(1);
|
||||||
CMSDK_I2C0->I2C_OAR = 0X78 ;
|
CMSDK_I2C0->I2C_OAR = 0X78 ;
|
||||||
CMSDK_I2C0->I2C_CR1 |= (1<<5);
|
CMSDK_I2C0->I2C_CR1 |= (1<<5);
|
||||||
|
|
@ -230,7 +230,6 @@ void I2C0_Event_Handler(void)
|
||||||
if(IIC_RxNE_EVENT(CMSDK_I2C0) == true)
|
if(IIC_RxNE_EVENT(CMSDK_I2C0) == true)
|
||||||
{
|
{
|
||||||
uint8_t read_data = (uint8_t)(CMSDK_I2C0->I2C_DR & 0xff);
|
uint8_t read_data = (uint8_t)(CMSDK_I2C0->I2C_DR & 0xff);
|
||||||
printf("%d\n", read_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_TxE_EVENT(CMSDK_I2C0) == true)
|
if(IIC_TxE_EVENT(CMSDK_I2C0) == true)
|
||||||
|
|
@ -246,25 +245,21 @@ void I2C0_Error_Handler(void)
|
||||||
|
|
||||||
if(IIC_BUS_ERROR(CMSDK_I2C0) == true)
|
if(IIC_BUS_ERROR(CMSDK_I2C0) == true)
|
||||||
{
|
{
|
||||||
printf("bus error\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_ACK_ERROR(CMSDK_I2C0) == true)
|
if(IIC_ACK_ERROR(CMSDK_I2C0) == true)
|
||||||
{
|
{
|
||||||
printf("IIC_ACK_ERROR\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_ARBITRAT_ERROR(CMSDK_I2C0) == true)
|
if(IIC_ARBITRAT_ERROR(CMSDK_I2C0) == true)
|
||||||
{
|
{
|
||||||
printf("IIC_ARBITRAT_ERROR\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_OVERRUN_ERROR(CMSDK_I2C0) == true)
|
if(IIC_OVERRUN_ERROR(CMSDK_I2C0) == true)
|
||||||
{
|
{
|
||||||
printf("IIC_OVERRUN_ERROR\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -293,17 +288,16 @@ void I2C1_Event_Handler(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //作为从机,进入此处则地址匹配!
|
if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //<EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַƥ<EFBFBD>䣡
|
||||||
{
|
{
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //作为从机,接收到STOP信号
|
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //<EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>STOP<EFBFBD>ź<EFBFBD>
|
||||||
{
|
{
|
||||||
printf("get stop\n");
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>գ<EFBFBD><D5A3><EFBFBD>ر<EFBFBD>IIC!!!
|
||||||
//如果不再接收,则关闭IIC!!!
|
|
||||||
IIC_Cmd(CMSDK_I2C1 ,DISABLE) ;
|
IIC_Cmd(CMSDK_I2C1 ,DISABLE) ;
|
||||||
CMSDK_I2C1->I2C_CR2|=(1<<7); //中断使能--bit8:buffer中断 / bit7:事件中断 / bit6:错误中断
|
CMSDK_I2C1->I2C_CR2|=(1<<7); //<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
CMSDK_I2C1->I2C_CR1|=(1);
|
CMSDK_I2C1->I2C_CR1|=(1);
|
||||||
CMSDK_I2C1->I2C_OAR = 0X78 ;
|
CMSDK_I2C1->I2C_OAR = 0X78 ;
|
||||||
CMSDK_I2C1->I2C_CR1 |= (1<<5);
|
CMSDK_I2C1->I2C_CR1 |= (1<<5);
|
||||||
|
|
@ -317,10 +311,9 @@ void I2C1_Event_Handler(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //作为从机,buffer非空,读IIC_DR中的数据
|
if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //<EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>buffer<EFBFBD>ǿգ<EFBFBD><EFBFBD><EFBFBD>IIC_DR<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
uint8_t read_data = (uint8_t)(CMSDK_I2C1->I2C_DR & 0xff);
|
uint8_t read_data = (uint8_t)(CMSDK_I2C1->I2C_DR & 0xff);
|
||||||
printf("%d\n", read_data);
|
|
||||||
}
|
}
|
||||||
if(IIC_TxE_EVENT(CMSDK_I2C1) == true)
|
if(IIC_TxE_EVENT(CMSDK_I2C1) == true)
|
||||||
{
|
{
|
||||||
|
|
@ -335,25 +328,21 @@ void I2C1_Error_Handler(void)
|
||||||
|
|
||||||
if(IIC_BUS_ERROR(CMSDK_I2C1) == true)
|
if(IIC_BUS_ERROR(CMSDK_I2C1) == true)
|
||||||
{
|
{
|
||||||
printf("bus error\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_ACK_ERROR(CMSDK_I2C1) == true)
|
if(IIC_ACK_ERROR(CMSDK_I2C1) == true)
|
||||||
{
|
{
|
||||||
printf("IIC_ACK_ERROR\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_ARBITRAT_ERROR(CMSDK_I2C1) == true)
|
if(IIC_ARBITRAT_ERROR(CMSDK_I2C1) == true)
|
||||||
{
|
{
|
||||||
printf("IIC_ARBITRAT_ERROR\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IIC_OVERRUN_ERROR(CMSDK_I2C1) == true)
|
if(IIC_OVERRUN_ERROR(CMSDK_I2C1) == true)
|
||||||
{
|
{
|
||||||
printf("IIC_OVERRUN_ERROR\n");
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,14 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
MTP说明
|
MTP˵<EFBFBD><EFBFBD>
|
||||||
1、MTP部分只能按块写入,每块有1024字节大小
|
1<EFBFBD><EFBFBD>MTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>ܰ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>,ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1024<EFBFBD>ֽڴ<EFBFBD>С
|
||||||
块的编号:
|
<EFBFBD><EFBFBD>ı<EFBFBD>ţ<EFBFBD>
|
||||||
SECTOR 0 : 0000H - 03FFH
|
SECTOR 0 : 0000H - 03FFH
|
||||||
SECTOR 1 : 0400H - 07FFH
|
SECTOR 1 : 0400H - 07FFH
|
||||||
SECTOR 2 : 0800H - 0BFFH
|
SECTOR 2 : 0800H - 0BFFH
|
||||||
|
|
@ -34,8 +34,8 @@ SECTOR 7 : 1C00H - 1FFFH
|
||||||
uint16_t write_current_data[4]={0,0,0,0};
|
uint16_t write_current_data[4]={0,0,0,0};
|
||||||
STRUCT_MTP_TRIM MTP_FT_SET=
|
STRUCT_MTP_TRIM MTP_FT_SET=
|
||||||
{
|
{
|
||||||
.OSCA_FT = 0x10, //默认值为 0X10
|
.OSCA_FT = 0x10, //Ĭ<EFBFBD><EFBFBD>ֵΪ 0X10
|
||||||
.OSC32K_RTRIM = 0x10, //默认值为 0X10
|
.OSC32K_RTRIM = 0x10, //Ĭ<EFBFBD><EFBFBD>ֵΪ 0X10
|
||||||
.BG_TRIM = 0x88,
|
.BG_TRIM = 0x88,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
@ -52,30 +52,29 @@ uint8_t MTP_init(void)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//MTP内保存的电流检测数据读取
|
//MTP<EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ
|
||||||
void flash_read(uint32_t start_addr,uint16_t *test_i){
|
void flash_read(uint32_t start_addr,uint16_t *test_i){
|
||||||
uint16_t result = 0;
|
uint16_t result = 0;
|
||||||
result = HW16_REG(start_addr);
|
result = HW16_REG(start_addr);
|
||||||
*test_i = result ;
|
*test_i = result ;
|
||||||
}
|
}
|
||||||
|
|
||||||
//向MTP中写入数据(仅限于向用户自定义块写入!!!)
|
//<EFBFBD><EFBFBD>MTP<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>룡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
//可自定义读写的区域为MTP的第0x1BC0块(MTP_BASE_ADDR + 0x6F00)
|
//<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪMTP<EFBFBD>ĵ<EFBFBD>0x1BC0<EFBFBD>飨MTP_BASE_ADDR + 0x6F00<30><30>
|
||||||
int8_t flash_buff_write(uint32_t start_addr, uint16_t *buff) {
|
int8_t flash_buff_write(uint32_t start_addr, uint16_t *buff) {
|
||||||
HW32_REG(start_addr) = ((uint32_t)((*(buff+1)<<16)&0xffff0000) + ((*buff)&0x0000ffff));
|
HW32_REG(start_addr) = ((uint32_t)((*(buff+1)<<16)&0xffff0000) + ((*buff)&0x0000ffff));
|
||||||
// while(!(CMSDK_MTPREG->MTP_SR&0x00000002)){};
|
// while(!(CMSDK_MTPREG->MTP_SR&0x00000002)){};
|
||||||
if(HW32_REG(start_addr) != ((uint32_t)(*(buff+1)<<16) + *buff ))
|
if(HW32_REG(start_addr) != ((uint32_t)(*(buff+1)<<16) + *buff ))
|
||||||
{
|
{
|
||||||
printf("write error\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){
|
int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){
|
||||||
CMSDK_MTPREG->MTP_CLR = 0xffffffff; //SR寄存器
|
CMSDK_MTPREG->MTP_CLR = 0xffffffff; //SR<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
CMSDK_MTPREG->MTP_CR = 0x00000002; //2等待周期
|
CMSDK_MTPREG->MTP_CR = 0x00000002; //2<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
CMSDK_MTPREG->MTP_ACLR = 0x00000000; //允许软件读写从sector0 -sector 6 (sector7 作为bootloader区)
|
CMSDK_MTPREG->MTP_ACLR = 0x00000000; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>sector0 -sector 6 <20><>sector7 <20><>Ϊbootloader<65><72><EFBFBD><EFBFBD>
|
||||||
CMSDK_MTPREG->MTP_KEYR = 0x5a5a5a5a; //key
|
CMSDK_MTPREG->MTP_KEYR = 0x5a5a5a5a; //key
|
||||||
return flash_buff_write(start_addr, buff);
|
return flash_buff_write(start_addr, buff);
|
||||||
}
|
}
|
||||||
|
|
@ -83,7 +82,7 @@ int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){
|
||||||
int8_t write_data(void){
|
int8_t write_data(void){
|
||||||
uint16_t *wr_data = (uint16_t *)malloc(8*sizeof(uint8_t));
|
uint16_t *wr_data = (uint16_t *)malloc(8*sizeof(uint8_t));
|
||||||
memcpy(wr_data , write_current_data, 8);
|
memcpy(wr_data , write_current_data, 8);
|
||||||
int8_t val = flash_write_ctrl(wr_data,DATA_SAVE_ADDR); //第 0x1BC0块
|
int8_t val = flash_write_ctrl(wr_data,DATA_SAVE_ADDR); //<EFBFBD><EFBFBD> 0x1BC0<43><30>
|
||||||
val = flash_write_ctrl(wr_data+2, DATA_SAVE_ADDR + 4);
|
val = flash_write_ctrl(wr_data+2, DATA_SAVE_ADDR + 4);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: 2023-11-15
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ENS1_SPI.h"
|
#include "ENS1_SPI.h"
|
||||||
#include "ENS1_GPIO.h"
|
#include "ENS1_GPIO.h"
|
||||||
/*---------------------------------------------------fifo相关的函数头--------------------------------------------------*/
|
/*---------------------------------------------------fifo????????--------------------------------------------------*/
|
||||||
/*清除FIFO和计数清0*/
|
/* Clear FIFO and reset to 0 */
|
||||||
uint8_t CLR_TX_FIFO( CMSDK_SPI_TypeDef* SPIx)
|
uint8_t CLR_TX_FIFO( CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)(SPIx->FCR>>8 & 0x1);
|
return (uint8_t)(SPIx->FCR>>8 & 0x1);
|
||||||
|
|
@ -27,47 +27,47 @@ uint8_t CLR_RX_FIFO(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)(SPIx->FCR>>1 & 0x1);
|
return (uint8_t)(SPIx->FCR>>1 & 0x1);
|
||||||
}
|
}
|
||||||
/*FIFO 状态读取*/
|
/*FIFO ?????*/
|
||||||
uint8_t RX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t RX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x001f0000)>>16)):0); //读取当前接收FIFO数据长度
|
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x001f0000)>>16)):0); //??????????FIFO???????
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t TX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t TX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x00001f00)>>8)):0); //读取当前发送FIFO数据长度
|
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x00001f00)>>8)):0); //??????????FIFO???????
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_BUSY_STATE BUSY_STATE(CMSDK_SPI_TypeDef* SPIx)
|
SPI_BUSY_STATE BUSY_STATE(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (SPI_BUSY_STATE)((((SPIx->FSR & 0x10) >> 4)==1) ? ( BUSY ) : ( NOTBUSY )); //读取当前SPI是否繁忙
|
return (SPI_BUSY_STATE)((((SPIx->FSR & 0x10) >> 4)==1) ? ( BUSY ) : ( NOTBUSY )); //??????SPI????
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t RX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t RX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)((((SPIx->FSR & 0x8)>> 3 )==1) ? (1) : (0)) ; //当前读取FIFO是否为满?
|
return (uint8_t)((((SPIx->FSR & 0x8)>> 3 )==1) ? (1) : (0)) ; //??????FIFO????????
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t RX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t RX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)((((SPIx->FSR & 0x4) >> 2)==1) ? (1) : (0) ) ; //当前读取FIFO是否为空?
|
return (uint8_t)((((SPIx->FSR & 0x4) >> 2)==1) ? (1) : (0) ) ; //??????FIFO???????
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t TX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t TX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)((((SPIx->FSR & 0x2) >> 1)==1) ? (1) : (0)) ; //当前发送FIFO是否为满?
|
return (uint8_t)((((SPIx->FSR & 0x2) >> 1)==1) ? (1) : (0)) ; //???????FIFO????????
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t TX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t TX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint8_t)(((SPIx->FSR & 0x1)==1) ? (1) : (0)) ; //当前发送FIFO是否为空?
|
return (uint8_t)(((SPIx->FSR & 0x1)==1) ? (1) : (0)) ; //???????FIFO???????
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*FIFO使能/DMA使能*/
|
/*FIFO???/DMA???*/
|
||||||
uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx) //读FIFO设置
|
uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx) //??FIFO????
|
||||||
{
|
{
|
||||||
return (uint8_t)(SPIx->FCR & 0x1) ;
|
return (uint8_t)(SPIx->FCR & 0x1) ;
|
||||||
}
|
}
|
||||||
|
|
@ -83,30 +83,30 @@ uint8_t SPI_FIFO_DISABLE(CMSDK_SPI_TypeDef* SPIx )
|
||||||
return (uint8_t)(SPIx->FCR & 0x1) ;
|
return (uint8_t)(SPIx->FCR & 0x1) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t SPI_FIFODMA_SET(CMSDK_SPI_TypeDef* SPIx ,bool TXDMA_SET ,bool RXDMA_SET)
|
uint8_t SPI_FIFODMA_SET(CMSDK_SPI_TypeDef* SPIx ,int TXDMA_SET ,int RXDMA_SET)
|
||||||
{
|
{
|
||||||
if(TXDMA_SET == true)
|
if(TXDMA_SET == 1)
|
||||||
SPIx->CTRL2 |= (1<<5);
|
SPIx->CTRL2 |= (1<<5);
|
||||||
else if(TXDMA_SET == false)
|
else if(TXDMA_SET == 0)
|
||||||
SPIx->CTRL2 &=~ (1<<5);
|
SPIx->CTRL2 &=~ (1<<5);
|
||||||
|
|
||||||
if(TXDMA_SET == true)
|
if(TXDMA_SET == 1)
|
||||||
SPIx->CTRL2 |= (1<<4);
|
SPIx->CTRL2 |= (1<<4);
|
||||||
else if(TXDMA_SET == false)
|
else if(TXDMA_SET == 0)
|
||||||
SPIx->CTRL2 &=~ (1<<4);
|
SPIx->CTRL2 &=~ (1<<4);
|
||||||
return (uint8_t)((SPIx->CTRL2>>4)&0x3);
|
return (uint8_t)((SPIx->CTRL2>>4)&0x3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------fifo相关的函数尾--------------------------------------------------*/
|
/*------------------------------------------------------fifo???????<3F><>--------------------------------------------------*/
|
||||||
|
|
||||||
/*----------------------------------------------------------SPI配置-------------------------------------------------------*/
|
/*----------------------------------------------------------SPI????-------------------------------------------------------*/
|
||||||
//读取当前的SPI模式
|
//????????SPI??
|
||||||
uint8_t READ_SPI_MODE(CMSDK_SPI_TypeDef* SPIx)
|
uint8_t READ_SPI_MODE(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return ((SPIx->CTRL1 & 0x7000) >> 12);
|
return ((SPIx->CTRL1 & 0x7000) >> 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
//NSS通道选择
|
//NSS??????
|
||||||
uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,FunctionalState ENorDIS)
|
uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,FunctionalState ENorDIS)
|
||||||
{
|
{
|
||||||
if(ENorDIS == ENABLE)
|
if(ENorDIS == ENABLE)
|
||||||
|
|
@ -117,12 +117,12 @@ uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,Functiona
|
||||||
return (uint8_t)((SPIx->CTRL2 & 0x0f00) >> 8);
|
return (uint8_t)((SPIx->CTRL2 & 0x0f00) >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
//spi的参数配置
|
//spi?????????
|
||||||
uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
|
uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
|
||||||
struct SPI_ModeConfig_Struct SPI_Config,
|
struct SPI_ModeConfig_Struct SPI_Config,
|
||||||
struct SPI_FIFO_Struct FIFO_Struct)
|
struct SPI_FIFO_Struct FIFO_Struct)
|
||||||
{
|
{
|
||||||
/*1、GPIO ALTER*/
|
/*1??GPIO ALTER*/
|
||||||
if(SPIx == CMSDK_SPI1)
|
if(SPIx == CMSDK_SPI1)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -144,21 +144,21 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
2、写SPI_CTRL1寄存器
|
2??<EFBFBD><EFBFBD>SPI_CTRL1?????
|
||||||
(1)配置时钟波特率BAUD_RATE[2:0]
|
??1??????????????BAUD_RATE[2:0]
|
||||||
(2)配置时钟极性和相位 CPOL and CPHA bits
|
??2???????????????<EFBFBD><EFBFBD> CPOL and CPHA bits
|
||||||
(3)选择传输模式 BIDI_EN, BIDI_MODE, UNIDI_MODE bits
|
??3????????? BIDI_EN, BIDI_MODE, UNIDI_MODE bits
|
||||||
(4)配置LSB_SEL位来定义帧格式
|
??4??????LSB_SEL<EFBFBD><EFBFBD>??????????
|
||||||
(5)通过配置NSS_TOGGLE、NSS_MST_CTRL、NSS_MST_SW bits来选择NSS控制方式 bit11 9 8
|
??5?????????NSS_TOGGLE??NSS_MST_CTRL??NSS_MST_SW bits?????NSS?????? bit11 9 8
|
||||||
(6)通过配置MST_SLV_SEL位选择主模式或从模式
|
??6?????????MST_SLV_SEL<EFBFBD><EFBFBD>????????????
|
||||||
*/
|
*/
|
||||||
SPIx->CTRL1 = (SPIx->CTRL1&~ 0xffff) | ( SPI_Config.BAUD_FPCLKdivx << 4);
|
SPIx->CTRL1 = (SPIx->CTRL1&~ 0xffff) | ( SPI_Config.BAUD_FPCLKdivx << 4);
|
||||||
SPIx->CTRL1 |= (SPI_Config.SPI_MODE << 2);
|
SPIx->CTRL1 |= (SPI_Config.SPI_MODE << 2);
|
||||||
SPIx->CTRL1 |= (SPI_Config.SPI_TRANS_MODE << 12 );
|
SPIx->CTRL1 |= (SPI_Config.SPI_TRANS_MODE << 12 );
|
||||||
SPIx->CTRL1 &=~ (0x1 << 7); //帧格式默认大端模式
|
SPIx->CTRL1 &=~ (0x1 << 7); //???????????
|
||||||
SPIx->CTRL1 &=~ (0x1 << 8); //帧格式默认大端模式
|
SPIx->CTRL1 &=~ (0x1 << 8); //???????????
|
||||||
SPIx->CTRL1 &=~ (1 << 11);
|
SPIx->CTRL1 &=~ (1 << 11);
|
||||||
SPIx->CTRL1 |= (1 << 11) ; // 默认硬件生成NSS
|
SPIx->CTRL1 |= (1 << 11) ; // ??????????NSS
|
||||||
|
|
||||||
if(SPI_Config.MS_SEL == MASTER)
|
if(SPI_Config.MS_SEL == MASTER)
|
||||||
{
|
{
|
||||||
|
|
@ -169,12 +169,12 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
|
||||||
SPIx->CTRL1 &=~ (1<<1);
|
SPIx->CTRL1 &=~ (1<<1);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
3、写SPI_CTRL2寄存器
|
3??<EFBFBD><EFBFBD>SPI_CTRL2?????
|
||||||
(1)配置CHAR_LEN[3:0]位来选择传输的数据长度
|
??1??????CHAR_LEN[3:0]<EFBFBD><EFBFBD>???????????????
|
||||||
(2)选择“NSS端口” NSS0_EN, NSS1_EN, NSS2_EN
|
??2?????NSS???? NSS0_EN, NSS1_EN, NSS2_EN
|
||||||
(3)通过配置主机选择合适的RX数据采集阶段 SAMP_PHASE(1:0)位
|
??3????????????????????RX????????? SAMP_PHASE(1:0)<EFBFBD><EFBFBD>
|
||||||
(4)通过配置C2T_DELAY和T2C_DELAY位,可以根据从设备的需求选择合适的C2T/T2C延迟
|
??4?????????C2T_DELAY??T2C_DELAY<EFBFBD><EFBFBD>???????????<EFBFBD><EFBFBD>?????????????C2T/T2C???
|
||||||
(5)通过配置TXDMA_EN和RXDMA_EN位使能或使能FIFO模式的TX/RX DMA。
|
??5?????????TXDMA_EN??RXDMA_EN<EFBFBD><EFBFBD>???????FIFO????TX/RX DMA??
|
||||||
*/
|
*/
|
||||||
SPIx->CTRL2 = (SPIx->CTRL2&~ 0xffff);
|
SPIx->CTRL2 = (SPIx->CTRL2&~ 0xffff);
|
||||||
if(SPI_Config.CHAR_LEN < 4)
|
if(SPI_Config.CHAR_LEN < 4)
|
||||||
|
|
@ -190,34 +190,34 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
|
||||||
|
|
||||||
}
|
}
|
||||||
SPI_NSS_CHANNEL(SPIx ,SPI_Config.NSSx ,ENABLE);
|
SPI_NSS_CHANNEL(SPIx ,SPI_Config.NSSx ,ENABLE);
|
||||||
//rx读采集相位, 仅仅在主模式下有效,默认选normal
|
//rx???????<3F><>?? ??????????????<3F><>??????normal
|
||||||
//C2T_DELAY ,仅在主模式下有效
|
//C2T_DELAY ,????????????<3F><>
|
||||||
//T2C_DELAY, 仅在主模式下有效
|
//T2C_DELAY, ????????????<3F><>
|
||||||
if(SPI_Config.MS_SEL == MASTER)
|
if(SPI_Config.MS_SEL == MASTER)
|
||||||
{
|
{
|
||||||
SPIx->CTRL2 |= (SPI_Config.SAMP_PHASE << 6);
|
SPIx->CTRL2 |= (SPI_Config.SAMP_PHASE << 6);
|
||||||
//T2C 是Transmit-end-to-chip-inactive 的延迟时间,默认为1T SCK
|
//T2C ??Transmit-end-to-chip-inactive ????????????1T SCK
|
||||||
//C2T 是Chip-select-active-to-transmit-start 的时间 默认1T SCK ,这里对这两参数没做设置
|
//C2T ??Chip-select-active-to-transmit-start ????? ???1T SCK ,????????????????????
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
4、写FIFO 寄存器
|
4??<EFBFBD><EFBFBD>FIFO ?????
|
||||||
(1)配置TX_FIFO_TH或RX_FIFO_TH来定义触发级别阈值
|
??1??????TX_FIFO_TH??RX_FIFO_TH?????<EFBFBD><EFBFBD>?????????
|
||||||
(2)通过配置TX_FIFO_CLR和RX_FIFO_CLR位清除TX/RX FIFO
|
??2?????????TX_FIFO_CLR??RX_FIFO_CLR<EFBFBD><EFBFBD>???TX/RX FIFO
|
||||||
(3)通过配置fif_en位使能或禁用FIFO模式
|
??3?????????fif_en<EFBFBD><EFBFBD>???????FIFO??
|
||||||
*/
|
*/
|
||||||
SPIx->FCR |= (FIFO_Struct.TX_FIFO_TH << 9 );
|
SPIx->FCR |= (FIFO_Struct.TX_FIFO_TH << 9 );
|
||||||
SPIx->FCR |= (FIFO_Struct.RX_FIFO_TH << 2 );
|
SPIx->FCR |= (FIFO_Struct.RX_FIFO_TH << 2 );
|
||||||
CLR_TX_FIFO(SPIx) ;
|
CLR_TX_FIFO(SPIx) ;
|
||||||
CLR_RX_FIFO(SPIx) ;
|
CLR_RX_FIFO(SPIx) ;
|
||||||
if(FIFO_Struct.FIFO_ENABLE_SET == true)
|
if(FIFO_Struct.FIFO_ENABLE_SET == 1)
|
||||||
SPI_FIFO_ENABLE(SPIx);
|
SPI_FIFO_ENABLE(SPIx);
|
||||||
//SPI_FIFODMA_SET(SPIx ,FIFO_Struct.TXDMA_SET ,FIFO_Struct.RXDMA_SET);
|
//SPI_FIFODMA_SET(SPIx ,FIFO_Struct.TXDMA_SET ,FIFO_Struct.RXDMA_SET);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------SPI启动和停止-------------------------------------------------*/
|
/*---------------------------------------------SPI????????-------------------------------------------------*/
|
||||||
uint8_t SPI_START(CMSDK_SPI_TypeDef* SPIx )
|
uint8_t SPI_START(CMSDK_SPI_TypeDef* SPIx )
|
||||||
{
|
{
|
||||||
SPIx->CTRL1 |= (1);
|
SPIx->CTRL1 |= (1);
|
||||||
|
|
@ -230,7 +230,7 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
if(SPI_FIFO_STATE(SPIx) == 1)
|
if(SPI_FIFO_STATE(SPIx) == 1)
|
||||||
{
|
{
|
||||||
//读 RX的FIFO 直到 FIFO长度为 0
|
//?? RX??FIFO ??? FIFO????? 0
|
||||||
while((RX_FIFO_LEN(SPIx) != 0) || (BUSY_STATE(SPIx) == BUSY))
|
while((RX_FIFO_LEN(SPIx) != 0) || (BUSY_STATE(SPIx) == BUSY))
|
||||||
{
|
{
|
||||||
//save_data = READ_SPI_RCVBuff(SPIx);
|
//save_data = READ_SPI_RCVBuff(SPIx);
|
||||||
|
|
@ -249,7 +249,7 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
while((TX_FIFO_LEN(SPIx)!= 0) || (BUSY_STATE(SPIx) == BUSY));
|
while((TX_FIFO_LEN(SPIx)!= 0) || (BUSY_STATE(SPIx) == BUSY));
|
||||||
SPIx->CTRL1 &=~ (1);
|
SPIx->CTRL1 &=~ (1);
|
||||||
//读 RX的FIFO 直到 FIFO长度为 0
|
//?? RX??FIFO ??? FIFO????? 0
|
||||||
while(RX_FIFO_LEN(SPIx) != 0)
|
while(RX_FIFO_LEN(SPIx) != 0)
|
||||||
{
|
{
|
||||||
uint16_t save_data = READ_SPI_RCVBuff(SPIx);
|
uint16_t save_data = READ_SPI_RCVBuff(SPIx);
|
||||||
|
|
@ -264,22 +264,22 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx)
|
||||||
return (uint8_t)(SPIx->CTRL1*0x1);
|
return (uint8_t)(SPIx->CTRL1*0x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------读 / 写 SPI BUFFER的数据-------------------------------------------------*/
|
/*-----------------------------------------?? / <20><> SPI BUFFER??????-------------------------------------------------*/
|
||||||
//读被接收的数据 最多16bits
|
//????????????? ???16bits
|
||||||
uint16_t READ_SPI_RCVBuff(CMSDK_SPI_TypeDef* SPIx)
|
uint16_t READ_SPI_RCVBuff(CMSDK_SPI_TypeDef* SPIx)
|
||||||
{
|
{
|
||||||
return (uint16_t)(SPIx->RBR & 0xffff);
|
return (uint16_t)(SPIx->RBR & 0xffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
//写数据
|
//<EFBFBD><EFBFBD>????
|
||||||
void WRITE_SPI_THRBuff(CMSDK_SPI_TypeDef* SPIx,uint8_t data)
|
void WRITE_SPI_THRBuff(CMSDK_SPI_TypeDef* SPIx,uint8_t data)
|
||||||
{
|
{
|
||||||
SPIx->THR = data;
|
SPIx->THR = data;
|
||||||
while(BUSY_STATE(SPIx) == BUSY);
|
while(BUSY_STATE(SPIx) == BUSY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------SPI中断------------------------------------------------------*/
|
/*------------------------------------------------------SPI?<3F><>?------------------------------------------------------*/
|
||||||
uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET)
|
uint8_t SPI_INT_SET(IRQn_Type IRQn, int SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET)
|
||||||
{
|
{
|
||||||
NVIC_DisableIRQ(IRQn);
|
NVIC_DisableIRQ(IRQn);
|
||||||
NVIC_ClearPendingIRQ(IRQn);
|
NVIC_ClearPendingIRQ(IRQn);
|
||||||
|
|
@ -289,10 +289,10 @@ uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET
|
||||||
}
|
}
|
||||||
else if(IRQn == SPI1_IRQn)
|
else if(IRQn == SPI1_IRQn)
|
||||||
{
|
{
|
||||||
CMSDK_SPI1->IER = ((CMSDK_SPI0->IER &~ (0xff)) | SPI_INT_BIT_SET);
|
CMSDK_SPI1->IER = ((CMSDK_SPI1->IER &~ (0xff)) | SPI_INT_BIT_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(SPI_INT_ENABLE == true)
|
if(SPI_INT_ENABLE == 1)
|
||||||
{
|
{
|
||||||
NVIC_EnableIRQ(IRQn);
|
NVIC_EnableIRQ(IRQn);
|
||||||
}
|
}
|
||||||
|
|
@ -303,22 +303,22 @@ uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//中断处理函数
|
//?<3F><>????????
|
||||||
/*
|
/*
|
||||||
中断有如下类型:
|
?<EFBFBD><EFBFBD>????????????
|
||||||
1、发送部分有 下溢 中断(发送数据没有啦)
|
1??????????? ???? ?<EFBFBD><EFBFBD>?????????????????
|
||||||
2、接收部分有 溢出 中断(接满啦)
|
2??????????? ??? ?<EFBFBD><EFBFBD>??????????
|
||||||
3、收发完成中断?
|
3?????????<EFBFBD><EFBFBD>??
|
||||||
4、发送缓冲区空 中断
|
4????????????? ?<EFBFBD><EFBFBD>?
|
||||||
5、接收缓冲区非空 中断
|
5?????????????? ?<EFBFBD><EFBFBD>?
|
||||||
*/
|
*/
|
||||||
void SPI1_Handler(void)
|
void SPI1_Handler(void)
|
||||||
{
|
{
|
||||||
NVIC_ClearPendingIRQ(SPI1_IRQn);
|
NVIC_ClearPendingIRQ(SPI1_IRQn);
|
||||||
uint8_t read_fifo=0;
|
uint8_t read_fifo=0;
|
||||||
if((CMSDK_SPI1->INTSTATUS & 0x10 )== UNDERRUN_INT) //下溢-发送时发送数据已为空时触发
|
if((CMSDK_SPI1->INTSTATUS & 0x10 )== UNDERRUN_INT) //????-???????????????????????
|
||||||
{
|
{
|
||||||
CMSDK_SPI1->INTCLEAR |= (1<<4); //清除中断
|
CMSDK_SPI1->INTCLEAR |= (1<<4); //????<3F><>?
|
||||||
}
|
}
|
||||||
if((CMSDK_SPI1->INTSTATUS & 0x8) ==OVERRUN_INT)
|
if((CMSDK_SPI1->INTSTATUS & 0x8) ==OVERRUN_INT)
|
||||||
{
|
{
|
||||||
|
|
@ -338,7 +338,6 @@ void SPI1_Handler(void)
|
||||||
while(!RX_FIFO_EMPTY(CMSDK_SPI1))
|
while(!RX_FIFO_EMPTY(CMSDK_SPI1))
|
||||||
{
|
{
|
||||||
read_fifo = READ_SPI_RCVBuff(CMSDK_SPI1);
|
read_fifo = READ_SPI_RCVBuff(CMSDK_SPI1);
|
||||||
printf("masterrcv:%d\n",read_fifo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -349,9 +348,9 @@ void SPI0_Handler(void)
|
||||||
{
|
{
|
||||||
NVIC_ClearPendingIRQ(SPI0_IRQn);
|
NVIC_ClearPendingIRQ(SPI0_IRQn);
|
||||||
uint8_t read_fifo=0;
|
uint8_t read_fifo=0;
|
||||||
if((CMSDK_SPI0->INTSTATUS & 0x10 )== UNDERRUN_INT) //下溢-发送时发送数据已为空时触发
|
if((CMSDK_SPI0->INTSTATUS & 0x10 )== UNDERRUN_INT) //????-???????????????????????
|
||||||
{
|
{
|
||||||
CMSDK_SPI0->INTCLEAR |= (1<<4); //清除中断
|
CMSDK_SPI0->INTCLEAR |= (1<<4); //????<3F><>?
|
||||||
}
|
}
|
||||||
if((CMSDK_SPI0->INTSTATUS & 0x8) ==OVERRUN_INT)
|
if((CMSDK_SPI0->INTSTATUS & 0x8) ==OVERRUN_INT)
|
||||||
{
|
{
|
||||||
|
|
@ -371,7 +370,6 @@ void SPI0_Handler(void)
|
||||||
while(!RX_FIFO_EMPTY(CMSDK_SPI0))
|
while(!RX_FIFO_EMPTY(CMSDK_SPI0))
|
||||||
{
|
{
|
||||||
read_fifo = READ_SPI_RCVBuff(CMSDK_SPI0);
|
read_fifo = READ_SPI_RCVBuff(CMSDK_SPI0);
|
||||||
printf("masterrcv:%d\n",read_fifo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,12 @@
|
||||||
#include "ENS1_TIMER.h"
|
#include "ENS1_TIMER.h"
|
||||||
#include "ENS_CURRENT_CALIBRATION.h"
|
#include "ENS_CURRENT_CALIBRATION.h"
|
||||||
#include "ENS1_CLOCK.h"
|
#include "ENS1_CLOCK.h"
|
||||||
|
#include <string.h>
|
||||||
void TIMER0_Init(uint32_t Int_Period) //形参,输入中断触发周期 (单位ms)
|
uint8_t ems_control_count = 0; // 电刺激控制计数器
|
||||||
|
uint8_t ems_state = 0; // 电刺激状态:0=关闭,1=开启
|
||||||
|
uint16_t time_count = 0;
|
||||||
|
uint8_t led_state = 0;
|
||||||
|
void TIMER0_Init(uint32_t Int_Period) //形参,输入中断触发周期 (单位ms)
|
||||||
{
|
{
|
||||||
PCLK_Enable(TIMER0_PCLK_EN);
|
PCLK_Enable(TIMER0_PCLK_EN);
|
||||||
NVIC_DisableIRQ(TIMER0_IRQn);
|
NVIC_DisableIRQ(TIMER0_IRQn);
|
||||||
|
|
@ -11,6 +15,7 @@ void TIMER0_Init(uint32_t Int_Period) //
|
||||||
NVIC_EnableIRQ(TIMER0_IRQn);
|
NVIC_EnableIRQ(TIMER0_IRQn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TIMER1_Init(uint32_t Int_Period)
|
void TIMER1_Init(uint32_t Int_Period)
|
||||||
{
|
{
|
||||||
PCLK_Enable(TIMER1_PCLK_EN);
|
PCLK_Enable(TIMER1_PCLK_EN);
|
||||||
|
|
@ -22,49 +27,49 @@ void TIMER1_Init(uint32_t Int_Period)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*使能定时器中断*/
|
/*使能定时器中断*/
|
||||||
void CMSDK_timer_EnableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
void CMSDK_timer_EnableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_IRQEN_Msk;
|
CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_IRQEN_Msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*关闭定时器中断*/
|
/*禁止定时器中断*/
|
||||||
void CMSDK_timer_DisableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
void CMSDK_timer_DisableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_IRQEN_Msk;
|
CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_IRQEN_Msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*定时器启动*/
|
/*启动定时器*/
|
||||||
void CMSDK_timer_StartTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
void CMSDK_timer_StartTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_EN_Msk;
|
CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_EN_Msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*定时器关闭*/
|
/*停止定时器*/
|
||||||
void CMSDK_timer_StopTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
void CMSDK_timer_StopTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_EN_Msk;
|
CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_EN_Msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*获取定时器Value*/
|
/*获取定时器当前值*/
|
||||||
uint32_t CMSDK_timer_GetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
uint32_t CMSDK_timer_GetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
return CMSDK_TIMER->VALUE;
|
return CMSDK_TIMER->VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*设置定时器值*/
|
/*设置定时器当前值*/
|
||||||
void CMSDK_timer_SetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value)
|
void CMSDK_timer_SetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value)
|
||||||
{
|
{
|
||||||
CMSDK_TIMER->VALUE = value;
|
CMSDK_TIMER->VALUE = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*获取重载值*/
|
/*获取定时器重装载值*/
|
||||||
uint32_t CMSDK_timer_GetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
uint32_t CMSDK_timer_GetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
return CMSDK_TIMER->RELOAD;
|
return CMSDK_TIMER->RELOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*设置重载值*/
|
/*设置定时器重装载值*/
|
||||||
void CMSDK_timer_SetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value)
|
void CMSDK_timer_SetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value)
|
||||||
{
|
{
|
||||||
CMSDK_TIMER->RELOAD = value;
|
CMSDK_TIMER->RELOAD = value;
|
||||||
|
|
@ -76,13 +81,13 @@ void TIMER1_Init(uint32_t Int_Period)
|
||||||
CMSDK_TIMER->INTCLEAR = CMSDK_TIMER_INTCLEAR_Msk;
|
CMSDK_TIMER->INTCLEAR = CMSDK_TIMER_INTCLEAR_Msk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*返回定时器状态*/
|
/*获取定时器中断状态*/
|
||||||
uint32_t CMSDK_timer_StatusIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
uint32_t CMSDK_timer_StatusIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
|
||||||
{
|
{
|
||||||
return CMSDK_TIMER->INTSTATUS;
|
return CMSDK_TIMER->INTSTATUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*初始化定时器*/
|
/*初始化定时器*/
|
||||||
void CMSDK_timer_Init(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, uint8_t irq_en)
|
void CMSDK_timer_Init(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload, uint8_t irq_en)
|
||||||
{
|
{
|
||||||
uint32_t new_ctrl = 0;
|
uint32_t new_ctrl = 0;
|
||||||
|
|
@ -372,8 +377,176 @@ void CMSDK_timer_Init_ExtEnable(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reloa
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Fuse_result(void)
|
||||||
|
{
|
||||||
|
// 获取时间标志位
|
||||||
|
Time_Flag_TypeDef* time_flags = Time_Manager_GetFlags();
|
||||||
|
|
||||||
|
// 处理电刺激(在主循环中运行)
|
||||||
|
// 注意:这里不再直接调用EMS_Process(),而是通过状态控制
|
||||||
|
if (time_flags->T_1ms) {
|
||||||
|
// 1ms周期任务 - 高频控制任务
|
||||||
|
|
||||||
|
EMS_Process();
|
||||||
|
time_flags->T_1ms = 0; // 清除标志位
|
||||||
|
}
|
||||||
|
|
||||||
|
// 基于时间标志位执行不同周期的任务
|
||||||
|
if (time_flags->T_2ms) {
|
||||||
|
// 2ms周期任务 - 高频控制任务
|
||||||
|
time_flags->T_2ms = 0; // 清除标志位
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_flags->T_10ms) {
|
||||||
|
// 10ms周期任务 - 中频控制任务
|
||||||
|
time_flags->T_10ms = 0; // 清除标志位
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_flags->T_100ms) {
|
||||||
|
// 100ms周期任务 - 低频控制任务
|
||||||
|
time_flags->T_100ms = 0; // 清除标志位
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (time_flags->T_1s) {
|
||||||
|
|
||||||
|
// 1s周期任务 - 超低频任务
|
||||||
|
ems_control_count++; // 每秒递增计数器,
|
||||||
|
|
||||||
|
// 间断性放电控制逻辑
|
||||||
|
if (ems_control_count <= 10) {
|
||||||
|
// 前10秒:开启电刺激
|
||||||
|
if (ems_state == 0) {
|
||||||
|
ems_state = 1;
|
||||||
|
time_count = 0; // 重置时间计数器
|
||||||
|
EMS_Start(); // 启动电刺激
|
||||||
|
}
|
||||||
|
// 处理电刺激
|
||||||
|
|
||||||
|
} else if (ems_control_count <= 20) {
|
||||||
|
// 后10秒:关闭电刺激
|
||||||
|
if (ems_state == 1) {
|
||||||
|
ems_state = 0;
|
||||||
|
time_count = 0; // 重置时间计数器
|
||||||
|
EMS_Stop(); // 停止电刺激
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 重置计数器,开始新的周期
|
||||||
|
ems_control_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
time_flags->T_1s = 0; // 清除标志位
|
||||||
|
}
|
||||||
|
// 定时器中断处理在 TIMER0_Handler() 中
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------- //
|
||||||
|
// 时间管理全局变量
|
||||||
|
// --------------------------------------------------------------- //
|
||||||
|
static Time_Flag_TypeDef g_time_flags = {0};
|
||||||
|
static Time_Counter_TypeDef g_time_counters = {0};
|
||||||
|
|
||||||
|
// --------------------------------------------------------------- //
|
||||||
|
// 时间管理函数实现
|
||||||
|
// --------------------------------------------------------------- //
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化时间管理器
|
||||||
|
*/
|
||||||
|
void Time_Manager_Init(void)
|
||||||
|
{
|
||||||
|
// 清零所有标志位和计数器
|
||||||
|
memset(&g_time_flags, 0, sizeof(Time_Flag_TypeDef));
|
||||||
|
memset(&g_time_counters, 0, sizeof(Time_Counter_TypeDef));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 时间管理处理函数(在定时器中断中调用)
|
||||||
|
* 基于1ms定时器中断,实现不同时间周期的任务调度
|
||||||
|
*/
|
||||||
|
void Time_Manager_Process(void)
|
||||||
|
{
|
||||||
|
// 所有计数器递增
|
||||||
|
g_time_counters.t_1ms++;
|
||||||
|
g_time_counters.t_2ms++;
|
||||||
|
g_time_counters.t_6ms++;
|
||||||
|
g_time_counters.t_10ms++;
|
||||||
|
g_time_counters.t_20ms++;
|
||||||
|
g_time_counters.t_100ms++;
|
||||||
|
g_time_counters.t_1s++;
|
||||||
|
|
||||||
|
// 2ms控制周期
|
||||||
|
if (g_time_counters.t_1ms >= 1)
|
||||||
|
{
|
||||||
|
g_time_counters.t_1ms = 0;
|
||||||
|
g_time_flags.T_1ms = 1;
|
||||||
|
/* code */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_time_counters.t_2ms >= 2) {
|
||||||
|
g_time_counters.t_2ms = 0;
|
||||||
|
g_time_flags.T_2ms = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6ms控制周期
|
||||||
|
if (g_time_counters.t_6ms >= 6) {
|
||||||
|
g_time_counters.t_6ms = 0;
|
||||||
|
g_time_flags.T_6ms = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 10ms控制周期
|
||||||
|
if (g_time_counters.t_10ms >= 10) {
|
||||||
|
g_time_counters.t_10ms = 0;
|
||||||
|
g_time_flags.T_10ms = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 20ms控制周期
|
||||||
|
if (g_time_counters.t_20ms >= 20) {
|
||||||
|
g_time_counters.t_20ms = 0;
|
||||||
|
g_time_flags.T_20ms = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 100ms控制周期
|
||||||
|
if (g_time_counters.t_100ms >= 100) {
|
||||||
|
g_time_counters.t_100ms = 0;
|
||||||
|
g_time_flags.T_100ms = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1s控制周期
|
||||||
|
if (g_time_counters.t_1s >= 1000) {
|
||||||
|
g_time_counters.t_1s = 0;
|
||||||
|
g_time_flags.T_1s = 1;
|
||||||
|
}
|
||||||
|
Fuse_result();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取时间标志位
|
||||||
|
* @return 时间标志位结构体指针
|
||||||
|
*/
|
||||||
|
Time_Flag_TypeDef* Time_Manager_GetFlags(void)
|
||||||
|
{
|
||||||
|
return &g_time_flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 清除所有时间标志位
|
||||||
|
*/
|
||||||
|
void Time_Manager_ClearFlags(void)
|
||||||
|
{
|
||||||
|
memset(&g_time_flags, 0, sizeof(Time_Flag_TypeDef));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 重置时间管理器
|
||||||
|
*/
|
||||||
|
void Time_Manager_Reset(void)
|
||||||
|
{
|
||||||
|
Time_Manager_Init();
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------- //
|
// --------------------------------------------------------------- //
|
||||||
// TIMER0_IRQ
|
// TIMER0_IRQ
|
||||||
|
|
@ -383,13 +556,11 @@ uint32_t time_flag =0;
|
||||||
void TIMER0_Handler(void){
|
void TIMER0_Handler(void){
|
||||||
CMSDK_TIMER0->INTCLEAR = 1;
|
CMSDK_TIMER0->INTCLEAR = 1;
|
||||||
timer0_irq_occurred++;
|
timer0_irq_occurred++;
|
||||||
if(timer0_irq_occurred % 1000 == 0)
|
// 调用时间管理处理函数
|
||||||
{
|
Time_Manager_Process();
|
||||||
GPIO_Overturn(GPIO_19);
|
|
||||||
time_flag++;
|
|
||||||
printf("%d s\n",time_flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// 注意:GPIO翻转现在通过时间管理系统在主循环中处理
|
||||||
|
// 这里不再直接翻转GPIO,避免重复操作
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------- //
|
// --------------------------------------------------------------- //
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,14 @@ UART_FifoStructrue UART1_Fifo = {
|
||||||
.FIFO_Enable =1 ,
|
.FIFO_Enable =1 ,
|
||||||
};
|
};
|
||||||
UART_InitStructure UART1_Init = {
|
UART_InitStructure UART1_Init = {
|
||||||
.UART_BaudRate = 115200 , //计算出来的DLL DLH不为整数, 1、需要校准RC精确度,2、需要调整此处的波特率
|
.UART_BaudRate = 110000 , //计算出来的DLL DLH不为整数, 1、需要校准RC精确度,2、需要调整此处的波特率
|
||||||
.UART_HardwareFlowControl =0,
|
.UART_HardwareFlowControl =0,
|
||||||
.FifoSetting = &UART1_Fifo ,
|
.FifoSetting = &UART1_Fifo ,
|
||||||
|
.stop_len = StopLen_1, //固定停止位1位
|
||||||
|
.Word_len = WordLen_8, //数据位8位
|
||||||
|
.Stick_EN = Stick_RESET, //禁用固定奇偶校验
|
||||||
|
.Even_EN = Even_SET, //奇偶校验选择
|
||||||
|
.Parity_EN = Parity_RESET, //禁用奇偶检验
|
||||||
};
|
};
|
||||||
UART_ITStructure UART1_ITSet = {
|
UART_ITStructure UART1_ITSet = {
|
||||||
.UartIntModel = RLSI_EN | RDAI_EN ,
|
.UartIntModel = RLSI_EN | RDAI_EN ,
|
||||||
|
|
@ -169,12 +174,33 @@ void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX){
|
||||||
PCLK_Enable(UART0_PCLK_EN);
|
PCLK_Enable(UART0_PCLK_EN);
|
||||||
GPIO_AltFunction(UART0_RX , ALT_FUNC1); //rx
|
GPIO_AltFunction(UART0_RX , ALT_FUNC1); //rx
|
||||||
GPIO_AltFunction(UART0_TX , ALT_FUNC1); //tx
|
GPIO_AltFunction(UART0_TX , ALT_FUNC1); //tx
|
||||||
|
|
||||||
|
// 修复:正确配置GPIO方向
|
||||||
|
// GPIO2 (RX) 应该是输入
|
||||||
|
CMSDK_GPIO->OE &= ~(1 << UART0_RX); // 禁用输出
|
||||||
|
CMSDK_GPIO->IE |= (1 << UART0_RX); // 使能输入
|
||||||
|
|
||||||
|
// GPIO3 (TX) 应该是输出
|
||||||
|
CMSDK_GPIO->IE &= ~(1 << UART0_TX); // 禁用输入
|
||||||
|
CMSDK_GPIO->OE |= (1 << UART0_TX); // 使能输出
|
||||||
}
|
}
|
||||||
else if(CMSDK_UART == CMSDK_UART1)
|
else if(CMSDK_UART == CMSDK_UART1)
|
||||||
{
|
{
|
||||||
PCLK_Enable(UART1_PCLK_EN);
|
PCLK_Enable(UART1_PCLK_EN);
|
||||||
GPIO_AltFunction(UART1_RX , ALT_FUNC1); //RX
|
GPIO_AltFunction(UART1_RX , ALT_FUNC1); //RX
|
||||||
GPIO_AltFunction(UART1_TX , ALT_FUNC1); //TX
|
GPIO_AltFunction(UART1_TX , ALT_FUNC1); //TX
|
||||||
|
|
||||||
|
// 修复:正确配置GPIO方向
|
||||||
|
// GPIO12 (RX) 应该是输入
|
||||||
|
CMSDK_GPIO->OE &= ~(1 << UART1_RX); // 禁用输出
|
||||||
|
CMSDK_GPIO->IE |= (1 << UART1_RX); // 使能输入
|
||||||
|
|
||||||
|
// GPIO13 (TX) 应该是输出
|
||||||
|
CMSDK_GPIO->IE &= ~(1 << UART1_TX); // 禁用输入
|
||||||
|
CMSDK_GPIO->OE |= (1 << UART1_TX); // 使能输出
|
||||||
|
|
||||||
|
// 确保TX引脚初始化为高电平
|
||||||
|
CMSDK_GPIO->DATAOUT |= (1 << UART1_TX);
|
||||||
}
|
}
|
||||||
/* 2 波特率设置*/
|
/* 2 波特率设置*/
|
||||||
if(((CMSDK_UART->MDR)&0x00000001) == 0)
|
if(((CMSDK_UART->MDR)&0x00000001) == 0)
|
||||||
|
|
@ -185,19 +211,36 @@ void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX){
|
||||||
{
|
{
|
||||||
overSamp_mode = 13;
|
overSamp_mode = 13;
|
||||||
}
|
}
|
||||||
|
//波特率校准,反推处DLL和DLH,(外设时钟主频/设置波特率/过采样模式)-1,
|
||||||
divisor_value = (uint16_t)((uint32_t)(APB_Clock_Freq / uart_paraX->UART_BaudRate / overSamp_mode) - 1);
|
divisor_value = (uint16_t)((uint32_t)(APB_Clock_Freq / uart_paraX->UART_BaudRate / overSamp_mode) - 1);
|
||||||
CMSDK_UART->DLL = (uint8_t)(divisor_value & 0x0011);
|
CMSDK_UART->DLL = (uint8_t)(divisor_value & 0x00FF);
|
||||||
CMSDK_UART->DLH = (uint8_t)((divisor_value & 0x1100)>>8);
|
CMSDK_UART->DLH = (uint8_t)((divisor_value & 0xFF00)>>8);
|
||||||
|
|
||||||
/*FCR配置 FIFO control*/
|
/*FCR配置 FIFO control*/
|
||||||
CMSDK_UART->FCR |= (uart_paraX->FifoSetting->level <<6);
|
CMSDK_UART->FCR |= (uart_paraX->FifoSetting->level <<6);//接收多少字节后触发中断
|
||||||
if(uart_paraX->FifoSetting->FIFO_Enable == 1)
|
if(uart_paraX->FifoSetting->FIFO_Enable == 1)
|
||||||
{
|
{
|
||||||
CMSDK_UART->FCR |= (1);
|
CMSDK_UART->FCR |= (1);
|
||||||
}
|
}
|
||||||
|
//配置停止位
|
||||||
|
CMSDK_UART->LCR &= ~(0x01 << 2);
|
||||||
|
CMSDK_UART->LCR |= uart_paraX->stop_len<<2;
|
||||||
|
|
||||||
/*LCR配置,不做配置,默认N 8 1 */
|
//配置数据位
|
||||||
|
CMSDK_UART->LCR &= ~(0x03 << 0);
|
||||||
|
CMSDK_UART->LCR |= uart_paraX->Word_len<<0;
|
||||||
|
|
||||||
|
//配置是否启用校验位
|
||||||
|
CMSDK_UART->LCR &= ~(0x01 << 3);
|
||||||
|
CMSDK_UART->LCR |= uart_paraX->Parity_EN<<3;
|
||||||
|
|
||||||
|
//启用校验位
|
||||||
|
if(uart_paraX->Parity_EN==Parity_SET)
|
||||||
|
{
|
||||||
|
CMSDK_UART->LCR &= ~(0x03 << 4);
|
||||||
|
CMSDK_UART->LCR |= uart_paraX->Even_EN<<4;
|
||||||
|
CMSDK_UART->LCR |= uart_paraX->Stick_EN<<5;
|
||||||
|
}
|
||||||
|
|
||||||
/*MCR自动流控配置*/
|
/*MCR自动流控配置*/
|
||||||
if(uart_paraX->UART_HardwareFlowControl == 1)
|
if(uart_paraX->UART_HardwareFlowControl == 1)
|
||||||
|
|
@ -239,6 +282,18 @@ unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch)
|
||||||
WRITE_UART_THRBuff(CMSDK_UART,my_ch);
|
WRITE_UART_THRBuff(CMSDK_UART,my_ch);
|
||||||
return (my_ch);
|
return (my_ch);
|
||||||
}
|
}
|
||||||
|
//串口发送一定字节的数据
|
||||||
|
void Uart_Send(CMSDK_UART_TypeDef *CMSDK_UART ,uint8_t *data, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t t;
|
||||||
|
for(t=0;t<len;t++) //循环发送数据
|
||||||
|
{
|
||||||
|
while(UARTLine_THREmpty(CMSDK_UART) == 0x0);//等待发送结束
|
||||||
|
WRITE_UART_THRBuff(CMSDK_UART,data[t]);
|
||||||
|
}
|
||||||
|
while(UARTLine_THREmpty(CMSDK_UART) == 0x0);//等待发送结束
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -278,23 +333,69 @@ void UART0_Handler(void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 外部变量声明(在main.c中定义)
|
||||||
|
uint8_t uart_rx_buffer[64];
|
||||||
|
uint8_t uart_rx_count;
|
||||||
|
volatile uint8_t uart_data_ready;
|
||||||
|
|
||||||
|
// 外部函数声明
|
||||||
|
extern uint8_t ParseUART_EMS_Packet(uint8_t *data, uint16_t length, void *packet);
|
||||||
|
extern void UpdateEMS_ConfigFromUART(void *packet);
|
||||||
|
|
||||||
|
// 数据包结构体定义
|
||||||
|
|
||||||
|
|
||||||
void UART1_Handler(void) {
|
void UART1_Handler(void) {
|
||||||
uint8_t rev_data = 0;
|
uint8_t rev_data = 0;
|
||||||
|
uint32_t ParamNumber = 0;
|
||||||
|
|
||||||
|
// 清除NVIC中断挂起位
|
||||||
NVIC_ClearPendingIRQ(UART1_IRQn);
|
NVIC_ClearPendingIRQ(UART1_IRQn);
|
||||||
//接收线中断 有错误或者break
|
|
||||||
if(UART_INT_TYPE(CMSDK_UART1) == INT_RCV_LINE_STATUS) {
|
// 检查中断类型
|
||||||
CMSDK_UART1->IER &= ~CMSDK_UART_IER_RLSI_EN_Msk;
|
uint8_t int_type = UART_INT_TYPE(CMSDK_UART1);
|
||||||
|
|
||||||
|
// 接收线中断 - 有错误或者break
|
||||||
|
if(int_type == INT_RCV_LINE_STATUS) {
|
||||||
|
// 读取LSR寄存器清除错误状态
|
||||||
|
uint32_t lsr = CMSDK_UART1->LSR;
|
||||||
|
(void)lsr; // 避免未使用变量警告
|
||||||
}
|
}
|
||||||
|
|
||||||
//数据就绪中断
|
// 数据就绪中断或接收超时中断
|
||||||
//接收超时中断
|
if((int_type == INT_RCV_DATA_AVAILABLE) || (int_type == INT_CHAR_TIMEOUT_INDICATION)) {
|
||||||
if((UART_INT_TYPE(CMSDK_UART1) == INT_RCV_DATA_AVAILABLE) || (UART_INT_TYPE(CMSDK_UART1) == INT_CHAR_TIMEOUT_INDICATION)) {
|
ParamNumber = (CMSDK_UART1->FSR >> 16) & 0x1f;
|
||||||
|
|
||||||
CMSDK_UART1->IER &= ~CMSDK_UART_IER_RDAI_EN_Msk;
|
for(uint32_t i = 0; i < ParamNumber; i++) {
|
||||||
rev_data = CMSDK_UART1->RBR;
|
rev_data = CMSDK_UART1->RBR; // 把接收到的数据取出来
|
||||||
UartPutc(CMSDK_UART1,rev_data);
|
|
||||||
CMSDK_UART1->IER |= CMSDK_UART_IER_RDAI_EN_Msk;
|
// 将数据存储到缓冲区
|
||||||
|
if(uart_rx_count < sizeof(uart_rx_buffer)) {
|
||||||
|
uart_rx_buffer[uart_rx_count] = rev_data;
|
||||||
|
uart_rx_count++;
|
||||||
|
} else {
|
||||||
|
// 缓冲区溢出,重置
|
||||||
|
uart_rx_count = 0;
|
||||||
}
|
}
|
||||||
|
UartPutc(CMSDK_UART1, rev_data); // 把接收到的数据再发回去
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否收到完整数据包(19字节)
|
||||||
|
if(uart_rx_count >= 19) {
|
||||||
|
//printf("1");
|
||||||
|
// 解析数据包
|
||||||
|
UART_EMS_Packet_t ems_packet;
|
||||||
|
if(ParseUART_EMS_Packet(uart_rx_buffer, uart_rx_count, &ems_packet)) {
|
||||||
|
// 更新电刺激配置
|
||||||
|
UpdateEMS_ConfigFromUART(&ems_packet);
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
// 清除缓冲区
|
||||||
|
uart_rx_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,314 @@
|
||||||
|
/*
|
||||||
|
*Copyright (C),2023 , NANOCHAP
|
||||||
|
*File name: ENS1_WAVEGEN.C
|
||||||
|
*Author:
|
||||||
|
*Version: V1.0
|
||||||
|
*Date: 2023-11-
|
||||||
|
*Description: 波形生成器电刺激功能实现
|
||||||
|
*Function List:
|
||||||
|
1 int wavegen_driverA_sine_test(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t incount);
|
||||||
|
2 void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA);
|
||||||
|
3 void wavegen_Init(void);
|
||||||
|
4 void wavegen_Start(void);
|
||||||
|
History:
|
||||||
|
1.V1.0
|
||||||
|
Date:
|
||||||
|
Author:
|
||||||
|
Modification: 初版
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "ENS1_WAVEGEN.h"
|
||||||
|
#include "ENS1_CLOCK.h"
|
||||||
|
#include "ENS1_BOOST.h"
|
||||||
|
EMS_Config_TypeDef ems_config = {
|
||||||
|
.frequency = 100, // 100Hz
|
||||||
|
.duration = 1000, // 1000ms
|
||||||
|
.intensity = 128, // 中等强度
|
||||||
|
.rest_time = 100, // 100ms休息时间
|
||||||
|
.silent_time = 50, // 50ms静默时间
|
||||||
|
|
||||||
|
// 缓进缓出控制参数
|
||||||
|
.ramp_up_time = 2, // 缓进时间:2秒
|
||||||
|
.hold_time = 6, // 保持时间:6秒
|
||||||
|
.ramp_down_time = 2, // 缓出时间:2秒·
|
||||||
|
.enable_ramp = 1 // 启用渐进控制
|
||||||
|
};
|
||||||
|
// 全局变量
|
||||||
|
EMS_Config_TypeDef g_ems_config = {0};
|
||||||
|
static volatile uint8_t g_ems_running = 0;
|
||||||
|
static volatile uint32_t g_ems_count = 0;
|
||||||
|
float waves_per_step = 0;
|
||||||
|
// 缓进缓出控制变量
|
||||||
|
static volatile float g_current_intensity = 0; // 当前强度
|
||||||
|
static volatile uint8_t g_ramp_phase = 0; // 渐进阶段:0=缓进, 1=保持, 2=缓出
|
||||||
|
static volatile uint32_t g_wave_counter = 0; // 方波周期计数器
|
||||||
|
static volatile uint32_t g_ramp_step_counter = 0; // 缓进步进计数器
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* 波形生成器驱动器A正弦波测试 */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
int wavegen_driverA_sine_test(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t incount)
|
||||||
|
{
|
||||||
|
int return_val = 0;
|
||||||
|
int err_code = 0;
|
||||||
|
|
||||||
|
// printf("\n驱动器A正弦波测试\n");
|
||||||
|
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_REST_T_REG = 100; // 死区时间10ms //交替模式下,死区时间失效,即使CONFIG_REG使能了死区时间也无效
|
||||||
|
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_SILENT_T_REG = 200; //静默时间20ms
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 0x00000020; // 32MHz ==PCLK
|
||||||
|
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 32; // 32MHz ==PCLK //MHz为单位
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = 100; // 正半周期脉宽10ms,有交替方波
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = 100; // 负半周期脉宽10ms,无交替方波
|
||||||
|
|
||||||
|
#if 1 // 无需静默时间
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x00000050; // bit 0:rest enable , 正半周期和负半周期中间的休息时间
|
||||||
|
// 1:negative enable , 负半周期发生使能,如果不使能,则没有负半周期的波形(注意交替模式只会对正半周期起作用)
|
||||||
|
// 2: silent enable , 负半周期结束后的静默时间
|
||||||
|
// 3: source B enable ,负脉宽方向使能位,1负脉宽在负半周期,0负脉宽在正半周期
|
||||||
|
|
||||||
|
// 4: alternating the positive side ,正极交替产生包络
|
||||||
|
// 5: continue mode ,连续模式
|
||||||
|
// 6: multi-electrode ,多电极模式
|
||||||
|
#else // 需要静默时间
|
||||||
|
/*交替模式下config寄存器说明:
|
||||||
|
正脉宽交替,无负脉宽,无死区时间,无静默时间:0x50 或 0x51 或 0x58 或 0x59
|
||||||
|
正脉宽交替,无死区时间,无负脉宽,有静默时间:0x54 或 0x55 或 0x5C 或 0x5D
|
||||||
|
正脉宽交替,无死区时间,负脉宽不交替但有波形,无静默时间 :0x5A 或 0x5B
|
||||||
|
正脉宽交替,无死区时间,负脉宽不交替但有波形且波形在正脉宽上(因为源B失能了),无静默时间 :0x52 或 0x53
|
||||||
|
正脉宽交替,无死区时间,负脉宽不交替但有波形且波形在正脉宽上(因为源B失能了),有静默时间 :0x56 或 0x57
|
||||||
|
正脉宽交替,无死区时间,负脉宽不交替但有波形,有静默时间 : 0x5E 或 0x5F
|
||||||
|
*/
|
||||||
|
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x5F; //bit 0:rest enable , 正半周期和负半周期中间的死区时间
|
||||||
|
// 1:negative enable , 负半周期发生使能,如果不使能,则没有负半周期的波形
|
||||||
|
// 2: silent enable , 负半周期结束后的静默时间
|
||||||
|
// 3: source B enable
|
||||||
|
// 4: alternating the positive side ,正极交替产生包络
|
||||||
|
// 5: continue mode ,连续模式
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x34; // 静默时间、交替模式和多电极使能 //6: multi-electrode ,多电极模式
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ISEL_REG = 0x04; // 总电流 = 单元电流ISEL * WAVE_GEN_DRV_IN_WAVE_REG
|
||||||
|
|
||||||
|
for (int i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
|
||||||
|
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = sine_data[i]; //正弦波数据数组,根据数组中的点描绘正半周期的波形
|
||||||
|
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = saw_data[i]; //三角波数据
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = incount; // 方波数据(固定值0x80)
|
||||||
|
}
|
||||||
|
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_LIM_REG = 3200; // 3200 需要设置一个正半周期下需要再生成多少个周期波形。设置10kHz=0.1ms=100us,100us=A*(1/32us),所以A=3200。
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_SILENT_LIM_REG = 0; // 交替后静默的时钟数(无死区时间设置)。在这种情况下,驱动器B连续交替。//包络下波形的静默时间
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_DELAY_LIM_REG = 0x00000000; // 延迟时钟数
|
||||||
|
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_SCALE_REG = 0x00000001; // 负半周期幅值倍乘系数,如超过255,则从0开始增长
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_OFFSET_REG = 0x00000000; // 负半周期幅值偏移量,如超过255,则从0开始增长,
|
||||||
|
// 如正半周期幅值为250,此处设置为10,则负半周期幅值为5 !!!
|
||||||
|
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_INT_REG = 0x0; // 中断寄存器设置为0
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CTRL_REG = 0x00000001; // 使能驱动器
|
||||||
|
|
||||||
|
/* 生成返回值 */
|
||||||
|
/*if (err_code != 0)
|
||||||
|
{
|
||||||
|
printf("\n错误 : 驱动器A测试失败\n");
|
||||||
|
return_val = 1;
|
||||||
|
err_code = 0;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
return (return_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA)
|
||||||
|
{
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ISEL_REG = 0; // 范围 0x00 - 0x07
|
||||||
|
|
||||||
|
for (int i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = 0; // 最大值0xff
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化波形生成器
|
||||||
|
void wavegen_Init(void)
|
||||||
|
{
|
||||||
|
// 设置MTP等待周期
|
||||||
|
CMSDK_MTPREG->MTP_CR = 0x00000002;
|
||||||
|
|
||||||
|
// 注意:时钟配置已在ClockInit()中完成,这里不再重复配置
|
||||||
|
// 使用HSI作为主频 32MHz
|
||||||
|
// CMSDK_SYSCON->HSI_CTRL = (CMSDK_SYSCON->HSI_CTRL & ~CMSDK_SYSCON_HSI_FREQ_Msk) | (0x3 << CMSDK_SYSCON_HSI_FREQ_Pos); //HSI=32MHz
|
||||||
|
|
||||||
|
// 使能UART和WAVE_GEN外设时钟(不覆盖TIMER0时钟)
|
||||||
|
CMSDK_SYSCON->APB_CLKEN |= 0x1003 | 0x4000; // 使用|=而不是=,避免覆盖其他时钟使能
|
||||||
|
|
||||||
|
// 升压电压选择
|
||||||
|
//boost_voltage_select_11V();
|
||||||
|
//boost_voltage_select_15V();
|
||||||
|
//boost_voltage_select_26V();
|
||||||
|
//boost_voltage_select_45V();
|
||||||
|
boost_voltage_select_55V();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启动波形生成器
|
||||||
|
void wavegen_Start(void)
|
||||||
|
{
|
||||||
|
g_ems_running = 1;
|
||||||
|
|
||||||
|
// 初始化缓进缓出控制
|
||||||
|
if (g_ems_config.enable_ramp)
|
||||||
|
{
|
||||||
|
g_current_intensity = 0; // 从0开始
|
||||||
|
g_ramp_phase = 0; // 缓进阶段
|
||||||
|
g_wave_counter = 0; // 重置方波计数器
|
||||||
|
g_ramp_step_counter = 0; // 重置步进计数器
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_current_intensity = g_ems_config.intensity; // 直接使用设定强度
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化硬件配置(只执行一次)
|
||||||
|
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, g_current_intensity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 电刺激参数配置
|
||||||
|
void EMS_Configure(EMS_Config_TypeDef *config)
|
||||||
|
{
|
||||||
|
if (config != NULL)
|
||||||
|
{
|
||||||
|
g_ems_config = *config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启动电刺激
|
||||||
|
void EMS_Start(void)
|
||||||
|
{
|
||||||
|
wavegen_Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止电刺激
|
||||||
|
void EMS_Stop(void)
|
||||||
|
{
|
||||||
|
g_ems_running = 0;
|
||||||
|
g_current_intensity = 0; // 重置强度
|
||||||
|
g_ramp_phase = 0; // 重置渐进阶段
|
||||||
|
g_wave_counter = 0; // 重置方波计数器
|
||||||
|
g_ramp_step_counter = 0; // 重置步进计数器
|
||||||
|
wavegen_Stop(WAVE_GEN_DRVA_BLK0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新电刺激强度
|
||||||
|
void EMS_UpdateIntensity(uint16_t intensity)
|
||||||
|
{
|
||||||
|
g_ems_config.intensity = intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缓进缓出处理函数(在电刺激处理中调用)
|
||||||
|
void EMS_Process_Ramp(void)
|
||||||
|
{
|
||||||
|
if(ems_state)
|
||||||
|
{
|
||||||
|
time_count++;
|
||||||
|
if (!g_ems_config.enable_ramp || !g_ems_running)
|
||||||
|
{
|
||||||
|
return; // 如果未启用缓进缓出或未运行,直接返回
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算每个强度步进需要的毫秒数
|
||||||
|
uint32_t ramp_up_ms = g_ems_config.ramp_up_time * 1000;
|
||||||
|
uint32_t hold_ms = g_ems_config.hold_time * 1000;
|
||||||
|
uint32_t ramp_down_ms = g_ems_config.ramp_down_time * 1000;
|
||||||
|
|
||||||
|
switch (g_ramp_phase)
|
||||||
|
{
|
||||||
|
case 0: // 缓进阶段
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( time_count <= g_ems_config.ramp_up_time*1000 )
|
||||||
|
{
|
||||||
|
// 计算当前应该达到的强度
|
||||||
|
uint16_t target_intensity = (time_count * g_ems_config.intensity) / ramp_up_ms;
|
||||||
|
if (target_intensity > g_ems_config.intensity) {
|
||||||
|
target_intensity = g_ems_config.intensity;
|
||||||
|
}
|
||||||
|
g_current_intensity = target_intensity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 缓进完成,进入保持阶段
|
||||||
|
g_ramp_phase = 1;
|
||||||
|
g_current_intensity = g_ems_config.intensity; // 确保达到最大强度
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: // 保持阶段
|
||||||
|
{
|
||||||
|
if(time_count <= (ramp_up_ms + hold_ms))
|
||||||
|
{
|
||||||
|
g_current_intensity = g_ems_config.intensity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_ramp_phase = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2: // 缓出阶段
|
||||||
|
{
|
||||||
|
if(time_count <= (ramp_up_ms + hold_ms + ramp_down_ms))
|
||||||
|
{
|
||||||
|
// 计算缓出阶段的时间偏移
|
||||||
|
uint32_t ramp_down_start = ramp_up_ms + hold_ms;
|
||||||
|
uint32_t ramp_down_elapsed = time_count - ramp_down_start;
|
||||||
|
|
||||||
|
// 计算当前应该达到的强度(从最大值递减到0)
|
||||||
|
uint16_t target_intensity = g_ems_config.intensity -
|
||||||
|
(ramp_down_elapsed * g_ems_config.intensity) / ramp_down_ms;
|
||||||
|
|
||||||
|
if (target_intensity > g_ems_config.intensity) {
|
||||||
|
target_intensity = 0;
|
||||||
|
}
|
||||||
|
g_current_intensity = target_intensity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 缓出完成,停止电刺激
|
||||||
|
g_current_intensity = 0;
|
||||||
|
g_ramp_phase = 0; // 重置为缓进阶段,准备下一轮
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新波形强度(不重新配置硬件)
|
||||||
|
void wavegen_UpdateIntensity(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t intensity)
|
||||||
|
{
|
||||||
|
// 只更新波形数据,不重新配置硬件
|
||||||
|
for (int i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = intensity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 电刺激主循环处理函数(在主循环中调用)
|
||||||
|
void EMS_Process(void)
|
||||||
|
{
|
||||||
|
if (g_ems_running)
|
||||||
|
{
|
||||||
|
EMS_Process_Ramp();
|
||||||
|
// 使用当前缓进缓出的强度
|
||||||
|
uint16_t current_intensity = g_current_intensity;
|
||||||
|
wavegen_UpdateIntensity(WAVE_GEN_DRVA_BLK0, current_intensity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -11,86 +11,86 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ENS1_ADC.h"
|
#include "ENS1_ADC.h"
|
||||||
#include "ENS1_GPIO.h"
|
#include "ENS1_GPIO.h"
|
||||||
#include "ENS1_CLOCK.h"
|
#include "ENS1_CLOCK.h"
|
||||||
#include "ENS1_ANAC.h"
|
#include "ENS1_ANAC.h"
|
||||||
/* 一、寄存器说明:
|
/* һ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
ADC配置:转换模式 数据覆盖模式 等待模式
|
ADC<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>ת<EFBFBD><EFBFBD>ģʽ <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>ģʽ <EFBFBD>ȴ<EFBFBD>ģʽ
|
||||||
ADC控制: ADC使能 , ADC启动
|
ADC<EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD> ADCʹ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
ADC中断使能: EOC中断使能 数据覆盖中断使能
|
ADC<EFBFBD>ж<EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD> EOC<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||||
ADC中断状态: EOC中断发生 数据覆盖中断发生
|
ADC<EFBFBD>ж<EFBFBD>״̬<EFBFBD><EFBFBD> EOC<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
ADC状态 : EOC标志 ADC空闲或繁忙状态
|
ADC״̬ <EFBFBD><EFBFBD> EOC<EFBFBD><EFBFBD>־ ADC<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>æ״̬
|
||||||
ADC时钟分频 :分频值 2 4 6 8 10 12 16 32
|
ADCʱ<EFBFBD>ӷ<EFBFBD>Ƶ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶֵ 2 4 6 8 10 12 16 32
|
||||||
ADC采样时间 :ADC采样时间时钟数 2 3 4 5
|
ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 3 4 5
|
||||||
ADC数据:
|
ADC<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||||
ADC通道选择 :
|
ADCͨ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
||||||
ADCEOC配置 :在连续模式下 , 是否在接收到EOC标志后开启下次转换
|
ADCEOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Ƿ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>ת<EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* 二、单次转换模式
|
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ
|
||||||
*ADC控制启将 给ADC_START 位置0 当接收到EOC或者EOC_WAIT_COUNT_DONE , 无论哪一个先到来
|
*ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ADC_START λ<EFBFBD><EFBFBD>0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>EOC_WAIT_COUNT_DONE <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
*如果直到EOC_WAIT_COUNT_DONE 都没有接收到EOC ,数据将不会被保存
|
*<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>EOC_WAIT_COUNT_DONE <EFBFBD><EFBFBD>û<EFBFBD>н<EFBFBD><EFBFBD>յ<EFBFBD>EOC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*ADC将停止转换,通过用户设置ADC_CTRL_REG 的 ADC_EN 位 为1
|
*ADC<EFBFBD><EFBFBD>ֹͣת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CTRL_REG <EFBFBD><EFBFBD> ADC_EN λ Ϊ1
|
||||||
*如果在采样和转换期间,ADC_EN 位置为0 ,控制器将完成正在进行的转换,然后基于 EOC/EOC_WAIT_COUNT_DONE 停止转换
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ڼ䣬ADC_EN λ<EFBFBD><EFBFBD>Ϊ0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>е<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC/EOC_WAIT_COUNT_DONE ֹͣת<EFBFBD><EFBFBD>
|
||||||
*数据会在EOC 到达后锁存
|
*<EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>EOC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
ADC单次转换流程:
|
ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>
|
||||||
1、设置单次转换(无等待模式)
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>ģʽ<EFBFBD><EFBFBD>
|
||||||
2、设置ADC_CONFIG_reg bit0 = 0 bit2 = 0
|
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit0 = 0 bit2 = 0
|
||||||
3、单次转换启动
|
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
4、转换结束, 数据保存至ADC_Data register
|
4<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_Data register
|
||||||
5、一个ADC_EOC_IE中断生成,
|
5<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ADC_EOC_IE<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
|
||||||
6、如果使能了 IER寄存器的 EOC_INT_EN 和OVER_RUN_INT_EN 位,则系统进入中断
|
6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> IER<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC_INT_EN <EFBFBD><EFBFBD>OVER_RUN_INT_EN λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
7、硬件停止ADC
|
7<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>ֹͣADC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*三、连续转换模式
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ
|
||||||
1、设置ADC_CONFIG_reg bit0 = 1
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit0 = 1
|
||||||
2、启动位置1 ADC_EN bit and ADC_START bits
|
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>1 ADC_EN bit and ADC_START bits
|
||||||
3、在每次转换完成之后,基于adc_eoc_config_regsiter[0] 启动下次转换:
|
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>adc_eoc_config_regsiter[0] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
如果Adc_eoc_config_register[0] =1 , 则接收到EOC后开始下次转换
|
<EFBFBD><EFBFBD><EFBFBD>Adc_eoc_config_register[0] =1 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD>ʼ<EFBFBD>´<EFBFBD>ת<EFBFBD><EFBFBD>
|
||||||
数据保存到寄存器中
|
<EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD>浽<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
4、ADC_EOC_IE 中断生成
|
4<EFBFBD><EFBFBD>ADC_EOC_IE <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
5、如果使能了 IER寄存器的 EOC_INT_EN 和OVER_RUN_INT_EN 位,则系统进入中断
|
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> IER<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC_INT_EN <EFBFBD><EFBFBD>OVER_RUN_INT_EN λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
|
|
||||||
注意:ADC_eoc_config_reg寄存器仅仅在连续采样-非等待模式下有效 即:0:连续模式不接收EOC即开始启动下一次转换
|
ע<EFBFBD>⣺ADC_eoc_config_reg<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD>ǵȴ<EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
|
||||||
1:连续模式接收到EOC后开始启动下一次转换
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
|
||||||
在连续采样-等待模式下,ADC_eoc_config_reg应该被设置为0 !!!
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD>ȴ<EFBFBD>ģʽ<EFBFBD>£<EFBFBD>ADC_eoc_config_regӦ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*四、等待模式
|
/*<EFBFBD>ġ<EFBFBD><EFBFBD>ȴ<EFBFBD>ģʽ
|
||||||
1、设置ADC_CONFIG_reg bit2 = 1 (使能等待模式)
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit2 = 1 <EFBFBD><EFBFBD>ʹ<EFBFBD>ܵȴ<EFBFBD>ģʽ<EFBFBD><EFBFBD>
|
||||||
2、启动测量转换
|
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
|
||||||
3、在转换完成后:
|
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>
|
||||||
存ADC数据到相应寄存器中
|
<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
ADC_EOC_IE 中断生成
|
ADC_EOC_IE <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
如果使能了 IER寄存器的 EOC_INT_EN 和OVER_RUN_INT_EN 位,则系统进入中断
|
<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> IER<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC_INT_EN <EFBFBD><EFBFBD>OVER_RUN_INT_EN λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
4、ADC控制器进入到ADC_WAIT 等待状态直到EOC中断被清除 或者 ADC数据被系统读走
|
4<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뵽ADC_WAIT <EFBFBD>ȴ<EFBFBD>״ֱ̬<EFBFBD><EFBFBD>EOC<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
5、一旦EOC中断被清除,ADC开始下一次的转换
|
5<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>EOC<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD>ת<EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*五、数据锁存器
|
/*<EFBFBD>塢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
1、当ADC控制启接收到EOC后,数据将被锁存
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
2、如果 OVERRUN模式被使能,新的转换数据将会被锁存 无论 overrun 错误状态如何
|
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OVERRUNģʽ<EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD><EFBFBD>µ<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ᱻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
注意: 如果overrun 模式没有被使能, 新的或者旧的转换数据将根据overrun 错误状态选择性锁存
|
ע<EFBFBD>⣺ <EFBFBD><EFBFBD><EFBFBD>overrun ģʽû<EFBFBD>б<EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD> <EFBFBD>µĻ<EFBFBD><EFBFBD>߾ɵ<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
即: 如果overrun 错误发生,数据将不会被锁存
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
如果没有overrun 错误发生,新数据将被锁存
|
<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*六、中断说明
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>˵<EFBFBD><EFBFBD>
|
||||||
1、接收到EOC后 EOC_IR 生成
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD> EOC_IR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
2、OVERRUN错误发生后OVERRUN_IR 生成
|
2<EFBFBD><EFBFBD>OVERRUN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OVERRUN_IR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
3、EOC_IR 和overrun 作为ADC中断被 通道到系统
|
3<EFBFBD><EFBFBD>EOC_IR <EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD>ΪADC<EFBFBD>жϱ<EFBFBD> ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
|
||||||
在系统通过 data_reg 读取走adc数据后, EOC_IR 被 EOC_IR_CLEAR 清除
|
<EFBFBD><EFBFBD>ϵͳͨ<EFBFBD><EFBFBD> data_reg <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>adc<EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD> EOC_IR <EFBFBD><EFBFBD> EOC_IR_CLEAR <EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*overrun 错误
|
/*overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
此错误指的是: ADC控制器在系统读取走ADC数据前(在清除到上一个EOC_IR前),接收到新的EOC
|
<EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>EOC_IRǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD>µ<EFBFBD>EOC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -148,13 +148,13 @@ uint8_t ENS1_ADC_CONFIG(ENS_ADC_SEL channelx ,
|
||||||
|
|
||||||
CMSDK_ADC->ADC_SAMP_TIME = (CMSDK_ADC->ADC_SAMP_TIME &~ 0x3) | SIMLING_TIME;
|
CMSDK_ADC->ADC_SAMP_TIME = (CMSDK_ADC->ADC_SAMP_TIME &~ 0x3) | SIMLING_TIME;
|
||||||
|
|
||||||
//配置ADC_eoc_config_reg寄存器,(仅仅在连续采样-非等待模式下有效)
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_eoc_config_reg<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D>ǵȴ<C7B5>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||||||
if( ((MODE_SEL & 0X1 )== 1 ) && (MODE_SEL & 0X4) == 0)
|
if( ((MODE_SEL & 0X1 )== 1 ) && (MODE_SEL & 0X4) == 0)
|
||||||
{
|
{
|
||||||
CMSDK_ADC->ADC_EOC_CONFG = (CMSDK_ADC->ADC_EOC_CONFG &~ (0x1)) | EOC_CONFIG;
|
CMSDK_ADC->ADC_EOC_CONFG = (CMSDK_ADC->ADC_EOC_CONFG &~ (0x1)) | EOC_CONFIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
//中断使能
|
//<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||||
CMSDK_ADC->ADC_IER = (CMSDK_ADC->ADC_IER &~ (0x3)) | ( INT_MODE_SEL );
|
CMSDK_ADC->ADC_IER = (CMSDK_ADC->ADC_IER &~ (0x3)) | ( INT_MODE_SEL );
|
||||||
return CMSDK_ADC->ADC_CONFG;
|
return CMSDK_ADC->ADC_CONFG;
|
||||||
}
|
}
|
||||||
|
|
@ -176,11 +176,11 @@ uint8_t ENS1_ADC_STOP(ENS_ADC_SEL channelx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//连续读取数据
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
//ADC在不同模式下有不同的采集方式,根据Adc_config_register的配置不同,共8种模式
|
//ADC<EFBFBD>ڲ<EFBFBD>ͬģʽ<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ͬ<EFBFBD>IJɼ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Adc_config_register<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD>ģʽ
|
||||||
uint16_t save_data;
|
uint16_t save_data;
|
||||||
uint8_t ADC_CONFIG_READ;
|
uint8_t ADC_CONFIG_READ;
|
||||||
//此函数未完成,测试使用连续采集+中断模式,此函数暂时用不到
|
//<EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>+<2B>ж<EFBFBD>ģʽ<C4A3><CABD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
||||||
|
|
||||||
uint16_t ADC_READ_DATA(void)
|
uint16_t ADC_READ_DATA(void)
|
||||||
{
|
{
|
||||||
|
|
@ -188,8 +188,8 @@ uint16_t ADC_READ_DATA(void)
|
||||||
ADC_CONFIG_READ = CMSDK_ADC->ADC_CONFG;
|
ADC_CONFIG_READ = CMSDK_ADC->ADC_CONFG;
|
||||||
switch(ADC_CONFIG_READ & 0x7) {
|
switch(ADC_CONFIG_READ & 0x7) {
|
||||||
case single_mode_without_overrun_without_wait :
|
case single_mode_without_overrun_without_wait :
|
||||||
while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //等待在中断中EOC的到来
|
while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>EOC<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //中断发生,已经有ADC的数据了,此时再将状态切换到等待下一次数据
|
ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ٽ<EFBFBD>״̬<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -230,12 +230,11 @@ uint16_t ADC_READ_DATA(void)
|
||||||
//ADC interrupt handler
|
//ADC interrupt handler
|
||||||
void ADC_Handler(void) __irq
|
void ADC_Handler(void) __irq
|
||||||
{
|
{
|
||||||
if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //接收到EOC
|
if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC
|
||||||
{
|
{
|
||||||
CMSDK_ADC->ADC_INT_CLR = (0x01<<0);
|
CMSDK_ADC->ADC_INT_CLR = (0x01<<0);
|
||||||
ADC_READ_STATUS = ADC_READ_DATA_IS_READY;
|
ADC_READ_STATUS = ADC_READ_DATA_IS_READY;
|
||||||
save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //读走数据后,可以进行下一次采集
|
save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<DDBA><F3A3ACBF>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>βɼ<CEB2>
|
||||||
printf("%d\n",save_data);
|
|
||||||
ADC_UART_BYTE_LOW = save_data&0xff;
|
ADC_UART_BYTE_LOW = save_data&0xff;
|
||||||
ADC_UART_BYTE_HIGH = (save_data&0x0f00)>>8;
|
ADC_UART_BYTE_HIGH = (save_data&0x0f00)>>8;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,106 +11,106 @@ History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
#include "ENS_CURRENT_CALIBRATION.h"
|
#include "ENS_CURRENT_CALIBRATION.h"
|
||||||
#include "ENS1_MTP.h"
|
#include "ENS1_MTP.h"
|
||||||
#include "ENS1_UART.h"
|
#include "ENS1_UART.h"
|
||||||
#include "ENS1_TIMER.h"
|
#include "ENS1_TIMER.h"
|
||||||
|
|
||||||
/*--------------------------------波形参数的初始化幅值结构体-----------------------------*/
|
/*--------------------------------<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ṹ<EFBFBD><EFBFBD>-----------------------------*/
|
||||||
|
|
||||||
STRUCT_WAVEFORM_PARA ParaSet_waveform[4] =
|
STRUCT_WAVEFORM_PARA ParaSet_waveform[4] =
|
||||||
{
|
{
|
||||||
/*通道1 -- ST0 ST1 */
|
/*ͨ<EFBFBD><EFBFBD>1 -- ST0 ST1 */
|
||||||
{
|
{
|
||||||
.Type = SQUARE_WAVE , //波形种类选择
|
.Type = SQUARE_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
|
||||||
.PositivePulseWidth = 100 , //正半周期脉宽-微秒
|
.PositivePulseWidth = 100 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DeadTime = 10, //死区时间-微秒
|
.DeadTime = 10, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.NegativePulseWidth = 100 , //负半周期脉宽-微秒
|
.NegativePulseWidth = 100 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.ClientTime = 1000 , //静默时间-微秒
|
.ClientTime = 1000 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DelayOutputTime_US = 0, //延迟输出时间-微秒
|
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
|
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD>沨<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
|
||||||
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
|
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
|
||||||
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
|
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
|
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||||
},
|
},
|
||||||
/*通道2 -- ST2 ST3 */
|
/*ͨ<EFBFBD><EFBFBD>2 -- ST2 ST3 */
|
||||||
{
|
{
|
||||||
.Type = TRIANGULAR_WAVE , //波形种类选择
|
.Type = TRIANGULAR_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
|
||||||
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
|
.PositivePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DeadTime = 0, //死区时间-微秒
|
.DeadTime = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
|
.NegativePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.ClientTime = 0 , //静默时间-微秒
|
.ClientTime = 0 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DelayOutputTime_US = 0, //延迟输出时间-微秒
|
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
|
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD>沨<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
|
||||||
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
|
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
|
||||||
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
|
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
|
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||||
},
|
},
|
||||||
/*通道3 -- ST4 ST5 */
|
/*ͨ<EFBFBD><EFBFBD>3 -- ST4 ST5 */
|
||||||
{
|
{
|
||||||
.Type = TRIANGULAR_WAVE , //波形种类选择
|
.Type = TRIANGULAR_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
|
||||||
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
|
.PositivePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DeadTime = 0, //死区时间-微秒
|
.DeadTime = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
|
.NegativePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.ClientTime = 0 , //静默时间-微秒
|
.ClientTime = 0 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DelayOutputTime_US = 0, //延迟输出时间-微秒
|
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
|
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD>沨<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
|
||||||
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
|
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
|
||||||
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
|
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
|
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||||
},
|
},
|
||||||
/*通道4 -- ST6 ST7 */
|
/*ͨ<EFBFBD><EFBFBD>4 -- ST6 ST7 */
|
||||||
{
|
{
|
||||||
.Type = TRIANGULAR_WAVE , //波形种类选择
|
.Type = TRIANGULAR_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
|
||||||
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
|
.PositivePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DeadTime = 0, //死区时间-微秒
|
.DeadTime = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
|
.NegativePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.ClientTime = 0 , //静默时间-微秒
|
.ClientTime = 0 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.DelayOutputTime_US = 0, //延迟输出时间-微秒
|
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>-<><CEA2>
|
||||||
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
|
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD>沨<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
|
||||||
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
|
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
|
||||||
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
|
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
|
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/*-------------------------获取到FT测试后的实际测量单元电流值---------------------------*/
|
/*-------------------------<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD>ʵ<EFBFBD>ʲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ---------------------------*/
|
||||||
uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //用于保存FT读取出的数据
|
uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //<EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //用于自定义单元电流值
|
uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>嵥Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
uint8_t unit_current[4] ={0,0,0,0}; //保存计算好的实际单元电流值
|
uint8_t unit_current[4] ={0,0,0,0}; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
uint8_t GET_FT_CURRENT(void) //电流设置:208*4
|
uint8_t GET_FT_CURRENT(void) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>208*4
|
||||||
{
|
{
|
||||||
//当需要使用FT后的芯片时,打开注释, 此时自动计算单元电流
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD><EFBFBD>оƬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ͣ<EFBFBD> <20><>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>㵥Ԫ<E3B5A5><D4AA><EFBFBD><EFBFBD>
|
||||||
//当手动校准时,修改CUSTOM_UNIT_CURRENT[4] 数组中的数据,并将下面4行注释掉
|
//<EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>Уʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>CUSTOM_UNIT_CURRENT[4] <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34>ע<EFBFBD>͵<EFBFBD>
|
||||||
// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
|
// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
|
// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
|
// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
|
// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
for(int i = 0 ;i<4;i++)
|
for(int i = 0 ;i<4;i++)
|
||||||
{
|
{
|
||||||
if(FT_CURRENT_SAVE[i] != 0)
|
if(FT_CURRENT_SAVE[i] != 0)
|
||||||
unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //计算实际单元电流
|
unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
else
|
else
|
||||||
unit_current[i] = CUSTOM_UNIT_CURRENT[i] ;
|
unit_current[i] = CUSTOM_UNIT_CURRENT[i] ;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------输出电流大小设置--------------------------------*/
|
/*-------------------------------------<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>--------------------------------*/
|
||||||
//正弦波计算数据填充值
|
//<EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
double sin_cal(uint8_t angle) //0-180
|
double sin_cal(uint8_t angle) //0-180
|
||||||
{
|
{
|
||||||
double radian = angle*PI/180;
|
double radian = angle*PI/180;
|
||||||
return sin(radian);
|
return sin(radian);
|
||||||
}
|
}
|
||||||
|
|
||||||
//计算不同波形下的的64个点的值,当前有方波,正弦波,三角波
|
//<EFBFBD><EFBFBD><EFBFBD>㲻ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µĵ<EFBFBD>64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>
|
||||||
uint16_t unit_t[4]; //保存计算后的单元电流系数(0-7) 共四个通道
|
uint16_t unit_t[4]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-7<><37> <20><><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><CDA8>
|
||||||
uint32_t isel_t[4][64]; //保存计算后得到的电流挡位(0-255)共四个通道
|
uint32_t isel_t[4][64]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>0-255<35><35><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><CDA8>
|
||||||
BasicWaveformType wavePara_type[4];
|
BasicWaveformType wavePara_type[4];
|
||||||
uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType type, uint16_t* unit , uint32_t (*isel)[64]) // uint16_t read_current_data
|
uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType type, uint16_t* unit , uint32_t (*isel)[64]) // uint16_t read_current_data
|
||||||
{
|
{
|
||||||
|
|
@ -134,7 +134,7 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t
|
||||||
{
|
{
|
||||||
if(type == SQUARE_WAVE)
|
if(type == SQUARE_WAVE)
|
||||||
{
|
{
|
||||||
//保存计算结果,用于给电流相关的寄存器赋值
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
|
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
|
||||||
for(int i = 0 ;i<64;i++)
|
for(int i = 0 ;i<64;i++)
|
||||||
{
|
{
|
||||||
|
|
@ -143,16 +143,16 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t
|
||||||
}
|
}
|
||||||
else if(type== SINE_WAVE)
|
else if(type== SINE_WAVE)
|
||||||
{
|
{
|
||||||
//保存计算结果,用于给电流相关的寄存器赋值
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
|
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
|
||||||
for(int i = 0 ;i<64;i++)
|
for(int i = 0 ;i<64;i++)
|
||||||
{
|
{
|
||||||
*(isel[0]+CHANNEL_X*64+i) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X) + 1)*unit_current[CHANNEL_X])*sin_cal(i*2.85714)); // 0 - 255
|
*(isel[0]+CHANNEL_X*64+i) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X) + 1)*unit_current[CHANNEL_X])*sin_cal(i*2.85714)); // 0 - 255
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else //三角波赋值(type == TRIANGULAR_WAVE )
|
else //<EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD>ֵ(type == TRIANGULAR_WAVE )
|
||||||
{
|
{
|
||||||
//保存计算结果,用于给电流相关的寄存器赋值
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
|
|
||||||
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
|
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
|
||||||
*(isel[0]+CHANNEL_X*64) = 0;
|
*(isel[0]+CHANNEL_X*64) = 0;
|
||||||
|
|
@ -160,20 +160,18 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t
|
||||||
for(int j = 1 ; j<32 ; j++)
|
for(int j = 1 ; j<32 ; j++)
|
||||||
{
|
{
|
||||||
*(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255
|
*(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255
|
||||||
// printf("%d\n",*(isel[0]+CHANNEL_X*64+j));
|
|
||||||
}
|
}
|
||||||
for(int k = 32 ; k<63 ; k++)
|
for(int k = 32 ; k<63 ; k++)
|
||||||
{
|
{
|
||||||
*(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ;
|
*(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ;
|
||||||
// printf("%d\n",*(isel[0]+CHANNEL_X*64+k));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*初始化设置*/
|
/*<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
/*CONFIG寄存器设置*/
|
/*CONFIG<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
uint8_t ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
|
uint8_t ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
|
||||||
{
|
{
|
||||||
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
||||||
|
|
@ -223,7 +221,7 @@ uint8_t ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------电刺激有关的寄存器的初始化--------------------------------*/
|
/*---------------------------<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD>йصļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD>--------------------------------*/
|
||||||
uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
|
uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
|
||||||
{
|
{
|
||||||
//uint32_t WaveformFreq=0;
|
//uint32_t WaveformFreq=0;
|
||||||
|
|
@ -232,9 +230,9 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
|
||||||
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
|
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
|
||||||
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
|
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
|
||||||
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
|
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
|
||||||
//config 设置
|
//config <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,DISABLE_ALL_BIT);
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,DISABLE_ALL_BIT);
|
||||||
//1 、 死区时间不为0,波形不为sine波 ,使能REST
|
//1 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>䲻Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD>Ϊsine<6E><65> ,ʹ<><CAB9>REST
|
||||||
if((ParaSet_waveform[CHANNEL_X].DeadTime > 0)){
|
if((ParaSet_waveform[CHANNEL_X].DeadTime > 0)){
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,REST_BIT);
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,REST_BIT);
|
||||||
}
|
}
|
||||||
|
|
@ -242,13 +240,13 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
|
||||||
{
|
{
|
||||||
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,REST_BIT);
|
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,REST_BIT);
|
||||||
}
|
}
|
||||||
//2 、 负半周期脉宽大于0 使能 NEGATIVE_BIT 和 SOURCE_B_BIT
|
//2 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 ʹ<><CAB9> NEGATIVE_BIT <20><> SOURCE_B_BIT
|
||||||
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth > 0)
|
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth > 0)
|
||||||
{
|
{
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEB不使能则负半周期的数据无效(=0)
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEB<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>=0<><30>
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,NEGATIVE_BIT );
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,NEGATIVE_BIT );
|
||||||
}
|
}
|
||||||
//3、静默时间不为0,开启SILENT_BIT
|
//3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭʱ<EFBFBD>䲻Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SILENT_BIT
|
||||||
if(ParaSet_waveform[CHANNEL_X].ClientTime>0)
|
if(ParaSet_waveform[CHANNEL_X].ClientTime>0)
|
||||||
{
|
{
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SILENT_BIT);
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SILENT_BIT);
|
||||||
|
|
@ -258,13 +256,13 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
|
||||||
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SILENT_BIT);
|
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SILENT_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
//4、交替模式ALTERNATING_POSITIVE_BIT
|
//4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽALTERNATING_POSITIVE_BIT
|
||||||
if(ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ > 0 )
|
if(ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ > 0 )
|
||||||
{
|
{
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,ALTERNATING_POSITIVE_BIT);
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,ALTERNATING_POSITIVE_BIT);
|
||||||
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SOURCE_B_BIT);
|
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SOURCE_B_BIT);
|
||||||
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,NEGATIVE_BIT);
|
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,NEGATIVE_BIT);
|
||||||
//交替时间与主频有关,输入的参数为交替频率,需要转化为时钟个数,时钟个数不能超过2^16
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>й<EFBFBD>,<2C><><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>Ҫת<D2AA><D7AA>Ϊʱ<CEAA>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>2^16
|
||||||
WAVE_GEN_BLK ->WAVE_GEN_DRV_ALT_LIM_REG =(uint16_t)(ParaSet_waveform[CHANNEL_X].PositivePulseWidth / (uint16_t)ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ * (uint16_t)(APB_Clock_Freq/1000000)) ;
|
WAVE_GEN_BLK ->WAVE_GEN_DRV_ALT_LIM_REG =(uint16_t)(ParaSet_waveform[CHANNEL_X].PositivePulseWidth / (uint16_t)ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ * (uint16_t)(APB_Clock_Freq/1000000)) ;
|
||||||
ParaSet_waveform[CHANNEL_X].NegativePulseWidth = 0;
|
ParaSet_waveform[CHANNEL_X].NegativePulseWidth = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -274,37 +272,37 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
|
||||||
}
|
}
|
||||||
|
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,CONTINUE_REPEATING_BIT);
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,CONTINUE_REPEATING_BIT);
|
||||||
//延迟输出时间计算 单位us
|
//<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>λus
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_DELAY_LIM_REG = (uint8_t)(APB_Clock_Freq/1000000)*ParaSet_waveform[CHANNEL_X].DelayOutputTime_US;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_DELAY_LIM_REG = (uint8_t)(APB_Clock_Freq/1000000)*ParaSet_waveform[CHANNEL_X].DelayOutputTime_US;
|
||||||
//根据初始化后的STRUCT_WAVEFORM_PARA结构体给对应的寄存器赋值
|
//<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>STRUCT_WAVEFORM_PARA<EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||||
|
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].NegativePulseWidth;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].NegativePulseWidth;
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].PositivePulseWidth;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].PositivePulseWidth;
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_CLK_FREQ_REG = (uint32_t)(APB_Clock_Freq/1000000); //
|
WAVE_GEN_BLK->WAVE_GEN_DRV_CLK_FREQ_REG = (uint32_t)(APB_Clock_Freq/1000000); //
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = ParaSet_waveform[CHANNEL_X].ClientTime;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = ParaSet_waveform[CHANNEL_X].ClientTime;
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_REST_T_REG = ParaSet_waveform[CHANNEL_X].DeadTime;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_REST_T_REG = ParaSet_waveform[CHANNEL_X].DeadTime;
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //寄存器默认为0, 必须写大于0的数
|
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_OFFSET_REG = 0;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_OFFSET_REG = 0;
|
||||||
|
|
||||||
//WaveformFreq = (uint32_t)(1000000 / (wavePara.ClientTime + wavePara.DeadTime +wavePara.NegativePulseWidth + wavePara.PositivePulseWidth));
|
//WaveformFreq = (uint32_t)(1000000 / (wavePara.ClientTime + wavePara.DeadTime +wavePara.NegativePulseWidth + wavePara.PositivePulseWidth));
|
||||||
//保存波形类型数据
|
//<EFBFBD><EFBFBD><EFBFBD>沨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
wavePara_type[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].Type;
|
wavePara_type[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].Type;
|
||||||
|
|
||||||
TOTAL_TIME_THRESHOLD_VALUE[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TotalOutputTime_S * 1000;
|
TOTAL_TIME_THRESHOLD_VALUE[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TotalOutputTime_S * 1000;
|
||||||
if( (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS > 0) || (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups >0))
|
if( (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS > 0) || (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups >0))
|
||||||
{
|
{
|
||||||
TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //间隔时间清零
|
TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
TRIGGER_TIME_THRESHOLD_VALUE[CHANNEL_X]=ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS ;
|
TRIGGER_TIME_THRESHOLD_VALUE[CHANNEL_X]=ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS ;
|
||||||
NUM_OF_PULSES_THRESHOLD[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups ;
|
NUM_OF_PULSES_THRESHOLD[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups ;
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
|
||||||
}
|
}
|
||||||
uint8_t returnValue = cal_output_current_mA(CHANNEL_X,0, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
|
uint8_t returnValue = cal_output_current_mA(CHANNEL_X,0, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
|
||||||
|
|
||||||
return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //返回波形的频率
|
return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD>ε<EFBFBD>Ƶ<EFBFBD><EFBFBD>
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------启动输出-----------------------------------------*/
|
/*--------------------------------------<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------------------------*/
|
||||||
volatile uint8_t statics_config=0; //明确当前有几个通道在输出 0 / 1 / 2 /4 / 8
|
volatile uint8_t statics_config=0; //<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ǰ<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 / 1 / 2 /4 / 8
|
||||||
void StartStimulatorOut(CHANNEL_NUM CHANNEL_X)
|
void StartStimulatorOut(CHANNEL_NUM CHANNEL_X)
|
||||||
{
|
{
|
||||||
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
||||||
|
|
@ -314,11 +312,11 @@ void StartStimulatorOut(CHANNEL_NUM CHANNEL_X)
|
||||||
else {WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; statics_config |= (1<<3) ;}
|
else {WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; statics_config |= (1<<3) ;}
|
||||||
if(statics_config > 1)
|
if(statics_config > 1)
|
||||||
{
|
{
|
||||||
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //多电极使能
|
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //<EFBFBD><EFBFBD>缫ʹ<EFBFBD><EFBFBD>
|
||||||
}
|
}
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG = 1;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG = 1;
|
||||||
}
|
}
|
||||||
/*--------------------------------------停止输出----------------------------------------*/
|
/*--------------------------------------ֹͣ<EFBFBD><EFBFBD><EFBFBD>----------------------------------------*/
|
||||||
void StopStimulatorOut(CHANNEL_NUM CHANNEL_X)
|
void StopStimulatorOut(CHANNEL_NUM CHANNEL_X)
|
||||||
{
|
{
|
||||||
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
||||||
|
|
@ -333,8 +331,8 @@ void StopStimulatorOut(CHANNEL_NUM CHANNEL_X)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------电刺激过程中的电流、频率设置-------------------------------*/
|
/*-----------------------------<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-------------------------------*/
|
||||||
/*输出电流大小修改*/
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>*/
|
||||||
uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA)
|
uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA)
|
||||||
{
|
{
|
||||||
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
|
||||||
|
|
@ -347,18 +345,18 @@ uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA)
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0;
|
||||||
StopStimulatorOut(CHANNEL_X);
|
StopStimulatorOut(CHANNEL_X);
|
||||||
cal_output_current_mA(CHANNEL_X,mA, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
|
cal_output_current_mA(CHANNEL_X,mA, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
|
||||||
WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //范围 0x00 - 0x07 单元电流
|
WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //<EFBFBD><EFBFBD>Χ 0x00 - 0x07 <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
|
||||||
for(int i=0; i<64; i++){
|
for(int i=0; i<64; i++){
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //最大0xff 电流挡位
|
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //<EFBFBD><EFBFBD><EFBFBD>0xff <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||||
}
|
}
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
|
||||||
NVIC_EnableIRQ(WG_DRV_IRQn);
|
NVIC_EnableIRQ(WG_DRV_IRQn);
|
||||||
StartStimulatorOut(CHANNEL_X);
|
StartStimulatorOut(CHANNEL_X);
|
||||||
return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //返回状态
|
return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||||
}
|
}
|
||||||
|
|
||||||
/*输出波形频率的实时修改,输出时,波形频率=(1000000/(正半周期脉宽 + 负半周期脉宽 + 死区时间 + 静默时间))*/
|
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʵ<EFBFBD>ʵʱ<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>=(1000000/(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> + <20><>Ĭʱ<C4AC><CAB1>))*/
|
||||||
uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
|
uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
|
||||||
{
|
{
|
||||||
uint32_t Pulse_Width = 0;
|
uint32_t Pulse_Width = 0;
|
||||||
|
|
@ -371,16 +369,16 @@ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
|
||||||
freq = 50000;
|
freq = 50000;
|
||||||
else if(freq < 10)
|
else if(freq < 10)
|
||||||
freq = 10;
|
freq = 10;
|
||||||
//死区数值不改动,如果静默时间不为0 ,则通过修改静默时间修改波形频率 ,如果静默时间为0,则修改正半周期/负半周期脉宽修改频率
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭʱ<EFBFBD>䲻Ϊ0 <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ľ<DEB8>Ĭʱ<C4AC><CAB1><EFBFBD>IJ<DEB8><C4B2><EFBFBD>Ƶ<EFBFBD><C6B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭʱ<C4AC><CAB1>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
|
||||||
if(ParaSet_waveform[CHANNEL_X].ClientTime > 0)
|
if(ParaSet_waveform[CHANNEL_X].ClientTime > 0)
|
||||||
{
|
{
|
||||||
Pulse_Width/*静默时间*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth);
|
Pulse_Width/*<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD>*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth);
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = Pulse_Width;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = Pulse_Width;
|
||||||
return Pulse_Width;
|
return Pulse_Width;
|
||||||
}
|
}
|
||||||
else if(ParaSet_waveform[CHANNEL_X].ClientTime == 0)
|
else if(ParaSet_waveform[CHANNEL_X].ClientTime == 0)
|
||||||
{
|
{
|
||||||
Pulse_Width/*正+负脉宽*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ;
|
Pulse_Width/*<EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ;
|
||||||
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth == 0)
|
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth == 0)
|
||||||
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = Pulse_Width;
|
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = Pulse_Width;
|
||||||
else
|
else
|
||||||
|
|
@ -397,7 +395,7 @@ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//电刺激时间计时
|
//<EFBFBD><EFBFBD>̼<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ʱ
|
||||||
|
|
||||||
uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE)
|
uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE)
|
||||||
{
|
{
|
||||||
|
|
@ -406,20 +404,20 @@ uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE)
|
||||||
{
|
{
|
||||||
count_time = *(CHANNEL_TIME_COUNT+CHANNEL_X) ;
|
count_time = *(CHANNEL_TIME_COUNT+CHANNEL_X) ;
|
||||||
}
|
}
|
||||||
else //MODE == TRIGGER_TIME_MODE 间隔时间
|
else //MODE == TRIGGER_TIME_MODE <EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
count_time = *(TRIGGER_TIME_COUNT+CHANNEL_X);
|
count_time = *(TRIGGER_TIME_COUNT+CHANNEL_X);
|
||||||
}
|
}
|
||||||
return count_time;
|
return count_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
//返回当前波形发生了多少次(需要开启波形发生器的中断)
|
//<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><EFBFBD>ٴΣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD>
|
||||||
uint32_t waveformOccurreCount(CHANNEL_NUM CHANNEL_X)
|
uint32_t waveformOccurreCount(CHANNEL_NUM CHANNEL_X)
|
||||||
{
|
{
|
||||||
return (uint32_t)(wave_gen_irq_occurred[CHANNEL_X]/4);
|
return (uint32_t)(wave_gen_irq_occurred[CHANNEL_X]/4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------电刺激驱动器中断处理函数-----------------------*/
|
/*-------------------------------<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------*/
|
||||||
volatile uint32_t NUM_OF_PULSES_THRESHOLD[4]={0,0,0,0};
|
volatile uint32_t NUM_OF_PULSES_THRESHOLD[4]={0,0,0,0};
|
||||||
volatile uint32_t wave_gen_irq_occurred[4]={0,0,0,0};
|
volatile uint32_t wave_gen_irq_occurred[4]={0,0,0,0};
|
||||||
void WG_DRV_Handler(void)
|
void WG_DRV_Handler(void)
|
||||||
|
|
@ -433,9 +431,9 @@ void WG_DRV_Handler(void)
|
||||||
else if(i==2){ DRVA= WAVE_GEN_DRVA_BLK2; }
|
else if(i==2){ DRVA= WAVE_GEN_DRVA_BLK2; }
|
||||||
else if(i==3){ DRVA= WAVE_GEN_DRVA_BLK3; }
|
else if(i==3){ DRVA= WAVE_GEN_DRVA_BLK3; }
|
||||||
|
|
||||||
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //判断哪个通道发生了中断
|
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //<EFBFBD>ж<EFBFBD><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
{
|
{
|
||||||
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//第一中断点发生中断
|
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//<EFBFBD><EFBFBD>һ<EFBFBD>жϵ㷢<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
{
|
{
|
||||||
if(((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Msk)>>CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Pos) == 0)
|
if(((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Msk)>>CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Pos) == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -448,7 +446,7 @@ void WG_DRV_Handler(void)
|
||||||
{
|
{
|
||||||
DRVA->WAVE_GEN_DRV_INT_REG = (31 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (0 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
|
DRVA->WAVE_GEN_DRV_INT_REG = (31 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (0 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
|
||||||
}
|
}
|
||||||
if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //需要脉冲计数功能才开启计数
|
if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲſ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
wave_gen_irq_occurred[i]++;
|
wave_gen_irq_occurred[i]++;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -459,8 +457,8 @@ void WG_DRV_Handler(void)
|
||||||
DRVA->WAVE_GEN_DRV_INT_REG = CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
|
DRVA->WAVE_GEN_DRV_INT_REG = CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
|
||||||
NVIC_DisableIRQ(WG_DRV_IRQn);
|
NVIC_DisableIRQ(WG_DRV_IRQn);
|
||||||
DRVA->WAVE_GEN_DRV_INT_REG = 0;
|
DRVA->WAVE_GEN_DRV_INT_REG = 0;
|
||||||
TRIGGER_TIME_COUNT_FLAG |= (1<<i); //脉冲群标志置1
|
TRIGGER_TIME_COUNT_FLAG |= (1<<i); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>1
|
||||||
wave_gen_irq_occurred[i] = 0; //清零计数
|
wave_gen_irq_occurred[i] = 0; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3159
JLinkLog.txt
3159
JLinkLog.txt
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -297,11 +297,12 @@ ARM Macro Assembler Page 5
|
||||||
00000000
|
00000000
|
||||||
00000000
|
00000000
|
||||||
Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M0 --apcs=interw
|
Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M0 --apcs=interw
|
||||||
ork --depend=.\objects\startup_cmsdk_cm0.d -o.\objects\startup_cmsdk_cm0.o -ID:
|
ork --depend=.\objects\startup_cmsdk_cm0.d -o.\objects\startup_cmsdk_cm0.o -IC:
|
||||||
\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\
|
\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE -IC:\Users\29096\AppData\Local\
|
||||||
Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include --predefine="__MICROLIB SE
|
Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include -IC:\Keil_v5\ARM\CMSIS\Incl
|
||||||
TA 1" --predefine="__UVISION_VERSION SETA 538" --predefine="ARMCM0 SETA 1" --li
|
ude --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 514" --
|
||||||
st=.\listings\startup_cmsdk_cm0.lst CORE\ARM\startup_CMSDK_CM0.s
|
predefine="ARMCM0 SETA 1" --list=.\listings\startup_cmsdk_cm0.lst CORE\ARM\star
|
||||||
|
tup_CMSDK_CM0.s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -3,44 +3,42 @@
|
||||||
<pre>
|
<pre>
|
||||||
<h1>µVision Build Log</h1>
|
<h1>µVision Build Log</h1>
|
||||||
<h2>Tool Versions:</h2>
|
<h2>Tool Versions:</h2>
|
||||||
IDE-Version: ¦ÌVision V5.38.0.0
|
IDE-Version: ¦ÌVision V5.14.2
|
||||||
Copyright (C) 2022 ARM Ltd and ARM Germany GmbH. All rights reserved.
|
Copyright (C) 2015 ARM Ltd and ARM Germany GmbH. All rights reserved.
|
||||||
License Information: rick chen, hangzhouQX, LIC=RC93N-YY58Z-RAADM-X0YVM-V5YIY-0QTVL
|
License Information: s 2909605431@qq.com, s, LIC=CZLZX-HAP5E-WFDI7-E212L-HDEAA-ZXKD1
|
||||||
|
|
||||||
Tool Versions:
|
Tool Versions:
|
||||||
Toolchain: MDK-ARM Plus Version: 5.38.0.0
|
Toolchain: MDK-ARM Standard Version: 5.36.0.0
|
||||||
Toolchain Path: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin
|
Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin
|
||||||
C Compiler: Armcc.exe V5.06 update 6 (build 750)
|
C Compiler: Armcc.exe V5.06 update 7 (build 960)
|
||||||
Assembler: Armasm.exe V5.06 update 6 (build 750)
|
Assembler: Armasm.exe V5.06 update 7 (build 960)
|
||||||
Linker/Locator: ArmLink.exe V5.06 update 6 (build 750)
|
Linker/Locator: ArmLink.exe V5.06 update 7 (build 960)
|
||||||
Library Manager: ArmAr.exe V5.06 update 6 (build 750)
|
Library Manager: ArmAr.exe V5.06 update 7 (build 960)
|
||||||
Hex Converter: FromElf.exe V5.06 update 6 (build 750)
|
Hex Converter: FromElf.exe V5.06 update 7 (build 960)
|
||||||
CPU DLL: SARMCM3.DLL V5.38.0.0
|
CPU DLL: SARMCM3.DLL V5.36.0.0
|
||||||
Dialog DLL: DARMCM1.DLL V1.19.6.0
|
Dialog DLL: DARMCM1.DLL V1.19.4.0
|
||||||
Target DLL: Segger\JL2CM3.dll V2.99.42.0
|
Target DLL: Segger\JL2CM3.dll V2.99.15.0
|
||||||
Dialog DLL: TARMCM1.DLL V1.14.6.0
|
Dialog DLL: TARMCM1.DLL V1.14.4.0
|
||||||
|
|
||||||
<h2>Project:</h2>
|
<h2>Project:</h2>
|
||||||
E:\Workspace\TIMER_DEMO\ENS001_BASIC_PRJ.uvprojx
|
C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\ENS001_BASIC_PRJ.uvprojx
|
||||||
Project File Date: 08/13/2025
|
Project File Date: 08/15/2025
|
||||||
|
|
||||||
<h2>Output:</h2>
|
<h2>Output:</h2>
|
||||||
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin'
|
*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
|
||||||
Build target 'ENS001_BASIC_PRJ'
|
Build target 'ENS001_BASIC_PRJ'
|
||||||
|
compiling mian.c...
|
||||||
|
compiling ENS1_UART.c...
|
||||||
|
linking...
|
||||||
|
Program Size: Code=9720 RO-data=384 RW-data=140 ZI-data=596
|
||||||
|
FromELF: creating hex file...
|
||||||
".\Objects\ENS001_BASIC_PRJ.axf" - 0 Error(s), 0 Warning(s).
|
".\Objects\ENS001_BASIC_PRJ.axf" - 0 Error(s), 0 Warning(s).
|
||||||
|
|
||||||
<h2>Software Packages used:</h2>
|
|
||||||
|
|
||||||
Package Vendor: ARM
|
|
||||||
https://www.keil.com/pack/ARM.Cortex_DFP.1.1.0.pack
|
|
||||||
ARM.Cortex_DFP.1.1.0
|
|
||||||
ARM Cortex Reference Subsystems Device Family Pack
|
|
||||||
|
|
||||||
<h2>Collection of Component include folders:</h2>
|
<h2>Collection of Component include folders:</h2>
|
||||||
D:/Keil_v5/ARM/Packs/ARM/Cortex_DFP/1.1.0/Device/ARMCM0/Include
|
C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
|
||||||
|
C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
|
||||||
|
|
||||||
<h2>Collection of Component Files used:</h2>
|
<h2>Collection of Component Files used:</h2>
|
||||||
Build Time Elapsed: 00:00:00
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -6,9 +6,11 @@
|
||||||
".\objects\ens1_clock.o"
|
".\objects\ens1_clock.o"
|
||||||
".\objects\retarget.o"
|
".\objects\retarget.o"
|
||||||
".\objects\ens1_timer.o"
|
".\objects\ens1_timer.o"
|
||||||
|
".\objects\ens1_boost.o"
|
||||||
|
".\objects\ens1_wavegen.o"
|
||||||
".\objects\system_cmsdk_cm0.o"
|
".\objects\system_cmsdk_cm0.o"
|
||||||
".\objects\startup_cmsdk_cm0.o"
|
".\objects\startup_cmsdk_cm0.o"
|
||||||
--library_type=microlib --strict --scatter ".\Objects\ENS001_BASIC_PRJ.sct"
|
--library_type=microlib --strict --scatter ".\Objects\ENS001_BASIC_PRJ.sct"
|
||||||
--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
|
--summary_stderr --info summarysizes --map --xref --callgraph --symbols
|
||||||
--info sizes --info totals --info unused --info veneers
|
--info sizes --info totals --info unused --info veneers
|
||||||
--list ".\Listings\ENS001_BASIC_PRJ.map" -o .\Objects\ENS001_BASIC_PRJ.axf
|
--list ".\Listings\ENS001_BASIC_PRJ.map" -o .\Objects\ENS001_BASIC_PRJ.axf
|
||||||
|
|
@ -7,7 +7,6 @@ LR_IROM1 0x10000000 0x00008000 { ; load region size_region
|
||||||
*.o (RESET, +First)
|
*.o (RESET, +First)
|
||||||
*(InRoot$$Sections)
|
*(InRoot$$Sections)
|
||||||
.ANY (+RO)
|
.ANY (+RO)
|
||||||
.ANY (+XO)
|
|
||||||
}
|
}
|
||||||
RW_IRAM1 0x20000000 0x00020000 { ; RW data
|
RW_IRAM1 0x20000000 0x00020000 { ; RW data
|
||||||
.ANY (+RW +ZI)
|
.ANY (+RW +ZI)
|
||||||
|
|
|
||||||
|
|
@ -1,104 +1,132 @@
|
||||||
Dependencies for Project 'ENS001_BASIC_PRJ', Target 'ENS001_BASIC_PRJ': (DO NOT MODIFY !)
|
Dependencies for Project 'ENS001_BASIC_PRJ', Target 'ENS001_BASIC_PRJ': (DO NOT MODIFY !)
|
||||||
CompilerVersion: 5060750::V5.06 update 6 (build 750)::.\ARM_Compiler_5.06u7
|
F (.\USER\mian.c)(0x68DB6E27)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\mian.o --omf_browse .\objects\mian.crf --depend .\objects\mian.d)
|
||||||
F (.\USER\mian.c)(0x689C4ADA)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\mian.o --omf_browse .\objects\mian.crf --depend .\objects\mian.d)
|
I (USER\my_header.h)(0x68C138EE)
|
||||||
I (USER\my_header.h)(0x689C4B9B)
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
I (.\FWLIB\include\ENS1_TIMER.h)(0x689C4BA6)
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
I (.\USER\my_header.h)(0x689C4B9B)
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
I (.\FWLIB\include\ENS1_MTP.h)(0x65605CD6)
|
I (.\FWLIB\include\ENS1_MTP.h)(0x65605CD6)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdlib.h)(0x599ECD2C)
|
I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
|
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358098)
|
||||||
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
|
I (.\FWLIB\include\ENS1_UART.h)(0x68DB4C98)
|
||||||
I (.\FWLIB\include\ENS1_UART.h)(0x689C4BC8)
|
I (.\FWLIB\include\ENS1_GPIO.h)(0x68B11DDE)
|
||||||
I (.\FWLIB\include\ENS1_GPIO.h)(0x656546CE)
|
I (.\FWLIB\include\ENS1_WAVEGEN.h)(0x68C2375A)
|
||||||
F (.\FWLIB\source\ENS1_UART.c)(0x689C4BE6)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\ens1_uart.o --omf_browse .\objects\ens1_uart.crf --depend .\objects\ens1_uart.d)
|
F (.\FWLIB\source\ENS1_TIMER.c)(0x68DB5580)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_timer.o --omf_browse .\objects\ens1_timer.crf --depend .\objects\ens1_timer.d)
|
||||||
I (.\USER\my_header.h)(0x689C4B9B)
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
I (.\FWLIB\include\ENS1_TIMER.h)(0x689C4BA6)
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
I (.\FWLIB\include\ENS1_UART.h)(0x689C4BC8)
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
I (.\FWLIB\include\ENS1_GPIO.h)(0x656546CE)
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
F (.\FWLIB\source\ENS1_GPIO.c)(0x689C4B85)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\ens1_gpio.o --omf_browse .\objects\ens1_gpio.crf --depend .\objects\ens1_gpio.d)
|
|
||||||
I (.\USER\my_header.h)(0x689C4B9B)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
|
||||||
I (.\FWLIB\include\ENS1_TIMER.h)(0x689C4BA6)
|
|
||||||
I (.\FWLIB\include\ENS1_GPIO.h)(0x656546CE)
|
|
||||||
F (.\FWLIB\source\ENS1_MTP.c)(0x680B4E85)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\ens1_mtp.o --omf_browse .\objects\ens1_mtp.crf --depend .\objects\ens1_mtp.d)
|
|
||||||
I (.\FWLIB\include\ENS1_MTP.h)(0x65605CD6)
|
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdlib.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
|
|
||||||
I (.\USER\my_header.h)(0x689C4B9B)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
|
|
||||||
I (.\FWLIB\include\ENS1_TIMER.h)(0x689C4BA6)
|
|
||||||
F (.\FWLIB\source\ENS1_CLOCK.c)(0x68358347)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\ens1_clock.o --omf_browse .\objects\ens1_clock.crf --depend .\objects\ens1_clock.d)
|
|
||||||
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
|
|
||||||
I (.\USER\my_header.h)(0x689C4B9B)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
|
||||||
I (.\FWLIB\include\ENS1_TIMER.h)(0x689C4BA6)
|
|
||||||
F (.\FWLIB\source\retarget.c)(0x6565495A)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\retarget.o --omf_browse .\objects\retarget.crf --depend .\objects\retarget.d)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\time.h)(0x599ECD2E)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\rt_misc.h)(0x599ECD2E)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stddef.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
|
||||||
F (.\FWLIB\source\ENS1_TIMER.c)(0x689C4BF1)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\ens1_timer.o --omf_browse .\objects\ens1_timer.crf --depend .\objects\ens1_timer.d)
|
|
||||||
I (.\FWLIB\include\ENS1_TIMER.h)(0x689C4BA6)
|
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
|
||||||
I (.\USER\my_header.h)(0x689C4B9B)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
|
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
|
|
||||||
I (.\FWLIB\include\ENS_CURRENT_CALIBRATION.h)(0x6566A27C)
|
I (.\FWLIB\include\ENS_CURRENT_CALIBRATION.h)(0x6566A27C)
|
||||||
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
|
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358098)
|
||||||
F (.\CORE\system_CMSDK_CM0.c)(0x63648DE6)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
-D__UVISION_VERSION="538" -DARMCM0
-o .\objects\system_cmsdk_cm0.o --omf_browse .\objects\system_cmsdk_cm0.crf --depend .\objects\system_cmsdk_cm0.d)
|
F (.\FWLIB\source\ENS1_UART.c)(0x68DB6E23)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_uart.o --omf_browse .\objects\ens1_uart.crf --depend .\objects\ens1_uart.d)
|
||||||
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
|
I (.\FWLIB\include\ENS1_UART.h)(0x68DB4C98)
|
||||||
|
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358098)
|
||||||
|
I (.\FWLIB\include\ENS1_GPIO.h)(0x68B11DDE)
|
||||||
|
F (.\FWLIB\source\ENS1_GPIO.c)(0x689C4B86)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_gpio.o --omf_browse .\objects\ens1_gpio.crf --depend .\objects\ens1_gpio.d)
|
||||||
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
|
I (.\FWLIB\include\ENS1_GPIO.h)(0x68B11DDE)
|
||||||
|
F (.\FWLIB\source\ENS1_MTP.c)(0x68B10C86)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_mtp.o --omf_browse .\objects\ens1_mtp.crf --depend .\objects\ens1_mtp.d)
|
||||||
|
I (.\FWLIB\include\ENS1_MTP.h)(0x65605CD6)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
|
F (.\FWLIB\source\ENS1_CLOCK.c)(0x68A5300E)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_clock.o --omf_browse .\objects\ens1_clock.crf --depend .\objects\ens1_clock.d)
|
||||||
|
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358098)
|
||||||
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
|
F (.\FWLIB\source\retarget.c)(0x6565495A)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\retarget.o --omf_browse .\objects\retarget.crf --depend .\objects\retarget.d)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\time.h)(0x60252378)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\rt_misc.h)(0x60252376)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stddef.h)(0x6025237E)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
F (.\CORE\ARM\startup_CMSDK_CM0.s)(0x6365EF56)(--cpu Cortex-M0 --li -g --apcs=interwork --pd "__MICROLIB SETA 1"
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include
-ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include
--pd "__UVISION_VERSION SETA 538" --pd "ARMCM0 SETA 1"
--list .\listings\startup_cmsdk_cm0.lst --xref -o .\objects\startup_cmsdk_cm0.o --depend .\objects\startup_cmsdk_cm0.d)
|
F (.\FWLIB\source\ENS1_BOOST.c)(0x689E9D46)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_boost.o --omf_browse .\objects\ens1_boost.crf --depend .\objects\ens1_boost.d)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (.\FWLIB\include\ENS1_BOOST.h)(0x68B11D24)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
F (.\FWLIB\source\ENS1_WAVEGEN.c)(0x68DB5638)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\ens1_wavegen.o --omf_browse .\objects\ens1_wavegen.crf --depend .\objects\ens1_wavegen.d)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
|
||||||
|
I (.\FWLIB\include\ENS1_WAVEGEN.h)(0x68C2375A)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
I (.\USER\my_header.h)(0x68C138EE)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
|
||||||
|
I (.\FWLIB\include\ENS1_TIMER.h)(0x68DA5180)
|
||||||
|
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358098)
|
||||||
|
I (.\FWLIB\include\ENS1_BOOST.h)(0x68B11D24)
|
||||||
|
F (.\CORE\system_CMSDK_CM0.c)(0x63648DE6)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I.\CORE\INCLUDE -I.\USER -I.\FWLIB\include
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
-D__UVISION_VERSION="514" -DARMCM0
-o .\objects\system_cmsdk_cm0.o --omf_browse .\objects\system_cmsdk_cm0.crf --depend .\objects\system_cmsdk_cm0.d)
|
||||||
|
I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E)
|
||||||
|
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
|
||||||
|
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
|
||||||
|
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
|
||||||
|
F (.\CORE\ARM\startup_CMSDK_CM0.s)(0x6365EF56)(--cpu Cortex-M0 --li -g --apcs=interwork --pd "__MICROLIB SETA 1"
-I C:\Users\29096\Desktop\work\ůоåÈ\TIMER_DEMO\RTE
-I C:\Users\29096\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\Device\ARM\ARMCM0\Include
-I C:\Keil_v5\ARM\CMSIS\Include
--pd "__UVISION_VERSION SETA 514" --pd "ARMCM0 SETA 1"
--list .\listings\startup_cmsdk_cm0.lst --xref -o .\objects\startup_cmsdk_cm0.o --depend .\objects\startup_cmsdk_cm0.d)
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ LR_IROM1 0x10000000 0x00008000 { ; load region size_region
|
||||||
*.o (RESET, +First)
|
*.o (RESET, +First)
|
||||||
*(InRoot$$Sections)
|
*(InRoot$$Sections)
|
||||||
.ANY (+RO)
|
.ANY (+RO)
|
||||||
|
.ANY (+XO)
|
||||||
}
|
}
|
||||||
RW_IRAM1 0x20000000 0x00020000 { ; RW data
|
RW_IRAM1 0x20000000 0x00020000 { ; RW data
|
||||||
.ANY (+RW +ZI)
|
.ANY (+RW +ZI)
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,12 +1,9 @@
|
||||||
.\objects\ens1_boost.o: FWLIB\source\ENS1_BOOST.c
|
.\objects\ens1_boost.o: FWLIB\source\ENS1_BOOST.c
|
||||||
.\objects\ens1_boost.o: .\FWLIB\include\ENS1_BOOST.h
|
|
||||||
.\objects\ens1_boost.o: .\USER\my_header.h
|
|
||||||
.\objects\ens1_boost.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
.\objects\ens1_boost.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\ens1_boost.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
.\objects\ens1_boost.o: .\FWLIB\include\ENS1_BOOST.h
|
||||||
.\objects\ens1_boost.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_boost.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_boost.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_boost.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\ens1_boost.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
.\objects\ens1_boost.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\ens1_boost.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_boost.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_boost.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_boost.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_boost.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_boost.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
.\objects\ens1_boost.o: .\FWLIB\include\ENS1_CLOCK.h
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,11 +1,12 @@
|
||||||
.\objects\ens1_clock.o: FWLIB\source\ENS1_CLOCK.c
|
.\objects\ens1_clock.o: FWLIB\source\ENS1_CLOCK.c
|
||||||
.\objects\ens1_clock.o: .\FWLIB\include\ENS1_CLOCK.h
|
.\objects\ens1_clock.o: .\FWLIB\include\ENS1_CLOCK.h
|
||||||
.\objects\ens1_clock.o: .\USER\my_header.h
|
.\objects\ens1_clock.o: .\USER\my_header.h
|
||||||
.\objects\ens1_clock.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\ens1_clock.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\ens1_clock.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
|
.\objects\ens1_clock.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
|
.\objects\ens1_clock.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\ens1_clock.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_clock.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\ens1_clock.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\ens1_clock.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_clock.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_clock.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,10 +1,11 @@
|
||||||
.\objects\ens1_gpio.o: FWLIB\source\ENS1_GPIO.c
|
.\objects\ens1_gpio.o: FWLIB\source\ENS1_GPIO.c
|
||||||
.\objects\ens1_gpio.o: .\USER\my_header.h
|
.\objects\ens1_gpio.o: .\USER\my_header.h
|
||||||
.\objects\ens1_gpio.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\ens1_gpio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\ens1_gpio.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
|
.\objects\ens1_gpio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
|
.\objects\ens1_gpio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\ens1_gpio.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_gpio.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\ens1_gpio.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\ens1_gpio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_gpio.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_gpio.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -2,14 +2,14 @@
|
||||||
.\objects\ens1_mtp.o: .\FWLIB\include\ENS1_MTP.h
|
.\objects\ens1_mtp.o: .\FWLIB\include\ENS1_MTP.h
|
||||||
.\objects\ens1_mtp.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_mtp.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_mtp.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_mtp.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\ens1_mtp.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\ens1_mtp.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\ens1_mtp.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_mtp.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_mtp.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_mtp.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_mtp.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_mtp.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
.\objects\ens1_mtp.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdlib.h
|
.\objects\ens1_mtp.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
|
||||||
.\objects\ens1_mtp.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
|
.\objects\ens1_mtp.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
.\objects\ens1_mtp.o: .\USER\my_header.h
|
.\objects\ens1_mtp.o: .\USER\my_header.h
|
||||||
.\objects\ens1_mtp.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\ens1_mtp.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\ens1_mtp.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
|
.\objects\ens1_mtp.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\ens1_mtp.o: .\FWLIB\include\ENS1_TIMER.h
|
.\objects\ens1_mtp.o: .\FWLIB\include\ENS1_TIMER.h
|
||||||
.\objects\ens1_mtp.o: .\USER\my_header.h
|
.\objects\ens1_mtp.o: .\USER\my_header.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -2,6 +2,7 @@
|
||||||
.\objects\ens1_spi.o: .\FWLIB\include\ENS1_SPI.h
|
.\objects\ens1_spi.o: .\FWLIB\include\ENS1_SPI.h
|
||||||
.\objects\ens1_spi.o: .\USER\my_header.h
|
.\objects\ens1_spi.o: .\USER\my_header.h
|
||||||
.\objects\ens1_spi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
.\objects\ens1_spi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
|
.\objects\ens1_spi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
.\objects\ens1_spi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
.\objects\ens1_spi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\ens1_spi.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_spi.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_spi.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_spi.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
|
|
@ -9,4 +10,6 @@
|
||||||
.\objects\ens1_spi.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_spi.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_spi.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_spi.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_spi.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_spi.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
|
.\objects\ens1_spi.o: .\FWLIB\include\ENS1_TIMER.h
|
||||||
|
.\objects\ens1_spi.o: .\USER\my_header.h
|
||||||
.\objects\ens1_spi.o: .\FWLIB\include\ENS1_GPIO.h
|
.\objects\ens1_spi.o: .\FWLIB\include\ENS1_GPIO.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -2,13 +2,14 @@
|
||||||
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_TIMER.h
|
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_TIMER.h
|
||||||
.\objects\ens1_timer.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_timer.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_timer.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_timer.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\ens1_timer.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\ens1_timer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\ens1_timer.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_timer.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_timer.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_timer.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_timer.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_timer.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
.\objects\ens1_timer.o: .\USER\my_header.h
|
.\objects\ens1_timer.o: .\USER\my_header.h
|
||||||
.\objects\ens1_timer.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\ens1_timer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\ens1_timer.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
|
.\objects\ens1_timer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
|
.\objects\ens1_timer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_TIMER.h
|
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_TIMER.h
|
||||||
.\objects\ens1_timer.o: .\FWLIB\include\ENS_CURRENT_CALIBRATION.h
|
.\objects\ens1_timer.o: .\FWLIB\include\ENS_CURRENT_CALIBRATION.h
|
||||||
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_CLOCK.h
|
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_CLOCK.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,10 +1,11 @@
|
||||||
.\objects\ens1_uart.o: FWLIB\source\ENS1_UART.c
|
.\objects\ens1_uart.o: FWLIB\source\ENS1_UART.c
|
||||||
.\objects\ens1_uart.o: .\USER\my_header.h
|
.\objects\ens1_uart.o: .\USER\my_header.h
|
||||||
.\objects\ens1_uart.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\ens1_uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\ens1_uart.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
|
.\objects\ens1_uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
|
.\objects\ens1_uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\ens1_uart.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\ens1_uart.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\ens1_uart.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\ens1_uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\ens1_uart.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\ens1_uart.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,16 @@
|
||||||
|
.\objects\ens1_wavegen.o: FWLIB\source\ENS1_WAVEGEN.c
|
||||||
|
.\objects\ens1_wavegen.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
|
.\objects\ens1_wavegen.o: .\FWLIB\include\ENS1_WAVEGEN.h
|
||||||
|
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
|
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
|
.\objects\ens1_wavegen.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
|
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
|
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
|
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
|
.\objects\ens1_wavegen.o: .\USER\my_header.h
|
||||||
|
.\objects\ens1_wavegen.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
|
.\objects\ens1_wavegen.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
|
.\objects\ens1_wavegen.o: .\FWLIB\include\ENS1_TIMER.h
|
||||||
|
.\objects\ens1_wavegen.o: .\USER\my_header.h
|
||||||
|
.\objects\ens1_wavegen.o: .\FWLIB\include\ENS1_CLOCK.h
|
||||||
|
.\objects\ens1_wavegen.o: .\FWLIB\include\ENS1_BOOST.h
|
||||||
Binary file not shown.
BIN
Objects/mian.crf
BIN
Objects/mian.crf
Binary file not shown.
|
|
@ -1,18 +1,19 @@
|
||||||
.\objects\mian.o: USER\mian.c
|
.\objects\mian.o: USER\mian.c
|
||||||
.\objects\mian.o: USER\my_header.h
|
.\objects\mian.o: USER\my_header.h
|
||||||
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\mian.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
|
.\objects\mian.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
|
||||||
|
.\objects\mian.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
|
||||||
.\objects\mian.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\mian.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\mian.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\mian.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\mian.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\mian.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\mian.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
.\objects\mian.o: .\CORE\INCLUDE\core_cmFunc.h
|
.\objects\mian.o: .\CORE\INCLUDE\core_cmFunc.h
|
||||||
.\objects\mian.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
.\objects\mian.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
|
||||||
.\objects\mian.o: .\FWLIB\include\ENS1_TIMER.h
|
.\objects\mian.o: .\FWLIB\include\ENS1_TIMER.h
|
||||||
.\objects\mian.o: .\USER\my_header.h
|
.\objects\mian.o: .\USER\my_header.h
|
||||||
.\objects\mian.o: .\FWLIB\include\ENS1_MTP.h
|
.\objects\mian.o: .\FWLIB\include\ENS1_MTP.h
|
||||||
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdlib.h
|
.\objects\mian.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
|
||||||
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
|
|
||||||
.\objects\mian.o: .\FWLIB\include\ENS1_CLOCK.h
|
.\objects\mian.o: .\FWLIB\include\ENS1_CLOCK.h
|
||||||
.\objects\mian.o: .\FWLIB\include\ENS1_UART.h
|
.\objects\mian.o: .\FWLIB\include\ENS1_UART.h
|
||||||
.\objects\mian.o: .\FWLIB\include\ENS1_GPIO.h
|
.\objects\mian.o: .\FWLIB\include\ENS1_GPIO.h
|
||||||
|
.\objects\mian.o: .\FWLIB\include\ENS1_WAVEGEN.h
|
||||||
|
|
|
||||||
BIN
Objects/mian.o
BIN
Objects/mian.o
Binary file not shown.
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
||||||
.\objects\retarget.o: FWLIB\source\retarget.c
|
.\objects\retarget.o: FWLIB\source\retarget.c
|
||||||
.\objects\retarget.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
|
.\objects\retarget.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
|
||||||
.\objects\retarget.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\time.h
|
.\objects\retarget.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\time.h
|
||||||
.\objects\retarget.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\rt_misc.h
|
.\objects\retarget.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\rt_misc.h
|
||||||
.\objects\retarget.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stddef.h
|
.\objects\retarget.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stddef.h
|
||||||
.\objects\retarget.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\retarget.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\retarget.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\retarget.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\retarget.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\retarget.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\retarget.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\retarget.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,5 +1,5 @@
|
||||||
.\objects\system_cmsdk_cm0.o: CORE\system_CMSDK_CM0.c
|
.\objects\system_cmsdk_cm0.o: CORE\system_CMSDK_CM0.c
|
||||||
.\objects\system_cmsdk_cm0.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdint.h
|
.\objects\system_cmsdk_cm0.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
|
||||||
.\objects\system_cmsdk_cm0.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
.\objects\system_cmsdk_cm0.o: .\CORE\INCLUDE\CMSDK_CM0.h
|
||||||
.\objects\system_cmsdk_cm0.o: .\CORE\INCLUDE\core_cm0.h
|
.\objects\system_cmsdk_cm0.o: .\CORE\INCLUDE\core_cm0.h
|
||||||
.\objects\system_cmsdk_cm0.o: .\CORE\INCLUDE\core_cmInstr.h
|
.\objects\system_cmsdk_cm0.o: .\CORE\INCLUDE\core_cmInstr.h
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,430 @@
|
||||||
|
# UART电刺激控制系统技术文档
|
||||||
|
|
||||||
|
## 1. 系统概述
|
||||||
|
|
||||||
|
本系统基于ENS1芯片实现UART通信控制的电刺激(EMS)功能,通过串口接收控制指令,实时调整电刺激参数并控制输出波形。
|
||||||
|
|
||||||
|
### 1.1 主要功能
|
||||||
|
- UART数据接收与解析
|
||||||
|
- 电刺激参数配置
|
||||||
|
- 实时波形控制
|
||||||
|
- 数据回传确认
|
||||||
|
|
||||||
|
### 1.2 技术特点
|
||||||
|
- 中断驱动的UART通信
|
||||||
|
- CRC校验确保数据完整性
|
||||||
|
- 实时参数更新
|
||||||
|
- 渐进式波形控制
|
||||||
|
|
||||||
|
## 2. 系统架构
|
||||||
|
|
||||||
|
### 2.1 文件结构
|
||||||
|
```
|
||||||
|
USER/
|
||||||
|
├── mian.c # 主程序文件
|
||||||
|
├── ENS001_CONFIG.h # 配置文件
|
||||||
|
└── MY_HEADER.h # 自定义头文件
|
||||||
|
|
||||||
|
FWLIB/
|
||||||
|
├── source/
|
||||||
|
│ ├── ENS1_UART.c # UART驱动实现
|
||||||
|
│ ├── ENS1_TIMER.c # 定时器控制
|
||||||
|
│ └── ENS1_WAVEGEN.c # 波形生成
|
||||||
|
└── include/
|
||||||
|
└── ENS1_UART.h # UART驱动头文件
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 核心模块
|
||||||
|
- **UART通信模块**: 负责数据接收、解析和回传
|
||||||
|
- **电刺激控制模块**: 负责参数配置和波形控制
|
||||||
|
- **定时器模块**: 提供系统时钟基准
|
||||||
|
- **波形生成模块**: 生成电刺激输出波形
|
||||||
|
|
||||||
|
## 3. UART通信协议
|
||||||
|
|
||||||
|
### 3.1 数据包格式
|
||||||
|
```
|
||||||
|
总长度: 19字节
|
||||||
|
┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
|
||||||
|
│ 功能码 │ 功能码 │ 数据长度│ 数据长度│ 开关类型│ 强度 │ 频率 │ 频率 │ 持续时间│ 持续时间│ 休息时间│ 休息时间│ 静默时间│ 静默时间│ 缓进时间│ 保持时间│ 缓出时间│ CRC16 │ CRC16 │
|
||||||
|
│ (低字节)│ (高字节)│ (低字节)│ (高字节)│ │ │ (低字节)│ (高字节)│ (低字节)│ (高字节)│ (低字节)│ (高字节)│ (低字节)│ (高字节)│ │ │ │ (低字节)│ (高字节)│
|
||||||
|
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 字段说明
|
||||||
|
| 字段 | 字节位置 | 长度 | 说明 | 示例值 |
|
||||||
|
|------|----------|------|------|--------|
|
||||||
|
| 功能码 | 0-1 | 2字节 | 固定值0x0003 | 0x0003 |
|
||||||
|
| 数据长度 | 2-3 | 2字节 | 数据部分长度 | 0x000D |
|
||||||
|
| 开关类型 | 4 | 1字节 | 0x00=关闭, 0x10~0x1F=开启 | 0x10 |
|
||||||
|
| 强度 | 5 | 1字节 | 电刺激强度(0-255) | 50 |
|
||||||
|
| 频率 | 6-7 | 2字节 | 电刺激频率(Hz) | 100 |
|
||||||
|
| 持续时间 | 8-9 | 2字节 | 总持续时间(ms) | 5000 |
|
||||||
|
| 休息时间 | 10-11 | 2字节 | 休息间隔(ms) | 1000 |
|
||||||
|
| 静默时间 | 12-13 | 2字节 | 静默间隔(ms) | 244 |
|
||||||
|
| 缓进时间 | 14 | 1字节 | 渐入时间(ms) | 1 |
|
||||||
|
| 保持时间 | 15 | 1字节 | 保持时间(ms) | 1 |
|
||||||
|
| 缓出时间 | 16 | 1字节 | 渐出时间(ms) | 3 |
|
||||||
|
| CRC16 | 17-18 | 2字节 | CRC-16-CCITT-FALSE校验 | 0x90B7 |
|
||||||
|
|
||||||
|
### 3.3 字节序说明
|
||||||
|
- 多字节字段采用小端序(Little Endian)
|
||||||
|
- 低字节在前,高字节在后
|
||||||
|
|
||||||
|
## 4. 工作流程
|
||||||
|
|
||||||
|
### 4.1 系统初始化流程
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[系统启动] --> B[MTP初始化]
|
||||||
|
B --> C[GPIO配置]
|
||||||
|
C --> D[UART初始化]
|
||||||
|
D --> E[定时器初始化]
|
||||||
|
E --> F[电刺激模块初始化]
|
||||||
|
F --> G[进入主循环]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 UART数据接收流程
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[UART中断触发] --> B[读取FIFO数据]
|
||||||
|
B --> C[存储到接收缓冲区]
|
||||||
|
C --> D[回传数据确认]
|
||||||
|
D --> E{数据包完整?}
|
||||||
|
E -->|否| F[继续接收]
|
||||||
|
E -->|是| G[解析数据包]
|
||||||
|
G --> H{解析成功?}
|
||||||
|
H -->|否| I[丢弃数据包]
|
||||||
|
H -->|是| J[更新电刺激配置]
|
||||||
|
J --> K[启动/停止电刺激]
|
||||||
|
K --> L[清除缓冲区]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 电刺激控制流程
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[接收UART数据] --> B[解析数据包]
|
||||||
|
B --> C{开关类型检查}
|
||||||
|
C -->|0x00| D[停止电刺激]
|
||||||
|
C -->|0x10~0x1F| E[参数有效性检查]
|
||||||
|
E --> F[创建新配置]
|
||||||
|
F --> G[应用配置]
|
||||||
|
G --> H[启动电刺激]
|
||||||
|
H --> I[波形生成]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 电刺激缓进缓出实现
|
||||||
|
|
||||||
|
### 5.1 缓进缓出原理
|
||||||
|
|
||||||
|
电刺激的缓进缓出功能通过三个阶段实现平滑的强度变化:
|
||||||
|
|
||||||
|
#### 5.1.1 三个阶段
|
||||||
|
1. **缓进阶段 (Ramp Up)**: 强度从0逐渐增加到目标值
|
||||||
|
2. **保持阶段 (Hold)**: 强度保持在目标值
|
||||||
|
3. **缓出阶段 (Ramp Down)**: 强度从目标值逐渐减少到0
|
||||||
|
|
||||||
|
#### 5.1.2 时间控制
|
||||||
|
```c
|
||||||
|
// 时间参数(单位:毫秒)
|
||||||
|
uint32_t ramp_up_ms = g_ems_config.ramp_up_time * 1000; // 缓进时间
|
||||||
|
uint32_t hold_ms = g_ems_config.hold_time * 1000; // 保持时间
|
||||||
|
uint32_t ramp_down_ms = g_ems_config.ramp_down_time * 1000; // 缓出时间
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 5.1.3 强度计算算法
|
||||||
|
- **缓进阶段**: `target_intensity = (time_count * max_intensity) / ramp_up_ms`
|
||||||
|
- **保持阶段**: `target_intensity = max_intensity`
|
||||||
|
- **缓出阶段**: `target_intensity = max_intensity - (ramp_down_elapsed * max_intensity) / ramp_down_ms`
|
||||||
|
|
||||||
|
### 5.2 缓进缓出实现代码
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 缓进缓出处理函数(在电刺激处理中调用)
|
||||||
|
void EMS_Process_Ramp(void)
|
||||||
|
{
|
||||||
|
if(ems_state)
|
||||||
|
{
|
||||||
|
time_count++;
|
||||||
|
if (!g_ems_config.enable_ramp || !g_ems_running)
|
||||||
|
{
|
||||||
|
return; // 如果未启用缓进缓出或未运行,直接返回
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算各阶段时间(毫秒)
|
||||||
|
uint32_t ramp_up_ms = g_ems_config.ramp_up_time * 1000;
|
||||||
|
uint32_t hold_ms = g_ems_config.hold_time * 1000;
|
||||||
|
uint32_t ramp_down_ms = g_ems_config.ramp_down_time * 1000;
|
||||||
|
|
||||||
|
switch (g_ramp_phase)
|
||||||
|
{
|
||||||
|
case 0: // 缓进阶段
|
||||||
|
{
|
||||||
|
if (time_count <= g_ems_config.ramp_up_time * 1000)
|
||||||
|
{
|
||||||
|
// 线性递增强度
|
||||||
|
uint16_t target_intensity = (time_count * g_ems_config.intensity) / ramp_up_ms;
|
||||||
|
if (target_intensity > g_ems_config.intensity) {
|
||||||
|
target_intensity = g_ems_config.intensity;
|
||||||
|
}
|
||||||
|
g_current_intensity = target_intensity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 缓进完成,进入保持阶段
|
||||||
|
g_ramp_phase = 1;
|
||||||
|
g_current_intensity = g_ems_config.intensity;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: // 保持阶段
|
||||||
|
{
|
||||||
|
if(time_count <= (ramp_up_ms + hold_ms))
|
||||||
|
{
|
||||||
|
g_current_intensity = g_ems_config.intensity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_ramp_phase = 2; // 进入缓出阶段
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2: // 缓出阶段
|
||||||
|
{
|
||||||
|
if(time_count <= (ramp_up_ms + hold_ms + ramp_down_ms))
|
||||||
|
{
|
||||||
|
// 计算缓出阶段的时间偏移
|
||||||
|
uint32_t ramp_down_start = ramp_up_ms + hold_ms;
|
||||||
|
uint32_t ramp_down_elapsed = time_count - ramp_down_start;
|
||||||
|
|
||||||
|
// 线性递减强度
|
||||||
|
uint16_t target_intensity = g_ems_config.intensity -
|
||||||
|
(ramp_down_elapsed * g_ems_config.intensity) / ramp_down_ms;
|
||||||
|
|
||||||
|
if (target_intensity > g_ems_config.intensity) {
|
||||||
|
target_intensity = 0;
|
||||||
|
}
|
||||||
|
g_current_intensity = target_intensity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 缓出完成,停止电刺激
|
||||||
|
g_current_intensity = 0;
|
||||||
|
g_ramp_phase = 0; // 重置为缓进阶段
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.3 波形强度更新
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 更新波形强度(不重新配置硬件)
|
||||||
|
void wavegen_UpdateIntensity(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t intensity)
|
||||||
|
{
|
||||||
|
// 只更新波形数据,不重新配置硬件
|
||||||
|
for (int i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
|
||||||
|
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_DATA_REG = intensity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.4 状态管理变量
|
||||||
|
|
||||||
|
```c
|
||||||
|
// 全局状态变量
|
||||||
|
uint8_t g_ramp_phase = 0; // 渐进阶段:0=缓进, 1=保持, 2=缓出
|
||||||
|
uint32_t time_count = 0; // 时间计数器(毫秒)
|
||||||
|
uint16_t g_current_intensity = 0; // 当前强度值
|
||||||
|
uint8_t g_ems_running = 0; // 电刺激运行状态
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.5 缓进缓出流程图
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[开始电刺激] --> B[缓进阶段]
|
||||||
|
B --> C{时间 < 缓进时间?}
|
||||||
|
C -->|是| D[线性增加强度]
|
||||||
|
C -->|否| E[进入保持阶段]
|
||||||
|
D --> F[更新波形强度]
|
||||||
|
F --> C
|
||||||
|
E --> G{时间 < 保持时间?}
|
||||||
|
G -->|是| H[保持最大强度]
|
||||||
|
G -->|否| I[进入缓出阶段]
|
||||||
|
H --> J[更新波形强度]
|
||||||
|
J --> G
|
||||||
|
I --> K{时间 < 缓出时间?}
|
||||||
|
K -->|是| L[线性减少强度]
|
||||||
|
K -->|否| M[停止电刺激]
|
||||||
|
L --> N[更新波形强度]
|
||||||
|
N --> K
|
||||||
|
M --> O[重置状态]
|
||||||
|
O --> A
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 核心代码实现
|
||||||
|
|
||||||
|
### 6.1 UART中断处理函数
|
||||||
|
```c
|
||||||
|
void UART1_Handler(void) {
|
||||||
|
uint8_t rev_data = 0;
|
||||||
|
uint32_t ParamNumber = 0;
|
||||||
|
|
||||||
|
// 清除NVIC中断挂起位
|
||||||
|
NVIC_ClearPendingIRQ(UART1_IRQn);
|
||||||
|
|
||||||
|
// 检查中断类型
|
||||||
|
uint8_t int_type = UART_INT_TYPE(CMSDK_UART1);
|
||||||
|
|
||||||
|
// 数据就绪中断处理
|
||||||
|
if((int_type == INT_RCV_DATA_AVAILABLE) || (int_type == INT_CHAR_TIMEOUT_INDICATION)) {
|
||||||
|
ParamNumber = (CMSDK_UART1->FSR >> 16) & 0x1f;
|
||||||
|
|
||||||
|
// 读取FIFO中的所有数据
|
||||||
|
for(uint32_t i = 0; i < ParamNumber; i++) {
|
||||||
|
rev_data = CMSDK_UART1->RBR;
|
||||||
|
|
||||||
|
// 存储到缓冲区
|
||||||
|
if(uart_rx_count < sizeof(uart_rx_buffer)) {
|
||||||
|
uart_rx_buffer[uart_rx_count] = rev_data;
|
||||||
|
uart_rx_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回传数据确认
|
||||||
|
UartPutc(CMSDK_UART1, rev_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查完整数据包
|
||||||
|
if(uart_rx_count >= 19) {
|
||||||
|
UART_EMS_Packet_t ems_packet;
|
||||||
|
if(ParseUART_EMS_Packet(uart_rx_buffer, uart_rx_count, &ems_packet)) {
|
||||||
|
UpdateEMS_ConfigFromUART(&ems_packet);
|
||||||
|
}
|
||||||
|
uart_rx_count = 0; // 清除缓冲区
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 数据包解析函数
|
||||||
|
```c
|
||||||
|
uint8_t ParseUART_EMS_Packet(uint8_t *data, uint16_t length, UART_EMS_Packet_t *packet) {
|
||||||
|
// 解析数据包(小端序)
|
||||||
|
packet->function_code = (data[1] << 8) | data[0];
|
||||||
|
packet->data_length = (data[3] << 8) | data[2];
|
||||||
|
packet->switch_type = data[4];
|
||||||
|
packet->intensity = data[5];
|
||||||
|
packet->frequency = (data[7] << 8) | data[6];
|
||||||
|
packet->duration = (data[9] << 8) | data[8];
|
||||||
|
packet->rest_time = (data[11] << 8) | data[10];
|
||||||
|
packet->silent_time = (data[13] << 8) | data[12];
|
||||||
|
packet->ramp_up_time = data[14];
|
||||||
|
packet->hold_time = data[15];
|
||||||
|
packet->ramp_down_time = data[16];
|
||||||
|
packet->crc16 = (data[18] << 8) | data[17];
|
||||||
|
|
||||||
|
// CRC校验(当前已注释)
|
||||||
|
// uint16_t calculated_crc = CalculateCRC16_CCITT_FALSE(data, 17);
|
||||||
|
// if(calculated_crc != packet->crc16) return 0;
|
||||||
|
|
||||||
|
return 1; // 解析成功
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 电刺激配置更新函数
|
||||||
|
```c
|
||||||
|
void UpdateEMS_ConfigFromUART(UART_EMS_Packet_t *packet) {
|
||||||
|
// 检查开关状态
|
||||||
|
if(packet->switch_type == 0x00) {
|
||||||
|
EMS_Stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查电刺激类型有效性
|
||||||
|
if(packet->switch_type < 0x10 || packet->switch_type > 0x1F) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建新配置
|
||||||
|
EMS_Config_TypeDef new_config = {
|
||||||
|
.frequency = packet->frequency,
|
||||||
|
.duration = packet->duration,
|
||||||
|
.intensity = packet->intensity,
|
||||||
|
.rest_time = packet->rest_time,
|
||||||
|
.silent_time = packet->silent_time,
|
||||||
|
.ramp_up_time = packet->ramp_up_time,
|
||||||
|
.hold_time = packet->hold_time,
|
||||||
|
.ramp_down_time = packet->ramp_down_time,
|
||||||
|
.enable_ramp = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
// 应用配置并启动
|
||||||
|
EMS_Configure(&new_config);
|
||||||
|
EMS_Start();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 关键数据结构
|
||||||
|
|
||||||
|
### 7.1 UART数据包结构
|
||||||
|
```c
|
||||||
|
typedef struct {
|
||||||
|
uint16_t function_code; // 功能码 (0x0003)
|
||||||
|
uint16_t data_length; // 数据长度 (0x000D)
|
||||||
|
uint8_t switch_type; // 开关状态以及电刺激类型
|
||||||
|
uint8_t intensity; // 强度值
|
||||||
|
uint16_t frequency; // 频率值
|
||||||
|
uint16_t duration; // 总持续时间 (ms)
|
||||||
|
uint16_t rest_time; // 休息时间 (ms)
|
||||||
|
uint16_t silent_time; // 静默时间 (ms)
|
||||||
|
uint8_t ramp_up_time; // 缓进时间
|
||||||
|
uint8_t hold_time; // 保持时间
|
||||||
|
uint8_t ramp_down_time; // 缓出时间
|
||||||
|
uint16_t crc16; // CRC16校验
|
||||||
|
} UART_EMS_Packet_t;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 电刺激配置结构
|
||||||
|
```c
|
||||||
|
typedef struct {
|
||||||
|
uint16_t frequency; // 频率
|
||||||
|
uint16_t duration; // 持续时间
|
||||||
|
uint8_t intensity; // 强度
|
||||||
|
uint16_t rest_time; // 休息时间
|
||||||
|
uint16_t silent_time; // 静默时间
|
||||||
|
uint8_t ramp_up_time; // 缓进时间
|
||||||
|
uint8_t hold_time; // 保持时间
|
||||||
|
uint8_t ramp_down_time; // 缓出时间
|
||||||
|
uint8_t enable_ramp; // 启用渐进控制
|
||||||
|
} EMS_Config_TypeDef;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. 调试与测试
|
||||||
|
|
||||||
|
### 8.1 调试输出
|
||||||
|
系统提供详细的调试输出,包括:
|
||||||
|
- 接收到的原始数据
|
||||||
|
- 解析后的参数值
|
||||||
|
- 配置更新状态
|
||||||
|
- 错误信息
|
||||||
|
|
||||||
|
### 8.2 测试用例
|
||||||
|
1. **停止指令测试**
|
||||||
|
```
|
||||||
|
数据包: 03 00 0d 00 00 32 64 00 88 13 e8 03 f4 01 01 03 01 b7 90
|
||||||
|
预期: 停止电刺激
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **启动指令测试**
|
||||||
|
```
|
||||||
|
数据包: 03 00 0d 00 10 32 64 00 88 13 e8 03 f4 01 01 03 01 [CRC]
|
||||||
|
预期: 启动电刺激,频率100Hz,强度50
|
||||||
|
```
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/*Copyright (C),2023 , NANOCHAP
|
/*Copyright (C),2023 , NANOCHAP
|
||||||
*File name:
|
*File name:
|
||||||
*Author: Martin
|
*Author: Martin
|
||||||
*Version: V1.0
|
*Version: V1.0
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
#ifndef MY_HEADER_H
|
#ifndef MY_HEADER_H
|
||||||
#define MY_HEADER_H
|
#define MY_HEADER_H
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "CMSDK_CM0.h"
|
#include "CMSDK_CM0.h"
|
||||||
#include "ENS1_TIMER.h"
|
#include "ENS1_TIMER.h"
|
||||||
|
|
@ -22,32 +24,32 @@ typedef enum {OUTPUT = 0, INPUT = !OUTPUT} I_O_SELECT;
|
||||||
typedef enum {oversamp_16 = 0, oversamp_13=!oversamp_16} OverSampModeSel;
|
typedef enum {oversamp_16 = 0, oversamp_13=!oversamp_16} OverSampModeSel;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GPIO_PU = 0x00, //上拉
|
GPIO_PU = 0x00, //上拉
|
||||||
GPIO_PD = 0x01, //下拉
|
GPIO_PD = 0x01, //下拉
|
||||||
GPIO_NOPULL = 0x02 //无上下拉
|
GPIO_NOPULL = 0x02 //无上下拉
|
||||||
}GPIO_PUPD_TypeDef;
|
}GPIO_PUPD_TypeDef;
|
||||||
|
|
||||||
//输出速度选择枚举
|
//输出速度选择枚举
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
OUTPUT_FAST = 0x00, //快速
|
OUTPUT_FAST = 0x00, //快速
|
||||||
OUTPUT_SLOW = 0x01 //慢速
|
OUTPUT_SLOW = 0x01 //慢速
|
||||||
}OUTPUT_SPEED_TypeDef;
|
}OUTPUT_SPEED_TypeDef;
|
||||||
|
|
||||||
//输出模式选择枚举
|
//输出模式选择枚举
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
GPIO_OType_PP = 0x00, //推挽输出
|
GPIO_OType_PP = 0x00, //推挽输出
|
||||||
GPIO_OType_OD = 0x01 //开漏输出
|
GPIO_OType_OD = 0x01 //开漏输出
|
||||||
}GPIOOType_TypeDef;
|
}GPIOOType_TypeDef;
|
||||||
|
|
||||||
//驱动强度选择枚举
|
//驱动强度选择枚举
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
PDRV_4mA = 0x00, //输出驱动强度4mA
|
PDRV_4mA = 0x00, //输出驱动强度4mA
|
||||||
PDRV_8mA, //输出驱动强度8mA
|
PDRV_8mA, //输出驱动强度8mA
|
||||||
PDRV_14mA, //输出驱动强度14mA
|
PDRV_14mA, //输出驱动强度14mA
|
||||||
PDRV_16mA //输出驱动强度16mA
|
PDRV_16mA //输出驱动强度16mA
|
||||||
}OUTPUT_PDRV_TypeDef;
|
}OUTPUT_PDRV_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
191
USER/mian.c
191
USER/mian.c
|
|
@ -4,14 +4,14 @@
|
||||||
*Author:
|
*Author:
|
||||||
*Version: V1.0
|
*Version: V1.0
|
||||||
*Date: 2023-11-
|
*Date: 2023-11-
|
||||||
*Description: 1S 定时器测试(TIMER0)
|
*Description: 定时器电刺激综合测试(TIMER0 + 电刺激)
|
||||||
*Function List:
|
*Function List:
|
||||||
|
|
||||||
History:
|
History:
|
||||||
1.V1.0
|
1.V1.0
|
||||||
Date:
|
Date:
|
||||||
Author:
|
Author:
|
||||||
Modification: 初版
|
Modification: 初版
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include "my_header.h"
|
#include "my_header.h"
|
||||||
|
|
@ -20,19 +20,182 @@ Modification:
|
||||||
#include "ENS1_UART.h"
|
#include "ENS1_UART.h"
|
||||||
#include "ENS1_TIMER.h"
|
#include "ENS1_TIMER.h"
|
||||||
#include "ENS1_GPIO.h"
|
#include "ENS1_GPIO.h"
|
||||||
int main(){
|
#include "ENS1_WAVEGEN.h"
|
||||||
MTP_init();
|
|
||||||
ClockInit();
|
// CRC-16-CCITT-FALSE计算函数
|
||||||
GPIO_IO_Init(GPIO_19, OUTPUT, 0x00, 0x02, 0x00, 0x00, ENABLE);
|
uint16_t CalculateCRC16_CCITT_FALSE(uint8_t *data, uint16_t length)
|
||||||
GPIO_Output(GPIO_19, LOW_LEVEL);
|
|
||||||
/*uart*/
|
|
||||||
UART_Init(CMSDK_UART1, &UART1_Init);
|
|
||||||
UART_ITConfig(CMSDK_UART1, &UART1_ITSet);
|
|
||||||
/*TIMER*/
|
|
||||||
TIMER0_Init(1);
|
|
||||||
while(1)
|
|
||||||
{
|
{
|
||||||
/*在 void TIMER0_Handler(void) 中断处理函数中打印*/
|
uint16_t crc = 0xFFFF; // 初始值为0xFFFF
|
||||||
|
for(uint16_t i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
crc ^= (uint16_t)(data[i] << 8); // 高字节先处理
|
||||||
|
for(uint8_t j = 0; j < 8; j++)
|
||||||
|
{
|
||||||
|
if(crc & 0x8000)
|
||||||
|
{
|
||||||
|
crc = (crc << 1) ^ 0x1021; // 多项式0x1021
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
crc = crc << 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// UART数据接收函数 - 轮询方式
|
||||||
|
void UART_ReceiveData(void)
|
||||||
|
{
|
||||||
|
// 检查接收FIFO并读取所有可用的数据
|
||||||
|
while(!UART_RX_FIFO_EMPTY(CMSDK_UART1))
|
||||||
|
{
|
||||||
|
uint8_t received_data = READ_UART_RCVBuff(CMSDK_UART1); // 读取接收数据
|
||||||
|
if(uart_rx_count < sizeof(uart_rx_buffer)) // 防止缓冲区溢出
|
||||||
|
{
|
||||||
|
uart_rx_buffer[uart_rx_count] = received_data;
|
||||||
|
uart_rx_count++;
|
||||||
|
uart_data_ready = 1; // 设置数据就绪标志
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 缓冲区溢出处理
|
||||||
|
uart_rx_count = 0; // 重置计数器
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 增强的中断接收函数
|
||||||
|
void UART_ReceiveDataFromISR(void)
|
||||||
|
{
|
||||||
|
if(!UART_RX_FIFO_EMPTY(CMSDK_UART1))
|
||||||
|
{
|
||||||
|
uint8_t received_data = READ_UART_RCVBuff(CMSDK_UART1);
|
||||||
|
if(uart_rx_count < sizeof(uart_rx_buffer))
|
||||||
|
{
|
||||||
|
uart_rx_buffer[uart_rx_count] = received_data;
|
||||||
|
uart_rx_count++;
|
||||||
|
// 注意:在中断中不建议使用printf,只设置标志
|
||||||
|
uart_data_ready = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UART数据发送函数(可选的)
|
||||||
|
void UART_SendData(uint8_t data)
|
||||||
|
{
|
||||||
|
if(!UART_TX_FIFO_FULL(CMSDK_UART1)) // 如果发送FIFO未满
|
||||||
|
{
|
||||||
|
WRITE_UART_THRBuff(CMSDK_UART1, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UART数据包解析函数
|
||||||
|
uint8_t ParseUART_EMS_Packet(uint8_t *data, uint16_t length, UART_EMS_Packet_t *packet)
|
||||||
|
{
|
||||||
|
// 解析数据包(注意字节序)
|
||||||
|
packet->function_code = (data[1] << 8) | data[0]; // 小端序
|
||||||
|
packet->data_length = (data[3] << 8) | data[2];
|
||||||
|
packet->switch_type = data[4];
|
||||||
|
packet->intensity = data[5];
|
||||||
|
packet->frequency = (data[7] << 8) | data[6];
|
||||||
|
packet->duration = (data[9] << 8) | data[8];
|
||||||
|
packet->rest_time = (data[11] << 8) | data[10];
|
||||||
|
packet->silent_time = (data[13] << 8) | data[12];
|
||||||
|
packet->ramp_up_time = data[14];
|
||||||
|
packet->hold_time = data[15];
|
||||||
|
packet->ramp_down_time = data[16];
|
||||||
|
packet->crc16 = (data[18] << 8) | data[17];
|
||||||
|
|
||||||
|
// CRC-16-CCITT-FALSE校验(对前17字节进行校验,不包括CRC本身)
|
||||||
|
uint16_t calculated_crc = CalculateCRC16_CCITT_FALSE(data, 17);
|
||||||
|
/*if(calculated_crc != packet->crc16)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// 功能码检查
|
||||||
|
|
||||||
|
return 1; // 解析成功
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据UART数据包更新电刺激配置
|
||||||
|
void UpdateEMS_ConfigFromUART(UART_EMS_Packet_t *packet)
|
||||||
|
{
|
||||||
|
// 检查开关状态
|
||||||
|
if(packet->switch_type == 0x00)
|
||||||
|
{
|
||||||
|
EMS_Stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查电刺激类型 (0x10~0x1F)
|
||||||
|
if(packet->switch_type < 0x10 || packet->switch_type > 0x1F)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建新的电刺激配置
|
||||||
|
EMS_Config_TypeDef new_config = {
|
||||||
|
.frequency = packet->frequency,
|
||||||
|
.duration = packet->duration,
|
||||||
|
.intensity = packet->intensity,
|
||||||
|
.rest_time = packet->rest_time,
|
||||||
|
.silent_time = packet->silent_time,
|
||||||
|
.ramp_up_time = packet->ramp_up_time,
|
||||||
|
.hold_time = packet->hold_time,
|
||||||
|
.ramp_down_time = packet->ramp_down_time,
|
||||||
|
.enable_ramp = 1 // 启用渐进控制
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
printf("0x%02X\n", packet->switch_type);
|
||||||
|
printf("%d\n", packet->intensity);
|
||||||
|
printf("%d\n", packet->frequency);
|
||||||
|
printf("%d\n", packet->duration);
|
||||||
|
printf("%d\n", packet->rest_time);
|
||||||
|
printf("%d\n", packet->silent_time);
|
||||||
|
printf("%d\n", packet->ramp_up_time);
|
||||||
|
printf("%d\n", packet->hold_time);
|
||||||
|
printf("%d\n", packet->ramp_down_time);
|
||||||
|
|
||||||
|
// 应用新配置
|
||||||
|
EMS_Configure(&new_config);
|
||||||
|
|
||||||
|
// 启动电刺激
|
||||||
|
EMS_Start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
// 初始化系统
|
||||||
|
MTP_init();
|
||||||
|
ClockInit();
|
||||||
|
|
||||||
|
// 初始化GPIO19用于定时器指示
|
||||||
|
GPIO_IO_Init(GPIO_19, OUTPUT, GPIO_OType_PP, GPIO_NOPULL, OUTPUT_FAST, PDRV_4mA, ENABLE);
|
||||||
|
GPIO_Output(GPIO_19, LOW_LEVEL);
|
||||||
|
|
||||||
|
// 初始化UART
|
||||||
|
UART_Init(CMSDK_UART1, &UART1_Init);
|
||||||
|
UART_ITConfig(CMSDK_UART1, &UART1_ITSet);
|
||||||
|
|
||||||
|
// 配置电刺激参数
|
||||||
|
EMS_Configure(&ems_config);
|
||||||
|
// 初始化时间管理器
|
||||||
|
Time_Manager_Init();
|
||||||
|
// 初始化定时器(在wavegen_Init之前)
|
||||||
|
TIMER0_Init(1);
|
||||||
|
|
||||||
|
// 初始化波形生成器(电刺激)- 必须先初始化
|
||||||
|
wavegen_Init();
|
||||||
|
// 启动电刺激
|
||||||
|
EMS_Start();
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue