update
This commit is contained in:
@@ -92,7 +92,7 @@ int main(void)
|
||||
MX_USART1_UART_Init();
|
||||
MX_USART2_UART_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
App_Init();
|
||||
app_init();
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
@@ -102,7 +102,7 @@ int main(void)
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
App_Task();
|
||||
app_task();
|
||||
}
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
#include "os_timer.h"
|
||||
#include "app_timer.h"
|
||||
#include "bsp_Uart.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
@@ -194,12 +194,12 @@ void PendSV_Handler(void)
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SysTick_IRQn 0 */
|
||||
OsTimer_Increment(1);
|
||||
COM_Uart1.Rx_TimeIncrementInt(&COM_Uart1,1);
|
||||
COM_Uart2.Rx_TimeIncrementInt(&COM_Uart2,1);
|
||||
COM_Uart4.Rx_TimeIncrementInt(&COM_Uart4,1);
|
||||
app_timer.increment_int(1);
|
||||
com_uart1.rx_time_increment_int(&com_uart1,1);
|
||||
com_uart2.rx_time_increment_int(&com_uart2,1);
|
||||
com_uart4.rx_time_increment_int(&com_uart4,1);
|
||||
/* USER CODE END SysTick_IRQn 0 */
|
||||
HAL_IncTick();
|
||||
HAL_IncTick();
|
||||
/* USER CODE BEGIN SysTick_IRQn 1 */
|
||||
|
||||
/* USER CODE END SysTick_IRQn 1 */
|
||||
@@ -277,7 +277,7 @@ void USART1_IRQHandler(void)
|
||||
// if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
|
||||
// {
|
||||
// __HAL_UART_CLEAR_IDLEFLAG(&huart1);
|
||||
// COM_Uart1.Rx_IdleInt(&COM_Uart1);
|
||||
// com_uart1.Rx_IdleInt(&com_uart1);
|
||||
// }
|
||||
// /* USER CODE END USART1_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart1);
|
||||
@@ -295,7 +295,7 @@ void USART2_IRQHandler(void)
|
||||
// if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
|
||||
// {
|
||||
// __HAL_UART_CLEAR_IDLEFLAG(&huart2);
|
||||
// COM_Uart2.Rx_IdleInt(&COM_Uart2);
|
||||
// com_uart2.Rx_IdleInt(&com_uart2);
|
||||
// }
|
||||
/* USER CODE END USART2_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart2);
|
||||
@@ -313,7 +313,7 @@ void UART4_IRQHandler(void)
|
||||
// if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE))
|
||||
// {
|
||||
// __HAL_UART_CLEAR_IDLEFLAG(&huart4);
|
||||
// COM_Uart4.Rx_IdleInt(&COM_Uart4);
|
||||
// com_uart4.Rx_IdleInt(&com_uart4);
|
||||
// }
|
||||
/* USER CODE END UART4_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart4);
|
||||
|
||||
Binary file not shown.
@@ -10,7 +10,7 @@
|
||||
<aExt>*.s*; *.src; *.a*</aExt>
|
||||
<oExt>*.obj; *.o</oExt>
|
||||
<lExt>*.lib</lExt>
|
||||
<tExt>*.txt; *.h; *.inc</tExt>
|
||||
<tExt>*.txt; *.h; *.inc; *.md</tExt>
|
||||
<pExt>*.plm</pExt>
|
||||
<CppX>*.cpp</CppX>
|
||||
<nMigrate>0</nMigrate>
|
||||
@@ -117,6 +117,25 @@
|
||||
<pMon>Segger\JL2CM3.dll</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMRTXEVENTFLAGS</Key>
|
||||
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGTARM</Key>
|
||||
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMDBGFLAGS</Key>
|
||||
<Name></Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGUARM</Key>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>JL2CM3</Key>
|
||||
@@ -140,7 +159,7 @@
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>0</viewmode>
|
||||
<viewmode>1</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
@@ -283,7 +302,7 @@
|
||||
|
||||
<Group>
|
||||
<GroupName>Drivers/STM32F4xx_HAL_Driver</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
@@ -483,7 +502,7 @@
|
||||
|
||||
<Group>
|
||||
<GroupName>Drivers/CMSIS</GroupName>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
@@ -526,8 +545,8 @@
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\app\os_timer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>os_timer.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\usr\app\gas_data.c</PathWithFileName>
|
||||
<FilenameWithoutPath>gas_data.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
@@ -538,8 +557,32 @@
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\app\gas_data.c</PathWithFileName>
|
||||
<FilenameWithoutPath>gas_data.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\usr\app\app_timer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_timer.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\app\app_leakage.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_leakage.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\app\app_com.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_com.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
@@ -553,7 +596,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -573,7 +616,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -585,7 +628,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -597,19 +640,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\bsp\bsp_Uart.c</PathWithFileName>
|
||||
<FilenameWithoutPath>bsp_Uart.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -621,7 +652,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -633,7 +664,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -645,25 +676,33 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\bsp\tjc_usart_hmi.c</PathWithFileName>
|
||||
<FilenameWithoutPath>tjc_usart_hmi.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\usr\bsp\bsp_uart.c</PathWithFileName>
|
||||
<FilenameWithoutPath>bsp_uart.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
<GroupName>gui</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\usr\bsp\tjc_usart_hmi.h</PathWithFileName>
|
||||
<FilenameWithoutPath>tjc_usart_hmi.h</FilenameWithoutPath>
|
||||
<PathWithFileName>..\usr\gui\gui_tjc_hmi.c</PathWithFileName>
|
||||
<FilenameWithoutPath>gui_tjc_hmi.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
@@ -676,8 +715,8 @@
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<GroupNumber>9</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -688,8 +727,8 @@
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<GroupNumber>9</GroupNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -700,8 +739,8 @@
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<GroupNumber>9</GroupNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -712,8 +751,8 @@
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<GroupNumber>9</GroupNumber>
|
||||
<FileNumber>41</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
||||
@@ -10,14 +10,14 @@
|
||||
<TargetName>CalibBoard</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
|
||||
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
|
||||
<uAC6>0</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>STM32F407VGTx</Device>
|
||||
<Vendor>STMicroelectronics</Vendor>
|
||||
<PackID>Keil.STM32F4xx_DFP.2.15.0</PackID>
|
||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||
<PackID>Keil.STM32F4xx_DFP.3.0.0</PackID>
|
||||
<PackURL>https://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
<StartupFile></StartupFile>
|
||||
@@ -185,6 +185,7 @@
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<hadIRAM2>1</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
@@ -338,7 +339,7 @@
|
||||
<MiscControls></MiscControls>
|
||||
<Define>USE_HAL_DRIVER,STM32F407xx</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../usr/algo;../usr/app;../usr/bsp;../usr/protocol</IncludePath>
|
||||
<IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../usr/algo;../usr/app;../usr/bsp;../usr/protocol;..\usr\gui</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@@ -351,7 +352,7 @@
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<uClangAs>0</uClangAs>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
@@ -527,16 +528,26 @@
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\app\app.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>os_timer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\app\os_timer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>gas_data.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\app\gas_data.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_timer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\app\app_timer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_leakage.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\app\app_leakage.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_com.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\app\app_com.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
@@ -562,11 +573,6 @@
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\bsp\bsp_Led.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>bsp_Uart.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\bsp\bsp_Uart.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>bsp_Wdg.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
@@ -583,14 +589,19 @@
|
||||
<FilePath>..\usr\bsp\bsp_Flash.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>tjc_usart_hmi.c</FileName>
|
||||
<FileName>bsp_uart.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\bsp\tjc_usart_hmi.c</FilePath>
|
||||
<FilePath>..\usr\bsp\bsp_uart.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>gui</GroupName>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>tjc_usart_hmi.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\usr\bsp\tjc_usart_hmi.h</FilePath>
|
||||
<FileName>gui_tjc_hmi.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\usr\gui\gui_tjc_hmi.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
@@ -639,4 +650,13 @@
|
||||
<files/>
|
||||
</RTE>
|
||||
|
||||
<LayerInfo>
|
||||
<Layers>
|
||||
<Layer>
|
||||
<LayName>CalibBoard</LayName>
|
||||
<LayPrjMark>1</LayPrjMark>
|
||||
</Layer>
|
||||
</Layers>
|
||||
</LayerInfo>
|
||||
|
||||
</Project>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,11 +11,5 @@
|
||||
#define RTE_COMPONENTS_H
|
||||
|
||||
|
||||
/*
|
||||
* Define the Device Header File:
|
||||
*/
|
||||
#define CMSIS_device_header "stm32f4xx.h"
|
||||
|
||||
|
||||
|
||||
#endif /* RTE_COMPONENTS_H */
|
||||
|
||||
+54
-77
@@ -1,5 +1,5 @@
|
||||
#include "app.h"
|
||||
#include "os_timer.h"
|
||||
#include "app_timer.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
|
||||
@@ -8,21 +8,37 @@
|
||||
#include "bsp_Led.h"
|
||||
#include "bsp_74HC4067.h"
|
||||
#include "bsp_Flash.h"
|
||||
#include "tjc_usart_hmi.h"
|
||||
|
||||
#include "proto_modbus_master_tdlas.h"
|
||||
#include "proto_modbus_slave_ex.h"
|
||||
|
||||
#include "gui_tjc_hmi.h"
|
||||
|
||||
const char *HwVersion = "V1.0";
|
||||
char SwVersion[24] = "V0.001.0";
|
||||
void TASK_Idle(void);
|
||||
void Task_10ms(void);
|
||||
void Task_50ms(void);
|
||||
void Task_100ms(void);
|
||||
void Task_200ms(void);
|
||||
void Task_500ms(void);
|
||||
void Task_1s(void);
|
||||
void Task_2s(void);
|
||||
void task_idle(void);
|
||||
void task_10ms(void);
|
||||
void task_50ms(void);
|
||||
void task_100ms(void);
|
||||
void task_200ms(void);
|
||||
void task_500ms(void);
|
||||
void task_1s(void);
|
||||
void task_2s(void);
|
||||
|
||||
#define APP_TIMER_TASK_NUM (sizeof(app_timer_task) / sizeof(app_timer_class_t))
|
||||
|
||||
/*定义任务*/
|
||||
app_timer_class_t app_timer_task[] =
|
||||
{
|
||||
{0, 1, 1, task_idle }, /*空闲任务一直执行*/
|
||||
{0, 3, 10, task_10ms },
|
||||
{0, 7, 50, task_50ms },
|
||||
{0, 11, 100, task_100ms },
|
||||
{0, 13, 200, task_200ms },
|
||||
{0, 17, 500, task_500ms },
|
||||
{0, 19, 1000, task_1s },
|
||||
{0, 23, 2000, task_2s },
|
||||
};
|
||||
|
||||
/******************************************
|
||||
* 函数: AppInit
|
||||
@@ -31,114 +47,75 @@ void Task_2s(void);
|
||||
* 返回: 无
|
||||
* 描述: 无
|
||||
******************************************/
|
||||
void App_Init(void)
|
||||
void app_init(void)
|
||||
{
|
||||
Usr_Flash.Init();
|
||||
|
||||
COM_Uart1.Init(&COM_Uart1);
|
||||
COM_Uart2.Init(&COM_Uart2);
|
||||
COM_Uart4.Init(&COM_Uart4);
|
||||
Led.Init();
|
||||
UartCH_Config.init();
|
||||
|
||||
/*串口初始化*/
|
||||
com_uart1.init(&com_uart1);
|
||||
com_uart2.init(&com_uart2);
|
||||
com_uart4.init(&com_uart4);
|
||||
|
||||
UartCH_Config.init();
|
||||
|
||||
tdlas.init();
|
||||
modbus_slave_ex.init();
|
||||
TJC_Init(&COM_Uart2);
|
||||
initRingBuffer();
|
||||
char init_msg[] = "系统初始化...\r\n";
|
||||
HAL_UART_Transmit(COM_Uart2.Uart, (uint8_t*)init_msg, strlen(init_msg), 100);
|
||||
app_timer.init(APP_TIMER_TASK_NUM,app_timer_task); /*分时复用,时间片轮询*/
|
||||
tjc_hmi.init();
|
||||
led.init();
|
||||
|
||||
//Wdg.Init();
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: App_Task
|
||||
* 函数: App_task
|
||||
* 功能: 分时复用
|
||||
* 参数: 无
|
||||
* 返回: 无
|
||||
* 描述: 主循环中调用
|
||||
******************************************/
|
||||
void App_Task(void)
|
||||
void app_task(void)
|
||||
{
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_10ms, osTime_MSecTick, 10))
|
||||
{
|
||||
OsTimeTick_10ms = osTime_MSecTick;
|
||||
Task_10ms();
|
||||
}
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_50ms, osTime_MSecTick, 50))
|
||||
{
|
||||
OsTimeTick_50ms = osTime_MSecTick;
|
||||
Task_50ms();
|
||||
}
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_100ms, osTime_MSecTick, 100))
|
||||
{
|
||||
OsTimeTick_100ms = osTime_MSecTick;
|
||||
Task_100ms();
|
||||
}
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_200ms, osTime_MSecTick, 200))
|
||||
{
|
||||
OsTimeTick_200ms = osTime_MSecTick;
|
||||
Task_200ms();
|
||||
}
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_500ms, osTime_MSecTick, 500))
|
||||
{
|
||||
OsTimeTick_500ms = osTime_MSecTick;
|
||||
Task_500ms();
|
||||
}
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_1s, osTime_MSecTick, 1000))
|
||||
{
|
||||
OsTimeTick_1s = osTime_MSecTick;
|
||||
Task_1s();
|
||||
}
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_2s, osTime_MSecTick, 2000))
|
||||
{
|
||||
OsTimeTick_2s = osTime_MSecTick;
|
||||
Task_2s();
|
||||
}
|
||||
TASK_Idle();
|
||||
app_timer.task();
|
||||
task_idle();
|
||||
}
|
||||
/*空闲执行的函数*/
|
||||
void TASK_Idle(void)
|
||||
void task_idle(void)
|
||||
{
|
||||
COM_Uart1.Rx_Task(&COM_Uart1);
|
||||
COM_Uart2.Rx_Task(&COM_Uart2);
|
||||
COM_Uart4.Rx_Task(&COM_Uart4);
|
||||
com_uart1.rx_task(&com_uart1);
|
||||
com_uart2.rx_task(&com_uart2);
|
||||
com_uart4.rx_task(&com_uart4);
|
||||
}
|
||||
|
||||
void Task_10ms(void)
|
||||
void task_10ms(void)
|
||||
{
|
||||
}
|
||||
|
||||
void Task_50ms(void)
|
||||
void task_50ms(void)
|
||||
{
|
||||
// tdlas.tx_task();
|
||||
|
||||
}
|
||||
|
||||
void Task_100ms(void)
|
||||
void task_100ms(void)
|
||||
{
|
||||
// tdlas.tx_task();
|
||||
|
||||
}
|
||||
|
||||
void Task_200ms(void)
|
||||
void task_200ms(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Task_500ms(void)
|
||||
void task_500ms(void)
|
||||
{
|
||||
// UartCH_Config.ch_set(ch);
|
||||
// tdlas.tx_task();
|
||||
Led.Flash();
|
||||
led.task();
|
||||
}
|
||||
|
||||
|
||||
void Task_1s(void)
|
||||
void task_1s(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Task_2s(void)
|
||||
void task_2s(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -4,7 +4,12 @@
|
||||
extern const char *HwVersion;
|
||||
extern char SwVersion[24];
|
||||
|
||||
void App_Init(void);
|
||||
void App_Task(void);
|
||||
|
||||
|
||||
void app_init(void);
|
||||
void app_task(void);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#include "app_com.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
#ifndef _APP_COM_H_
|
||||
#define _APP_COM_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "app_leakage.h"
|
||||
#include "bsp_uart.h"
|
||||
|
||||
#define APP_COM_NUM (4)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 baudrate; /*波特率*/
|
||||
}app_com_flash_data_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
app_com_flash_data_t flash_data; /*flash数据*/
|
||||
u16 device_num; /*绑定的设备数量*/
|
||||
u8 device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*设备的索引*/
|
||||
bsp_uart_t *uart; /*绑定的哪个串口*/
|
||||
}app_com_class_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
app_com_class_t com_class[APP_COM_NUM];
|
||||
}app_com_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,100 @@
|
||||
#include "app_leakage.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
app_leakage_t leakage =
|
||||
{
|
||||
|
||||
};
|
||||
app_leakage_t *p_leakage = &leakage;
|
||||
|
||||
/*区域分类,将同一区域名的设备划分到一起*/
|
||||
static void app_leakage_region_classify(void)
|
||||
{
|
||||
u16 i,j;
|
||||
u8 add_region_flag;
|
||||
|
||||
/*数量及相关数据清零*/
|
||||
p_leakage->region_num = 0;
|
||||
p_leakage->sub_device_num = 0;
|
||||
memset(p_leakage->region_data,0,sizeof(p_leakage->region_data));
|
||||
|
||||
/*遍历子系统*/
|
||||
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++)
|
||||
{
|
||||
add_region_flag = 1; /*添加新区域*/
|
||||
/*设备使能*/
|
||||
if(ENABLE == p_leakage->sub_device_data[i].flash_data.state)
|
||||
{
|
||||
p_leakage->sub_device_num++;/*子系统总数量++*/
|
||||
/*遍历区域*/
|
||||
for(j=0;j<APP_LEAKAGE_SUB_DEVICE_NUM;j++)
|
||||
{
|
||||
if(0 == memcmp(p_leakage->region_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*名称相同*/
|
||||
{
|
||||
/*添加子设备*/
|
||||
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*绑定子设备索引*/
|
||||
p_leakage->region_data[j].leakage_num++; /*区域中子系统数据++*/
|
||||
add_region_flag = 0;/*不添加新区域*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*没有找到相同名称*/
|
||||
if(add_region_flag)/*添加新区域*/
|
||||
{
|
||||
/*复制名称*/
|
||||
memcpy(p_leakage->region_data[p_leakage->region_num].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN);
|
||||
p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*绑定子设备索引*/
|
||||
p_leakage->region_data[p_leakage->region_num].leakage_num++; /*区域中子系统数据++*/
|
||||
p_leakage->region_num++; /*区域数量++*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*异常状态设备数量统计*/
|
||||
void app_leakage_task(void)
|
||||
{
|
||||
u16 i,j,k,sub_device_index;
|
||||
/*计算异常设备数量*/
|
||||
/*遍历区域*/
|
||||
for(i=0;i<p_leakage->region_num;i++)
|
||||
{
|
||||
/*清除设备*/
|
||||
p_leakage->region_data[i].leakage_num = 0;
|
||||
p_leakage->region_data[i].open_num = 0;
|
||||
p_leakage->region_data[i].time_out_num = 0;
|
||||
/*遍历区域里面的设备*/
|
||||
for(j=0;j<p_leakage->region_data[i].leakage_num;j++)
|
||||
{
|
||||
/*记录索引*/
|
||||
sub_device_index = p_leakage->region_data[i].sub_device_index[j];
|
||||
|
||||
/*遍历通道*/
|
||||
for(k=0;k<APP_LEAKAGE_SUB_DEVICE_CH_NUM;k++)
|
||||
{
|
||||
/*通讯超时*/
|
||||
if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
|
||||
{
|
||||
p_leakage->region_data[i].time_out_num++;
|
||||
break;
|
||||
}
|
||||
/*断带*/
|
||||
else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
|
||||
{
|
||||
p_leakage->region_data[i].open_num++;
|
||||
break;
|
||||
}
|
||||
/*漏液*/
|
||||
else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
|
||||
{
|
||||
p_leakage->region_data[i].leakage_num++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
#ifndef _APP_LEAKAGE_H_
|
||||
#define _APP_LEAKAGE_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define ENABLE (1)
|
||||
#define DISABLE (0)
|
||||
|
||||
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
|
||||
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
|
||||
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*通讯超时*/
|
||||
|
||||
#define APP_LEAKAGE_STRING_NANE_LEN (10)
|
||||
#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
|
||||
#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4)
|
||||
|
||||
/*子设备存储的参数*/
|
||||
typedef struct
|
||||
{
|
||||
u8 state; /*状态 使能 非使能*/
|
||||
u8 com_port; /*端口*/
|
||||
u8 modbus_id; /*modbus id*/
|
||||
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*设备名*/
|
||||
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名*/
|
||||
}app_leakage_sub_device_flash_data_t;
|
||||
|
||||
/*子设备信息*/
|
||||
typedef struct
|
||||
{
|
||||
app_leakage_sub_device_flash_data_t flash_data; /*flash存储数据*/
|
||||
struct
|
||||
{
|
||||
u16 state; /*状态*/
|
||||
u16 distance; /*漏液距离*/
|
||||
}ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*通道数据*/
|
||||
}app_leakage_sub_device_class_t;
|
||||
|
||||
|
||||
/*区域信息*/
|
||||
typedef struct
|
||||
{
|
||||
u8 leakage_num; /*漏液数量*/
|
||||
u8 open_num; /*断带数量*/
|
||||
u8 time_out_num; /*通讯超时数量*/
|
||||
u8 sub_device_num; /*设备总数量*/
|
||||
u8 name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名称*/
|
||||
u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*设备的索引*/
|
||||
}app_leakage_region_data_class_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 region_num;
|
||||
u8 sub_device_num;
|
||||
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
|
||||
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
|
||||
|
||||
void (*init)(void); /*初始化*/
|
||||
void (*task)(void); /*执行任务*/
|
||||
}app_leakage_t;
|
||||
|
||||
extern app_leakage_t leakage;
|
||||
#endif
|
||||
@@ -0,0 +1,195 @@
|
||||
#include "app_timer.h"
|
||||
#include "app.h"
|
||||
|
||||
/* 函数声明 */
|
||||
static void app_timer_task(void);
|
||||
static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class);
|
||||
static void app_timer_task_increment_int(u16 ms_tick);
|
||||
|
||||
/******************************************
|
||||
* 结构体: app_timer
|
||||
* 功能: 应用定时器实例
|
||||
* 描述: 定时器控制结构体的具体实例
|
||||
*******************************************/
|
||||
app_timer_t app_timer =
|
||||
{
|
||||
.p_timer_class = NULL,
|
||||
.init = app_timer_init,
|
||||
.task = app_timer_task,
|
||||
.increment_int = app_timer_task_increment_int,
|
||||
};
|
||||
|
||||
/* 全局指针,指向定时器结构体 */
|
||||
app_timer_t *p_app_timer = &app_timer;
|
||||
|
||||
/******************************************
|
||||
* 函数: app_timer_init
|
||||
* 功能: 定时器初始化
|
||||
* 参数: task_num - 任务数量
|
||||
* p_timer_class - 任务时间片数组指针
|
||||
* 返回: 无
|
||||
* 描述: 初始化定时器,设置任务数量和任务数组
|
||||
*******************************************/
|
||||
static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class)
|
||||
{
|
||||
p_app_timer->task_num = task_num;
|
||||
p_app_timer->p_timer_class = p_timer_class;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: app_timer_task
|
||||
* 功能: 定时器任务调度
|
||||
* 参数: 无
|
||||
* 返回: 无
|
||||
* 描述: 执行所有已到时间的任务
|
||||
*******************************************/
|
||||
static void app_timer_task(void)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
/* 检查任务数组是否有效 */
|
||||
if(NULL == p_app_timer->p_timer_class)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* 遍历所有任务 */
|
||||
for (i = 0; i < p_app_timer->task_num; i++)
|
||||
{
|
||||
/* 检查任务是否需要执行 */
|
||||
if (p_app_timer->p_timer_class[i].run_flag)
|
||||
{
|
||||
p_app_timer->p_timer_class[i].run_flag = 0; /* 清除执行标志 */
|
||||
|
||||
/* 检查任务函数是否有效 */
|
||||
if (p_app_timer->p_timer_class[i].task == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* 执行任务函数 */
|
||||
p_app_timer->p_timer_class[i].task();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: app_timer_task_increment_int
|
||||
* 功能: 中断递增函数
|
||||
* 参数: ms_tick - 毫秒增量
|
||||
* 返回: 无
|
||||
* 描述: 在中断中调用,更新定时器计数器和检查任务时间片
|
||||
*******************************************/
|
||||
static void app_timer_task_increment_int(u16 ms_tick)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
/* 更新毫秒级计数器 */
|
||||
p_app_timer->ms_tick++;
|
||||
|
||||
/* 更新秒级计数器 */
|
||||
if(p_app_timer->ms_tick >= 1000)
|
||||
{
|
||||
p_app_timer->s_tick++;
|
||||
}
|
||||
|
||||
/* 检查任务数组是否有效 */
|
||||
if(NULL == p_app_timer->p_timer_class)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* 更新所有任务的时间片计数器 */
|
||||
for (i = 0; i < p_app_timer->task_num; i++)
|
||||
{
|
||||
/* 检查任务计数器是否有效 */
|
||||
if (p_app_timer->p_timer_class[i].timer_count)
|
||||
{
|
||||
p_app_timer->p_timer_class[i].timer_count--;
|
||||
|
||||
/* 检查是否到达任务执行时间 */
|
||||
if (p_app_timer->p_timer_class[i].timer_count == 0)
|
||||
{
|
||||
p_app_timer->p_timer_class[i].run_flag = 1;
|
||||
p_app_timer->p_timer_class[i].timer_count = p_app_timer->p_timer_class[i].timer_reload;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: app_timer_check_time_out
|
||||
* 功能: 检查超时
|
||||
* 参数: time_start - 计时开始时间
|
||||
* time_now - 当前时间
|
||||
* time_out - 超时时间
|
||||
* 返回: TIME_TRUE - 已超时,TIME_FALSE - 未超时
|
||||
* 描述: 检查从time_start开始经过time_out时间后是否超时,
|
||||
* 考虑了计数器溢出的情况
|
||||
*******************************************/
|
||||
u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out)
|
||||
{
|
||||
u16 timer_activate_val;
|
||||
|
||||
/* 计算触发时间 */
|
||||
timer_activate_val = time_out + time_start;
|
||||
|
||||
/* 考虑计数器溢出情况 */
|
||||
if (timer_activate_val > time_start)
|
||||
{
|
||||
/* 未发生溢出 */
|
||||
if ((time_now >= timer_activate_val) || (time_now < time_start))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
}
|
||||
else if ((time_now >= timer_activate_val) && (time_now < time_start))
|
||||
{
|
||||
/* 发生溢出且当前时间在溢出后 */
|
||||
return TIME_TRUE;
|
||||
}
|
||||
|
||||
return TIME_FALSE;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: app_timer_check_run_time
|
||||
* 功能: 计算剩余运行时间
|
||||
* 参数: time_start - 计时开始时间
|
||||
* time_now - 当前时间
|
||||
* time_out - 超时时间
|
||||
* 返回: 剩余时间(毫秒)
|
||||
* 描述: 配合app_timer_check_time_out函数使用,
|
||||
* 计算距离超时还有多少时间,考虑了计数器溢出
|
||||
*******************************************/
|
||||
u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out)
|
||||
{
|
||||
u16 timer_activate_val;
|
||||
|
||||
/* 计算触发时间 */
|
||||
timer_activate_val = time_out + time_start;
|
||||
|
||||
/* 考虑计数器溢出情况 */
|
||||
if (timer_activate_val > time_start)
|
||||
{
|
||||
/* 未发生溢出,直接计算剩余时间 */
|
||||
return (timer_activate_val - time_now);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 发生溢出,计算溢出后的剩余时间 */
|
||||
return (65535U - time_now + timer_activate_val);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: delay_ms
|
||||
* 功能: 阻塞式延时
|
||||
* 参数: delay - 延时时间(毫秒)
|
||||
* 返回: 无
|
||||
* 描述: 使用HAL库提供的延时函数实现阻塞式延时
|
||||
*******************************************/
|
||||
void delay_ms(u16 delay)
|
||||
{
|
||||
HAL_Delay(delay);
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef _APP_TIMER_H_
|
||||
#define _APP_TIMER_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
/* 时间相关宏定义 */
|
||||
#define TIME_TRUE 1U /* 时间已到 */
|
||||
#define TIME_FALSE 0U /* 时间未到 */
|
||||
|
||||
/******************************************
|
||||
* 结构体: app_timer_class_t
|
||||
* 功能: 任务时间片结构体
|
||||
* 描述: 定义单个任务的时间片调度参数
|
||||
*******************************************/
|
||||
typedef struct
|
||||
{
|
||||
u8 run_flag; /* 调度标志,1:调度,0:挂起 */
|
||||
u16 timer_count; /* 时间片计数值 */
|
||||
u16 timer_reload; /* 时间片重载值 */
|
||||
void (*task)(void); /* 任务函数指针 */
|
||||
} app_timer_class_t;
|
||||
|
||||
/******************************************
|
||||
* 结构体: app_timer_t
|
||||
* 功能: 应用定时器结构体
|
||||
* 描述: 管理所有任务的定时调度
|
||||
*******************************************/
|
||||
typedef struct
|
||||
{
|
||||
u16 ms_tick; /* 滴答毫秒级计数器 */
|
||||
u16 s_tick; /* 滴答秒级计数器 */
|
||||
u16 task_num; /* 任务数量 */
|
||||
app_timer_class_t *p_timer_class; /* 任务时间片数组指针 */
|
||||
|
||||
void (*init)(u8, app_timer_class_t *); /* 初始化函数指针 */
|
||||
void (*task)(void); /* 定时器任务函数指针 */
|
||||
void (*increment_int)(u16); /* 中断递增函数指针 */
|
||||
} app_timer_t;
|
||||
|
||||
/* 函数声明 */
|
||||
u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out);
|
||||
u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out);
|
||||
void delay_ms(u16 delay);
|
||||
|
||||
/* 声明外部变量 */
|
||||
extern app_timer_t app_timer;
|
||||
|
||||
#endif
|
||||
@@ -1,121 +0,0 @@
|
||||
#include "os_timer.h"
|
||||
|
||||
unsigned short osTime_MSecTick = 0; /*滴答时钟*/
|
||||
unsigned short osTime_SecTick = 0;
|
||||
unsigned short osTime_10SecTick = 0; /*10s记一次 用于自动调零周期时间记录*/
|
||||
|
||||
static unsigned short osTimer_MSec1 = 0;
|
||||
static unsigned short osTimer_MSec2 = 0;
|
||||
|
||||
unsigned short OsTimeTick_10ms;
|
||||
unsigned short OsTimeTick_50ms;
|
||||
unsigned short OsTimeTick_100ms;
|
||||
unsigned short OsTimeTick_200ms;
|
||||
unsigned short OsTimeTick_500ms;
|
||||
unsigned short OsTimeTick_1s;
|
||||
unsigned short OsTimeTick_2s;
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_Init
|
||||
* CALLED BY: Application
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: None
|
||||
* RETURN VALUES: None
|
||||
* DESCRIPTION: OsTimer initialization
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void OsTimer_Init(void)
|
||||
{
|
||||
osTimer_MSec1 = 0;
|
||||
osTimer_MSec2 = 0;
|
||||
osTime_SecTick = 0;
|
||||
osTime_MSecTick = 0;
|
||||
|
||||
OsTimeTick_10ms = osTime_MSecTick;
|
||||
OsTimeTick_50ms = osTime_MSecTick;
|
||||
OsTimeTick_100ms = osTime_MSecTick;
|
||||
OsTimeTick_200ms = osTime_MSecTick;
|
||||
OsTimeTick_500ms = osTime_MSecTick;
|
||||
OsTimeTick_1s = osTime_MSecTick;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_Increment
|
||||
* CALLED BY: ISR
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: msec - millisecond to increase
|
||||
* RETURN VALUES: None
|
||||
* DESCRIPTION: Increase the Timer
|
||||
*
|
||||
****************************************************************************/
|
||||
void OsTimer_Increment(unsigned short msec)
|
||||
{
|
||||
osTime_MSecTick += msec;
|
||||
osTimer_MSec1 += msec;
|
||||
osTimer_MSec2 += msec;
|
||||
if (osTimer_MSec1 >= 1000U) /*1s*/
|
||||
{
|
||||
osTimer_MSec1 = 0U;
|
||||
osTime_SecTick++;
|
||||
}
|
||||
if (osTimer_MSec2 >= 10000U) /*10s*/
|
||||
{
|
||||
osTimer_MSec2 = 0U;
|
||||
osTime_10SecTick++;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_CheckTimeOut
|
||||
* CALLED BY: Application
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: timeStart - start tick
|
||||
* timeNow - current tick
|
||||
* timeOut - expired tick
|
||||
* RETURN VALUES: whether timer is expired
|
||||
* DESCRIPTION: check if specified time is expired
|
||||
*
|
||||
****************************************************************************/
|
||||
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
|
||||
{
|
||||
unsigned short timerActivateVal;
|
||||
timerActivateVal = timeOut + timeStart;
|
||||
|
||||
if (timerActivateVal > timeStart)
|
||||
{
|
||||
if ((timeNow >= timerActivateVal) || (timeNow < timeStart))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
}
|
||||
else if ((timeNow >= timerActivateVal) && (timeNow < timeStart))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
return TIME_FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
离结束运行还有多少时间 配合OsTimer_CheckTimeOut函数使用
|
||||
*/
|
||||
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
|
||||
{
|
||||
unsigned short timerActivateVal;
|
||||
timerActivateVal = timeOut + timeStart;
|
||||
|
||||
if (timerActivateVal > timeStart)
|
||||
{
|
||||
return (timerActivateVal - timeNow);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (65535U - timeNow + timerActivateVal);
|
||||
}
|
||||
}
|
||||
|
||||
/*阻塞式延时*/
|
||||
void Delay_ms(unsigned short delay)
|
||||
{
|
||||
HAL_Delay(delay);
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
#ifndef _OSTIMER_H_
|
||||
#define _OSTIMER_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define TIME_TRUE 1U
|
||||
#define TIME_FALSE 0U
|
||||
|
||||
|
||||
extern unsigned short osTime_MSecTick;
|
||||
extern unsigned short osTime_SecTick;
|
||||
extern unsigned short osTime_10SecTick; // 10s记一次 用于自动调零周期时间记录
|
||||
|
||||
extern unsigned short OsTimeTick_10ms;
|
||||
extern unsigned short OsTimeTick_50ms;
|
||||
extern unsigned short OsTimeTick_100ms;
|
||||
extern unsigned short OsTimeTick_200ms;
|
||||
extern unsigned short OsTimeTick_500ms;
|
||||
extern unsigned short OsTimeTick_1s;
|
||||
extern unsigned short OsTimeTick_2s;
|
||||
|
||||
void OsTimer_Init(void);
|
||||
void OsTimer_Increment(unsigned short msec);
|
||||
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
|
||||
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
|
||||
|
||||
void Delay_ms(unsigned short delay);
|
||||
|
||||
#endif
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "bsp_74HC4067.h"
|
||||
#include "os_timer.h"
|
||||
|
||||
/*两片74HC4067,一片TX 一片RX 每片16通道*/
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "bsp_Led.h"
|
||||
#include "os_timer.h"
|
||||
#include "app_timer.h"
|
||||
|
||||
#define LED1_ON HAL_GPIO_WritePin (LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)
|
||||
#define LED1_OFF HAL_GPIO_WritePin (LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)
|
||||
@@ -14,25 +14,25 @@
|
||||
#define LED3_TOGGLE HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin)
|
||||
|
||||
|
||||
static void bsp_Led_Init(void);
|
||||
static void bsp_Led_Flash(void);
|
||||
static void bsp_led_init(void);
|
||||
static void bsp_led_task(void);
|
||||
|
||||
bsp_Led_t Led =
|
||||
bsp_led_t led =
|
||||
{
|
||||
.Init = bsp_Led_Init,
|
||||
.Flash = bsp_Led_Flash,
|
||||
.init = bsp_led_init,
|
||||
.task = bsp_led_task,
|
||||
};
|
||||
/*其他外设初始化后快速闪烁,提示初始化完成*/
|
||||
static void bsp_Led_Init(void)
|
||||
static void bsp_led_init(void)
|
||||
{
|
||||
for(u8 i = 0;i < 20;i++)
|
||||
{
|
||||
Delay_ms(50);
|
||||
delay_ms(50);
|
||||
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_Led_Flash(void)
|
||||
static void bsp_led_task(void)
|
||||
{
|
||||
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void (*Init)(void);
|
||||
void (*Flash)(void);
|
||||
}bsp_Led_t;
|
||||
void (*init)(void);
|
||||
void (*task)(void);
|
||||
}bsp_led_t;
|
||||
|
||||
extern bsp_Led_t Led;
|
||||
extern bsp_led_t led;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,396 +0,0 @@
|
||||
#include "bsp_Uart.h"
|
||||
|
||||
#include "string.h"
|
||||
|
||||
//#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_RESET)
|
||||
#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
|
||||
#define RS485_TX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
|
||||
|
||||
/*缓冲收发区*/
|
||||
#define RX_TEMP_BUFF_NUM (3000U)
|
||||
u8 Rx_Temp_Buff[RX_TEMP_BUFF_NUM];
|
||||
|
||||
#define UART1_TX_LEN (3000U)
|
||||
#define UART1_RX_LEN (3000U)
|
||||
|
||||
#define UART2_TX_LEN (3000U)
|
||||
#define UART2_RX_LEN (3000U)
|
||||
|
||||
#define UART4_TX_LEN (3000U)
|
||||
#define UART4_RX_LEN (3000U)
|
||||
|
||||
u8 Uart1_TX_Buff[UART1_TX_LEN];
|
||||
u8 Uart1_Rx_Buff[UART1_RX_LEN];
|
||||
|
||||
u8 Uart2_TX_Buff[UART2_TX_LEN];
|
||||
u8 Uart2_Rx_Buff[UART2_RX_LEN];
|
||||
|
||||
u8 Uart4_TX_Buff[UART4_TX_LEN];
|
||||
u8 Uart4_Rx_Buff[UART4_RX_LEN];
|
||||
|
||||
static void bsp_Uart_Init(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len);
|
||||
static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time);
|
||||
static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart);
|
||||
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern UART_HandleTypeDef huart2;
|
||||
extern UART_HandleTypeDef huart4;
|
||||
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||
extern DMA_HandleTypeDef hdma_usart2_rx;
|
||||
extern DMA_HandleTypeDef hdma_usart2_tx;
|
||||
extern DMA_HandleTypeDef hdma_uart4_rx;
|
||||
extern DMA_HandleTypeDef hdma_uart4_tx;
|
||||
|
||||
bsp_Uart_t COM_Uart1 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART1_RX_LEN),
|
||||
.Uart =&huart1,
|
||||
|
||||
.Tx_DMA = &hdma_usart1_tx,
|
||||
.Rx_DMA = &hdma_usart1_rx,
|
||||
|
||||
.Tx_DMA_Len = UART1_TX_LEN,
|
||||
.Rx_DMA_Len = UART1_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart1_TX_Buff[0],
|
||||
.Rx_Addr = &Uart1_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 0,
|
||||
|
||||
.relay.uart = NULL,
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
bsp_Uart_t COM_Uart2 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART2_RX_LEN),
|
||||
.Uart =&huart2,
|
||||
|
||||
.Tx_DMA = &hdma_usart2_tx,
|
||||
.Rx_DMA = &hdma_usart2_rx,
|
||||
|
||||
.Tx_DMA_Len = UART2_TX_LEN,
|
||||
.Rx_DMA_Len = UART2_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart2_TX_Buff[0],
|
||||
.Rx_Addr = &Uart2_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 0,
|
||||
|
||||
.relay.uart = &COM_Uart4,
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
bsp_Uart_t COM_Uart4 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART4_RX_LEN),
|
||||
.Uart =&huart4,
|
||||
|
||||
.Tx_DMA = &hdma_uart4_tx,
|
||||
.Rx_DMA = &hdma_uart4_rx,
|
||||
|
||||
.Tx_DMA_Len = UART4_TX_LEN,
|
||||
.Rx_DMA_Len = UART4_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart4_TX_Buff[0],
|
||||
.Rx_Addr = &Uart4_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 0,
|
||||
|
||||
.relay.uart = NULL,
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
|
||||
/* 初始化函数 */
|
||||
static void bsp_Uart_Init(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
/*配置数据解析函数*/
|
||||
//p_Uart->Rx_DataAnalysis = NULL;
|
||||
|
||||
/* 启用空闲中断 */
|
||||
__HAL_UART_ENABLE_IT(p_Uart->Uart, UART_IT_IDLE);
|
||||
|
||||
/* 启动DMA接收 */
|
||||
//HAL_UART_Receive_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
|
||||
/* 重新启动接收 */
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
|
||||
}
|
||||
|
||||
|
||||
static void bsp_Uart_DMASend(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
|
||||
{
|
||||
u32 tickstart,tick;
|
||||
p_Uart->Tx_DMA_CompleteFlag = 0;
|
||||
if(p_Uart->Tx_DMA_Len < Len)
|
||||
Len = p_Uart->Tx_DMA_Len;
|
||||
memcpy(p_Uart->Tx_Addr, pData, Len); /*拷贝数据到发送缓冲*/
|
||||
|
||||
// /*阻塞式发送,非阻塞式发送,会导致收发数据时正好切换通道的情况*/
|
||||
// HAL_UART_Transmit(p_Uart->Uart,p_Uart->Tx_Addr,Len,500);
|
||||
|
||||
|
||||
HAL_UART_Transmit_DMA(p_Uart->Uart,p_Uart->Tx_Addr,Len);
|
||||
tickstart = HAL_GetTick();
|
||||
while( !p_Uart->Tx_DMA_CompleteFlag)
|
||||
{
|
||||
tick = HAL_GetTick();
|
||||
if((tick - tickstart) > 200) // 1000ms 超时
|
||||
{
|
||||
p_Uart->Tx_DMA_CompleteFlag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*大数据量发送*/
|
||||
static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
|
||||
{
|
||||
u16 i,SendNum;
|
||||
|
||||
if(p_Uart == &COM_Uart4)
|
||||
RS485_TX;
|
||||
SendNum = Len / p_Uart->Tx_DMA_Len;
|
||||
for(i=0;i<SendNum;i++)
|
||||
{
|
||||
bsp_Uart_DMASend(p_Uart,&pData[p_Uart->Tx_DMA_Len * i], p_Uart->Tx_DMA_Len);
|
||||
}
|
||||
|
||||
/*发送剩余数据*/
|
||||
Len -= p_Uart->Tx_DMA_Len * i;
|
||||
if(0 == Len)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
else
|
||||
{
|
||||
bsp_Uart_DMASend(p_Uart,&pData[p_Uart->Tx_DMA_Len * i],Len);
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Tx_DMA_CompleteFlag = 1;
|
||||
}
|
||||
|
||||
/*空闲接收中断*/
|
||||
static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
u16 Rx_Length, i;
|
||||
/*停止接收*/
|
||||
HAL_UART_DMAStop(p_Uart->Uart);
|
||||
|
||||
/* 计算接收到的数据长度 */
|
||||
Rx_Length = p_Uart->Rx_DMA_Len - __HAL_DMA_GET_COUNTER(p_Uart->Rx_DMA);
|
||||
|
||||
/* 如果长度为0,直接返回 */
|
||||
if (Rx_Length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* 入队 */
|
||||
for (i = 0; i < Rx_Length; i++)
|
||||
{
|
||||
queue_push_back(p_Uart->RxQueue, (void *)&p_Uart->Rx_Addr[i]);
|
||||
}
|
||||
/* 开始计数 */
|
||||
bsp_Uart_Rx_TimeStart(p_Uart);
|
||||
// HAL_UART_Receive_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*中断计数*/
|
||||
static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time)
|
||||
{
|
||||
/*开始计数*/
|
||||
if(1 == p_Uart->Rx_StartFlag)
|
||||
{
|
||||
p_Uart->Rx_TimeCount += Time;
|
||||
}
|
||||
}
|
||||
|
||||
/*开始计数*/
|
||||
static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Rx_StartFlag = 1;
|
||||
p_Uart->Rx_TimeCount = 0;
|
||||
}
|
||||
|
||||
/*停止计数*/
|
||||
static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Rx_StartFlag = 0;
|
||||
p_Uart->Rx_TimeCount = 0;
|
||||
}
|
||||
|
||||
static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
/*超时计数完成,接收到一帧数据*/
|
||||
if(p_Uart->Rx_TimeOver < p_Uart->Rx_TimeCount)
|
||||
{
|
||||
p_Uart->Rx_Len = queue_size(p_Uart->RxQueue);
|
||||
/*停止计数*/
|
||||
bsp_Uart_Rx_TimeStop(p_Uart);
|
||||
if(p_Uart->Rx_Len <= p_Uart->Rx_DMA_Len && (0 != p_Uart->Rx_Len))
|
||||
{
|
||||
if(RX_TEMP_BUFF_NUM < p_Uart->Rx_Len)
|
||||
{
|
||||
queue_clear(p_Uart->RxQueue);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(u16 i = 0;i < p_Uart->Rx_Len;i++)
|
||||
{
|
||||
queue_pop(p_Uart->RxQueue,&Rx_Temp_Buff[i]);
|
||||
}
|
||||
if(NULL != p_Uart->Rx_DataAnalysis)
|
||||
{
|
||||
p_Uart->Rx_DataAnalysis(Rx_Temp_Buff,p_Uart->Rx_Len,p_Uart); /*解析数据*/
|
||||
}
|
||||
// p_Uart->Send(p_Uart,Rx_Temp_Buff,p_Uart->Rx_Len);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 错误回调函数中处理ORE
|
||||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
bsp_Uart_t *p_Uart = NULL;
|
||||
if (huart->Instance == USART1)
|
||||
{
|
||||
p_Uart = &COM_Uart1;
|
||||
}
|
||||
else if (huart->Instance == USART2)
|
||||
{
|
||||
p_Uart = &COM_Uart2;
|
||||
}
|
||||
else if (huart->Instance == UART4)
|
||||
{
|
||||
p_Uart = &COM_Uart4;
|
||||
}
|
||||
|
||||
// 检查具体错误类型
|
||||
if(huart->ErrorCode & HAL_UART_ERROR_NE)
|
||||
{
|
||||
// 处理噪声错误
|
||||
__HAL_UART_CLEAR_NEFLAG(huart);
|
||||
}
|
||||
if(huart->ErrorCode & HAL_UART_ERROR_FE)
|
||||
{
|
||||
// 处理帧错误
|
||||
__HAL_UART_CLEAR_FEFLAG(huart);
|
||||
}
|
||||
// 其他错误处理...
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET)
|
||||
{
|
||||
__HAL_UART_CLEAR_OREFLAG(huart); // 清除ORE标志
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET)
|
||||
{
|
||||
__HAL_UART_CLEAR_FEFLAG(huart); // 清除ORE标志
|
||||
}
|
||||
|
||||
//
|
||||
if(p_Uart != NULL)
|
||||
{
|
||||
// HAL_UART_DeInit(huart);
|
||||
// HAL_UART_Init(huart);
|
||||
// HAL_UART_DMAStop(p_Uart->Uart);
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
|
||||
}
|
||||
}
|
||||
|
||||
// 实现空闲中断回调
|
||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||
{
|
||||
if (huart->Instance == USART1)
|
||||
{
|
||||
bsp_Uart_Rx_IdleInt(&COM_Uart1);
|
||||
}
|
||||
else if (huart->Instance == USART2)
|
||||
{
|
||||
bsp_Uart_Rx_IdleInt(&COM_Uart2);
|
||||
}
|
||||
else if (huart->Instance == UART4)
|
||||
{
|
||||
bsp_Uart_Rx_IdleInt(&COM_Uart4);
|
||||
}
|
||||
}
|
||||
|
||||
/* 串口接收完成回调函数 - 处理空闲中断 */
|
||||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
// if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
|
||||
// {
|
||||
// __HAL_UART_CLEAR_IDLEFLAG(huart);
|
||||
|
||||
// if (huart->Instance == USART1)
|
||||
// {
|
||||
// bsp_Uart_Rx_IdleInt(&COM_Uart1);
|
||||
// }
|
||||
// else if (huart->Instance == USART2)
|
||||
// {
|
||||
// bsp_Uart_Rx_IdleInt(&COM_Uart2);
|
||||
// }
|
||||
// else if (huart->Instance == UART4)
|
||||
// {
|
||||
// bsp_Uart_Rx_IdleInt(&COM_Uart4);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
if (huart->Instance == USART1)
|
||||
{
|
||||
COM_Uart1.Tx_DMA_TCInt(&COM_Uart1);
|
||||
}
|
||||
else if (huart->Instance == USART2)
|
||||
{
|
||||
COM_Uart2.Tx_DMA_TCInt(&COM_Uart2);
|
||||
}
|
||||
else if (huart->Instance == UART4)
|
||||
{
|
||||
RS485_RX;
|
||||
COM_Uart4.Tx_DMA_TCInt(&COM_Uart4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
#ifndef _BSP_UART_H_
|
||||
#define _BSP_UART_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "algo_Queue.h"
|
||||
|
||||
typedef struct bsp_Uart_t bsp_Uart_t;
|
||||
|
||||
|
||||
#define usart_type UART_HandleTypeDef
|
||||
#define dma_type DMA_HandleTypeDef
|
||||
|
||||
/*串口转发*/
|
||||
typedef struct
|
||||
{
|
||||
u8 flag; /*串口转发标志位*/
|
||||
bsp_Uart_t *uart; /*转发出去的串口*/
|
||||
u16 time_out; /*转发超时时间*/
|
||||
}bsp_uart_relay_t;
|
||||
|
||||
struct bsp_Uart_t
|
||||
{
|
||||
queue RxQueue; /*数据接收队列*/
|
||||
usart_type *Uart; /*串口*/
|
||||
|
||||
dma_type *Tx_DMA; /*DMA*/
|
||||
dma_type *Rx_DMA;
|
||||
|
||||
u8 Tx_DMA_CH;
|
||||
u8 Rx_DMA_CH;
|
||||
vu8 Tx_DMA_CompleteFlag; /*DMA接受完成标志位*/
|
||||
|
||||
u8 *Tx_Addr; /*DMA搬运缓冲*/
|
||||
u8 *Rx_Addr;
|
||||
u16 Tx_DMA_Len;
|
||||
u16 Rx_DMA_Len;
|
||||
|
||||
u16 Rx_Len; /*接收到的数据长度*/
|
||||
u16 Rx_TimeCount; /*超时计数*/
|
||||
u16 Rx_TimeOver; /*超时时间*/
|
||||
u8 Rx_StartFlag; /*开始超时计数标志位*/
|
||||
|
||||
|
||||
bsp_uart_relay_t relay; /*串口转发*/
|
||||
void (*Init)(bsp_Uart_t *); /*初始化*/
|
||||
void (*Send)(bsp_Uart_t *,u8 *,u16); /*串口发送函数*/
|
||||
|
||||
void (*Tx_DMA_TCInt)(bsp_Uart_t *); /*DMA发送完成中断*/
|
||||
|
||||
void (*Rx_IdleInt)(bsp_Uart_t *); /*空闲中断*/
|
||||
void (*Rx_TimeIncrementInt)(bsp_Uart_t *,u16); /*中断计数计数*/
|
||||
void (*Rx_DataAnalysis)(u8 *,u16,void *); /*数据解析*/
|
||||
void (*Rx_Task)(bsp_Uart_t *); /*串口接收任务*/
|
||||
};
|
||||
|
||||
extern bsp_Uart_t COM_Uart1;
|
||||
extern bsp_Uart_t COM_Uart2;
|
||||
extern bsp_Uart_t COM_Uart4;
|
||||
#endif
|
||||
@@ -0,0 +1,489 @@
|
||||
#include "bsp_uart.h"
|
||||
#include "string.h"
|
||||
|
||||
/* RS485控制宏定义 */
|
||||
#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
|
||||
#define RS485_TX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
|
||||
|
||||
/* 缓冲收发区大小 */
|
||||
#define RX_TEMP_BUFF_NUM (3000U)
|
||||
|
||||
/* UART缓冲区大小定义 */
|
||||
#define UART1_TX_LEN (3000U)
|
||||
#define UART1_RX_LEN (3000U)
|
||||
|
||||
#define UART2_TX_LEN (3000U)
|
||||
#define UART2_RX_LEN (3000U)
|
||||
|
||||
#define UART4_TX_LEN (3000U)
|
||||
#define UART4_RX_LEN (3000U)
|
||||
|
||||
/* 全局缓冲区变量 */
|
||||
u8 uart1_tx_buff[UART1_TX_LEN];
|
||||
u8 uart1_rx_buff[UART1_RX_LEN];
|
||||
|
||||
u8 uart2_tx_buff[UART2_TX_LEN];
|
||||
u8 uart2_rx_buff[UART2_RX_LEN];
|
||||
|
||||
u8 uart4_tx_buff[UART4_TX_LEN];
|
||||
u8 uart4_rx_buff[UART4_RX_LEN];
|
||||
|
||||
u8 rx_temp_buff[RX_TEMP_BUFF_NUM];
|
||||
|
||||
/* 函数声明 */
|
||||
static void bsp_uart_init(bsp_uart_t *p_uart);
|
||||
static void bsp_uart_send(bsp_uart_t *p_uart, u8 *p_data, u16 len);
|
||||
static void bsp_uart_rx_idle_int(bsp_uart_t *p_uart);
|
||||
static void bsp_uart_rx_time_increment(bsp_uart_t *p_uart, u16 time);
|
||||
static void bsp_uart_rx_task(bsp_uart_t *p_uart);
|
||||
static void bsp_uart_rx_time_start(bsp_uart_t *p_uart);
|
||||
static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart);
|
||||
static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len);
|
||||
|
||||
/* 外部HAL句柄声明 */
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern UART_HandleTypeDef huart2;
|
||||
extern UART_HandleTypeDef huart4;
|
||||
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||
extern DMA_HandleTypeDef hdma_usart2_rx;
|
||||
extern DMA_HandleTypeDef hdma_usart2_tx;
|
||||
extern DMA_HandleTypeDef hdma_uart4_rx;
|
||||
extern DMA_HandleTypeDef hdma_uart4_tx;
|
||||
|
||||
/******************************************
|
||||
* 结构体: com_uart1
|
||||
* 功能: UART1控制实例
|
||||
* 描述: 定义UART1的硬件参数和回调函数
|
||||
*******************************************/
|
||||
bsp_uart_t com_uart1 =
|
||||
{
|
||||
.rx_queue = queue(u8, UART1_RX_LEN),
|
||||
.uart = &huart1,
|
||||
|
||||
.tx_dma = &hdma_usart1_tx,
|
||||
.rx_dma = &hdma_usart1_rx,
|
||||
|
||||
.tx_dma_len = UART1_TX_LEN,
|
||||
.rx_dma_len = UART1_RX_LEN,
|
||||
|
||||
.tx_addr = &uart1_tx_buff[0],
|
||||
.rx_addr = &uart1_rx_buff[0],
|
||||
|
||||
.tx_dma_complete_flag = 1,
|
||||
.rx_time_over = 0,
|
||||
|
||||
.relay.uart = NULL,
|
||||
|
||||
.init = bsp_uart_init,
|
||||
.send = bsp_uart_send,
|
||||
|
||||
.tx_dma_tc_int = bsp_uart_tx_dma_tc_int,
|
||||
.rx_idle_int = bsp_uart_rx_idle_int,
|
||||
.rx_time_increment_int = bsp_uart_rx_time_increment,
|
||||
.rx_data_analysis = NULL,
|
||||
.rx_task = bsp_uart_rx_task,
|
||||
};
|
||||
|
||||
/******************************************
|
||||
* 结构体: com_uart2
|
||||
* 功能: UART2控制实例
|
||||
* 描述: 定义UART2的硬件参数和回调函数
|
||||
*******************************************/
|
||||
bsp_uart_t com_uart2 =
|
||||
{
|
||||
.rx_queue = queue(u8, UART2_RX_LEN),
|
||||
.uart = &huart2,
|
||||
|
||||
.tx_dma = &hdma_usart2_tx,
|
||||
.rx_dma = &hdma_usart2_rx,
|
||||
|
||||
.tx_dma_len = UART2_TX_LEN,
|
||||
.rx_dma_len = UART2_RX_LEN,
|
||||
|
||||
.tx_addr = &uart2_tx_buff[0],
|
||||
.rx_addr = &uart2_rx_buff[0],
|
||||
|
||||
.tx_dma_complete_flag = 1,
|
||||
.rx_time_over = 0,
|
||||
|
||||
.relay.uart = &com_uart4,
|
||||
|
||||
.init = bsp_uart_init,
|
||||
.send = bsp_uart_send,
|
||||
.tx_dma_tc_int = bsp_uart_tx_dma_tc_int,
|
||||
.rx_idle_int = bsp_uart_rx_idle_int,
|
||||
.rx_time_increment_int = bsp_uart_rx_time_increment,
|
||||
.rx_data_analysis = NULL,
|
||||
.rx_task = bsp_uart_rx_task,
|
||||
};
|
||||
|
||||
/******************************************
|
||||
* 结构体: com_uart4
|
||||
* 功能: UART4控制实例
|
||||
* 描述: 定义UART4的硬件参数和回调函数
|
||||
*******************************************/
|
||||
bsp_uart_t com_uart4 =
|
||||
{
|
||||
.rx_queue = queue(u8, UART4_RX_LEN),
|
||||
.uart = &huart4,
|
||||
|
||||
.tx_dma = &hdma_uart4_tx,
|
||||
.rx_dma = &hdma_uart4_rx,
|
||||
|
||||
.tx_dma_len = UART4_TX_LEN,
|
||||
.rx_dma_len = UART4_RX_LEN,
|
||||
|
||||
.tx_addr = &uart4_tx_buff[0],
|
||||
.rx_addr = &uart4_rx_buff[0],
|
||||
|
||||
.tx_dma_complete_flag = 1,
|
||||
.rx_time_over = 0,
|
||||
|
||||
.relay.uart = NULL,
|
||||
|
||||
.init = bsp_uart_init,
|
||||
.send = bsp_uart_send,
|
||||
.tx_dma_tc_int = bsp_uart_tx_dma_tc_int,
|
||||
.rx_idle_int = bsp_uart_rx_idle_int,
|
||||
.rx_time_increment_int = bsp_uart_rx_time_increment,
|
||||
.rx_data_analysis = NULL,
|
||||
.rx_task = bsp_uart_rx_task,
|
||||
};
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_init
|
||||
* 功能: UART初始化
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* 返回: 无
|
||||
* 描述: 初始化UART,使能空闲中断和DMA接收
|
||||
*******************************************/
|
||||
static void bsp_uart_init(bsp_uart_t *p_uart)
|
||||
{
|
||||
/* 启用空闲中断 */
|
||||
__HAL_UART_ENABLE_IT(p_uart->uart, UART_IT_IDLE);
|
||||
|
||||
/* 重新启动接收,使用空闲中断模式 */
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_dma_send
|
||||
* 功能: DMA发送函数
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* p_data - 要发送的数据指针
|
||||
* len - 要发送的数据长度
|
||||
* 返回: 无
|
||||
* 描述: 使用DMA发送数据,带有超时检测
|
||||
*******************************************/
|
||||
static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len)
|
||||
{
|
||||
u32 tick_start, tick;
|
||||
|
||||
p_uart->tx_dma_complete_flag = 0;
|
||||
|
||||
/* 如果请求发送的长度大于缓冲区长度,则截断 */
|
||||
if(p_uart->tx_dma_len < len)
|
||||
len = p_uart->tx_dma_len;
|
||||
|
||||
/* 拷贝数据到发送缓冲区 */
|
||||
memcpy(p_uart->tx_addr, p_data, len);
|
||||
|
||||
/* 启动DMA发送 */
|
||||
HAL_UART_Transmit_DMA(p_uart->uart, p_uart->tx_addr, len);
|
||||
|
||||
/* 等待发送完成,带超时检测 */
|
||||
tick_start = HAL_GetTick();
|
||||
while(!p_uart->tx_dma_complete_flag)
|
||||
{
|
||||
tick = HAL_GetTick();
|
||||
if((tick - tick_start) > 200) /* 200ms超时 */
|
||||
{
|
||||
p_uart->tx_dma_complete_flag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_send
|
||||
* 功能: UART发送函数
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* p_data - 要发送的数据指针
|
||||
* len - 要发送的数据长度
|
||||
* 返回: 无
|
||||
* 描述: 大数据量发送函数,支持分块发送
|
||||
*******************************************/
|
||||
static void bsp_uart_send(bsp_uart_t *p_uart, u8 *p_data, u16 len)
|
||||
{
|
||||
u16 i, send_num;
|
||||
|
||||
/* RS485切换到发送模式 */
|
||||
if(p_uart == &com_uart4)
|
||||
RS485_TX;
|
||||
|
||||
/* 计算需要发送的次数 */
|
||||
send_num = len / p_uart->tx_dma_len;
|
||||
|
||||
/* 分块发送数据 */
|
||||
for(i = 0; i < send_num; i++)
|
||||
{
|
||||
bsp_uart_dma_send(p_uart, &p_data[p_uart->tx_dma_len * i], p_uart->tx_dma_len);
|
||||
}
|
||||
|
||||
/* 发送剩余数据 */
|
||||
len -= p_uart->tx_dma_len * i;
|
||||
if(0 == len)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
bsp_uart_dma_send(p_uart, &p_data[p_uart->tx_dma_len * i], len);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_tx_dma_tc_int
|
||||
* 功能: DMA发送完成中断处理
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* 返回: 无
|
||||
* 描述: 在DMA发送完成中断中调用,设置发送完成标志
|
||||
*******************************************/
|
||||
static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart)
|
||||
{
|
||||
p_uart->tx_dma_complete_flag = 1;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_rx_idle_int
|
||||
* 功能: 空闲中断处理
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* 返回: 无
|
||||
* 描述: 处理UART空闲中断,将接收到的数据存入队列
|
||||
*******************************************/
|
||||
static void bsp_uart_rx_idle_int(bsp_uart_t *p_uart)
|
||||
{
|
||||
u16 rx_length, i;
|
||||
|
||||
/* 停止接收 */
|
||||
HAL_UART_DMAStop(p_uart->uart);
|
||||
|
||||
/* 计算接收到的数据长度 */
|
||||
rx_length = p_uart->rx_dma_len - __HAL_DMA_GET_COUNTER(p_uart->rx_dma);
|
||||
|
||||
/* 如果长度为0,直接返回 */
|
||||
if (rx_length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* 将接收到的数据存入队列 */
|
||||
for (i = 0; i < rx_length; i++)
|
||||
{
|
||||
queue_push_back(p_uart->rx_queue, (void *)&p_uart->rx_addr[i]);
|
||||
}
|
||||
|
||||
/* 开始接收超时计时 */
|
||||
bsp_uart_rx_time_start(p_uart);
|
||||
|
||||
/* 重新启动接收 */
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_rx_time_increment
|
||||
* 功能: 接收超时时间递增
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* time - 增加的时间值
|
||||
* 返回: 无
|
||||
* 描述: 在中断中调用,递增接收超时计数器
|
||||
*******************************************/
|
||||
static void bsp_uart_rx_time_increment(bsp_uart_t *p_uart, u16 time)
|
||||
{
|
||||
/* 如果已经开始计数,则增加时间 */
|
||||
if(1 == p_uart->rx_start_flag)
|
||||
{
|
||||
p_uart->rx_time_count += time;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_rx_time_start
|
||||
* 功能: 启动接收超时计时
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* 返回: 无
|
||||
* 描述: 开始接收超时计数
|
||||
*******************************************/
|
||||
static void bsp_uart_rx_time_start(bsp_uart_t *p_uart)
|
||||
{
|
||||
p_uart->rx_start_flag = 1;
|
||||
p_uart->rx_time_count = 0;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_rx_time_stop
|
||||
* 功能: 停止接收超时计时
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* 返回: 无
|
||||
* 描述: 停止接收超时计数
|
||||
*******************************************/
|
||||
static void bsp_uart_rx_time_stop(bsp_uart_t *p_uart)
|
||||
{
|
||||
p_uart->rx_start_flag = 0;
|
||||
p_uart->rx_time_count = 0;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: bsp_uart_rx_task
|
||||
* 功能: UART接收任务
|
||||
* 参数: p_uart - 指向UART结构体的指针
|
||||
* 返回: 无
|
||||
* 描述: 检查接收超时,处理接收到的数据帧
|
||||
*******************************************/
|
||||
static void bsp_uart_rx_task(bsp_uart_t *p_uart)
|
||||
{
|
||||
/* 检查是否超时,接收到一帧数据 */
|
||||
if(p_uart->rx_time_over < p_uart->rx_time_count)
|
||||
{
|
||||
/* 获取队列中数据长度 */
|
||||
p_uart->rx_len = queue_size(p_uart->rx_queue);
|
||||
|
||||
/* 停止计时 */
|
||||
bsp_uart_rx_time_stop(p_uart);
|
||||
|
||||
/* 检查数据长度是否有效 */
|
||||
if(p_uart->rx_len <= p_uart->rx_dma_len && (0 != p_uart->rx_len))
|
||||
{
|
||||
/* 如果数据长度超过临时缓冲区大小,则清空队列 */
|
||||
if(RX_TEMP_BUFF_NUM < p_uart->rx_len)
|
||||
{
|
||||
queue_clear(p_uart->rx_queue);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 从队列中取出数据到临时缓冲区 */
|
||||
for(u16 i = 0; i < p_uart->rx_len; i++)
|
||||
{
|
||||
queue_pop(p_uart->rx_queue, &rx_temp_buff[i]);
|
||||
}
|
||||
|
||||
/* 如果有数据解析函数,则调用解析函数 */
|
||||
if(NULL != p_uart->rx_data_analysis)
|
||||
{
|
||||
p_uart->rx_data_analysis(rx_temp_buff, p_uart->rx_len, p_uart);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 错误回调函数中处理ORE
|
||||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
bsp_uart_t *p_uart = NULL;
|
||||
if (huart->Instance == USART1)
|
||||
{
|
||||
p_uart = &com_uart1;
|
||||
}
|
||||
else if (huart->Instance == USART2)
|
||||
{
|
||||
p_uart = &com_uart2;
|
||||
}
|
||||
else if (huart->Instance == UART4)
|
||||
{
|
||||
p_uart = &com_uart4;
|
||||
}
|
||||
|
||||
// 检查具体错误类型
|
||||
if(huart->ErrorCode & HAL_UART_ERROR_NE)
|
||||
{
|
||||
// 处理噪声错误
|
||||
__HAL_UART_CLEAR_NEFLAG(huart);
|
||||
}
|
||||
if(huart->ErrorCode & HAL_UART_ERROR_FE)
|
||||
{
|
||||
// 处理帧错误
|
||||
__HAL_UART_CLEAR_FEFLAG(huart);
|
||||
}
|
||||
// 其他错误处理...
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET)
|
||||
{
|
||||
__HAL_UART_CLEAR_OREFLAG(huart); // 清除ORE标志
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET)
|
||||
{
|
||||
__HAL_UART_CLEAR_FEFLAG(huart); // 清除ORE标志
|
||||
}
|
||||
|
||||
//
|
||||
if(p_uart != NULL)
|
||||
{
|
||||
// HAL_UART_DeInit(huart);
|
||||
// HAL_UART_Init(huart);
|
||||
// HAL_UART_DMAStop(p_Uart->Uart);
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
|
||||
}
|
||||
}
|
||||
|
||||
// 实现空闲中断回调
|
||||
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||
{
|
||||
if (huart->Instance == USART1)
|
||||
{
|
||||
bsp_uart_rx_idle_int(&com_uart1);
|
||||
}
|
||||
else if (huart->Instance == USART2)
|
||||
{
|
||||
bsp_uart_rx_idle_int(&com_uart2);
|
||||
}
|
||||
else if (huart->Instance == UART4)
|
||||
{
|
||||
bsp_uart_rx_idle_int(&com_uart4);
|
||||
}
|
||||
}
|
||||
|
||||
/* 串口接收完成回调函数 - 处理空闲中断 */
|
||||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
// if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
|
||||
// {
|
||||
// __HAL_UART_CLEAR_IDLEFLAG(huart);
|
||||
|
||||
// if (huart->Instance == USART1)
|
||||
// {
|
||||
// bsp_Uart_Rx_IdleInt(&COM_Uart1);
|
||||
// }
|
||||
// else if (huart->Instance == USART2)
|
||||
// {
|
||||
// bsp_Uart_Rx_IdleInt(&COM_Uart2);
|
||||
// }
|
||||
// else if (huart->Instance == UART4)
|
||||
// {
|
||||
// bsp_Uart_Rx_IdleInt(&COM_Uart4);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
|
||||
{
|
||||
if (huart->Instance == USART1)
|
||||
{
|
||||
bsp_uart_tx_dma_tc_int(&com_uart1);
|
||||
}
|
||||
else if (huart->Instance == USART2)
|
||||
{
|
||||
bsp_uart_tx_dma_tc_int(&com_uart2);
|
||||
}
|
||||
else if (huart->Instance == UART4)
|
||||
{
|
||||
bsp_uart_tx_dma_tc_int(&com_uart2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
#ifndef _BSP_UART_H_
|
||||
#define _BSP_UART_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "algo_queue.h"
|
||||
|
||||
/******************************************
|
||||
* 结构体: bsp_uart_t
|
||||
* 功能: UART控制结构体
|
||||
* 描述: 包含UART的所有配置和状态信息
|
||||
*******************************************/
|
||||
typedef struct bsp_uart_t bsp_uart_t;
|
||||
|
||||
/* 类型重定义 */
|
||||
#define usart_type UART_HandleTypeDef
|
||||
#define dma_type DMA_HandleTypeDef
|
||||
|
||||
/******************************************
|
||||
* 结构体: bsp_uart_relay_t
|
||||
* 功能: UART转发结构体
|
||||
* 描述: 用于配置UART数据转发功能
|
||||
*******************************************/
|
||||
typedef struct
|
||||
{
|
||||
u8 flag; /* 串口转发标志位 */
|
||||
bsp_uart_t *uart; /* 转发出去的串口指针 */
|
||||
u16 time_out; /* 转发超时时间 */
|
||||
} bsp_uart_relay_t;
|
||||
|
||||
struct bsp_uart_t
|
||||
{
|
||||
queue rx_queue; /* 数据接收队列 */
|
||||
usart_type *uart; /* 串口句柄指针 */
|
||||
|
||||
dma_type *tx_dma; /* 发送DMA句柄 */
|
||||
dma_type *rx_dma; /* 接收DMA句柄 */
|
||||
|
||||
u8 tx_dma_ch; /* 发送DMA通道号 */
|
||||
u8 rx_dma_ch; /* 接收DMA通道号 */
|
||||
vu8 tx_dma_complete_flag; /* DMA接收完成标志位 */
|
||||
|
||||
u8 *tx_addr; /* DMA发送缓冲区地址 */
|
||||
u8 *rx_addr; /* DMA接收缓冲区地址 */
|
||||
u16 tx_dma_len; /* DMA发送缓冲区长度 */
|
||||
u16 rx_dma_len; /* DMA接收缓冲区长度 */
|
||||
|
||||
u16 rx_len; /* 接收到的数据长度 */
|
||||
u16 rx_time_count; /* 超时计数 */
|
||||
u16 rx_time_over; /* 超时时间 */
|
||||
u8 rx_start_flag; /* 开始超时计数标志位 */
|
||||
|
||||
bsp_uart_relay_t relay; /* 串口转发配置 */
|
||||
|
||||
void (*init)(bsp_uart_t *); /* 初始化函数指针 */
|
||||
void (*send)(bsp_uart_t *, u8 *, u16); /* 串口发送函数指针 */
|
||||
|
||||
void (*tx_dma_tc_int)(bsp_uart_t *); /* DMA发送完成中断处理函数指针 */
|
||||
|
||||
void (*rx_idle_int)(bsp_uart_t *); /* 空闲中断处理函数指针 */
|
||||
void (*rx_time_increment_int)(bsp_uart_t *, u16); /* 中断计数函数指针 */
|
||||
void (*rx_data_analysis)(u8 *, u16, void *); /* 数据解析函数指针 */
|
||||
void (*rx_task)(bsp_uart_t *); /* 串口接收任务函数指针 */
|
||||
};
|
||||
|
||||
/* 声明外部变量 */
|
||||
extern bsp_uart_t com_uart1;
|
||||
extern bsp_uart_t com_uart2;
|
||||
extern bsp_uart_t com_uart4;
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,155 +0,0 @@
|
||||
#ifndef __TJCUSARTHMI_H_
|
||||
#define __TJCUSARTHMI_H_
|
||||
|
||||
#include "stm32f4xx.h"
|
||||
#include "main.h" // 包含 HAL 库头文件
|
||||
#include "bsp_Uart.h"
|
||||
#include "bsp_Flash.h" // 添加Flash操作支持
|
||||
|
||||
// 定义使用的串口句柄(在main.c中定义的huart2)
|
||||
extern UART_HandleTypeDef huart2;
|
||||
|
||||
// 定义串口屏使用的串口
|
||||
#define TJC_UART huart2
|
||||
|
||||
// 环形缓冲区长度
|
||||
#define RINGBUFF_LEN (500)
|
||||
|
||||
// 指令结束符(TJC串口屏协议)
|
||||
#define TJC_END_BYTES 0xFF
|
||||
|
||||
// 最大指令长度
|
||||
#define MAX_COMMAND_LEN 200 // 增加长度以适应设备信息
|
||||
|
||||
// 自定义指令定义
|
||||
#define CUSTOM_CMD_HEADER_0 0xAA
|
||||
#define CUSTOM_CMD_HEADER_1 0x55
|
||||
|
||||
// 指令类型
|
||||
#define CMD_DISPLAY_DATA 0x02 // 显示数据
|
||||
#define CMD_ALARM 0x03 // 报警
|
||||
#define CMD_DELETE_DEVICE 0x04 // 删除设备
|
||||
|
||||
// 显示数据子命令
|
||||
#define SUB_CMD_SHOW_DEVICES 0x01 // 显示已添加的设备
|
||||
#define SUB_CMD_REGION_STATS 0x02 // 主界面区域显示
|
||||
#define SUB_CMD_REGION1_DEVICES 0x03 // 第一个区域设备
|
||||
#define SUB_CMD_REGION2_DEVICES 0x04 // 第二个区域设备
|
||||
#define SUB_CMD_REGION3_DEVICES 0x05 // 第三个区域设备
|
||||
#define SUB_CMD_REGION4_DEVICES 0x06 // 第四个区域设备
|
||||
|
||||
// 报警子命令
|
||||
#define SUB_CMD_HISTORY_ALARM 0x01 // 历史报警
|
||||
#define SUB_CMD_REALTIME_ALARM 0x02 // 实时报警
|
||||
|
||||
// 添加设备指令识别
|
||||
#define ADD_DEVICE_CMD_BYTE 0x43 // 'C'的ASCII码
|
||||
|
||||
// 分隔符
|
||||
#define DATA_SEPARATOR 0xAA
|
||||
|
||||
// 通信状态枚举
|
||||
typedef enum {
|
||||
COMM_STATUS_NORMAL = 0, // 正常
|
||||
COMM_STATUS_ABNORMAL // 异常
|
||||
} CommStatus;
|
||||
|
||||
// 漏液状态枚举
|
||||
typedef enum {
|
||||
LEAK_NORMAL = 0, // 正常
|
||||
LEAK_ABNORMAL // 漏液
|
||||
} LeakStatus;
|
||||
|
||||
// 断带状态枚举
|
||||
typedef enum {
|
||||
BREAK_NORMAL = 0, // 正常
|
||||
BREAK_ABNORMAL // 断带
|
||||
} BreakStatus;
|
||||
|
||||
// 通道状态结构体
|
||||
typedef struct {
|
||||
LeakStatus leak_status; // 漏液状态
|
||||
BreakStatus break_status; // 断带状态
|
||||
int leak_meter; // 漏液米数(如果漏液状态为漏液,则显示具体米数,否则显示0)
|
||||
} ChannelStatus;
|
||||
|
||||
// 报警类型枚举
|
||||
typedef enum {
|
||||
ALARM_LEAK = 0, // 漏液
|
||||
ALARM_BREAK, // 断带
|
||||
ALARM_COMM // 通信异常
|
||||
} AlarmType;
|
||||
|
||||
// 设备信息结构体
|
||||
typedef struct {
|
||||
uint8_t port; // 端口号
|
||||
char region[20]; // 区域名(英文)
|
||||
uint8_t device_id; // 设备ID (1-254)
|
||||
char device_name[20]; // 设备名(英文)
|
||||
LeakStatus leak_status; // 漏液状态
|
||||
BreakStatus break_status; // 断带状态
|
||||
CommStatus comm_status; // 通信状态
|
||||
ChannelStatus channels[4]; // 四个通道的状态
|
||||
} DeviceInfo;
|
||||
|
||||
// 报警信息结构体
|
||||
typedef struct {
|
||||
char region[20]; // 设备区域
|
||||
uint8_t device_id; // 设备ID
|
||||
char device_name[20]; // 设备名称
|
||||
AlarmType alarm_type; // 报警类型
|
||||
char start_time[20]; // 开始时间
|
||||
char end_time[20]; // 结束时间
|
||||
} AlarmInfo;
|
||||
|
||||
// 区域统计结构体
|
||||
typedef struct {
|
||||
char region_name[20]; // 区域名
|
||||
uint8_t total_devices; // 总设备数量
|
||||
uint8_t leak_devices; // 漏液设备数量
|
||||
uint8_t break_devices; // 断带设备数量
|
||||
uint8_t comm_devices; // 通信异常设备数量
|
||||
} RegionStats;
|
||||
|
||||
// 外部可调用函数的声明
|
||||
void TJC_Init(bsp_Uart_t *pUart);
|
||||
void TJC_SendData(uint8_t *data, uint16_t len);
|
||||
void TJCPrintf(const char *cmd, ...);
|
||||
|
||||
// 环形缓冲区相关函数
|
||||
uint16_t TJC_CleanBufferFromInvalidPatterns(void);
|
||||
void initRingBuffer(void);
|
||||
void writeRingBuff(uint8_t data);
|
||||
void deleteRingBuff(uint16_t size);
|
||||
uint16_t getRingBuffLength(void);
|
||||
uint8_t read1BFromRingBuff(uint16_t position);
|
||||
uint8_t isRingBuffOverflow(void);
|
||||
|
||||
// 指令处理相关函数
|
||||
void TJC_ProcessCommand(uint8_t *cmd, uint16_t len);
|
||||
uint8_t TJC_CheckEndBytes(uint8_t *data, uint16_t len, uint16_t *end_pos);
|
||||
void TJC_SendResponse(const char *response);
|
||||
void TJC_ProcessSerialData(u8 *data, u16 len, void *p_arg);
|
||||
void TJC_DeleteDevices(uint8_t *delete_flags, uint8_t flag_count);
|
||||
void TJC_ProcessDeleteCommand(uint8_t *cmd, uint16_t len);
|
||||
|
||||
/*测试发送历史报警数据*/
|
||||
void TJC_SendInitCommands(void);
|
||||
|
||||
// 新增函数声明
|
||||
uint16_t CalculateCRC16(uint8_t *data, uint16_t length);
|
||||
void TJC_ProcessCustomCommand(uint8_t *cmd, uint16_t len);
|
||||
void TJC_SendAlarmHistory(void);
|
||||
void TJC_SendRealtimeAlarms(void);
|
||||
void TJC_SendDeviceList(void);
|
||||
uint8_t TJC_AddDeviceToFlash(uint8_t *data, uint16_t len);
|
||||
void TJC_SendRegionStats(void); // 新增:发送区域统计
|
||||
void TJC_SendRegionDeviceDetails(uint8_t region_index);
|
||||
|
||||
// 宏定义简化
|
||||
#define usize getRingBuffLength()
|
||||
#define code_c() initRingBuffer()
|
||||
#define udelete(x) deleteRingBuff(x)
|
||||
#define u(x) read1BFromRingBuff(x)
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,604 @@
|
||||
#include "GUI_tjc_hmi.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "proto_modbus_lib.h"
|
||||
|
||||
|
||||
#include "bsp_Flash.h" // 添加Flash操作
|
||||
#include "bsp_uart.h"
|
||||
|
||||
#include "app_leakage.h"
|
||||
|
||||
/*串口发送缓冲区*/
|
||||
#define HMI_TX_BUFFER_NUM (2048)
|
||||
/*字符发送拼接 缓冲区*/
|
||||
#define GUI_TJC_HMI_TEXT_BUFFER_NUM (256)
|
||||
|
||||
/*帧头*/
|
||||
#define HMI_PROTO_FRAME_HEADER1 (0xAA)
|
||||
#define HMI_PROTO_FRAME_HEADER2 (0x55)
|
||||
/*操作*/
|
||||
#define HMI_PROTO_CMD_GET (0x03) /*获取数据数据*/
|
||||
#define HMI_PROTO_CMD_SET (0x10) /*设置信息*/
|
||||
/*界面*/
|
||||
#define HMI_PROTO_GUI_MAIN (0x10)/*主界面 */
|
||||
#define HMI_PROTO_GUI_CURR_ALARM (0x11)/*实时报警界面 */
|
||||
#define HMI_PROTO_GUI_DETAIL_MAIN (0x12)/*主界面_详细信息 */
|
||||
#define HMI_PROTO_GUI_LOGIN (0x13)/*登录界面 */
|
||||
#define HMI_PROTO_GUI_HISTORY_ALARM (0x14)/*历史报警界面 */
|
||||
#define HMI_PROTO_GUI_TCP_CONFIG (0x15)/*网络配置界面 */
|
||||
#define HMI_PROTO_GUI_DEVICE_CONFIG (0x16)/*设备配置界面 */
|
||||
#define HMI_PROTO_GUI_HELP (0x17)/*帮助界面 */
|
||||
|
||||
#define HMI_PROTO_ASCII_RX_DELINITER (0xAA)/*接收分隔符*/
|
||||
|
||||
#define HMI_PROTO_ASCII_TX_DELINITER (0xFF)/*发送分隔符*/
|
||||
#define HMI_PROTO_ASCII_TX_DELINITER_NUM (3)/*发送分隔符数量*/
|
||||
|
||||
|
||||
static void gui_tjc_hmi_init(void);
|
||||
static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart);
|
||||
|
||||
/*串口发送缓冲区*/
|
||||
static u8 hmi_tx_buffer[HMI_TX_BUFFER_NUM];
|
||||
/*字符发送拼接 缓冲区*/
|
||||
static char gui_tjc_hmi_text_buffer[GUI_TJC_HMI_TEXT_BUFFER_NUM];
|
||||
/*字符名称 端口号*/
|
||||
static char *hmi_proto_string_com[] =
|
||||
{
|
||||
"COM1",
|
||||
"COM2",
|
||||
"COM3",
|
||||
"COM4"
|
||||
};
|
||||
|
||||
/*字符名称 波特率*/
|
||||
static char *hmi_proto_string_baudrate[] =
|
||||
{
|
||||
"4800",
|
||||
"9600",
|
||||
"19200",
|
||||
"57600",
|
||||
"115200",
|
||||
};
|
||||
|
||||
|
||||
static bsp_uart_t * p_rx_uart = NULL;
|
||||
|
||||
gui_tjc_hmi_t tjc_hmi =
|
||||
{
|
||||
.init = gui_tjc_hmi_init,
|
||||
};
|
||||
|
||||
gui_tjc_hmi_t *p_tjc_hmi = &tjc_hmi;
|
||||
|
||||
|
||||
|
||||
/*屏幕协议初始化*/
|
||||
static void gui_tjc_hmi_init(void)
|
||||
{
|
||||
com_uart1.rx_data_analysis = gui_tjc_hmi_communication_data_analysis;
|
||||
}
|
||||
|
||||
|
||||
/*发送接口*/
|
||||
static void gui_tjc_hmi_data_send(u8 *p_data,u16 len)
|
||||
{
|
||||
if(p_rx_uart != NULL)
|
||||
{
|
||||
p_rx_uart->send(p_rx_uart,p_data,len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*设置对应的控件
|
||||
x:第几行
|
||||
y:第几个
|
||||
buffer:写入的buffer
|
||||
format:格式化输入
|
||||
...:不定长
|
||||
*/
|
||||
static u16 gui_tjc_hmi_tx_text_display(u16 x,u16 y,char *buffer,const char *format,...)
|
||||
{
|
||||
u16 i,len;
|
||||
s16 state;
|
||||
va_list arg;
|
||||
|
||||
/*清空缓冲区*/
|
||||
memset(gui_tjc_hmi_text_buffer,0,sizeof(gui_tjc_hmi_text_buffer));
|
||||
|
||||
va_start(arg,format);
|
||||
/*格式化转成字符串*/
|
||||
state = vsnprintf(gui_tjc_hmi_text_buffer,GUI_TJC_HMI_TEXT_BUFFER_NUM,format,arg);
|
||||
if(-1 == state || state > GUI_TJC_HMI_TEXT_BUFFER_NUM)
|
||||
{
|
||||
va_end(arg);
|
||||
printf("Length REEOR");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*拼接字符串*/
|
||||
sprintf(buffer,"t%d_%d.txt=\"%s\"",x,y,gui_tjc_hmi_text_buffer);
|
||||
len = strlen(buffer);
|
||||
for(i=0;i<HMI_PROTO_ASCII_TX_DELINITER_NUM;i++)
|
||||
{
|
||||
buffer[len + i] = HMI_PROTO_ASCII_TX_DELINITER;
|
||||
}
|
||||
va_end(arg);
|
||||
return len + 3;
|
||||
}
|
||||
|
||||
|
||||
/*主界面响应*/
|
||||
static void gui_tjc_hmi_main_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
/*每页显示的区域数量*/
|
||||
#define MAIN_PAGE_SUB_DEVICE_NUM (4)
|
||||
|
||||
u16 len = 0,i,j,x,y,index;
|
||||
u8 page_num,remain_region_num;
|
||||
|
||||
memset(hmi_tx_buffer,0,sizeof(hmi_tx_buffer));
|
||||
|
||||
/*计算页面数量*/
|
||||
page_num = leakage.region_num / MAIN_PAGE_SUB_DEVICE_NUM;
|
||||
remain_region_num = leakage.region_num % MAIN_PAGE_SUB_DEVICE_NUM;/*剩余区域数量*/
|
||||
if(remain_region_num > 0)
|
||||
{
|
||||
page_num++;
|
||||
}
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:/*读取区域信息*/
|
||||
{
|
||||
if(p_tjc_hmi->page.main_index == page_num - 1 && remain_region_num >0)/*显示剩余区域*/
|
||||
{
|
||||
for(j=0;j<remain_region_num;j++)
|
||||
{
|
||||
index = p_tjc_hmi->page.main_index * MAIN_PAGE_SUB_DEVICE_NUM + j;
|
||||
x = j;
|
||||
/*名称*/
|
||||
y = 0;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%s",leakage.region_data[index].name);
|
||||
/*区域内设备总数量*/
|
||||
y = 1;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].sub_device_num);
|
||||
/*漏液数量*/
|
||||
y = 2;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].leakage_num);
|
||||
/*断带*/
|
||||
y = 3;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].open_num);
|
||||
/*通讯*/
|
||||
y = 4;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].time_out_num);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(j=0;j<MAIN_PAGE_SUB_DEVICE_NUM;j++)
|
||||
{
|
||||
index = p_tjc_hmi->page.main_index*MAIN_PAGE_SUB_DEVICE_NUM + j;
|
||||
x = j;
|
||||
/*名称*/
|
||||
y = 0;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%s",leakage.region_data[index].name);
|
||||
/*区域内设备总数量*/
|
||||
y = 1;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].sub_device_num);
|
||||
/*漏液数量*/
|
||||
y = 2;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].leakage_num);
|
||||
/*断带*/
|
||||
y = 3;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].open_num);
|
||||
/*通讯*/
|
||||
y = 4;
|
||||
len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].time_out_num);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x03:/*翻页*/
|
||||
{
|
||||
if(0x01 == p_data[0])
|
||||
{
|
||||
if(page_num - 1 <= p_tjc_hmi->page.main_index)
|
||||
{
|
||||
p_tjc_hmi->page.main_index = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_tjc_hmi->page.main_index++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if(0 == p_tjc_hmi->page.main_index)
|
||||
{
|
||||
p_tjc_hmi->page.main_index = page_num - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_tjc_hmi->page.main_index--;
|
||||
}
|
||||
}
|
||||
}
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
|
||||
/*实时报警响应*/
|
||||
static void gui_tjc_hmi_curr_alarm_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
/*主界面详情*/
|
||||
static void gui_tjc_hmi_detail_main_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
/*登录界面*/
|
||||
static void gui_tjc_hmi_login_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
|
||||
/*历史报警界面*/
|
||||
static void gui_tjc_hmi_history_alarm_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
|
||||
/*网络配置界面*/
|
||||
static void gui_tjc_hmi_tcp_config_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
|
||||
/*设备配置界面 */
|
||||
static void gui_tjc_hmi_device_config_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
/*帮助界面*/
|
||||
static void gui_tjc_hmi_help_send(u8 cmd,u8 opa,u8 *p_data)
|
||||
{
|
||||
u16 len = 0,i;
|
||||
|
||||
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
else if(HMI_PROTO_CMD_SET == cmd)/*设置*/
|
||||
{
|
||||
switch(opa)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
|
||||
}break;
|
||||
case 0x02:
|
||||
{
|
||||
|
||||
}break;
|
||||
default:return;
|
||||
}
|
||||
len = strlen((char *)hmi_tx_buffer);
|
||||
gui_tjc_hmi_data_send(hmi_tx_buffer,len);
|
||||
}
|
||||
}
|
||||
/*屏幕指令解析*/
|
||||
static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart)
|
||||
{
|
||||
u8 cmd,data,gui_id,opa,*p_offset_data;
|
||||
u16 i,modbus_crc16,check_crc16;
|
||||
/*长度不足*/
|
||||
if(len < 5)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
/*检测帧头*/
|
||||
if(p_data[0] != HMI_PROTO_FRAME_HEADER1 || p_data[1] != HMI_PROTO_FRAME_HEADER2)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
/*校验位*/
|
||||
check_crc16 = p_data[len-2] << 8 | p_data[len-1];
|
||||
modbus_crc16 = modbus_lib_crc16(p_data,len-2);
|
||||
modbus_crc16 = (modbus_crc16 >> 8) | (modbus_crc16 << 8);
|
||||
if(modbus_crc16 != check_crc16)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
/*CMD*/
|
||||
cmd = p_data[2];
|
||||
if(cmd != HMI_PROTO_CMD_GET || HMI_PROTO_CMD_GET != HMI_PROTO_CMD_SET)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
gui_id = p_data[3]; /*gui_id*/
|
||||
opa = p_data[4]; /*操作码*/
|
||||
p_offset_data = &p_data[5]; /*附带数据*/
|
||||
p_rx_uart = (bsp_uart_t *)rx_uart; /*串口指针*/
|
||||
switch(gui_id)
|
||||
{
|
||||
case HMI_PROTO_GUI_MAIN :
|
||||
{
|
||||
gui_tjc_hmi_main_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_CURR_ALARM :
|
||||
{
|
||||
gui_tjc_hmi_curr_alarm_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_DETAIL_MAIN :
|
||||
{
|
||||
gui_tjc_hmi_detail_main_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_LOGIN :
|
||||
{
|
||||
gui_tjc_hmi_main_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_HISTORY_ALARM :
|
||||
{
|
||||
gui_tjc_hmi_history_alarm_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_TCP_CONFIG :
|
||||
{
|
||||
gui_tjc_hmi_tcp_config_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_DEVICE_CONFIG :
|
||||
{
|
||||
gui_tjc_hmi_device_config_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
case HMI_PROTO_GUI_HELP :
|
||||
{
|
||||
gui_tjc_hmi_help_send(cmd,opa,p_offset_data);
|
||||
}break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef _GUI_TJC_HMI_H_
|
||||
#define _GUI_TJC_HMI_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
/*Ò³Âë*/
|
||||
typedef struct
|
||||
{
|
||||
u8 main_index;
|
||||
u8 deliniter_main_index;
|
||||
|
||||
}gui_tjc_hmi_page_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gui_tjc_hmi_page_t page;
|
||||
void (*init)(void);
|
||||
}gui_tjc_hmi_t;
|
||||
|
||||
extern gui_tjc_hmi_t tjc_hmi;
|
||||
|
||||
#endif
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "stdio.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "os_timer.h"
|
||||
#include "app_timer.h"
|
||||
|
||||
#include "bsp_Uart.h"
|
||||
#include "bsp_74HC4067.h"
|
||||
@@ -36,7 +36,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data);
|
||||
static void proto_tdlas_control_fac_calib_data_get(u8 ch);
|
||||
|
||||
/*是哪个串口接收的数据*/
|
||||
static bsp_Uart_t *rx_uart = NULL;
|
||||
static bsp_uart_t *rx_uart = NULL;
|
||||
|
||||
proto_tdlas_t tdlas=
|
||||
{
|
||||
@@ -56,16 +56,16 @@ proto_tdlas_t tdlas=
|
||||
};
|
||||
|
||||
proto_tdlas_t *p_sensor = &tdlas;
|
||||
bsp_Uart_t *p_use_uart = &COM_Uart4;
|
||||
bsp_uart_t *p_use_uart = &com_uart4;
|
||||
|
||||
static void proto_tdlas_init(void)
|
||||
{
|
||||
COM_Uart4.Rx_DataAnalysis = p_sensor->rx_task;
|
||||
com_uart4.rx_data_analysis = p_sensor->rx_task;
|
||||
}
|
||||
|
||||
static void proto_tdlas_send(u8 *p_data,u16 len)
|
||||
{
|
||||
COM_Uart4.Send(&COM_Uart4,p_data,len);
|
||||
com_uart4.send(&com_uart4,p_data,len);
|
||||
}
|
||||
|
||||
static void proto_sensor_switch(u8 ch)
|
||||
@@ -324,7 +324,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
|
||||
|
||||
if( p_use_uart->relay.flag == 1)
|
||||
{
|
||||
p_use_uart->relay.uart->Send(p_use_uart->relay.uart,p_data,len);
|
||||
p_use_uart->relay.uart->send(p_use_uart->relay.uart,p_data,len);
|
||||
}
|
||||
|
||||
if(p_sensor->modbus_id != p_data[0])
|
||||
@@ -348,7 +348,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
|
||||
{
|
||||
p_rx_valid = &p_data[6];
|
||||
}
|
||||
rx_uart = (bsp_Uart_t *)other_data;
|
||||
rx_uart = (bsp_uart_t *)other_data;
|
||||
|
||||
p_sensor_sys->tx_time_out_count = 0;
|
||||
p_sensor_sys->state_error_flag &= (~(0x00000001 << PROTO_TDLAS_ERROR_FLAG_TIME_OUT));
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "stdio.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "os_timer.h"
|
||||
#include "app_timer.h"
|
||||
|
||||
#include "bsp_Uart.h"
|
||||
#include "bsp_Flash.h"
|
||||
@@ -33,26 +33,21 @@ proto_Modbus_t modbus_slave_ex=
|
||||
};
|
||||
|
||||
static proto_Modbus_t *p_modbus = &modbus_slave_ex;
|
||||
static bsp_Uart_t * rx_uart;
|
||||
static bsp_uart_t * p_rx_uart;
|
||||
|
||||
static void proto_modbus_communication_data_send(u8 *pData, u16 len)
|
||||
static void proto_modbus_communication_data_send(u8 *p_data, u16 len)
|
||||
{
|
||||
if(&COM_Uart1 == rx_uart)
|
||||
if(p_rx_uart != NULL)
|
||||
{
|
||||
COM_Uart1.Send(&COM_Uart1,pData,len);
|
||||
}
|
||||
else if(&COM_Uart4 == rx_uart)
|
||||
{
|
||||
COM_Uart4.Send(&COM_Uart4,pData,len);
|
||||
}
|
||||
|
||||
p_rx_uart->send(p_rx_uart,p_data,len);
|
||||
}
|
||||
}
|
||||
|
||||
static void proto_modbus_init(void)
|
||||
{
|
||||
p_modbus->id = Usr_Flash.FlashData.modbus_id;
|
||||
COM_Uart1.Rx_DataAnalysis = proto_modbus_communication_data_analysis;
|
||||
COM_Uart4.Rx_DataAnalysis = proto_modbus_communication_data_analysis;
|
||||
com_uart1.rx_data_analysis = proto_modbus_communication_data_analysis;
|
||||
com_uart4.rx_data_analysis = proto_modbus_communication_data_analysis;
|
||||
}
|
||||
static void proto_modbus_task(void)
|
||||
{
|
||||
@@ -82,7 +77,7 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot
|
||||
goto Error;
|
||||
}
|
||||
*/
|
||||
rx_uart = (bsp_Uart_t*)other_data;
|
||||
p_rx_uart = (bsp_uart_t*)other_data;
|
||||
switch (modbus_analysis_data.func)
|
||||
{
|
||||
case 0x03:
|
||||
|
||||
Reference in New Issue
Block a user