Compare commits

...

7 Commits
main ... Master

Author SHA1 Message Date
ZhangJinLong 0802617137 second commit 2025-10-09 11:29:11 +08:00
ZhangJinLong 9ca4aad163 first commit 2025-09-30 14:07:39 +08:00
Shocky 0f75f951b7 9/11Version 稳定周期电刺激输出
去除定时器Printf延迟,实现稳定“262”波形输出
2025-09-11 10:53:37 +08:00
Shocky b84ae4b6c7 9.11commit
完成准确定时波形输出
2025-09-11 10:41:05 +08:00
Shocky 83d56969fb 9.10commit
存在故障的定时器设定,平均每秒延迟1.4秒
2025-09-10 18:07:54 +08:00
Shocky 77e6088821 第三次上传
已实现功能:
1.波形输出
2.定时器
3.串口调试与通信

尚未完成:正确时间计算,平滑的梯形方波输出
2025-08-29 11:30:52 +08:00
Shocky 8a454bcd9e 第二次上传
变更:定时器使用正常、定时方波输出正常,指示灯定时闪烁正常
2025-08-20 11:03:53 +08:00
70 changed files with 6261 additions and 4068 deletions

10
.vscode/settings.json vendored Normal file
View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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);
//32MHz频率下设置升压电压为15V
void boost_voltage_select_15V(void);
//32MHz频率下设置升压电压为26V
void boost_voltage_select_26V(void);
//32MHz频率下设置升压电压为45V
void boost_voltage_select_45V(void);
//32MHz频率下设置升压电压为55V
void boost_voltage_select_55V(void);
extern uint8_t Boost_Voltage_Sel(uint8_t VOLTAGE_XV); #endif
#define VOLTAGE_11V 0x0
#define VOLTAGE_15V 0x1
#define VOLTAGE_26V 0x2
#define VOLTAGE_45V 0x3
#define VOLTAGE_55V 0x4
#endif

View File

@ -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);

View File

@ -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

View File

@ -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];
@ -37,7 +61,14 @@ extern void CMSDK_dualtimer_setup_oneshot(CMSDK_DUALTIMER_TypeDef *CMSDK_DUALTIM
unsigned int interrupt, unsigned int size); unsigned int interrupt, unsigned int size);
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

View File

@ -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>
1THREINT THR发送寄存器或发送FIFO空 1<EFBFBD><EFBFBD>THREINT THR<EFBFBD><EFBFBD><EFBFBD>ͼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO<EFBFBD><EFBFBD>
2RDAINT 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>ֵ
3RTOINT 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>
4RLSINT 线 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>
5MSIINT CTS更改状态autoflowDSR/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><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模式 1fifo 使能 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;

View File

@ -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

View File

@ -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) CMSDK_ANAC->BOOST_CTRL =0x77013;//内部升压
{ CMSDK_ANAC->PMU_CTRL = 0x10;
PCLK_Enable(ANALOG_PCLK_EN); }
switch (VOLTAGE_XV){
case VOLTAGE_11V : //占空比1-20%=80% ,256分频 ,10.5A,15V 关闭功率,电压,内部升压使用
CMSDK_ANAC->BOOST_CTRL =0x71013;//ÄÚ˛żboost void boost_voltage_select_15V(void)
CMSDK_ANAC->PMU_CTRL = 0x10; {
break; CMSDK_ANAC->BOOST_CTRL =0x77113;
CMSDK_ANAC->PMU_CTRL = 0x10;
case VOLTAGE_15V : }
CMSDK_ANAC->BOOST_CTRL =0x71113;//ÄÚ˛żboost
CMSDK_ANAC->PMU_CTRL = 0x10; //占空比1-20%=80% ,256分频 ,10.5A ,26V,关闭功率,电压,内部升压使用
break; void boost_voltage_select_26V(void)
case VOLTAGE_26V : {
CMSDK_ANAC->BOOST_CTRL =0x71213;//ÄÚ˛żboost //占空比64分频 10.5A 26V 关闭功率 内部升压
CMSDK_ANAC->PMU_CTRL = 0x10; CMSDK_ANAC->BOOST_CTRL =0x77213;//内部升压
break; CMSDK_ANAC->PMU_CTRL = 0x10;
case VOLTAGE_45V : }
CMSDK_ANAC->BOOST_CTRL =0xc1413;//
CMSDK_ANAC->PMU_CTRL = 0x10; //占空比1-10%=90% ,16分频 ,10.5A ,45V,关闭功率,电压,内部升压使用
break; void boost_voltage_select_45V(void)
case VOLTAGE_55V : {
CMSDK_ANAC->BOOST_CTRL =0xc1713;//ÄÚ˛żboost CMSDK_ANAC->BOOST_CTRL =0x97413;//内部升压
CMSDK_ANAC->PMU_CTRL = 0x10; CMSDK_ANAC->PMU_CTRL = 0x10;
break; }
default:
CMSDK_ANAC->BOOST_CTRL =0x71013;//ÄÚ˛żboost //占空比1-10%=90% ,16分频 ,10.5A ,55V,关闭功率,电压,内部升压使用
CMSDK_ANAC->PMU_CTRL = 0x10; void boost_voltage_select_55V(void)
break; {
} CMSDK_ANAC->BOOST_CTRL =0x97713;//内部升压
return 0; CMSDK_ANAC->PMU_CTRL = 0x10;
} }

View File

@ -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>
} }

View File

@ -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);//中断使能--bit8buffer中断 / 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); //中断使能--bit8buffer中断 / 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); //中断使能--bit8buffer中断 / 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 ;
} }

View File

@ -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>
1MTP部分只能按块写入,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,8 +82,8 @@ 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;
} }

View File

@ -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)
{ {
/*1GPIO 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 ,
} }
/* /*
2SPI_CTRL1寄存器 2??<EFBFBD><EFBFBD>SPI_CTRL1?????
1BAUD_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
4LSB_SEL位来定义帧格式 ??4??????LSB_SEL<EFBFBD><EFBFBD>??????????
5NSS_TOGGLENSS_MST_CTRLNSS_MST_SW bits来选择NSS控制方式 bit11 9 8 ??5?????????NSS_TOGGLE??NSS_MST_CTRL??NSS_MST_SW bits?????NSS?????? bit11 9 8
6MST_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);
} }
/* /*
3SPI_CTRL2寄存器 3??<EFBFBD><EFBFBD>SPI_CTRL2?????
1CHAR_LEN[3:0] ??1??????CHAR_LEN[3:0]<EFBFBD><EFBFBD>???????????????
2NSS端口 NSS0_EN, NSS1_EN, NSS2_EN ??2?????NSS???? NSS0_EN, NSS1_EN, NSS2_EN
3RX数据采集阶段 SAMP_PHASE(1:0) ??3????????????????????RX????????? SAMP_PHASE(1:0)<EFBFBD><EFBFBD>
4C2T_DELAY和T2C_DELAY位C2T/T2C延迟 ??4?????????C2T_DELAY??T2C_DELAY<EFBFBD><EFBFBD>???????????<EFBFBD><EFBFBD>?????????????C2T/T2C???
5TXDMA_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 ,????????????????????
} }
/* /*
4FIFO 4??<EFBFBD><EFBFBD>FIFO ?????
1TX_FIFO_TH或RX_FIFO_TH来定义触发级别阈值 ??1??????TX_FIFO_TH??RX_FIFO_TH?????<EFBFBD><EFBFBD>?????????
2TX_FIFO_CLR和RX_FIFO_CLR位清除TX/RX FIFO ??2?????????TX_FIFO_CLR??RX_FIFO_CLR<EFBFBD><EFBFBD>???TX/RX FIFO
3fif_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);
} }
} }
} }

View File

@ -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,9 +377,177 @@ 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避免重复操作
} }
// --------------------------------------------------------------- // // --------------------------------------------------------------- //

View File

@ -35,13 +35,18 @@ ENS1 uart特性说明
#include "ENS1_GPIO.h" #include "ENS1_GPIO.h"
UART_FifoStructrue UART1_Fifo = { UART_FifoStructrue UART1_Fifo = {
.level = bytes_8 , .level = bytes_8 ,
.DMA_Enable = 0 , .DMA_Enable =0 ,
.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;
} }

314
FWLIB/source/ENS1_WAVEGEN.c Normal file
View File

@ -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=100us100us=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);
}
}

View File

@ -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>
2ADC_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
5ADC_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>
7ADC 7<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>ֹͣADC
*/ */
/*三、连续转换模式 /*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ
1ADC_CONFIG_reg bit0 = 1 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit0 = 1
21 ADC_EN bit and ADC_START bits 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>1 ADC_EN bit and ADC_START bits
3adc_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>
4ADC_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寄存器仅仅在连续采样- 0EOC即开始启动下一次转换 ע<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>
1EOC后开始启动下一次转换 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>ģʽ
1ADC_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>
4ADC控制器进入到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>
5EOC中断被清除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>
1ADC控制启接收到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>
1EOC后 EOC_IR 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD> EOC_IR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2OVERRUN错误发生后OVERRUN_IR 2<EFBFBD><EFBFBD>OVERRUN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OVERRUN_IR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3EOC_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;
} }

View File

@ -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,37 +143,35 @@ 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;
*(isel[0]+CHANNEL_X*64+63) = 0; *(isel[0]+CHANNEL_X*64+63) = 0;
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>
} }
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

BIN
Objects/ens1_wavegen.crf Normal file

Binary file not shown.

16
Objects/ens1_wavegen.d Normal file
View File

@ -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

BIN
Objects/ens1_wavegen.o Normal file

Binary file not shown.

Binary file not shown.

View File

@ -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

Binary file not shown.

Binary file not shown.

View File

@ -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.

View File

@ -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.

View File

@ -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
```

View File

@ -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

View File

@ -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;

View File

@ -3,15 +3,15 @@
*File name: MIAN.C *File name: MIAN.C
*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*/ uint16_t crc = 0xFFFF; // 初始值为0xFFFF
UART_Init(CMSDK_UART1, &UART1_Init); for(uint16_t i = 0; i < length; i++)
UART_ITConfig(CMSDK_UART1, &UART1_ITSet); {
/*TIMER*/ crc ^= (uint16_t)(data[i] << 8); // 高字节先处理
TIMER0_Init(1); for(uint8_t j = 0; j < 8; j++)
while(1) {
{ if(crc & 0x8000)
/*在 void TIMER0_Handler(void) 中断处理函数中打印*/ {
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)
{
}
}