更新文件
This commit is contained in:
parent
b457eb5bc2
commit
a43b1df369
|
@ -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 */
|
|
@ -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>
|
||||
|
|
|
@ -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
962
User/app_hart.c
962
User/app_hart.c
|
@ -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 设备呼叫,0一直呼叫,1-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; // 设备配置已锁定。设备处于写保护状态或已锁定
|
||||
}
|
||||
}
|
||||
}
|
1066
User/app_hart_user.c
1066
User/app_hart_user.c
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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 如果设定点值小于等于0或大于等于100,则返回0。
|
||||
* 转换公式为:b * log(setpoint) / log(base) + linear_coefficient * setpoint
|
||||
* 其中,b为13.25,linear_coefficient为0.123,base为对数底数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
|
@ -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.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
存储模块是一个用于存储和读取数据的函数,它使用了 FAL(Flash Abstraction Layer)库来实现。FAL 库是一个用于访问 Flash 存储器的抽象层,
|
||||
它提供了一组标准的接口,使得应用程序可以方便地访问 Flash 存储器中的数据。在这段代码中,函数 fal_execution_kv_read()
|
||||
用于从 KV(Key-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);
|
||||
}
|
|
@ -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
|
@ -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;
|
||||
}
|
BIN
User/static.lib
BIN
User/static.lib
Binary file not shown.
|
@ -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
|
||||
|
|
Reference in New Issue