更新文件

This commit is contained in:
许晟昊 2024-11-27 13:13:29 +08:00
parent b457eb5bc2
commit a43b1df369
17 changed files with 21792 additions and 31430 deletions

View File

@ -1,20 +0,0 @@
/*
* Auto generated Run-Time-Environment Component Configuration File
* *** Do not modify ! ***
*
* Project: 'controller'
* Target: 'controller-stlink'
*/
#ifndef RTE_COMPONENTS_H
#define RTE_COMPONENTS_H
/*
* Define the Device Header File:
*/
#define CMSIS_device_header "stm32l4xx.h"
#endif /* RTE_COMPONENTS_H */

View File

@ -100,6 +100,9 @@
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>6</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
@ -153,11 +156,19 @@
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<Lin2Executable></Lin2Executable>
<Lin2ConfigFile></Lin2ConfigFile>
<bLin2Auto>0</bLin2Auto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>0</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
@ -244,6 +255,9 @@
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>4</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
@ -297,11 +311,19 @@
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<Lin2Executable></Lin2Executable>
<Lin2ConfigFile></Lin2ConfigFile>
<bLin2Auto>0</bLin2Auto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>0</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
@ -366,23 +388,6 @@
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>18</CpuCode>
<Books>
<Book>
<Number>0</Number>
<Title>User Manual (STM32L476G-EVAL)</Title>
<Path>D:\Keil\ARM\PACK\Keil\STM32L4xx_DFP\2.1.0\MDK\Boards\ST\STM32L476G-EVAL\Documentation\DM00155732.pdf</Path>
</Book>
<Book>
<Number>1</Number>
<Title>Schematics (STM32L476G-EVAL)</Title>
<Path>D:\Keil\ARM\PACK\Keil\STM32L4xx_DFP\2.1.0\MDK\Boards\ST\STM32L476G-EVAL\Documentation\MB1144B.pdf</Path>
</Book>
<Book>
<Number>2</Number>
<Title>Web Page (STM32L476G-EVAL)</Title>
<Path>http://www.st.com/web/en/catalog/tools/PF261634</Path>
</Book>
</Books>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
@ -405,7 +410,10 @@
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<nTsel>11</nTsel>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>6</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
@ -495,11 +503,19 @@
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<Lin2Executable></Lin2Executable>
<Lin2ConfigFile></Lin2ConfigFile>
<bLin2Auto>0</bLin2Auto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>0</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
@ -828,18 +844,6 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\app_hart.c</PathWithFileName>
<FilenameWithoutPath>app_hart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\app_flow.c</PathWithFileName>
<FilenameWithoutPath>app_flow.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@ -847,19 +851,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\app_hart_user.c</PathWithFileName>
<FilenameWithoutPath>app_hart_user.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>25</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -879,31 +871,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\key.c</PathWithFileName>
<FilenameWithoutPath>key.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\convert.c</PathWithFileName>
<FilenameWithoutPath>convert.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -913,77 +881,17 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\diagnosis.c</PathWithFileName>
<FilenameWithoutPath>diagnosis.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\pdctrl.c</PathWithFileName>
<FilenameWithoutPath>pdctrl.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\fal_execution.c</PathWithFileName>
<FilenameWithoutPath>fal_execution.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\params_hart.c</PathWithFileName>
<FilenameWithoutPath>params_hart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\application\src\at_bluetooth.c</PathWithFileName>
<FilenameWithoutPath>at_bluetooth.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>User/application/mode</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -995,7 +903,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1007,98 +915,6 @@
</File>
</Group>
<Group>
<GroupName>User/hart</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\hart.c</PathWithFileName>
<FilenameWithoutPath>hart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\hart_frame.c</PathWithFileName>
<FilenameWithoutPath>hart_frame.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\slave\src\hart_slave.c</PathWithFileName>
<FilenameWithoutPath>hart_slave.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\slave\src\hart_slave_frame.c</PathWithFileName>
<FilenameWithoutPath>hart_slave_frame.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\slave\src\hart_slave_req.c</PathWithFileName>
<FilenameWithoutPath>hart_slave_req.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\slave\src\hart_slave_req_user.c</PathWithFileName>
<FilenameWithoutPath>hart_slave_req_user.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\hart\hart_cache.c</PathWithFileName>
<FilenameWithoutPath>hart_cache.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>User/lib/control</GroupName>
<tvExp>0</tvExp>
@ -1106,8 +922,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>45</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1118,8 +934,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>46</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1130,8 +946,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>47</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1142,8 +958,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>48</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1154,8 +970,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>49</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1166,8 +982,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>50</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1178,8 +994,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>51</FileNumber>
<GroupNumber>8</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1198,8 +1014,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>52</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1210,8 +1026,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>53</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1222,8 +1038,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>54</FileNumber>
<GroupNumber>9</GroupNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1242,8 +1058,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>55</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1254,8 +1070,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>56</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1266,8 +1082,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>57</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1278,8 +1094,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>58</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1290,8 +1106,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>59</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1302,8 +1118,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>60</FileNumber>
<GroupNumber>10</GroupNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1322,8 +1138,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>61</FileNumber>
<GroupNumber>11</GroupNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1334,8 +1150,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>62</FileNumber>
<GroupNumber>11</GroupNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1354,8 +1170,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>63</FileNumber>
<GroupNumber>12</GroupNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1366,8 +1182,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>64</FileNumber>
<GroupNumber>12</GroupNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1379,6 +1195,26 @@
</File>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>49</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Middlewares/ST/ARM/DSP/Lib/arm_cortexM4l_math.lib</PathWithFileName>
<FilenameWithoutPath>arm_cortexM4l_math.lib</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>
@ -1387,24 +1223,4 @@
<RteFlg>1</RteFlg>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>15</GroupNumber>
<FileNumber>65</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Middlewares/ST/ARM/DSP/Lib/arm_cortexM4l_math.lib</PathWithFileName>
<FilenameWithoutPath>arm_cortexM4l_math.lib</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
</ProjectOpt>

View File

@ -11,12 +11,13 @@
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
<uAC6>8</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32L476VGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32L4xx_DFP.2.1.0</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<PackID>Keil.STM32L4xx_DFP.2.6.2</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 DSP CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -183,6 +184,8 @@
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>1</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@ -323,11 +326,15 @@
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>0</uGnu>
<useXO>0</useXO>
<v6Lang>3</v6Lang>
<v6LangP>3</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
<v6Lto>0</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls>--locale=english --diag_suppress=9</MiscControls>
<Define>STM32,SLAVE,USE_FULL_LL_DRIVER,STM32L476xx,__FPU_PRESENT=1U,__FPU_USED=0U,__CC_ARM,ARM_MATH_CM4,HSE_STARTUP_TIMEOUT=100,LSE_STARTUP_TIMEOUT=5000,LSE_VALUE=32768,EXTERNALSAI1_CLOCK_VALUE=2097000,EXTERNALSAI2_CLOCK_VALUE=2097000,HSI_VALUE=16000000,LSI_VALUE=32000,VDD_VALUE=3300,PREFETCH_ENABLE=1,INSTRUCTION_CACHE_ENABLE=1,DATA_CACHE_ENABLE=1,MSI_VALUE=16000000,PREFETCH_ENABLE=0,HSE_VALUE=11059200</Define>
@ -345,6 +352,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<ClangAsOpt>1</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -507,11 +515,15 @@
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -557,21 +569,11 @@
<FileType>1</FileType>
<FilePath>..\User\app.c</FilePath>
</File>
<File>
<FileName>app_hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_hart.c</FilePath>
</File>
<File>
<FileName>app_flow.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_flow.c</FilePath>
</File>
<File>
<FileName>app_hart_user.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_hart_user.c</FilePath>
</File>
<File>
<FileName>static.lib</FileName>
<FileType>4</FileType>
@ -582,46 +584,11 @@
<Group>
<GroupName>User/application</GroupName>
<Files>
<File>
<FileName>key.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\key.c</FilePath>
</File>
<File>
<FileName>convert.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\convert.c</FilePath>
</File>
<File>
<FileName>params.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\params.c</FilePath>
</File>
<File>
<FileName>diagnosis.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\diagnosis.c</FilePath>
</File>
<File>
<FileName>pdctrl.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\pdctrl.c</FilePath>
</File>
<File>
<FileName>fal_execution.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\fal_execution.c</FilePath>
</File>
<File>
<FileName>params_hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\params_hart.c</FilePath>
</File>
<File>
<FileName>at_bluetooth.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\at_bluetooth.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -639,46 +606,6 @@
</File>
</Files>
</Group>
<Group>
<GroupName>User/hart</GroupName>
<Files>
<File>
<FileName>hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart.c</FilePath>
</File>
<File>
<FileName>hart_frame.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart_frame.c</FilePath>
</File>
<File>
<FileName>hart_slave.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave.c</FilePath>
</File>
<File>
<FileName>hart_slave_frame.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_frame.c</FilePath>
</File>
<File>
<FileName>hart_slave_req.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_req.c</FilePath>
</File>
<File>
<FileName>hart_slave_req_user.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_req_user.c</FilePath>
</File>
<File>
<FileName>hart_cache.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart_cache.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>User/lib/control</GroupName>
<Files>
@ -804,9 +731,6 @@
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<GroupOption>
@ -842,11 +766,15 @@
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -864,6 +792,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -900,6 +829,9 @@
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
</Group>
</Groups>
</Target>
<Target>
@ -907,12 +839,13 @@
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
<uAC6>8</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32L476VGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32L4xx_DFP.2.1.0</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<PackID>Keil.STM32L4xx_DFP.2.6.2</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 DSP CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -1079,6 +1012,8 @@
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>1</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@ -1219,11 +1154,15 @@
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>0</uGnu>
<useXO>0</useXO>
<v6Lang>3</v6Lang>
<v6LangP>3</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
<v6Lto>0</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls>--locale=english --diag_suppress=9</MiscControls>
<Define>STM32,SLAVE,USE_FULL_LL_DRIVER,STM32L476xx,__FPU_PRESENT=1U,__FPU_USED=0U,__CC_ARM,ARM_MATH_CM4,HSE_VALUE=8000000,HSE_STARTUP_TIMEOUT=100,LSE_STARTUP_TIMEOUT=5000,LSE_VALUE=32768,EXTERNALSAI1_CLOCK_VALUE=2097000,EXTERNALSAI2_CLOCK_VALUE=2097000,HSI_VALUE=16000000,LSI_VALUE=32000,VDD_VALUE=3300,PREFETCH_ENABLE=1,INSTRUCTION_CACHE_ENABLE=1,DATA_CACHE_ENABLE=1,MSI_VALUE=16000000</Define>
@ -1241,6 +1180,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<ClangAsOpt>1</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -1403,11 +1343,15 @@
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -1453,21 +1397,11 @@
<FileType>1</FileType>
<FilePath>..\User\app.c</FilePath>
</File>
<File>
<FileName>app_hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_hart.c</FilePath>
</File>
<File>
<FileName>app_flow.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_flow.c</FilePath>
</File>
<File>
<FileName>app_hart_user.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_hart_user.c</FilePath>
</File>
<File>
<FileName>static.lib</FileName>
<FileType>4</FileType>
@ -1478,46 +1412,11 @@
<Group>
<GroupName>User/application</GroupName>
<Files>
<File>
<FileName>key.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\key.c</FilePath>
</File>
<File>
<FileName>convert.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\convert.c</FilePath>
</File>
<File>
<FileName>params.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\params.c</FilePath>
</File>
<File>
<FileName>diagnosis.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\diagnosis.c</FilePath>
</File>
<File>
<FileName>pdctrl.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\pdctrl.c</FilePath>
</File>
<File>
<FileName>fal_execution.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\fal_execution.c</FilePath>
</File>
<File>
<FileName>params_hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\params_hart.c</FilePath>
</File>
<File>
<FileName>at_bluetooth.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\at_bluetooth.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -1535,46 +1434,6 @@
</File>
</Files>
</Group>
<Group>
<GroupName>User/hart</GroupName>
<Files>
<File>
<FileName>hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart.c</FilePath>
</File>
<File>
<FileName>hart_frame.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart_frame.c</FilePath>
</File>
<File>
<FileName>hart_slave.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave.c</FilePath>
</File>
<File>
<FileName>hart_slave_frame.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_frame.c</FilePath>
</File>
<File>
<FileName>hart_slave_req.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_req.c</FilePath>
</File>
<File>
<FileName>hart_slave_req_user.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_req_user.c</FilePath>
</File>
<File>
<FileName>hart_cache.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart_cache.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>User/lib/control</GroupName>
<Files>
@ -1700,6 +1559,16 @@
</File>
</Files>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<Files>
<File>
<FileName>arm_cortexM4l_math.lib</FileName>
<FileType>4</FileType>
<FilePath>../Middlewares/ST/ARM/DSP/Lib/arm_cortexM4l_math.lib</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<GroupOption>
@ -1735,11 +1604,15 @@
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -1757,6 +1630,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -1767,16 +1641,6 @@
</GroupArmAds>
</GroupOption>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<Files>
<File>
<FileName>arm_cortexM4l_math.lib</FileName>
<FileType>4</FileType>
<FilePath>../Middlewares/ST/ARM/DSP/Lib/arm_cortexM4l_math.lib</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
<Target>
@ -1784,12 +1648,13 @@
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32L476VGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32L4xx_DFP.2.1.0</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<PackID>Keil.STM32L4xx_DFP.2.6.2</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 DSP CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -1956,6 +1821,8 @@
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>1</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@ -2096,11 +1963,15 @@
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>1</uGnu>
<useXO>0</useXO>
<v6Lang>3</v6Lang>
<v6LangP>3</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
<v6Lto>0</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls>--locale=english --diag_suppress=9</MiscControls>
<Define>STM32,SLAVE,USE_FULL_LL_DRIVER,STM32L476xx,__FPU_PRESENT=1U,__FPU_USED=0U,__CC_ARM,ARM_MATH_CM4,HSE_VALUE=8000000,HSE_STARTUP_TIMEOUT=100,LSE_STARTUP_TIMEOUT=5000,LSE_VALUE=32768,EXTERNALSAI1_CLOCK_VALUE=2097000,EXTERNALSAI2_CLOCK_VALUE=2097000,HSI_VALUE=16000000,LSI_VALUE=32000,VDD_VALUE=3300,PREFETCH_ENABLE=1,INSTRUCTION_CACHE_ENABLE=1,DATA_CACHE_ENABLE=1,MSI_VALUE=16000000</Define>
@ -2118,6 +1989,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<ClangAsOpt>1</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -2280,11 +2152,15 @@
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -2330,21 +2206,11 @@
<FileType>1</FileType>
<FilePath>..\User\app.c</FilePath>
</File>
<File>
<FileName>app_hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_hart.c</FilePath>
</File>
<File>
<FileName>app_flow.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_flow.c</FilePath>
</File>
<File>
<FileName>app_hart_user.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\app_hart_user.c</FilePath>
</File>
<File>
<FileName>static.lib</FileName>
<FileType>4</FileType>
@ -2355,46 +2221,11 @@
<Group>
<GroupName>User/application</GroupName>
<Files>
<File>
<FileName>key.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\key.c</FilePath>
</File>
<File>
<FileName>convert.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\convert.c</FilePath>
</File>
<File>
<FileName>params.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\params.c</FilePath>
</File>
<File>
<FileName>diagnosis.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\diagnosis.c</FilePath>
</File>
<File>
<FileName>pdctrl.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\pdctrl.c</FilePath>
</File>
<File>
<FileName>fal_execution.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\fal_execution.c</FilePath>
</File>
<File>
<FileName>params_hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\params_hart.c</FilePath>
</File>
<File>
<FileName>at_bluetooth.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\application\src\at_bluetooth.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -2412,46 +2243,6 @@
</File>
</Files>
</Group>
<Group>
<GroupName>User/hart</GroupName>
<Files>
<File>
<FileName>hart.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart.c</FilePath>
</File>
<File>
<FileName>hart_frame.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart_frame.c</FilePath>
</File>
<File>
<FileName>hart_slave.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave.c</FilePath>
</File>
<File>
<FileName>hart_slave_frame.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_frame.c</FilePath>
</File>
<File>
<FileName>hart_slave_req.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_req.c</FilePath>
</File>
<File>
<FileName>hart_slave_req_user.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\slave\src\hart_slave_req_user.c</FilePath>
</File>
<File>
<FileName>hart_cache.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\hart\hart_cache.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>User/lib/control</GroupName>
<Files>
@ -2577,6 +2368,16 @@
</File>
</Files>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<Files>
<File>
<FileName>arm_cortexM4l_math.lib</FileName>
<FileType>4</FileType>
<FilePath>../Middlewares/ST/ARM/DSP/Lib/arm_cortexM4l_math.lib</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<GroupOption>
@ -2612,11 +2413,15 @@
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -2634,6 +2439,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -2644,16 +2450,6 @@
</GroupArmAds>
</GroupOption>
</Group>
<Group>
<GroupName>Middlewares/Library/DSP Library/DSP Library</GroupName>
<Files>
<File>
<FileName>arm_cortexM4l_math.lib</FileName>
<FileType>4</FileType>
<FilePath>../Middlewares/ST/ARM/DSP/Lib/arm_cortexM4l_math.lib</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
</Targets>
@ -2672,4 +2468,13 @@
<files/>
</RTE>
<LayerInfo>
<Layers>
<Layer>
<LayName>controller</LayName>
<LayPrjMark>1</LayPrjMark>
</Layer>
</Layers>
</LayerInfo>
</Project>

File diff suppressed because it is too large Load Diff

View File

@ -1,962 +0,0 @@
/**
* @file app_hart.c
* @author xxx
* @date 2023-07-06 13:08:52
* @brief HART功能
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
*/
#include "app.h"
#include "hart.h"
#include "hart_frame.h"
#include "uarts.h"
#include "test_bsp.h"
#include "at_bluetooth.h"
#include "menus.h"
#include "bootload.h"
#include "ymodem.h"
#include "flow.h"
#include "app_hart.h"
#include <stdlib.h>
#include "app_hart_user.h"
#define HART_UART_RXSIZE (240u)
#define BLE_UART_RXSIZE (1100u) // 接收1100个字节,考虑到BOOTLOAD需要接收大量数据在RAM允许的情况下可以适当增大
#define HART_UART_TXSIZE (240u) // 发送240个字节
uart_t *uarts[APP_UART_MAX];
static void _get_real_time_clock(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec);
static void update_device_status(void); // 更新其他设备状态
/**
* @brief
*
* @param event
* @param data
*
* @return
*/
static BOOL _user_common_event(hart_interface_user_event_e event, const void *const data)
{
return hart_user_handle(event, data);
}
/**
* @brief (hart协议数据帧)
* @param {uint8_t} *txBuf
* @param {uint16_t} len
* @return {*}
*/
static void _response(uint8_t uart_index, uint8_t *data, uint16_t len)
{
#ifdef STM32
rt_data.flag.bits.hart_rts_on = FALSE;
uart_send_data(uarts[uart_index], data, len);
uart_data_storage_reset(uarts[uart_index]);
#else
LOG_HEX(data, len);
#endif
}
/**
* @brief UART的错误计数
*
* UART索引获取指定UART的错误计数
*
* @param uart_index UART索引
*
* @return STM32宏UART的错误计数0
*/
static uint16_t _uart_error_count(uint8_t uart_index)
{
#ifdef STM32
return uart_get_error_count(uarts[uart_index]);
#else
return 0;
#endif
}
static void _uart_errors(uint8_t uart_index, hart_uart_error_t *errors)
{
uint16_t count = uart_get_error_count(uarts[uart_index]);
if (count > 0)
{
uarts_interupt_error_t *uart_errors = uart_get_error(uarts[uart_index]);
if (uart_errors != NULL)
{
for (uint16_t i = 0; i < count; i++)
{
errors[i].uart_error = (hart_uarts_interupt_error_e)uart_errors[i].err;
errors[i].rx_index = uart_errors[i].index;
}
}
}
}
static void _frame_data_parse_time_start(uint16_t timer_period)
{
ENABLE_TIM(HART_TIM);
hart_timer_start(timer_period);
}
/**
* @brief
* @return {*}
*/
static uint32_t _get_timestamp(void)
{
uint8_t year, month, day, hour, min, sec;
uint32_t stamp;
rtc_date_t date;
rtc_time_t time;
_get_real_time_clock(&year, &month, &day, &hour, &min, &sec);
date.year = year;
date.month = month;
date.day = day;
time.hour = hour;
time.minute = min;
time.second = sec;
stamp = time2stamp(&date, &time);
return stamp;
}
/**
* @brief flash读取接口
* @param {uint32_t} addr
* @param {uint8_t} *data
* @param {uint16_t} len
* @return {*}
*/
static BOOL _flash_read(hart_storage_e index, uint8_t *data)
{
BOOL res = FALSE;
switch (index)
{
case HART_STORAGE_PARAMS:
res = storage_read_all(hart_attribute_storage, data);
break;
case HART_STORAGE_VARIABLE:
res = storage_read_all(hart_variable_storage, data);
break;
case HART_STORAGE_CONSTANT:
res = storage_read_all(hart_constant_storage, data);
break;
case HART_STORAGE_STANDARD_VARIABLE:
res = storage_read_all(hart_standard_variable_storage, data);
break;
default:
break;
}
return res;
}
/**
* @brief flash写入接口
* @param {uint32_t} addr
* @param {uint8_t} *data
* @param {uint16_t} len
* @return {*}
*/
static BOOL _flash_write(hart_storage_e index, uint8_t *data)
{
BOOL res = FALSE;
switch (index)
{
case HART_STORAGE_PARAMS:
res = storage_write_all(hart_attribute_storage, data);
if (storage_check_all(hart_attribute_storage, data) == FALSE)
{
rt_data.flag.bits.hart_attribute_storage = FALSE;
}
break;
case HART_STORAGE_VARIABLE:
res = storage_write_all(hart_variable_storage, data);
if (storage_check_all(hart_variable_storage, data) == FALSE)
{
rt_data.flag.bits.hart_variable_storage = FALSE;
}
break;
case HART_STORAGE_CONSTANT:
res = storage_write_all(hart_constant_storage, data);
if (storage_check_all(hart_constant_storage, data) == FALSE)
{
rt_data.flag.bits.hart_constant_storage = FALSE;
}
break;
case HART_STORAGE_STANDARD_VARIABLE:
res = storage_write_all(hart_standard_variable_storage, data);
if (storage_check_all(hart_standard_variable_storage, data) == FALSE)
{
rt_data.flag.bits.hart_standard_variable_storage = FALSE;
}
break;
default:
break;
}
return res;
}
static BOOL _flash_read_item(hart_storage_e index, uint8_t item, uint8_t *data)
{
BOOL res = FALSE;
switch (index)
{
case HART_STORAGE_PARAMS:
res = storage_read(hart_attribute_storage, item, data);
break;
case HART_STORAGE_VARIABLE:
res = storage_read(hart_variable_storage, item, data);
break;
case HART_STORAGE_CONSTANT:
res = storage_read(hart_constant_storage, item, data);
break;
case HART_STORAGE_STANDARD_VARIABLE:
res = storage_read(hart_standard_variable_storage, item, data);
break;
default:
break;
}
return res;
}
static BOOL _flash_write_item(hart_storage_e index, uint8_t item, uint8_t *data)
{
BOOL res = FALSE;
switch (index)
{
case HART_STORAGE_PARAMS:
res = storage_write(hart_attribute_storage, item, data);
if (storage_check(hart_attribute_storage, item, data) == FALSE)
{
rt_data.flag.bits.hart_attribute_storage = FALSE;
}
break;
case HART_STORAGE_VARIABLE:
res = storage_write(hart_variable_storage, item, data);
if (storage_check(hart_variable_storage, item, data) == FALSE)
{
rt_data.flag.bits.hart_variable_storage = FALSE;
}
break;
case HART_STORAGE_CONSTANT:
res = storage_write(hart_constant_storage, item, data);
if (storage_check(hart_constant_storage, item, data) == FALSE)
{
rt_data.flag.bits.hart_constant_storage = FALSE;
}
break;
case HART_STORAGE_STANDARD_VARIABLE:
res = storage_write(hart_standard_variable_storage, item, data);
if (storage_check(hart_standard_variable_storage, item, data) == FALSE)
{
rt_data.flag.bits.hart_standard_variable_storage = FALSE;
}
break;
default:
break;
}
return res;
}
/**
* @brief
* @param {*}
* @return {*}
*/
static void _perform_self_test(void)
{
// power_on_diagnosis(); // 是否需要延时回复
menus_show_custom_window(SET_CUSTOM_SELF_TEST);
}
/**
* @brief
* @param {*}
* @return {*}
*/
static void _device_reset(void)
{
get_menus()->accelerate = TRUE;
menus_show_custom_window(SET_CUSTOM_RESET);
}
/**
* @brief ,01-255
* @param {*}
* @return {*}
*/
static void _squawk_control(BOOL open, uint8_t second)
{
}
/**
* @brief command74
* @param {*}
* @return {*}
*/
static BOOL _armed(void)
{
return TRUE;
}
static void _set_real_time_clock(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec)
{
set_real_time(year, month, day, hour, min, sec);
}
static void _get_real_time_clock(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec)
{
get_real_time(year, month, day, hour, min, sec);
}
/**
* @brief
* @return {*}
*/
static BOOL _set_dynamics(device_variable_dynamics_t *const dynamics)
{
// HART自带部分
// 下面是用户自定义部分
return TRUE;
}
/**
* @brief
* @param {uint8_t} *data
* @param {uint16_t} len
* @return {*}
* @note
*/
void bluetooth_output(uint8_t *data, uint16_t len)
{
DBG_ASSERT(data != NULL __DBG_LINE);
if (len == 0)
{
return;
}
else
{
if (SystemCoreClock == SYSTEM_CLOCK_HIGHT)
{
return;
}
if (uarts[APP_UART_2] != NULL && BLE_IS_ENABLE() == TRUE)
{
uart_send_data(uarts[APP_UART_2], data, len);
}
}
}
void h24_bluetooth_output_dbg(uint8_t *data, uint16_t len)
{
DBG_ASSERT(data != NULL __DBG_LINE);
if (len == 0)
{
return;
}
else
{
#if DEBUG_ENABLE == TRUE
if (BIT_IS_SET(bluetooth_state, BIT2))
{
bluetooth_output(data, len);
}
#endif
}
}
void hart_write_test(void)
{
#define TEST_LEN 10
uint8_t buf[TEST_LEN];
osel_memset(buf, 0, ARRAY_LEN(buf));
buf[0] = 0xFF;
buf[1] = 0xFF;
buf[2] = 0xFF;
buf[3] = 0xFF;
buf[4] = 0xFF;
buf[5] = 0xaa;
buf[6] = 0xbb;
buf[7] = 0xD5;
buf[8] = 0xC8;
buf[TEST_LEN - 1] = 0xce;
_response(APP_UART_1, buf, TEST_LEN);
}
/**
* @brief H24模块配置工作
* @return {*}
* @note
*/
void bluetooth_work(uint8_t index)
{
uint8_t len = 0;
char data[128];
osel_memset((uint8_t *)data, 0, 128);
// HC42蓝牙模块设置名称总长度不超过 12 字节 MX02蓝牙模块设置名称总长度不超过 20 字节
#if BOOTLOAD
char device_id[] = "BOOTLOAD";
#else
char device_id[HART_PACKED12_LEN + 1];
osel_memset((uint8_t *)device_id, 0, HART_PACKED12_LEN);
sprintf(device_id, "%s", DESCRIPTOR);
uint8_t use_offset = osel_mstrlen(DESCRIPTOR);
assic_to_str((uint8_t *)&udevice.dev_serial_num[INST_SERIAL_NUM_LEN - (HART_PACKED12_LEN - use_offset)],
HART_PACKED12_LEN - use_offset, (uint8_t *)&device_id[use_offset]);
device_id[HART_PACKED12_LEN] = 0;
#endif
#if BLE_TYPE == BLE_TYPE_HC42
char *test_cmd[AT_END] = {
"AT",
"AT+NAME",
"AT+NAME=%s",
"AT+RESET",
};
#elif BLE_TYPE == BLE_TYPE_MX02
char *test_cmd[AT_END] = {
"AT+VER?\r\n",
"AT+NAME?\r\n",
"AT+NAME=%s\r\n",
"AT+TXPOWER=0\r\n",
};
#else
// 编译时输出错误提示
#error "BLE_TYPE 类型错误"
#endif
switch (index)
{
case AT_CMD_TEST: // 测试指令
{
bluetooth_state = 0;
sprintf(data, test_cmd[AT_CMD_TEST]);
len = osel_mstrlen((unsigned char *)data);
bluetooth_output((uint8_t *)data, len);
break;
}
case AT_CMD_NAME_REQ: // 获取设备名称
{
sprintf(data, "%s", device_id);
at_set_memcmp_cache((unsigned char *)data, osel_mstrlen((unsigned char *)data));
osel_memset((uint8_t *)data, 0, 128);
sprintf(data, test_cmd[AT_CMD_NAME_REQ]);
len = osel_mstrlen((unsigned char *)data);
bluetooth_output((uint8_t *)data, len);
break;
}
case AT_CMD_NAME: // 设置设备名称
{
sprintf(data, "%s", device_id);
at_set_memcmp_cache((unsigned char *)data, osel_mstrlen((unsigned char *)data));
osel_memset((uint8_t *)data, 0, 128);
sprintf(data, test_cmd[AT_CMD_NAME], device_id);
len = osel_mstrlen((unsigned char *)data);
bluetooth_output((uint8_t *)data, len);
break;
}
case AT_CMD_TX_POWER: // 设置发射功率
{
bluetooth_state = 0;
sprintf(data, test_cmd[AT_CMD_TX_POWER]);
len = osel_mstrlen((unsigned char *)data);
bluetooth_output((uint8_t *)data, len);
break;
}
case 100:
{
sprintf(data, "%f,%f,%f\r\n", 1.1, 2.2, 3.3);
len = osel_mstrlen((unsigned char *)data);
bluetooth_output((uint8_t *)data, len);
break;
}
default:
break;
}
}
// 串口1、5接收中断回调函数
static void hart_rx1_cb(uint8_t uart_index, uint8_t *data, uint16_t len)
{
DBG_ASSERT(uart_index < APP_UART_MAX __DBG_LINE);
#ifndef BOOTLOAD
HART_RTS_OFF(); // RTS需要提前
uart1_set_idel_status(FALSE);
if (hart_handle(uart_index, data, len) == FALSE)
{
HART_RTS_ON();
}
#else
rym_receive(uart_index, data, len);
#endif
}
static void hart_rx5_cb(uint8_t uart_index, uint8_t *data, uint16_t len)
{
DBG_ASSERT(uart_index < APP_UART_MAX __DBG_LINE);
if (data[0] == 'O' && data[1] == 'K') // HC42蓝牙协议
{
data[0] = 'A';
data[1] = 'T';
at_cmd_parse(data, len);
}
else if (data[0] == '+' && data[len - 1] == '\n' && data[len - 2] == '\r') // MX02蓝牙协议
{
uint8_t mx02_data[32];
mx02_data[0] = 'A';
mx02_data[1] = 'T';
osel_memcpy(&mx02_data[2], data, len);
at_cmd_parse((unsigned char *)mx02_data, len + 2);
}
else if (data[0] == 'B' && data[1] == 'T') // 收到BOOTLOAD启动命令
{
if (osel_memcmp(data, "BT RUN", 6) == 0)
{
if (get_app_preload_bootload_flag() == BOOTLOAD_UNSET_FLAG) // 如果已经在BOOTLOAD模式下不再重复启动
{
set_app_preload_bootload_flag(BOOTLOAD_SET_FLAG); // 设置BOOTLOAD标志
bootload_transmit_from(uart_index); // 从指定位置开始发送数据
}
}
else if (osel_memcmp(data, "BT STOP", 7) == 0)
{
set_app_preload_bootload_flag(BOOTLOAD_UNSET_FLAG); // 设置BOOTLOAD标志
}
}
else
{
// 注在BOOTLOAD模式下不接收HART数据
#ifndef BOOTLOAD
uart1_set_idel_status(FALSE);
if (hart_handle(uart_index, data, len) == FALSE)
{
__NOP();
}
#else
rym_receive(uart_index, data, len);
#endif
}
}
static void hart_tx_complete_cb(void)
{
// 串口1发送完成回调函数
HART_RTS_ON();
rt_data.flag.bits.hart_rts_on = TRUE;
}
// HART协议的使用的串口 --- 串口1
void hart_uart_init(void)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
GPIO_SET_OUTPUT(HART_PWR_GPIO_Port, HART_PWR_Pin);
GPIO_SET_OUTPUT(HART_RST_GPIO_Port, HART_RST_Pin);
GPIO_SET_OUTPUT(HART_RTS_GPIO_Port, HART_RTS_Pin);
GPIO_SET_ALTERNATE(HART_TX_GPIO_Port, HART_TX_Pin);
GPIO_SET_ALTERNATE(HART_RX_GPIO_Port, HART_RX_Pin);
LL_mDelay(10);
// 串口1初始化开始
HART_RTS_ON();
HART_RST_OFF();
LL_mDelay(20);
HART_RST_ON();
HART_EN_DISABLE();
HART_EN_ENABLE();
HART_RTS_ON();
if (uarts[APP_UART_1] == NULL)
{
LL_mDelay(100);
uarts[APP_UART_1] = uart_create(HART_UART1, FALSE, HART_UART_RXSIZE, hart_rx1_cb, FALSE, HART_UART_TXSIZE, hart_tx_complete_cb);
uarts[APP_UART_1]->rx_cd_en = TRUE;
uarts[APP_UART_1]->uart_index = APP_UART_1;
uarts[APP_UART_1]->dma = DMA2;
uarts[APP_UART_1]->dma_rx_channel = LL_DMA_CHANNEL_7;
uarts[APP_UART_1]->dma_tx_channel = LL_DMA_CHANNEL_6;
uart_recv_en(uarts[APP_UART_1], TRUE);
rt_data.flag.bits.hart_rts_on = TRUE;
}
// 串口1初始化结束
uart1_set_idel_status(TRUE);
uart_data_storage_reset(uarts[APP_UART_1]);
}
// HART协议使用的串口为模拟IO口
void hart_uart_dinit(void)
{
HART_EN_DISABLE();
LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_USART1);
LL_USART_Disable(USART1);
GPIO_SET_ANALOG(HART_PWR_GPIO_Port, HART_PWR_Pin);
GPIO_SET_ANALOG(HART_RST_GPIO_Port, HART_RST_Pin);
// GPIO_SET_ANALOG(HART_CD_GPIO_Port, HART_CD_Pin); // CD作为外部输入中断不需要设置为模拟IO口
GPIO_SET_ANALOG(HART_TX_GPIO_Port, HART_TX_Pin);
GPIO_SET_ANALOG(HART_RX_GPIO_Port, HART_RX_Pin);
}
// 蓝牙模块串口初始化
void hart_ble_init(void)
{
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UART5);
GPIO_SET_OUTPUT(BLE_PWR_GPIO_Port, BLE_PWR_Pin);
GPIO_SET_INPUT(BLE_RST_GPIO_Port, BLE_RST_Pin);
GPIO_SET_ALTERNATE(BLE_TX_GPIO_Port, BLE_TX_Pin);
GPIO_SET_ALTERNATE(BLE_RX_GPIO_Port, BLE_RX_Pin);
if (uarts[APP_UART_2] == NULL)
{
uarts[APP_UART_2] = uart_create(HART_UART2, TRUE, BLE_UART_RXSIZE, hart_rx5_cb, TRUE, HART_UART_TXSIZE, NULL);
uarts[APP_UART_2]->uart_index = APP_UART_2;
uarts[APP_UART_2]->dma = DMA2;
uarts[APP_UART_2]->dma_rx_channel = LL_DMA_CHANNEL_2;
uarts[APP_UART_2]->dma_tx_channel = LL_DMA_CHANNEL_1;
uart_recv_en(uarts[APP_UART_2], FALSE);
}
BLE_EN_ENABLE();
}
// 蓝牙模块端口IO口反初始化
void hart_ble_dinit(void)
{
// 关闭蓝牙串口
BLE_EN_DISABLE();
LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_UART5);
LL_USART_Disable(UART5);
// 端口转成模拟IO口
GPIO_SET_ANALOG(BLE_PWR_GPIO_Port, BLE_PWR_Pin);
GPIO_SET_ANALOG(BLE_RST_GPIO_Port, BLE_RST_Pin);
GPIO_SET_ANALOG(BLE_TX_GPIO_Port, BLE_TX_Pin);
GPIO_SET_ANALOG(BLE_RX_GPIO_Port, BLE_RX_Pin);
}
static void hart_params_init(void)
{
uint32_t stmp = _get_timestamp();
uint8_t message[HART_PACKED32_LEN];
osel_memset(message, 0, HART_PACKED32_LEN);
// hart_storage_variable_t *p = &hart_device_attribute.flash_variable;
app_hart_update_time(); // 更新时间
// 记录消息
if (dbg_assert_line != 0)
{
uint16_t line = dbg_assert_line;
sprintf((char *)message, "GSDT RESET[%d]:%d", line, stmp);
// osel_memcpy(p->message, message, sizeof(message)); // 消息
dbg_assert_line = 0;
}
hart_attribute_params_map_address_update(); // 参数变量地址映射
}
// HART初始化
BOOL app_hart_init(void)
{
hart_init_t init;
init.hart_protocol_version = HART_VERSION; // 协议版本
init.dir = MODULE_SLAVE; // 协议模式--从
init.interface.response = _response;
init.interface.uart_error_count = _uart_error_count;
init.interface.uart_errors = _uart_errors;
init.interface.frame_data_parse_time_start = _frame_data_parse_time_start;
init.interface.get_timestamp = _get_timestamp;
init.interface.flash_read = _flash_read;
init.interface.flash_write = _flash_write;
init.interface.flash_read_item = _flash_read_item;
init.interface.flash_write_item = _flash_write_item;
init.interface.perform_self_test = _perform_self_test;
init.interface.device_reset = _device_reset;
init.interface.squawk_control = _squawk_control;
init.interface.armed = _armed;
init.interface.set_dynamics = _set_dynamics;
init.interface.set_real_time_clock = _set_real_time_clock;
init.interface.get_real_time_clock = _get_real_time_clock;
init.interface.user_common_event = _user_common_event;
init.interface.attribute_init = hart_attribute_params_restart;
init.interface.variable_init = hart_attribute_params_map_restart;
init.hart_timer.timer_cycle = (LL_TIM_GetAutoReload(HART_TIM) + 1) * 0.1; // 定时器周期
hart_device_attribute.last_device_variable = (uint8_t *)&rt_save.last_dev_variable;
uarts[APP_UART_1] = NULL;
uarts[APP_UART_2] = NULL;
hart_init(&init);
hart_params_init();
ENABLE_TIM(HART_OUT_TIM);
PWM_START(HART_OUT_TIM, LL_TIM_CHANNEL_CH2);
return TRUE;
}
/**
* @brief HART检测任务
* @return {*}
* @note
*/
void app_hart_inspection(void)
{
hart_device_attribute.internal++;
app_hart_update_time(); // 更新时间
hart_cache_detection(); // HART缓存区探测如果缓存区过期则回收
rt_save.hart_run_time_h = rt_save.dev_run_time_h / 18; // 1:18运行时间 详见参数读取-129 RUN_TIME_18HR
// 是否写保护
driver_icon_enable.bits.write_protect = hart_device_attribute.flash_variable.write_protect_code == WRITE_PROTECT_CODE_WRITE_PROTECT ? 1 : 0;
// 是否锁定
driver_icon_enable.bits.lock = hart_device_attribute.flash_variable.lock_code == LOCK_DEVICE_CODE_0 ? 0 : 1;
// 扩展设备类型
if (hart_device_attribute.flash_variable.extended_device_type != udevice.dev_model)
{
hart_device_attribute.flash_variable.extended_device_type = udevice.dev_model;
hart_long_addr_set();
hart_storage_write_item(HART_STORAGE_PARAMS, HPB_EXTENDED_DEVICE_TYPE,
(uint8_t *)&hart_device_attribute.flash_variable.extended_device_type);
hart_storage_write_item(HART_STORAGE_PARAMS, HPB_LONG_ADDRESS,
hart_device_attribute.flash_variable.long_address);
}
if (hart_device_attribute.internal % HART_INTERNAL == 0) // 需要延时判断的
{
if (hart_device_attribute.device_status.reset == TRUE)
{
LL_mDelay(200);
sys_soft_reset();
}
else if (hart_device_attribute.device_status.busy == TRUE)
{
perform_self_test_finish();
menus_rebuild();
}
}
update_device_status(); // 扩展现场设备状态 48号指令
spec_table_data_mapping(TRUE); // udevice中数据映射到规格表
// // 每60次进入执行一次检查ram和存储中数据是否一致
// if (hart_device_attribute.internal % (HART_INTERNAL * 20) == 0)
// {
// hart_storage_variable_t *p1 = &hart_device_attribute.flash_variable;
// if (storage_check_all(hart_attribute_storage, (uint8_t *)p1) == FALSE)
// {
// rt_data.flag.bits.hart_attribute_storage = FALSE;
// }
// hart_device_variable_t *p2 = hart_device_attribute.device_variable;
// if (storage_check_all(hart_variable_storage, (uint8_t *)p2) == FALSE)
// {
// rt_data.flag.bits.hart_variable_storage = FALSE;
// }
// hart_device_constant_t *p3 = hart_device_attribute.device_constant;
// if (storage_check_all(hart_constant_storage, (uint8_t *)p3) == FALSE)
// {
// rt_data.flag.bits.hart_constant_storage = FALSE;
// }
// hart_device_standard_variable_t *p4 = hart_device_attribute.device_standard_variable;
// if (storage_check_all(hart_standard_variable_storage, (uint8_t *)p4) == FALSE)
// {
// rt_data.flag.bits.hart_standard_variable_storage = FALSE;
// }
// }
}
// 更新实时时间
void app_hart_update_time(void)
{
BOOL change = FALSE;
uint8_t y, h, m, s;
real_time_clock_t *p = &hart_device_attribute.real_time_clock;
uint8_t *date = hart_device_attribute.flash_variable.date;
y = rt_save.real_time.date.year;
covert_rtc_year(&y);
if (date[2] != y || date[1] != rt_save.real_time.date.month || date[0] != rt_save.real_time.date.day)
{
change = TRUE;
}
date[2] = y;
date[1] = rt_save.real_time.date.month;
date[0] = rt_save.real_time.date.day;
p->date[0] = hart_device_attribute.flash_variable.date[0];
p->date[1] = hart_device_attribute.flash_variable.date[1];
p->date[2] = hart_device_attribute.flash_variable.date[2];
h = rt_save.real_time.date.hour;
m = rt_save.real_time.date.minute;
s = rt_save.real_time.date.second;
convert_timestrap(&p->time, h, m, s, 0);
p->rtc_flags = REAL_TIME_CLOCK_FLAGS_1;
if (change == TRUE)
{
hart_storage_write_item(HART_STORAGE_PARAMS, HPB_DATE,
hart_device_attribute.flash_variable.date);
}
}
// 判断下一篇存储数据是否已经写过数据
BOOL app_hart_storage_is_written(uint32_t address, uint16_t length)
{
uint8_t *data;
uint16_t count = 0;
ErrorStatus rst = ERROR;
BOOL res = FALSE;
count = length / LL_FLASH_PAGE_SIZE;
data = osel_mem_alloc(LL_FLASH_PAGE_SIZE);
DBG_ASSERT(data != NULL __DBG_LINE);
for (uint16_t i = 0; i < count; i++)
{
rst = LL_FLASH_Read(address + i * LL_FLASH_PAGE_SIZE, data, LL_FLASH_PAGE_SIZE);
if (rst == SUCCESS)
{
for (uint16_t j = 0; j < LL_FLASH_PAGE_SIZE; j++)
{
if (data[j] != 0xff)
{
res = TRUE;
break;
}
}
}
else
{
res = TRUE;
}
if (res == TRUE)
{
break;
}
res = FALSE;
}
osel_mem_free(data);
return res;
}
/**
* @brief
* @param {uint8_t} *rev_buf
* @return {*}
* @note
*/
static void hart_get_device_specific_status(uint8_t *rev_buf)
{
hart_device_specific_status_u st;
st.bits.u1.travel_sensor_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_MAGNET);
st.bits.u1.pressure_sensor_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_PRESS_SENSOR);
st.bits.u1.temperature_sensor_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TEMPERATURE_SENSOR);
st.bits.u1.critical_nvm_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_CRITICAL_NVM);
st.bits.u1.drive_current_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_IP_DRIVER);
st.bits.u1.reference_voltage_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_VREF);
st.bits.u1.mlfb_sensor_alarm = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_MICRO_LOOP);
st.bits.u1.flash_integrity_failure = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_FLASH_INTEGRITY);
st.bits.u2.auto_cal_in_progress_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_AUTO_CALIBRATION);
st.bits.u2.nvm_protective_mode = get_diagnosis_fault_result_of_enable_state(INDICATE_NVM_PROTECT_MODE);
st.bits.u2.pressure_fallback_active_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_PRESS_ACTIVE);
st.bits.u2.diagnostics_in_progress_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_TEST_PROGRESS);
st.bits.u2.calibration_in_progress_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_CALIBRATION);
st.bits.u2.alert_record_not_empty_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_ALERT_RECORD_NOT_EMPTY);
st.bits.u3.alert_record_full_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_ALERT_RECORD_FULL);
st.bits.u3.cycle_counter_high_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_ACT_SUM);
st.bits.u3.instrument_time_is_approximate_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_DEV_REALTIME);
st.bits.u3.non_critical_nvm_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_NON_CRITICAL_NVM);
st.bits.u3.offline_failed_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_OFFLINE);
st.bits.u3.travel_accumulator_high_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TRAVEL_SUM);
st.bits.u4.diagnostic_data_available_alert = get_diagnosis_fault_result_of_enable_state(INDICATE_DIAG_DATA_AVAILABLE);
st.bits.u4.end_point_pressure_deviation_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_PRESS_ERROR);
st.bits.u4.integrator_saturated_high_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_UI_SATURATED_HIGH);
st.bits.u4.integrator_saturated_low_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_UI_SATURATED_LOW);
st.bits.u4.supply_pressure_high_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_SUPPLY_UPPER);
st.bits.u4.supply_pressure_low_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_SUPPLY_LOWER);
st.bits.u5.drive_signal_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_DRIVE_SIGNAL);
st.bits.u5.travel_alert_hi = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TRAVEL_HI);
st.bits.u5.travel_alert_hi_hi = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TRAVEL_HI_HI);
st.bits.u5.travel_alert_lo = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TRAVEL_LO);
st.bits.u5.travel_alert_lo_lo = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TRAVEL_LO_LO);
st.bits.u5.travel_deviation_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_TRAVEL_ERROR);
st.bits.u5.travel_limit_cutoff_hi_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_LIMIT_CUTOFF_HI);
st.bits.u5.travel_limit_cutoff_lo_alert = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_LIMIT_CUTOFF_LO);
st.bits.u6.output_circuit_error = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_OUTPUT_CIRCUIT_ERROR);
st.bits.u6.output_pressure_limiting = get_diagnosis_fault_result_of_enable_state(DIAGNOSIS_OUTPUT_PRESS_LIMIT);
osel_memcpy(rev_buf, (uint8_t *)&st, ARRAY_LEN(st.data));
}
/**
* @brief
* @return {*}
* @note
*/
static void update_device_status(void)
{
additional_device_status_t *p = &hart_device_attribute.device_status.additional_device_status;
// 设备特定状态 - 48号指令
{
hart_get_device_specific_status(p->device_specific_status);
}
// 扩展设备状态
{
diag_class_e status = get_diagnosis_fault_priority();
switch (status)
{
case DIAGNOSIS_CLASS_FAIL:
p->extended_device_status = EXTENDED_DEVICE_STATUS_4; // 设备故障
break;
case DIAGNOSIS_CLASS_SPEC:
p->extended_device_status = EXTENDED_DEVICE_STATUS_5; // 超出规格
break;
case DIAGNOSIS_CLASS_CHECK:
p->extended_device_status = EXTENDED_DEVICE_STATUS_6; // 功能检查
break;
case DIAGNOSIS_CLASS_MAINT:
p->extended_device_status = EXTENDED_DEVICE_STATUS_1; // 需要维护
break;
default:
p->extended_device_status = EXTENDED_DEVICE_STATUS_0; // 正常
break;
}
}
// 标准化状态0
{
p->standardized_status0 = STANDARDIZED_STATUS0_0;
// 非易失性存储器缺陷
BOOL eeprom_status = FALSE;
eeprom_status = fal_execution_status_get(FAL_EXECUTION_EEPROM_M95_1);
if (eeprom_status == TRUE)
{
eeprom_status = fal_execution_status_get(FAL_EXECUTION_EEPROM_M95_2);
if (eeprom_status == TRUE)
{
eeprom_status = fal_execution_status_get(FAL_EXECUTION_EEPROM_FM24);
if (eeprom_status == TRUE)
{
// TODO: eeprom_lc02b
}
}
}
if (eeprom_status == FALSE)
{
p->standardized_status0 = STANDARDIZED_STATUS0_2; // 非易失性存储器缺陷
}
// 电源条件超出范围
if (rt_data.loop_current < LOOP_CURRENT_MIN || rt_data.loop_current > LOOP_CURRENT_MAX)
{
p->standardized_status0 = STANDARDIZED_STATUS0_5; // 电源条件超出范围
}
if (hart_device_attribute.flash_variable.write_protect_code == WRITE_PROTECT_CODE_WRITE_PROTECT ||
hart_device_attribute.flash_variable.lock_code != LOCK_DEVICE_CODE_0)
{
p->standardized_status0 = STANDARDIZED_STATUS0_8; // 设备配置已锁定。设备处于写保护状态或已锁定
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +0,0 @@
#include "app_hart_user_standard.h"
BOOL hart_user_standard_handle(hart_interface_user_event_e event, const void *const data)
{
return TRUE;
}

View File

@ -1,126 +0,0 @@
#include "at_bluetooth.h"
#define MEM_CACHE_LEN (64U)
unsigned char bluetooth_state = 0;
static unsigned char at_memcmp_cache[MEM_CACHE_LEN];
static unsigned char at_cmd_test(unsigned char *p, unsigned char len);
static unsigned char at_cmd_name(unsigned char *p, unsigned char len);
#if BLE_TYPE == BLE_TYPE_HC42
/* AT指令表 */
const at_cmd_func_t at_cmd_func[] = {
{AT_CMD_TEST, "AT", at_cmd_test},
{AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name},
{AT_CMD_NAME, "AT+NAME=", at_cmd_name},
{AT_END, NULL, NULL}};
const char split_c = '=';
#elif BLE_TYPE == BLE_TYPE_MX02
/* AT指令表 */
const at_cmd_func_t at_cmd_func[] = {
{AT_CMD_TEST, "AT", at_cmd_test}, // 这个指令没用为了和HC42统一
{AT_GET_VER, "AT+VER", at_cmd_test},
{AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name},
{AT_CMD_NAME, "AT+NAME=", at_cmd_name},
{AT_END, NULL, NULL}};
const char split_c = ':';
#endif
void at_set_memcmp_cache(unsigned char *p, unsigned char len)
{
osel_memset(at_memcmp_cache, 0, MEM_CACHE_LEN);
osel_memcpy(at_memcmp_cache, p, len);
}
/* 指令执行函数 */
static unsigned char at_cmd_test(unsigned char *p, unsigned char len)
{
BIT_SET(bluetooth_state, BIT0);
return 0;
}
static unsigned char at_cmd_name(unsigned char *p, unsigned char len)
{
if (*p == split_c)
{
p++; // 偏移一个字节split_c
if (osel_memcmp(p, at_memcmp_cache, osel_mstrlen(at_memcmp_cache)) == 0) // 去掉最后\r\n
{
BIT_SET(bluetooth_state, BIT1);
}
}
return 0;
}
/* 查找指令表中对应的指令 */
unsigned char at_cmd_search(unsigned char *p, unsigned char len)
{
unsigned char ret = 0;
// unsigned char* pstr;
unsigned char i, n;
for (i = 1; at_cmd_func[i].cmd != AT_END; i++)
{
n = osel_mstrlen((unsigned char *)at_cmd_func[i].str);
if (!osel_memcmp(p, (unsigned char *)at_cmd_func[i].str, n))
{
ret = i;
break;
}
}
return ret;
}
/* AT指令解析 */
unsigned char at_cmd_parse(unsigned char *p, unsigned char len)
{
unsigned char ret = AT_SUCCESS;
unsigned char index = 0;
if (len < 2)
return AT_ERR; /* 不符合指令最小长度 */
if ((p[0] == 'A') && (p[1] == 'T'))
{
if (len == 2)
{ /* 测试指令 */
if (at_cmd_func[AT_CMD_TEST].cb != NULL)
at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
}
else if (p[2] == '+')
{ /* 执行指令解析 */
index = at_cmd_search(p, len); /* 查找匹配的执行指令0-已匹配,!0-未匹配 */
if (index)
{
if (at_cmd_func[index].cb != NULL)
{ /* 判断指令对应执行函数是否存在 */
unsigned char n;
n = osel_mstrlen((unsigned char *)at_cmd_func[index].str);
ret = at_cmd_func[index].cb(p + n, len - n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数len-n-2:指令参数有效长度 */
}
else
ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
}
else
{
ret = AT_ERR_UNINVAIL; /* 未找到匹配的指令 */
}
}
}
else
{ /* 格式不匹配 */
return AT_ERR;
}
return ret;
}

View File

@ -1,113 +0,0 @@
#include "at_hc24.h"
#define MEM_CACHE_LEN (64U)
unsigned char hc_24_state = 0;
static unsigned char at_memcmp_cache[MEM_CACHE_LEN];
static unsigned char at_cmd_test(unsigned char *p, unsigned char len);
static unsigned char at_cmd_name(unsigned char *p, unsigned char len);
/* AT指令表 */
const at_cmd_func_t at_cmd_func[] = {
{AT_CMD_TEST, "AT", at_cmd_test},
{AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name},
{AT_CMD_NAME, "AT+NAME=", at_cmd_name},
{AT_GET_VER, "AT+VERSION=", NULL},
{AT_END, NULL, NULL}};
void at_set_memcmp_cache(unsigned char *p, unsigned char len)
{
osel_memset(at_memcmp_cache, 0, MEM_CACHE_LEN);
osel_memcpy(at_memcmp_cache, p, len);
}
/* 指令执行函数 */
static unsigned char at_cmd_test(unsigned char *p, unsigned char len)
{
BIT_SET(hc_24_state, BIT0);
return 0;
}
static unsigned char at_cmd_name(unsigned char *p, unsigned char len)
{
if (*p == '=')
{
p++; // 偏移一个字节'='
if (osel_memcmp(p, at_memcmp_cache, len - 3) == 0) // 去掉最后\r\n
{
BIT_SET(hc_24_state, BIT1);
}
}
return 0;
}
/* 查找指令表中对应的指令 */
unsigned char at_cmd_search(unsigned char *p, unsigned char len)
{
unsigned char ret = 0;
// unsigned char* pstr;
unsigned char i, n;
for (i = 1; at_cmd_func[i].cmd != AT_END; i++)
{
n = osel_mstrlen((unsigned char *)at_cmd_func[i].str);
if (!osel_memcmp(p, (unsigned char *)at_cmd_func[i].str, n))
{
ret = i;
break;
}
}
return ret;
}
/* AT指令解析 */
unsigned char at_cmd_parse(unsigned char *p, unsigned char len)
{
unsigned char ret = AT_SUCCESS;
unsigned char index = 0;
if (len < 2)
return AT_ERR; /* 不符合指令最小长度 */
if ((p[0] == 'A') && (p[1] == 'T'))
{
if (len == 2)
{ /* 测试指令 */
if (at_cmd_func[AT_CMD_TEST].cb != NULL)
at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
}
else if (p[2] == '+')
{ /* 执行指令解析 */
index = at_cmd_search(p, len); /* 查找匹配的执行指令0-已匹配,!0-未匹配 */
if (index)
{
if (at_cmd_func[index].cb != NULL)
{ /* 判断指令对应执行函数是否存在 */
unsigned char n;
n = osel_mstrlen((unsigned char *)at_cmd_func[index].str);
ret = at_cmd_func[index].cb(p + n, len - n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数len-n-2:指令参数有效长度 */
}
else
ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
}
else
{
ret = AT_ERR_UNINVAIL; /* 未找到匹配的指令 */
}
}
}
else
{ /* 格式不匹配 */
return AT_ERR;
}
return ret;
}

View File

@ -1,797 +0,0 @@
/**
* @file convert.c
* @author xxx
* @date 2023-12-27 16:23:05
* @brief
* @copyright Copyright (c) 2024 by xxx, All Rights Reserved.
*/
/**
* @file convert.c
* @author xxx
* @date 2023-08-30 08:58:43
* @brief
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
*/
#include "../inc/convert.h"
#include "../inc/params.h"
#include "../inc/fal_execution.h"
#include "board.h"
#include <math.h>
#include "eeprom_fm24.h"
#include "mode.h"
#define EQUAL_ALPHA 50.0f // 等百分比范围比
#define LOG_ALPHA log(EQUAL_ALPHA)
static float32 last_travel = 0; // 上次目标值
/**
* @brief ,
*
*
*
* @param setpoint
*
* @return
*
* @note 01000
* b * log(setpoint) / log(base) + linear_coefficient * setpoint
* b为13.25linear_coefficient为0.123base为对数底数2
*/
static inline float32 logarithmic_conversion(float32 setpoint)
{
static const float32 b = 13.24f;
static const float32 linear_coefficient = 0.123f;
static const float32 base_log = 0.6931471805599453f; // 直接使用log(2)的预计算值
float32 res = 0.0f;
if (setpoint <= 0)
{
return 0;
}
else if (setpoint >= 100)
{
return 100;
}
else
{
res = b * log(setpoint) / base_log + linear_coefficient * setpoint;
if (res < 0)
{
res = 0.0f;
}
else if (res > 100)
{
res = 100.0f;
}
return res;
}
}
/**
* @brief
*
*
*
* @param setpoint
*
* @return
*/
static float32 travel_char_custom_conversion(float32 setpoint)
{
float32 res = 0.0f;
// 获取自定义属性表指针
custom_property_table_t *p = (custom_property_table_t *)&udevice.custom_property_table;
// 遍历所有点
for (uint8_t i = 0; i < p->points; i++)
{
// 将无符号16位整数转换为浮点数得到当前点的设定值最小值
float32 setpoint_min = UINT16_TO_FLOAT(p->setpoint[i]);
// 将无符号16位整数转换为浮点数得到当前点的设定值最大值下一个点的设定值最小值
float32 setpoint_max = UINT16_TO_FLOAT(p->setpoint[i + 1]);
// 判断输入设定值是否在当前设定值范围内
if (setpoint >= setpoint_min && setpoint <= setpoint_max)
{
// 将无符号16位整数转换为浮点数得到当前点的对应值最小值
float32 min = UINT16_TO_FLOAT(p->value[i]);
// 将无符号16位整数转换为浮点数得到当前点的对应值最大值下一个点的对应值最小值
float32 max = UINT16_TO_FLOAT(p->value[i + 1]);
// 计算斜率:线性
float32 k = (max - min) / (setpoint_max - setpoint_min);
// 根据斜率和输入设定值计算对应值
res = k * (setpoint - setpoint_min) + min;
// 跳出循环
break;
}
}
// 返回计算得到的对应值
return res;
}
/**
* @brief
* @param {char} *s -
* @param {uint8_t} *sn -
* @param {uint8_t} len -
* @param {uint8_t} interval -
* @param {char} *fix -
* @return {*}
* @note
*/
void dev_serial_number_to_string(char *s, uint8_t *sn, uint8_t len, uint8_t interval, char *fix)
{
uint8_t count = 0;
for (uint8_t i = 0; i < len; i++)
{
s[count] = NUM_TO_ASCII(*(sn + i));
count++;
if (interval != 0)
{
if ((i + 1) % interval == 0 && count < count + len / interval)
{
s[count] = *fix;
count++;
}
}
}
if (interval != 0)
{
s[len + len / interval - 1] = '\0'; // 添加字符串结束符
}
else
{
s[len] = '\0'; // 添加字符串结束符
}
}
/**
* @brief HART长地址转字符串
* @param {char} *s -
* @param {uint8_t} *sn -
* @param {uint8_t} len -
* @return {*}
* @note
*/
void hart_long_address_to_string(char *s, uint8_t *sn, uint8_t len)
{
for (uint8_t i = 0; i < len; i++)
{
sprintf(s + i * 2, "%02X", sn[i]);
}
}
/**
* @brief
* @param {float32} in -
* @return {float32}
* @note
*/
float32 get_show_travel(float32 in)
{
float32 travel = in;
travel = travel < 0 ? 0 : travel;
travel = travel > 100 ? 100 : travel;
if (udevice.display_travel_mode == TRAVEL_DISPLAY_REVERSE) // 反向显示
{
travel = 100 - travel;
}
return travel;
}
/**
* @brief 1%,
* @param {float32} tag
* @param {float32} cur
* @param {float32} err
* @return {*}
* @note
*/
float32 get_show_actual_travel(float32 tag, float32 cur, float32 err)
{
if (ABS(tag - cur) <= err)
{
return tag;
}
else
{
if (ABS(tag - cur) < err * 2)
{
if (cur < tag)
{
return cur + err;
}
else
{
return cur - err;
}
}
else
{
return cur;
}
}
}
/**
* @brief
*
* ASCII
*
* @return uint32_t
*/
uint32_t dev_serial_num_deal(void)
{
uint8_t b[INST_SERIAL_NUM_LEN];
uint8_t c[3];
for (uint8_t i = 0; i < INST_SERIAL_NUM_LEN; i++)
{
b[i] = ASCII_TO_NUM(udevice.dev_serial_num[i]);
}
c[0] = (b[INST_SERIAL_NUM_LEN - 6] << 4) | b[INST_SERIAL_NUM_LEN - 5];
c[1] = (b[INST_SERIAL_NUM_LEN - 4] << 4) | b[INST_SERIAL_NUM_LEN - 3];
c[2] = (b[INST_SERIAL_NUM_LEN - 2] << 4) | b[INST_SERIAL_NUM_LEN - 1];
return c[0] << 16 | c[1] << 8 | c[2];
}
/**
* @brief PID控制行程
* @param {float32} in -
* @return {float32} PID控制行程
* @note
*/
float32 get_pid_travel(float32 in)
{
float32 travel = in;
if (udevice.zero_power_condition == VALVE_OPEN) // 气关
{
travel = 100 - travel;
}
return travel;
}
/**
* @brief ,SWO输出和PWM输出
* @param {float32} in -
* @return {*}
* @note
*/
void actual_travel_deal(float32 in)
{
float32 travel = in;
if (udevice.control_mode == DIGITAL_CTRL_MODE || udevice.control_mode == ANALOG_CTRL_MODE)
{
// SWO输出
swo_output_deal(travel);
// PWM输出阀位占空比
pwm_output_deal(travel);
}
}
/**
* @brief PWM输出处理
* @param {float32} in -
* @return {*}
* @note
*/
void pwm_output_deal(float32 in)
{
float32 travel = in;
if (udevice.output_current_enable == true && calib_param[CALIBPARA_VIP].is_calibration == TRUE) // pwm输出使能
{
pwm_output_position(travel);
}
}
void swo_output_deal(float32 in)
{
float32 travel = in;
if (udevice.swo_logic[0] == TRIGGER_LOGIC_BELOW)
{
if (travel < udevice.swo_value[0])
SWO1_CLOSE();
else
SWO1_OPEN();
}
else if (udevice.swo_logic[0] == TRIGGER_LOGIC_ABOVE)
{
if (travel < udevice.swo_value[0])
SWO1_OPEN();
else
SWO1_CLOSE();
}
else
{
SWO1_CLOSE();
}
if (udevice.swo_logic[1] == TRIGGER_LOGIC_BELOW)
{
if (travel > udevice.swo_value[1])
SWO2_CLOSE();
else
SWO2_OPEN();
}
else if (udevice.swo_logic[1] == TRIGGER_LOGIC_ABOVE)
{
if (travel > udevice.swo_value[1])
SWO2_OPEN();
else
SWO2_CLOSE();
}
else
{
SWO2_CLOSE();
}
}
/**
* @brief
* @param {float32} in -
* @return {float32}
* @note
*/
float32 target_travel_deal(float32 in)
{
float32 travel = in;
// 小信号切除
travel = small_signal_deal(travel);
// 死区处理
// travel = dead_zone_deal(travel);
// 分程处理
travel = part_travel_deal(travel);
travel = floorf(travel * 100.f) / 100.f;
return travel;
}
/**
* @brief
* @param {float32} *in -
* @return {*}
* @note
*/
float32 part_travel_deal(float32 in)
{
float32 travel = in;
float32 min = udevice.part_travel_lower;
float32 max = udevice.part_travel_upper;
if (udevice.part_travel_enable == true) // 部分行程
{
travel = (max - min) * travel * 0.01f + min;
}
return travel;
}
/**
* @brief
* @param {float32} in
* @return {*}
* @note
*/
float32 dead_zone_deal(float32 in)
{
float32 travel = in;
float32 target_diff = fabsf(travel - last_travel);
if (target_diff >= udevice.integral_db)
{
last_travel = travel;
}
return last_travel;
}
/**
* @brief
* @param {float32} *in -
* @return {*}
* @note
*/
float32 small_signal_deal(float32 in)
{
float32 travel = in;
float32 cutoff_limit_lo = 0;
float32 cutoff_limit_hi = 0;
if (udevice.travel_cut_enable == TRUE) // 使能,使用设定值
{
cutoff_limit_lo = udevice.cutoff_limit_lo;
cutoff_limit_hi = udevice.cutoff_limit_hi;
}
else // 禁用,使用默认值
{
cutoff_limit_lo = 0;
cutoff_limit_hi = 100;
}
if (travel >= 0 && travel <= 100)
{
// 最大最小需要快速的反应
if (travel >= cutoff_limit_hi) // 上限
{
travel = 100.0;
rt_data.flag.bits.small_signal_deal = TRUE;
}
else if (travel <= cutoff_limit_lo) // 下限
{
travel = 0;
rt_data.flag.bits.small_signal_deal = TRUE;
}
else
{
rt_data.flag.bits.small_signal_deal = FALSE;
}
}
else
{
rt_data.flag.bits.small_signal_deal = FALSE;
}
return travel;
}
/**
* @brief 4~20mA输入电流转换成需要控制的阀门开度() %(1 0~100%, 100% = 1000)
* @param {float32} in
* @return {float32} -
*/
float32 i2psb(float32 in)
{
float32 travel_target_percent = 0.0f, ftmp = 0.0f;
float32 travel = 0.0f;
// 线性 等百分比 快开 : 输入的电流值直接转换成百分比
float32 normalized_in = CURRENT_PERCENT(in); // 计算一次,复用结果
switch (udevice.travel_char)
{
case TRAVEL_CHAR_LINEAR:
travel_target_percent = normalized_in * 100; // 线性:电流百分百就是行程百分比
break;
case TRAVEL_CHAR_EQUAL: // 等百分比
travel_target_percent = (exp(normalized_in * LOG_ALPHA) - 1) * 100 / (EQUAL_ALPHA - 1); // 使用指数函数和预定义的常数LOG_ALPHA和EQUAL_ALPHA来计算等百分比行程
break;
case TRAVEL_CHAR_QUICK_OPEN: // 快开
travel_target_percent = logarithmic_conversion(normalized_in * 100); // 调用logarithmic_conversion函数来计算快开特性的行程百分比
break;
case TRAVEL_CHAR_CUSTOM: // 自定义特性
travel_target_percent = travel_char_custom_conversion(normalized_in * 100);
break;
default:
return 0;
}
ftmp = travel_target_percent;
/*
I增大时
I增大时
*/
if (udevice.zero_power_condition == VALVE_CLOSE)
{
// 气开
if (udevice.act_style.bits.dev_driver_dir == CONTROLLER_ACTING_NORMAL)
{
// 定位器正作用:电流增大->气压增大->弹簧压缩->开方向->%增大(正显示、反馈)
travel = ftmp;
}
else if (udevice.act_style.bits.dev_driver_dir == CONTROLLER_ACTING_REVERSE)
{
// 定位器反作用:电流增大->气压减小->弹簧释放->关方向->%减小(正显示、反馈)
travel = 100 - ftmp;
}
else
{
travel = ftmp;
}
}
else
{
// 气关
if (udevice.act_style.bits.dev_driver_dir == CONTROLLER_ACTING_NORMAL)
{
// 定位器正作用:电流增大->气压增大->弹簧压缩->关方向->%减小(正显示、反馈)
travel = 100 - ftmp;
}
else
{
// 定位器反作用:电流增大->气压减小->弹簧释放->开方向->%增大(正显示、反馈)
travel = ftmp;
}
}
if (travel < MIN_TARGET_PERCENT)
{
travel = MIN_TARGET_PERCENT;
}
else if (travel > MAX_TARGET_PERCENT)
{
travel = MAX_TARGET_PERCENT;
}
return travel;
}
/**
* @brief
* @param {float32} celsius
* @return {float32} fahrenhite
* @note
*/
float32 temperature_c2unit(float32 in, uint16_t unit)
{
float32 temp = 0.0f;
switch (unit)
{
case TEMPERATURE_UNIT_C: // ℃
temp = in;
break;
case TEMPERATURE_UNIT_F: // ℉
temp = 32 + in * 1.8f;
break;
default:
temp = in;
break;
}
return temp;
}
/**
* @brief kPa
*
* kPa
*
* @param in
* @param unit
*
* @return kPa
*/
float32 pressure_unit2kpa(float32 in, uint16_t unit)
{
float32 pre = 0;
switch (unit)
{
case PRESSURE_UNIT_KPA: // kPa
pre = in;
break;
case PRESSURE_UNIT_PSI: // psi
pre = in / 0.145037743897f;
break;
case PRESSURE_UNIT_BAR: // bar
pre = in / 0.01f;
break;
case PRESSURE_UNIT_KGF: // kgf/cm2
pre = in / 0.0101972f;
break;
default:
pre = in;
break;
}
return pre;
}
/**
* @brief kPa -> mPa psi bar kgf/cm2
* @param {float32} kpa kPa
* @param {uint16_t} unit
* @return {float32}
* @note
*/
float32 pressure_kpa2unit(float32 kpa, uint16_t unit)
{
float32 pre = 0;
switch (unit)
{
case PRESSURE_UNIT_KPA: // kPa
pre = kpa;
break;
case PRESSURE_UNIT_PSI: // psi
pre = kpa * 0.145037743897f;
break;
case PRESSURE_UNIT_BAR: // bar
pre = kpa * 0.01f;
break;
case PRESSURE_UNIT_KGF: // kgf/cm2
pre = kpa * 0.0101972f;
break;
case PRESSURE_UNIT_MPA: // MPA
pre = kpa * 0.01f;
break;
default:
pre = kpa;
break;
}
return pre;
}
/**
* @brief
* @param {uint16_t} unit
* @return {*}
* @note
*/
BOOL pressure_unit_need_decimal_display(uint16_t unit)
{
BOOL ret = FALSE;
switch (unit)
{
case PRESSURE_UNIT_KPA: // kPa
ret = TRUE;
break;
case PRESSURE_UNIT_PSI: // psi
case PRESSURE_UNIT_BAR: // bar
case PRESSURE_UNIT_KGF: // kgf/cm2
default:
ret = FALSE;
break;
}
return ret;
}
/**
* @brief
* @param {char} *s -
* @param {uint16_t} unit -
* @return {*}
* @note
*/
void get_pressure_unit(char *s, uint16_t unit)
{
DBG_ASSERT(s != NULL __DBG_LINE);
switch (unit)
{
case PRESSURE_UNIT_KPA: // kPa
sprintf(s, "kPa");
break;
case PRESSURE_UNIT_PSI: // psi
sprintf(s, "psi");
break;
case PRESSURE_UNIT_BAR: // bar
sprintf(s, "bar");
break;
case PRESSURE_UNIT_KGF: // kgf/cm2
sprintf(s, "kgf");
break;
case PRESSURE_UNIT_MPA: // mpa
sprintf(s, "mPa");
break;
default:
sprintf(s, "kPa");
break;
}
}
/**
* @brief
* @param {float32} i
* @param {uint16_t} unit
* @return {*}
* @note
*/
float32 get_pressure_limit_deal(float32 in, uint16_t unit)
{
float32 max = 1000;
float32 min = 10;
switch (unit)
{
case PRESSURE_UNIT_KPA: // kPa
min = 20;
break;
case PRESSURE_UNIT_PSI: // psi
max = max * 0.145037743897f;
min = 1;
break;
case PRESSURE_UNIT_BAR: // bar
max = max * 0.01f;
min = 0.1;
break;
case PRESSURE_UNIT_MPA: // Mpa
max = max * 0.01f;
min = 0.1;
break;
case PRESSURE_UNIT_KGF: // kgf/cm2
max = max * 0.0101972f;
min = 0.1;
break;
default:
min = 10;
break;
}
if (in > max)
{
return max;
}
else if (in < min)
{
return 0;
}
else
{
return in;
}
}
// 将压力数据转换成百分比
float32 pressure_to_percent(float32 pressure)
{
return (pressure * 100.0f) / (udevice.press_100_percent - udevice.press_0_percent);
}
// 判断是否双作用
BOOL is_double_acting(void)
{
return udevice.act_style.bits.value_relay_type % 2 != 0 ? TRUE : FALSE;
}
// 计算校准参数
void calib_param_calculate(calibration_e index, int16_t offset, int16_t span, float32 min, float32 max)
{
calib_param_t *p = (calib_param_t *)&calib_param[index];
DBG_ASSERT(p != NULL __DBG_LINE);
float32 adc_min = 0.0f;
float32 adc_max = 0.0f;
float32 ma = 0.0f;
float32 adc = 0.0f;
p->offset = offset;
p->span = span;
p->max = max;
p->min = min;
adc_min = p->original_adc_value[0] + offset;
adc_max = p->original_adc_value[1] + offset;
ma = max - min;
adc = adc_max - adc_min;
p->slope = ma / adc;
p->is_calibration = TRUE; // 标记已校准
p->crc = crc32_compute((uint8_t *)p, sizeof(calib_param_t) - sizeof(uint32_t));
}
// AD值线性转换
float32 adc_linear_conversion(calibration_e index, uint16_t adc)
{
float32 f = 0.0f;
calib_param_t *p = (calib_param_t *)&calib_param[index];
DBG_ASSERT(p != NULL __DBG_LINE);
if (p->is_calibration)
{
f = ((adc - (p->original_adc_value[0] + p->offset))) * p->slope;
}
return f;
}
// 上次整定状态更新
void last_tuned_state_update(void)
{
switch (udevice.tuned_flag)
{
case TUNED_NONE:
udevice.auto_cal_status = NEVER_HAPPENED;
break;
case TUNED_SUCCESS:
udevice.auto_cal_status = CAL_SUCCESS;
break;
case TUNED_FAILED:
udevice.auto_cal_status = TIMEOUT;
break;
default:
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,816 +0,0 @@
/**
* @file fal_execution.c
* @author xxx
* @date 2023-12-29 11:27:55
* @brief
* @copyright Copyright (c) 2024 by xxx, All Rights Reserved.
*/
/**
*
使 FALFlash Abstraction LayerFAL 访 Flash
使便访 Flash fal_execution_kv_read()
KVKey-Value fal_execution_kv_write() KV
fal_execution_inspection() fal_execution_kv_read() 使 fal_execution_get()
fdb_kv_get_blob() KV blob 0
fal_execution_set_crc() CRC TRUE FALSE
fal_execution_kv_write() 使 fal_execution_get()
fdb_kv_set_blob() KV fal_execution_set_crc()
CRC校验 TRUE FALSE fal_execution_inspection()
M95_1 FM24 HART HART
0 FM24
*/
#include "fal_execution.h"
#include "board.h"
#include "sys.h"
#include "delay.h"
#include "entity.h"
#include "cmac.h"
#include "mode_diagnosis.h"
#include "diagnosis.h"
#define FAL_DBG_ENABLE 0 // 等测试完成后再删除
const char *fal_kv_key[KEY_MAX] =
{
"noinit_data", // 非初始化数据
"device", // 设备信息
"rt_data", // 实时数据
"diag_rst", // 诊断结果
}; // 里面的顺序要和fal_key_e一一对应
fal_execution_t fal_executions[FAL_EXECUTION_MAX];
fal_execution_status_t fal_execution_status; // eeprom状态
static struct fdb_default_kv_node m95_1_kv_table[] = {};
static struct fdb_default_kv_node fm24_kv_table[] = {
{(char *)&fal_kv_key[KEY_DEVICE], (void *)&udevice, sizeof(udevice_t)}, // 设备内设置的信息
{(char *)&fal_kv_key[KEY_DIAGNOSIS_RESULT], (void *)&diag_result, sizeof(diag_result_t)}, // 诊断结果
{(char *)&fal_kv_key[KEY_NOINIT_DATA], (void *)&noinit_data, sizeof(noinit_data_t)}, // 非初始化数据
{(char *)&fal_kv_key[KEY_REAL_TIME_DATA], (void *)&rt_save, sizeof(rt_save_param_t)}, // 实时数据
};
uint32_t fal_inspection_crc[KEY_MAX];
static struct flow fal_execution_fw; // fal执行流程
struct flow_sem fal_write_sem; // 有的是突发的写入检查
static fal_execution_t *fal_execution_get(const fal_key_e key); // 获取fal_execution_t结构体
/**
* @brief fal执行初始化
* @return {*}
* @note
*/
void fal_execution_init(fal_execution_e index, uint16_t data_size)
{
static BOOL inited = FALSE;
uint32_t start_time = 0;
if (inited == FALSE)
{
fal_execution_status.init.data = 0;
fal_execution_status.read.data = 0;
fal_execution_status.write.data = 0;
osel_memset((uint8_t *)&fal_inspection_crc, 0, sizeof(uint32_t) * KEY_MAX);
inited = TRUE;
FL_INIT(&fal_execution_fw); // fal执行
}
fal_execution_t *p = NULL;
fdb_err_t res = FDB_NO_ERR;
switch (index)
{
case FAL_EXECUTION_EEPROM_M95_1:
{
DBG_ASSERT(data_size <= EEPROM_M95_1_BLOCK_SIZE __DBG_LINE);
// 初始化M95_1
p = &fal_executions[FAL_EXECUTION_EEPROM_M95_1];
p->storage_index = FAL_EXECUTION_EEPROM_M95_1;
p->read_key = KEY_MAX;
p->write_key = KEY_MAX;
p->kv.kvs = m95_1_kv_table;
p->kv.num = ARRAY_LEN(m95_1_kv_table);
p->data_size = data_size;
fdb_kvdb_control(&p->kvdb, FDB_KVDB_CTRL_SET_LOCK, NULL);
fdb_kvdb_control(&p->kvdb, FDB_KVDB_CTRL_SET_UNLOCK, NULL);
start_time = sys_millis();
res = fdb_kvdb_init(&p->kvdb, "env", "KVDB", &p->kv, NULL);
p->init_use_time = sys_millis() - start_time;
if (res != FDB_NO_ERR)
{
fal_execution_status.init.bits.M95_1 = 0;
fal_execution_status.read.bits.M95_1 = 0;
fal_execution_status.write.bits.M95_1 = 0;
}
else
{
fal_execution_status.init.bits.M95_1 = 1;
fal_execution_status.read.bits.M95_1 = 1;
fal_execution_status.write.bits.M95_1 = 1;
}
break;
}
case FAL_EXECUTION_EEPROM_M95_2:
{
DBG_ASSERT(data_size <= EEPROM_M95_2_BLOCK_SIZE __DBG_LINE);
// 初始化M95_2
p = &fal_executions[FAL_EXECUTION_EEPROM_M95_2];
p->read_key = KEY_MAX;
p->write_key = KEY_MAX;
p->storage_index = FAL_EXECUTION_EEPROM_M95_2;
p->data_size = data_size;
fdb_tsdb_control(&p->tsdb, FDB_TSDB_CTRL_SET_LOCK, NULL);
fdb_tsdb_control(&p->tsdb, FDB_TSDB_CTRL_SET_UNLOCK, NULL);
start_time = sys_millis();
res = fdb_tsdb_init(&p->tsdb, "log", "TSDB", fal_execution_get_time, 128, NULL);
p->init_use_time = sys_millis() - start_time;
if (res != FDB_NO_ERR)
{
fal_execution_status.init.bits.M95_2 = 0;
fal_execution_status.read.bits.M95_2 = 0;
fal_execution_status.write.bits.M95_2 = 0;
}
else
{
fal_execution_status.init.bits.M95_2 = 1;
fal_execution_status.read.bits.M95_2 = 1;
fal_execution_status.write.bits.M95_2 = 1;
}
break;
}
case FAL_EXECUTION_EEPROM_FM24:
{
DBG_ASSERT(data_size <= EEPROM_FM24_BLOCK_SIZE __DBG_LINE);
// 初始化FM24
p = &fal_executions[FAL_EXECUTION_EEPROM_FM24];
p->storage_index = FAL_EXECUTION_EEPROM_FM24;
p->read_key = KEY_MAX;
p->write_key = KEY_MAX;
p->kv.kvs = fm24_kv_table;
p->kv.num = ARRAY_LEN(fm24_kv_table);
p->data_size = data_size;
fdb_kvdb_control(&p->kvdb, FDB_KVDB_CTRL_SET_LOCK, NULL);
fdb_kvdb_control(&p->kvdb, FDB_KVDB_CTRL_SET_UNLOCK, NULL);
start_time = sys_millis();
res = fdb_kvdb_init(&p->kvdb, "env", "RTDB", &p->kv, NULL);
p->init_use_time = sys_millis() - start_time;
if (res != FDB_NO_ERR)
{
fal_execution_status.init.bits.FM24 = 0;
fal_execution_status.read.bits.FM24 = 0;
fal_execution_status.write.bits.FM24 = 0;
}
else
{
fal_execution_status.init.bits.FM24 = 1;
fal_execution_status.read.bits.FM24 = 1;
fal_execution_status.write.bits.FM24 = 1;
}
break;
}
default:
DBG_ASSERT(FALSE __DBG_LINE);
break;
}
p->statistics_enable = FALSE;
}
/**
* @brief FAL
*
* FAL FAL
*
* @param index FAL
* @param enable TRUE FALSE
*/
void fal_execution_statistics_enable(fal_execution_e index, BOOL enable)
{
fal_execution_t *p = NULL;
p = &fal_executions[index];
p->statistics_enable = enable;
}
/**
* @brief FAL
*
* FAL
* 使
*
* @param index FAL
*/
void fal_execution_statistics(fal_execution_e index)
{
fal_execution_t *p = NULL;
p = &fal_executions[index];
uint32_t start_time = 0;
if (p->statistics_enable == FALSE)
{
return;
}
start_time = sys_millis();
// 占用百分百
{
// p->statistics.used = fdb_kv_used(&p->kvdb);
}
p->statistics_use_time = sys_millis() - start_time;
}
/**
* @brief
*
*
*
* @param index
* @param enable TRUE FALSE
*/
void fal_execution_set_enable(fal_execution_e index, BOOL enable)
{
fal_execution_t *p = NULL;
p = &fal_executions[index];
p->enable = enable;
}
/**
* @brief fal执行清除
* @param {fal_execution_e} index
* @return {*}
* @note
*/
void fal_execution_clear(fal_execution_e index)
{
fal_execution_t *p = NULL;
switch (index)
{
case FAL_EXECUTION_EEPROM_M95_1:
p = &fal_executions[FAL_EXECUTION_EEPROM_M95_1];
fdb_kv_set_default(&p->kvdb);
break;
case FAL_EXECUTION_EEPROM_M95_2:
p = &fal_executions[FAL_EXECUTION_EEPROM_M95_2];
fdb_tsl_clean(&p->tsdb);
break;
case FAL_EXECUTION_EEPROM_FM24:
p = &fal_executions[FAL_EXECUTION_EEPROM_FM24];
fdb_kv_set_default(&p->kvdb);
break;
default:
DBG_ASSERT(FALSE __DBG_LINE);
break;
}
}
/**
* @brief fal_execution_t结构体
* @param {fal_execution_e} index
* @return {*}
* @note
*/
static fal_execution_t *fal_execution_get(const fal_key_e key)
{
fal_execution_t *p = NULL;
switch (key)
{
case KEY_DEVICE: // 设备内设置的信息
case KEY_NOINIT_DATA: // 非初始化数据
case KEY_DIAGNOSIS_RESULT: // 诊断结果
case KEY_REAL_TIME_DATA: // 实时数据
if (fal_execution_status.init.bits.FM24 == 1)
{
p = &fal_executions[FAL_EXECUTION_EEPROM_FM24];
}
break;
default:
break;
}
return p;
}
/**
* @brief CRC计算
* @param {uint8_t} index
* @param {uint8_t} *data
* @param {uint16_t} length
* @return {*}
* @note
*/
void fal_execution_set_crc(const uint8_t index, const uint8_t *const data, const uint16_t length)
{
uint32_t crc = crc32_compute(data, length);
fal_inspection_crc[index] = crc;
}
/**
* @brief
* @param {uint8_t} index
* @param {uint8_t} *data
* @param {uint16_t} length
* @return {*}
* @note CRC校验和CMAC校验
*/
BOOL fal_execution_data_storage_check(const uint8_t index, const uint8_t *const data, const uint16_t length)
{
// CRC校验
uint32_t crc = 0;
crc = crc32_compute(data, length);
if (crc != fal_inspection_crc[index])
{
return FALSE;
}
return TRUE;
}
fdb_time_t fal_execution_get_time(void)
{
/* Using the counts instead of timestamp.
* Please change this function to return RTC time.
*/
rtc_date_t dd;
rtc_time_t tt;
get_real_time((uint8_t *)&dd.year, &dd.month, &dd.day, &tt.hour, &tt.minute, &tt.second);
return (int32_t)time2stamp(&dd, &tt);
}
/**
* KV
*
* @param key KV
* @param data
* @param length
*
* @return true false
*
* @note KV 'p' fdb_kv_get_blob() KV false false
*/
BOOL fal_execution_kv_read(const fal_key_e key, const uint8_t *data, uint16_t length)
{
DBG_ASSERT(fal_kv_key[key] != NULL __DBG_LINE);
uint32_t start_time = 0;
BOOL rv = FALSE;
struct fdb_blob blob; // 定义一个 fdb_blob 结构体变量 blob
fal_execution_t *p = fal_execution_get(key); // 将给定的键转换为相应的执行结构
if (p == NULL)
{
return FALSE;
}
if (p->enable == FALSE)
{
return FALSE;
}
start_time = sys_millis();
fdb_kv_get_blob(&p->kvdb, fal_kv_key[key], fdb_blob_make(&blob, data, length)); // 从 KV 存储中读取数据并存储在 blob 变量中
p->read_use_time = sys_millis() - start_time;
p->read_key = key;
if (blob.saved.len > 0)
{
fal_execution_set_crc((uint8_t)key, data, length); // 数据的CRC计算
rv = TRUE; // 返回 true
}
else
{
__NOP();
}
switch (p->storage_index)
{
case FAL_EXECUTION_EEPROM_M95_1:
fal_execution_status.read.bits.M95_1 = rv == TRUE ? 1 : 0;
break;
case FAL_EXECUTION_EEPROM_M95_2:
fal_execution_status.read.bits.M95_2 = rv == TRUE ? 1 : 0;
break;
case FAL_EXECUTION_EEPROM_FM24:
fal_execution_status.read.bits.FM24 = rv == TRUE ? 1 : 0;
break;
default:
DBG_ASSERT(FALSE __DBG_LINE);
break;
}
return rv;
}
/**
* @brief KV
*
* @param key KV
* @param data KV
* @param length KV
*
* @return true false
*
* @note KV 'p' fdb_kv_set_blob() KV false false
*/
BOOL fal_execution_kv_write(const fal_key_e key, const uint8_t *const data, const uint16_t length)
{
if (get_current_by_resistance() < FAL_WRITE_CURRENT)
{
return TRUE;
}
DBG_ASSERT(fal_kv_key[key] != NULL __DBG_LINE);
uint32_t start_time = 0;
BOOL rv = FALSE;
struct fdb_blob blob;
fdb_err_t res = FDB_NO_ERR;
fal_execution_t *p = fal_execution_get(key);
if (p == NULL)
{
return FALSE;
}
if (p->enable == FALSE)
{
return FALSE;
}
start_time = sys_millis();
res = fdb_kv_set_blob(&p->kvdb, fal_kv_key[key], fdb_blob_make(&blob, data, length));
p->write_use_time = sys_millis() - start_time;
p->write_key = key;
if (res == FDB_NO_ERR)
{
fal_execution_set_crc((uint8_t)key, data, length); // 数据的CRC计算
rv = TRUE;
}
else
{
rv = FALSE;
}
switch (p->storage_index)
{
case FAL_EXECUTION_EEPROM_M95_1:
fal_execution_status.write.bits.M95_1 = rv == TRUE ? 1 : 0;
fal_execution_status.read.bits.M95_1 = rv == TRUE ? 1 : 0;
break;
case FAL_EXECUTION_EEPROM_M95_2:
fal_execution_status.write.bits.M95_2 = rv == TRUE ? 1 : 0;
fal_execution_status.read.bits.M95_2 = rv == TRUE ? 1 : 0;
break;
case FAL_EXECUTION_EEPROM_FM24:
fal_execution_status.write.bits.FM24 = rv == TRUE ? 1 : 0;
fal_execution_status.read.bits.FM24 = rv == TRUE ? 1 : 0;
break;
default:
DBG_ASSERT(FALSE __DBG_LINE);
break;
}
return rv;
}
/**
* @brief
*
*
*
* @param key
*
* @return
*/
void fal_execution_kv_delete(const fal_key_e key)
{
if (get_current_by_resistance() < FAL_WRITE_CURRENT)
{
return;
}
DBG_ASSERT(fal_kv_key[key] != NULL __DBG_LINE);
uint32_t start_time = 0;
fal_execution_t *p = fal_execution_get(key);
if (p == NULL)
{
return;
}
if (p->enable == FALSE)
{
return;
}
start_time = sys_millis();
fdb_kv_del(&p->kvdb, fal_kv_key[key]);
p->write_use_time = sys_millis() - start_time;
fal_inspection_crc[key] = 0;
return;
}
/**
* @brief fal执行状态
* @param {fal_execution_e} index
* @return {*}
* @note
*/
BOOL fal_execution_status_get(fal_execution_e index)
{
BOOL init = FALSE;
BOOL read = FALSE;
BOOL write = FALSE;
switch (index)
{
case FAL_EXECUTION_EEPROM_M95_1:
init = fal_execution_status.init.bits.M95_1 == 1 ? TRUE : FALSE;
read = fal_execution_status.read.bits.M95_1 == 1 ? TRUE : FALSE;
write = fal_execution_status.write.bits.M95_1 == 1 ? TRUE : FALSE;
break;
case FAL_EXECUTION_EEPROM_M95_2:
init = fal_execution_status.init.bits.M95_2 == 1 ? TRUE : FALSE;
read = fal_execution_status.read.bits.M95_2 == 1 ? TRUE : FALSE;
write = fal_execution_status.write.bits.M95_2 == 1 ? TRUE : FALSE;
break;
case FAL_EXECUTION_EEPROM_FM24:
init = fal_execution_status.init.bits.FM24 == 1 ? TRUE : FALSE;
read = fal_execution_status.read.bits.FM24 == 1 ? TRUE : FALSE;
write = fal_execution_status.write.bits.FM24 == 1 ? TRUE : FALSE;
break;
default:
DBG_ASSERT(FALSE __DBG_LINE);
break;
}
return init && read && write;
}
/**
* @brief fal执行状态
* @param {fal_execution_e} index
* @return {*}
* @note
*/
void fal_execution_status_set(fal_execution_e index, BOOL status)
{
switch (index)
{
case FAL_EXECUTION_EEPROM_M95_1:
fal_execution_status.init.bits.M95_1 = status;
fal_execution_status.read.bits.M95_1 = status;
fal_execution_status.write.bits.M95_1 = status;
break;
case FAL_EXECUTION_EEPROM_M95_2:
fal_execution_status.init.bits.M95_2 = status;
fal_execution_status.read.bits.M95_2 = status;
fal_execution_status.write.bits.M95_2 = status;
break;
case FAL_EXECUTION_EEPROM_FM24:
fal_execution_status.init.bits.FM24 = status;
fal_execution_status.read.bits.FM24 = status;
fal_execution_status.write.bits.FM24 = status;
break;
default:
DBG_ASSERT(FALSE __DBG_LINE);
break;
}
}
#if FAL_DBG_ENABLE
#include <stdlib.h>
#include "convert.h"
// 测试
static void fal_execution_inspection_test(void)
{
}
#endif
/**
* @brief fal
*
* fal_write_sem fal
*
* @note
*/
void fal_execution_sem_update(void)
{
FLOW_SEM_RELEASE(&fal_write_sem);
}
// 检查存储的数据
static void fal_execution_read_and_check_data(fal_key_e key, uint16_t length)
{
uint8_t r_count = 3;
int8_t count = r_count;
fal_execution_t *p = fal_execution_get(key); // 将给定的键转换为相应的执行结构
if (p == NULL)
{
return;
}
uint8_t *data = (uint8_t *)osel_mem_alloc(length);
DBG_ASSERT(data != NULL __DBG_LINE);
while (count > 0)
{
if (TRUE == fal_execution_kv_read(key, data, length))
{
if (TRUE == fal_execution_data_storage_check(key, data, length))
{
break;
}
}
count--;
}
osel_mem_free(data);
if (count <= 0)
{
fal_inspection_crc[key] = 0;
}
}
/**
* @brief
*
*
*
* @param key
* @param data
* @param length
*/
void fal_execution_write_and_check_data(fal_key_e key, uint8_t *data, uint16_t length)
{
uint8_t w_count = 3;
int8_t count = w_count;
fal_execution_t *p = fal_execution_get(key); // 将给定的键转换为相应的执行结构
if (p == NULL)
{
return;
}
if (FALSE == fal_execution_data_storage_check(key, data, length))
{
// 读取数据
uint8_t *read_data = (uint8_t *)osel_mem_alloc(length);
DBG_ASSERT(read_data != NULL __DBG_LINE);
while (count > 0)
{
fal_execution_kv_write(key, data, length);
for (uint8_t i = 0; i < 10; i++)
{
__NOP();
}
fal_execution_kv_read(key, read_data, length);
// 比较数据
if (osel_memcmp(data, read_data, length) == 0)
{
break;
}
count--;
}
osel_mem_free(read_data);
if (count <= 0)
{
fal_inspection_crc[key] = 0;
p->write_error_num++;
}
else
{
if (p->write_error_num > 0)
{
p->write_error_num--;
}
}
}
}
/**
* @brief FAL信号检查
*
* mode模块专门使用
*
* @return
*/
void fal_execution_inspection_sem(void)
{
uint32_t crc = 0;
// 设备参数
crc = crc32_compute((uint8_t *)&udevice, sizeof(udevice_t) - sizeof(uint32_t));
if (crc != udevice.crc)
{
udevice.crc = crc;
fal_inspection_crc[KEY_DEVICE] = 0;
}
fal_execution_write_and_check_data(KEY_DEVICE, (uint8_t *)&udevice, sizeof(udevice_t));
// 非初始化数据
{
crc = crc32_compute((uint8_t *)&noinit_data, sizeof(noinit_data_t) - sizeof(uint32_t));
if (crc != noinit_data.crc)
{
noinit_data.crc = crc;
fal_inspection_crc[KEY_NOINIT_DATA] = 0;
}
fal_execution_write_and_check_data(KEY_NOINIT_DATA, (uint8_t *)&noinit_data, sizeof(noinit_data_t));
}
}
static void fal_execution_check_data_internal(uint16_t cycle)
{
static uint32_t check_data_tm = 0;
uint32_t tms = 60000 * 10;
if (sys_millis() - check_data_tm >= tms)
{
check_data_tm = sys_millis();
fal_execution_read_and_check_data(KEY_DEVICE, sizeof(udevice_t));
fal_execution_read_and_check_data(KEY_REAL_TIME_DATA, sizeof(rt_save_param_t));
}
}
static void fal_execution_inspection_internal(uint16_t cycle)
{
#if FAL_DBG_ENABLE
fal_execution_inspection_test();
#else
uint32_t crc = 0;
static uint32_t rtdata_tm = 0;
uint32_t tms = (uint32_t)(udevice.save_cycle * 1000);
if (sys_millis() - rtdata_tm >= tms)
{
rtdata_tm = sys_millis();
// 写入数据
{
// 非初始化数据
{
crc = crc32_compute((uint8_t *)&noinit_data, sizeof(noinit_data_t) - sizeof(uint32_t));
if (crc != noinit_data.crc)
{
noinit_data.crc = crc;
fal_inspection_crc[KEY_NOINIT_DATA] = 0;
}
fal_execution_write_and_check_data(KEY_NOINIT_DATA, (uint8_t *)&noinit_data, sizeof(noinit_data_t));
}
// 诊断结果
{
crc = crc32_compute((uint8_t *)&diag_result, sizeof(diag_result_t) - sizeof(uint32_t));
if (crc != diag_result.crc)
{
diag_result.crc = crc;
fal_inspection_crc[KEY_DIAGNOSIS_RESULT] = 0;
}
fal_execution_write_and_check_data(KEY_DIAGNOSIS_RESULT, (uint8_t *)&diag_result, sizeof(diag_result_t));
}
// 实时数据
{
crc = crc32_compute((uint8_t *)&rt_save, sizeof(rt_save_param_t) - sizeof(uint32_t));
if (crc != rt_save.crc)
{
rt_save.crc = crc;
fal_inspection_crc[KEY_REAL_TIME_DATA] = 0;
}
fal_execution_write_and_check_data(KEY_REAL_TIME_DATA, (uint8_t *)&rt_save, sizeof(rt_save_param_t));
// sys_soft_reset();
}
}
fal_execution_sem_update();
}
#endif
}
static uint8_t fal_execution_inspection(struct flow *fl)
{
FL_HEAD(fl);
for (;;)
{
FL_LOCK_WAIT_SEM_OR_TIMEOUT(fl, &fal_write_sem, FL_CLOCK_SEC * 1);
if (FL_SEM_IS_RELEASE(fl, &fal_write_sem))
{
FL_SEM_INIT(&fal_write_sem, 0);
fal_execution_inspection_sem();
}
else
{
if (mode_get()->ctrl.mode != TEST_CTRL_MODE)
{
fal_execution_inspection_internal(1000);
}
fal_execution_check_data_internal(1000);
}
}
FL_TAIL(fl);
}
/**
* @brief
*
*
*
* @note fal_execution_inspection fal_execution_fw
*/
void fal_execution_process(void)
{
fal_execution_inspection(&fal_execution_fw);
}

View File

@ -1,790 +0,0 @@
/**
* @file key.c
* @author xxx
* @date 2023-08-29 08:34:41
* @brief
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
*/
#include "../inc/key.h"
#include "bsp.h"
#include <stdlib.h>
#include "sys.h"
#include "hart.h"
#include "menus.h"
#define INVALID_BUTTON_TICKS 200 // 无效按键时间 毫秒
/* 按钮 */
struct Button key_1;
struct Button key_2;
struct Button key_3;
struct Button key_4;
struct Button key_5;
struct Button key_6;
struct Button key_auto;
uint64_t rnd_key_1;
uint64_t rnd_key_2;
uint64_t rnd_key_3;
uint64_t rnd_key_4;
uint64_t rnd_key_5;
uint64_t rnd_key_6;
uint64_t rnd_key_auto;
// 模拟按键记录
#define EFFECTIVE_TIME 1000 // 有效时间 毫秒
static __IO uint32_t key_imitate = 0;
static __IO uint16_t key2_5_imitate_timers = 0;
static uint8_t key_init_flag = 0;
static BOOL key1_done_flag = FALSE;
static BOOL key6_done_flag = FALSE;
static BOOL auto_done_flag = FALSE;
static __IO BOOL long_done_flag = FALSE;
static uint32_t key_start_ticks = 0; // 记录开启时间仿真的时候按键会有毛刺在xx秒之后按下有效
// 允许执行的条件
static BOOL allow_condition(void)
{
/**
* key的初始化在LCD板子上电之前
*/
if (sys_millis() - key_start_ticks < INVALID_BUTTON_TICKS) // 仿真的时候按键会有毛刺在xx秒之后按下有效
{
key_imitate = 0; // 清除标志位
return FALSE;
}
return TRUE;
}
/**
* @brief GPIO电平
* @param {uint8_t} button_id
* @return {uint8_t} GPIO电平
* @note
*/
static uint8_t read_button_gpio(uint8_t button_id)
{
if (allow_condition() == FALSE)
{
return ACTIVE_LEVEL_HIGH;
}
if (key2_5_imitate_timers > 0)
{
key2_5_imitate_timers--;
}
else
{
key_imitate = 0;
}
switch (button_id)
{
case KEY_ESC:
return GPIO_READ(KEY1_GPIO_Port, KEY1_Pin);
case KEY_LEFT:
return GPIO_READ(KEY2_GPIO_Port, KEY2_Pin);
case KEY_UP:
return GPIO_READ(KEY3_GPIO_Port, KEY3_Pin);
case KEY_DOWN:
return GPIO_READ(KEY4_GPIO_Port, KEY4_Pin);
case KEY_RIGHT:
return GPIO_READ(KEY5_GPIO_Port, KEY5_Pin);
case KEY_ENT:
return GPIO_READ(KEY6_GPIO_Port, KEY6_Pin);
case KEY_AUTO:
return GPIO_READ(KEY_AUTO_GPIO_Port, KEY_AUTO_Pin);
default:
return ACTIVE_LEVEL_HIGH;
}
}
/**
* @brief key2和key5同时按下判断
* @return {*}
* @note
*/
static void key_2_5_press_down(void)
{
__NOP();
if (allow_condition() == FALSE)
{
return;
}
// 检查标志,判断左右同时按下
if (key_imitate == (KEY_LEFT | KEY_RIGHT))
{
key_imitate = 0; // 清除标志位
#if LCD_DESIGN == FALSE
menus_jump(MENUS_MAIN, FALSE); // 跳转到主界面
#else
menus_jump(MENUS_PASSWORD, FALSE);
#endif
}
}
/**
* @brief 1
* @param {void} *btn
* @return {*}
* @note
*/
static void key_1_press_down_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
if (get_menus()->dir == 0)
{
menus_key_register(handle->button_id); // 注册为菜单功能键
}
else
{
menus_key_register(handle->button_id_reverse); // 注册为菜单功能键
}
}
/**
* @brief 1
* @param {void} *btn
* @return {*}
* @note
*/
static void key_1_double_click_handler(void *btn)
{
__NOP();
}
/**
* @brief 1
* @param {void} *btn
* @return {*}
* @note
*/
static void key_1_long_press_hold_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
long_done_flag = TRUE;
if (key_1.ticks >= (1000 / TICKS_INTERVAL) && key1_done_flag == FALSE)
{
key1_done_flag = TRUE;
__NOP();
if (handle->button_id == KEY_ESC)
{
// 跳转到工作界面
menus_jump(MENUS_WORK, TRUE);
}
else
{
// 跳转到菜单界面
menus_jump(MENUS_MAIN, FALSE); // 跳转到主菜单界面
}
}
}
/**
* @brief 1
* @param {void} *btn
* @return {*}
* @note
*/
static void key_1_up_handler(void *btn)
{
__NOP();
long_done_flag = FALSE;
key1_done_flag = FALSE;
}
/**
* @brief 2
* @param {void} *btn
* @return {*}
* @note
*/
static void key_2_press_down_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
if (get_menus()->dir == 0)
{
key_imitate |= handle->button_id; // 设置按下标志(组合键)
key2_5_imitate_timers = EFFECTIVE_TIME / TICKS_INTERVAL; // 设置按下时间(组合键)
menus_key_register(handle->button_id); // 注册为菜单功能键
}
else
{
key_imitate |= handle->button_id_reverse; // 设置按下标志(组合键)
key2_5_imitate_timers = EFFECTIVE_TIME / TICKS_INTERVAL; // 设置按下时间(组合键)
menus_key_register(handle->button_id_reverse); // 注册为菜单功能键
}
// 组合键判断
key_2_5_press_down();
}
/**
* @brief 2
* @param {void} *btn
* @return {*}
* @note
*/
static void key_2_double_click_handler(void *btn)
{
__NOP();
}
/**
* @brief 2
* @param {void} *btn
* @return {*}
* @note
*/
static void key_2_long_press_hold_handler(void *btn)
{
__NOP();
}
/**
* @brief 2
* @param {void} *btn
* @return {*}
* @note
*/
static void key_2_up_handler(void *btn)
{
__NOP();
}
/**
* @brief 3
* @param {void} *btn
* @return {*}
* @note
*/
static void key_3_press_down_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
if (get_menus()->dir == 0)
{
menus_key_register(handle->button_id); // 注册为菜单功能键
}
else
{
menus_key_register(handle->button_id_reverse); // 注册为菜单功能键
}
}
/**
* @brief 3
* @param {void} *btn
* @return {*}
* @note
*/
static void key_3_double_click_handler(void *btn)
{
__NOP();
}
/**
* @brief 3
* @param {void} *btn
* @return {*}
* @note
*/
static void key_3_long_press_hold_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
DISABLE_TIM(MODE_TIM);
if (get_menus()->dir == 0)
{
menus_key_register(handle->button_id | WM_LONG); // 注册为菜单功能键
menus_key_long_start(); // 开始计时长按时间
}
else
{
menus_key_register(handle->button_id_reverse | WM_LONG); // 注册为菜单功能键
menus_key_long_start(); // 开始计时长按时间
}
}
// 弹起3
static void key_3_up_handler(void *btn)
{
__NOP();
ENABLE_TIM(MODE_TIM);
menus_key_long_stop(); // 清除长按时间
}
/**
* @brief 4
* @param {void} *btn
* @return {*}
* @note
*/
static void key_4_press_down_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
if (get_menus()->dir == 0)
{
menus_key_register(handle->button_id); // 注册为菜单功能键
}
else
{
menus_key_register(handle->button_id_reverse); // 注册为菜单功能键
}
}
/**
* @brief 4
* @param {void} *btn
* @return {*}
* @note
*/
static void key_4_double_click_handler(void *btn)
{
__NOP();
}
/**
* @brief 4
* @param {void} *btn
* @return {*}
* @note
*/
static void key_4_long_press_hold_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
DISABLE_TIM(MODE_TIM);
if (get_menus()->dir == 0)
{
menus_key_register(handle->button_id | WM_LONG); // 注册为菜单功能键
menus_key_long_start(); // 开始计时长按时间
}
else
{
menus_key_register(handle->button_id_reverse | WM_LONG); // 注册为菜单功能键
menus_key_long_start(); // 开始计时长按时间
}
}
/**
* @brief 4
* @param {void} *btn
* @return {*}
* @note
*/
static void key_4_up_handler(void *btn)
{
__NOP();
ENABLE_TIM(MODE_TIM);
menus_key_long_stop(); // 清除长按时间
}
/**
* @brief 5
* @param {void} *btn
* @return {*}
* @note
*/
static void key_5_press_down_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
if (get_menus()->dir == 0)
{
key_imitate |= handle->button_id; // 设置按下标志(组合键)
key2_5_imitate_timers = EFFECTIVE_TIME / TICKS_INTERVAL; // 设置按下时间(组合键)
menus_key_register(handle->button_id); // 注册为菜单功能键
}
else
{
key_imitate |= handle->button_id_reverse; // 设置按下标志(组合键)
key2_5_imitate_timers = EFFECTIVE_TIME / TICKS_INTERVAL; // 设置按下时间(组合键)
hart_cache_data_send(rnd_key_2); // 按键测试
menus_key_register(handle->button_id_reverse); // 注册为菜单功能键
}
// 组合键判断
key_2_5_press_down();
}
/**
* @brief 5
* @param {void} *btn
* @return {*}
* @note
*/
static void key_5_double_click_handler(void *btn)
{
__NOP();
}
/**
* @brief 5
* @param {void} *btn
* @return {*}
* @note
*/
static void key_5_long_press_hold_handler(void *btn)
{
__NOP();
}
/**
* @brief 5
* @param {void} *btn
* @return {*}
* @note
*/
static void key_5_up_handler(void *btn)
{
__NOP();
}
/**
* @brief 6
* @param {void} *btn
* @return {*}
* @note
*/
static void key_6_press_down_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
if (get_menus()->dir == 0)
{
menus_key_register(handle->button_id);
}
else
{
menus_key_register(handle->button_id_reverse);
}
}
/**
* @brief 6
* @param {void} *btn
* @return {*}
* @note
*/
static void key_6_double_click_handler(void *btn)
{
__NOP();
}
/**
* @brief 6
* @param {void} *btn
* @return {*}
* @note
*/
static void key_6_long_press_hold_handler(void *btn)
{
struct Button *handle = (struct Button *)btn;
long_done_flag = TRUE;
if (key_6.ticks >= (1000 / TICKS_INTERVAL) && key6_done_flag == FALSE)
{
key6_done_flag = TRUE;
if (handle->button_id == KEY_ESC)
{
// 跳转到工作界面
menus_jump(MENUS_WORK, TRUE);
}
else
{
// 跳转到菜单界面
menus_jump(MENUS_MAIN, FALSE); // 跳转到主菜单界面
}
}
}
/**
* @brief 6
* @param {void} *btn
* @return {*}
* @note
*/
static void key_6_up_handler(void *btn)
{
__NOP();
long_done_flag = FALSE;
key6_done_flag = FALSE;
}
/**
* @brief auto按下
* @param {void} *btn
* @return {*}
* @note
*/
static void key_auto_press_down_handler(void *btn)
{
#if HART_HARDWARE_TEST_ENABLE == TRUE
rt_data.flag.bits.hart_send_test++;
if (rt_data.flag.bits.hart_send_test == 3)
{
rt_data.flag.bits.hart_send_test = 0;
}
#endif
}
/**
* @brief auto长按
* @param {void} *btn
* @return {*}
* @note
*/
static void key_auto_long_press_hold_handler(void *btn)
{
if (key_auto.ticks >= (1000 / TICKS_INTERVAL) && auto_done_flag == FALSE)
{
auto_done_flag = TRUE;
// 跳转到自动整定界面
mode_get()->interface_req.mode_adjust_stop();
if (mode_get()->interface_req.mode_is_adjusting() != TRUE) ///< 如果整定中不触发自整定跳转
{
mode_get()->interface_req.mode_adjust_start();
mode_get()->adjust_initiate = ADJUST_INITIATE_INTERNAL;
menu_exit(FALSE);
menu_exit(FALSE);
menus_jump(MENUS_SELFTUNE, TRUE);
}
}
}
// 弹起auto
static void key_auto_up_handler(void *btn)
{
__NOP();
auto_done_flag = FALSE;
}
/**
* @brief
* @return {*}
* @note
*/
void key_init(void)
{
if (key_init_flag == 1)
{
return;
}
key_init_flag = 1;
GPIO_SET_INPUT(KEY1_GPIO_Port, KEY1_Pin);
GPIO_SET_INPUT(KEY2_GPIO_Port, KEY2_Pin);
GPIO_SET_INPUT(KEY3_GPIO_Port, KEY3_Pin);
GPIO_SET_INPUT(KEY4_GPIO_Port, KEY4_Pin);
GPIO_SET_INPUT(KEY5_GPIO_Port, KEY5_Pin);
GPIO_SET_INPUT(KEY6_GPIO_Port, KEY6_Pin);
GPIO_SET_INPUT(KEY_AUTO_GPIO_Port, KEY_AUTO_Pin);
// 按键1->KEY1, 方向180: 按键1->KEY6
// 按键2->KEY2, 方向180: 按键2->KEY5
button_init(&key_1, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_ESC, KEY_ESC);
button_init(&key_2, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_LEFT, KEY_RIGHT);
button_init(&key_3, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_UP, KEY_DOWN);
button_init(&key_4, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_DOWN, KEY_UP);
button_init(&key_5, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_RIGHT, KEY_LEFT);
button_init(&key_6, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_ENT, KEY_ENT);
button_init(&key_auto, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_AUTO, KEY_AUTO);
// 硬件上GPS2000和GPS3000的按键是反的所以需要翻转一下
// switch (udevice.dev_model)
// {
// case POSITIONER_MODEL_GPS3000:
// button_init(&key_1, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_ENT, KEY_ENT);
// button_init(&key_2, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_RIGHT, KEY_LEFT);
// button_init(&key_3, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_DOWN, KEY_UP);
// button_init(&key_4, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_UP, KEY_DOWN);
// button_init(&key_5, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_LEFT, KEY_RIGHT);
// button_init(&key_6, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_ESC, KEY_ESC);
// button_init(&key_auto, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_AUTO, KEY_AUTO);
// break;
// case POSITIONER_MODEL_GPS2000:
// default:
// button_init(&key_1, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_ESC, KEY_ESC);
// button_init(&key_2, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_LEFT, KEY_RIGHT);
// button_init(&key_3, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_UP, KEY_DOWN);
// button_init(&key_4, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_DOWN, KEY_UP);
// button_init(&key_5, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_RIGHT, KEY_LEFT);
// button_init(&key_6, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_ENT, KEY_ENT);
// button_init(&key_auto, read_button_gpio, ACTIVE_LEVEL_LOW, KEY_AUTO, KEY_AUTO);
// break;
// }
// 添加按键1按下按钮的按下按钮回调函数
button_attach(&key_1, PRESS_DOWN, key_1_press_down_handler);
// 添加按键1双击按钮的按下按钮回调函数
button_attach(&key_1, DOUBLE_CLICK, key_1_double_click_handler);
// 添加按键1长按按钮的按下按钮回调函数
button_attach(&key_1, LONG_PRESS_HOLD, key_1_long_press_hold_handler);
// 添加按键1按下按钮的抬起按钮回调函数
button_attach(&key_1, PRESS_UP, key_1_up_handler);
// 添加按键2按下按钮的按下按钮回调函数
button_attach(&key_2, PRESS_DOWN, key_2_press_down_handler);
// 添加按键2双击按钮的按下按钮回调函数
button_attach(&key_2, DOUBLE_CLICK, key_2_double_click_handler);
// 添加按键2长按按钮的按下按钮回调函数
button_attach(&key_2, LONG_PRESS_HOLD, key_2_long_press_hold_handler);
// 添加按键2按下按钮的抬起按钮回调函数
button_attach(&key_2, PRESS_UP, key_2_up_handler);
// 添加按键3按下按钮的按下按钮回调函数
button_attach(&key_3, PRESS_DOWN, key_3_press_down_handler);
// 添加按键3双击按钮的按下按钮回调函数
button_attach(&key_3, DOUBLE_CLICK, key_3_double_click_handler);
// 添加按键3长按按钮的按下按钮回调函数
button_attach(&key_3, LONG_PRESS_HOLD, key_3_long_press_hold_handler);
// 添加按键3按下按钮的抬起按钮回调函数
button_attach(&key_3, PRESS_UP, key_3_up_handler);
// 添加按键4按下按钮的按下按钮回调函数
button_attach(&key_4, PRESS_DOWN, key_4_press_down_handler);
// 添加按键4双击按钮的按下按钮回调函数
button_attach(&key_4, DOUBLE_CLICK, key_4_double_click_handler);
// 添加按键4长按按钮的按下按钮回调函数
button_attach(&key_4, LONG_PRESS_HOLD, key_4_long_press_hold_handler);
// 添加按键4按下按钮的抬起按钮回调函数
button_attach(&key_4, PRESS_UP, key_4_up_handler);
// 添加按键5按下按钮的按下按钮回调函数
button_attach(&key_5, PRESS_DOWN, key_5_press_down_handler);
// 添加按键5双击按钮的按下按钮回调函数
button_attach(&key_5, DOUBLE_CLICK, key_5_double_click_handler);
// 添加按键5长按按钮的按下按钮回调函数
button_attach(&key_5, LONG_PRESS_HOLD, key_5_long_press_hold_handler);
// 添加按键5按下按钮的抬起按钮回调函数
button_attach(&key_5, PRESS_UP, key_5_up_handler);
// 添加按键6按下按钮的按下按钮回调函数
button_attach(&key_6, PRESS_DOWN, key_6_press_down_handler);
// 添加按键6双击按钮的按下按钮回调函数
button_attach(&key_6, DOUBLE_CLICK, key_6_double_click_handler);
// 添加按键6长按按钮的按下按钮回调函数
button_attach(&key_6, LONG_PRESS_HOLD, key_6_long_press_hold_handler);
// 添加按键6按下按钮的抬起按钮回调函数
button_attach(&key_6, PRESS_UP, key_6_up_handler);
// 添加按键auto按下按钮的按下按钮回调函数
button_attach(&key_auto, PRESS_DOWN, key_auto_press_down_handler);
// 添加按键auto长按按钮的按下按钮回调函数
button_attach(&key_auto, LONG_PRESS_HOLD, key_auto_long_press_hold_handler);
// 添加按键auto按下按钮的抬起按钮回调函数
button_attach(&key_auto, PRESS_UP, key_auto_up_handler);
board_srand(); // 随机数种子
rnd_key_1 = rand();
rnd_key_2 = rand();
rnd_key_3 = rand();
rnd_key_4 = rand();
rnd_key_5 = rand();
rnd_key_6 = rand();
rnd_key_auto = rand();
key_start_ticks = sys_millis(); // 记录开启时间仿真的时候按键会有毛刺在xx秒之后按下有效
key_botton_start();
}
void key_botton_start(void)
{
button_start(&key_1);
button_start(&key_2);
button_start(&key_3);
button_start(&key_4);
button_start(&key_5);
button_start(&key_6);
button_start(&key_auto);
}
/**
* @brief
* @return {*}
* @note
*/
void key_dinit(void)
{
if (key_init_flag == 1)
{
key_init_flag = 0;
button_stop(&key_1);
button_stop(&key_2);
button_stop(&key_3);
button_stop(&key_4);
button_stop(&key_5);
button_stop(&key_6);
button_stop(&key_auto);
GPIO_SET_ANALOG(KEY1_GPIO_Port, KEY1_Pin);
GPIO_SET_ANALOG(KEY2_GPIO_Port, KEY2_Pin);
GPIO_SET_ANALOG(KEY3_GPIO_Port, KEY3_Pin);
GPIO_SET_ANALOG(KEY4_GPIO_Port, KEY4_Pin);
GPIO_SET_ANALOG(KEY5_GPIO_Port, KEY5_Pin);
GPIO_SET_ANALOG(KEY6_GPIO_Port, KEY6_Pin);
GPIO_SET_ANALOG(KEY_AUTO_GPIO_Port, KEY_AUTO_Pin);
}
}
/**
* @brief uuid
* @param {button_id_e} k -
* @return {uint64_t} uuid
* @note
*/
uint64_t get_key_uuid(button_id_e k)
{
uint64_t uuid = 0;
switch (k)
{
case KEY1:
uuid = rnd_key_1;
break;
case KEY2:
uuid = rnd_key_2;
break;
case KEY3:
uuid = rnd_key_3;
break;
case KEY4:
uuid = rnd_key_4;
break;
case KEY5:
uuid = rnd_key_5;
break;
case KEY6:
uuid = rnd_key_6;
break;
case KEYAUTO:
uuid = rnd_key_auto;
break;
default:
break;
}
return uuid;
}
/**
* @brief HART缓存区
* @return {*}
* @note
*/
void remove_key_hart_cache(void)
{
hart_cache_remove(get_key_uuid(KEY1));
hart_cache_remove(get_key_uuid(KEY2));
hart_cache_remove(get_key_uuid(KEY3));
hart_cache_remove(get_key_uuid(KEY4));
hart_cache_remove(get_key_uuid(KEY5));
hart_cache_remove(get_key_uuid(KEY6));
hart_cache_remove(get_key_uuid(KEYAUTO));
}
/**
* @brief
* @return {*}
* @note
*/
BOOL key_long_press_flag(void)
{
return long_done_flag;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,304 +0,0 @@
#include "pdctrl.h"
#include "main.h"
#include "entity.h"
#include "leds.h"
#include "board.h"
pdctrl_t pdctrl_data;
pdctrl_t pdctrl_data_out;
__IO static pdctrl_mode_e out_mode = PDCTRL_DAC;
__IO static BOOL pdctrl_run_flag = FALSE;
static void dac_dinit(void)
{
DAC_STOP(DAC, PDCTRL_DAC_CHINNEL); // DAC通道禁用
GPIO_SET_ANALOG(PDCTRL_DAC_GPIO_Port, PDCTRL_DAC_Pin);
}
static void dac_init(void)
{
pdctrl_data.last_out = 0xffff;
GPIO_SET_ANALOG(PDCTRL_DAC_GPIO_Port, PDCTRL_DAC_Pin);
DAC_START(DAC, PDCTRL_DAC_CHINNEL); // DAC通道使能
}
static void pwm_dinit(void)
{
PWM_STOP(PDCTRL_PWM_TIM, PDCTRL_PWM_CHINNEL); // PWM通道禁用
GPIO_SET_ANALOG(PDCTRL_PWM_GPIO_Port, PDCTRL_PWM_Pin);
}
static void pwm_init(void)
{
pdctrl_data.last_out = 0xffff;
GPIO_SET_ALTERNATE(PDCTRL_PWM_GPIO_Port, PDCTRL_PWM_Pin);
if (pdctrl_data.pwm_arr_default == 0)
{
pdctrl_data.pwm_arr_default = LL_TIM_GetAutoReload(PDCTRL_PWM_TIM);
}
PWM_START(PDCTRL_PWM_TIM, PDCTRL_PWM_CHINNEL); // PWM通道使能
}
static void pwmp_dinit(void)
{
PWM_STOP(PDCTRL_PWMP_TIM, PDCTRL_PWMP_CHINNEL); // PWM通道禁用
GPIO_SET_ANALOG(PDCTRL_PWMP_GPIO_Port, PDCTRL_PWMP_Pin);
}
static void pwmp_init(void)
{
pdctrl_data.last_out = 0xffff;
GPIO_SET_ALTERNATE(PDCTRL_PWM_GPIO_Port, PDCTRL_PWM_Pin);
ENABLE_TIM_ARR_RELOAD(PDCTRL_PWMP_TIM);
PWM_START(PDCTRL_PWMP_TIM, PDCTRL_PWMP_CHINNEL); // PWM通道使能
}
/**
* @brief
* @param {pdctrl_mode_e} mode
* @param {uint8_t} pwm_frequency
* @return {*}
* @note
*/
void pdctrl_init(pdctrl_mode_e mode)
{
out_mode = mode;
pdctrl_data.pwm_wid = PWM_WID;
osel_memset((uint8_t *)&pdctrl_data, 0, sizeof(pdctrl_t));
dac_dinit();
pwm_dinit();
pwmp_dinit();
if (out_mode == PDCTRL_DAC)
{
dac_init();
}
else if (out_mode == PDCTRL_PWM)
{
pwm_init();
}
else if (out_mode == PDCTRL_PWMP)
{
pwmp_init();
}
else
{
return;
}
}
/**
* @brief
* @return {*}
* @note
*/
void pdctrl_stop(void)
{
pdctrl_run_flag = FALSE;
if (out_mode == PDCTRL_DAC)
{
dac_dinit();
}
else if (out_mode == PDCTRL_PWM)
{
pwm_dinit();
}
else if (out_mode == PDCTRL_PWMP)
{
pwmp_dinit();
}
else
{
return;
}
}
/**
* @brief
* @return {*}
* @note
*/
void pdctrl_run(void)
{
pdctrl_run_flag = TRUE;
if (out_mode == PDCTRL_DAC)
{
dac_init();
}
else if (out_mode == PDCTRL_PWM)
{
pwm_init();
}
else if (out_mode == PDCTRL_PWMP)
{
pwmp_init();
}
else
{
return;
}
}
/**
* @brief
* @return {*}
* @note
*/
pdctrl_t *pdctrl_get(void)
{
return &pdctrl_data;
}
/**
* @brief CCR值
* @param {float32} out
* @return {*}
* @note
*/
uint16_t pdctrl_pwm_duty_convert_ccr(float32 pwm_duty)
{
return (pwm_duty * pdctrl_data.pwm_arr_default) / 100;
}
// 计算频率
static void calculate_pwm_freq(uint32_t arr)
{
pdctrl_data.sysclk = SystemCoreClock / 1000;
pdctrl_data.psc = LL_TIM_GetPrescaler(PDCTRL_PWM_TIM);
pdctrl_data.freq = (float32)pdctrl_data.sysclk / (float32)(pdctrl_data.psc + 1) / (float32)arr;
}
/**
* @brief
* @param {uint32_t} arr
* @return {*}
* @note
*/
uint16_t calculate_pwm_duty(uint32_t arr)
{
float32 wid = pdctrl_data.pwm_wid;
calculate_pwm_freq(arr);
if (arr < pdctrl_data.pwm_arr_default)
{
wid = (pdctrl_data.pwm_arr_default - arr) * 10 / pdctrl_data.pwm_arr_default + wid;
}
pdctrl_data.arr_us = 1000.0f / pdctrl_data.freq;
pdctrl_data.duty_percent = ((float32)wid * 100.0f) / pdctrl_data.arr_us;
pdctrl_data.duty = arr * pdctrl_data.duty_percent / 100;
return pdctrl_data.duty;
}
/**
* @brief PWM频率
* @param {uint32_t} freq
* @return {*}
* @note
*/
void pdctrl_set_pwm_wid(uint16_t wid)
{
pdctrl_data.pwm_wid = wid;
}
/**
* @brief
* @param {uint32_t} arr
* @return {*}
* @note
*/
void pdctrl_pwm_set_arr(uint32_t arr)
{
uint16_t pwm_arr = LL_TIM_GetAutoReload(PDCTRL_PWM_TIM);
if (pwm_arr == arr)
{
return;
}
if (arr == 0)
{
arr = pdctrl_data.pwm_arr_default;
}
LL_TIM_SetAutoReload(PDCTRL_PWM_TIM, arr);
uint16_t duty = calculate_pwm_duty(arr);
#if PDCTRL_PWM_CHINNEL == LL_TIM_CHANNEL_CH4
PWM_SET_DUTY(PDCTRL_PWM_TIM, 4, duty);
#else
#error "PDCTRL_PWM_CHINNEL undefined"
#endif
}
/**
* @brief
* @param {uint32_t} arr
* @return {*}
* @note
*/
float32 pdctrl_pwm_get_duty_percent(uint32_t arr)
{
calculate_pwm_duty(arr);
return pdctrl_data.duty_percent;
}
/**
* @brief
* @param {uint16_t} out
* @return {*}
* @note
*/
void pdctrl_out(uint16_t out)
{
if (pdctrl_run_flag == FALSE)
{
return;
}
if (pdctrl_data.last_out == out && (pdctrl_data.sysclk != (SystemCoreClock / 1000)))
{
return;
}
pdctrl_data.last_out = out;
rt_data.ip_output = out;
if (out_mode == PDCTRL_DAC)
{
DAC_OUT(DAC, PDCTRL_DAC_CHINNEL, out);
}
else if (out_mode == PDCTRL_PWM)
{
pdctrl_pwm_set_arr(out);
}
else if (out_mode == PDCTRL_PWMP)
{
#if PDCTRL_PWMP_CHINNEL == LL_TIM_CHANNEL_CH4
PWM_SET_DUTY(PDCTRL_PWMP_TIM, 4, out);
#else
#error "PDCTRL_PWMP_CHINNEL undefined"
#endif
}
else
{
return;
}
}
/**
* @brief
* @return {*}
* @note
*/
uint8_t get_pdctrl_mode(void)
{
return out_mode;
}
/**
* @brief PWM默认频率
* @return {*}
* @note
*/
uint16_t get_pwm_arr_default(void)
{
return pdctrl_data.pwm_arr_default;
}

Binary file not shown.

View File

@ -40,4 +40,11 @@ for %%i in (User\application\mode\*.c) do (
if not "%%~nxi"=="mode.c" if not "%%~nxi"=="mode_pwmp_hd.c" del "%%i"
)
for %%i in (User\application\src\*.c) do (
if not "%%~nxi"=="params.c" del "%%i"
)
for %%i in (User\*.c) do (
if not "%%~nxi"=="app.c" if not "%%~nxi"=="app_flow.c" del "%%i"
)
exit