feat(uart): 分离ETH与Cat1通讯,支持UART1/Cat1/Debug互斥切换

Breaking Changes:
- USART1(PA11/PA12)改为Cat1(115200)/Debug(500000)共享,SGM3157控制
- USART4(PB09/PC13)独家给ETH(115200),不再共享
- 新增EthTask独立状态机,与CatOneTask解耦运行
- 上电默认Comm=CATONE_COMM,dch=RS485_CH1

Details:
- feat: 新增EthTask.c/h,ETH状态机(8态)独立运行
- refactor: CatOneTask移除ETH代码,AT发送/接收走USART1
- feat: comm cat1/eth命令增加USART1占用互斥检查
- feat: dch dbg命令增加USART1占用互斥检查
- feat: rt_kprintf根据dch通道自动路由(USART1/RS485)
- feat: 新增eth on/off调试打印开关命令
- fix: 两个状态机按Comm模式判断休眠,避免误发AT
- fix: bsp.c修复IRQ回调函数名不匹配(BusFault隐患)
- fix: PB08(PortB Pin08)PORT_Init触发复位,改用外部上拉+POUTE单bit使能
- fix: DebugCmd命令表DEBUG_CMD_CNT与实际条目数不符(crash风险)
- chore: 删除InfTest死函数、重复include、无用宏声明、EthRev_Sem等冗余代码
- chore: 更正中文标点(!→! ,→,)
This commit is contained in:
2026-07-22 12:36:01 +08:00
parent d08ca726df
commit f40c422684
14 changed files with 857 additions and 763 deletions
+43 -64
View File
@@ -135,7 +135,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
<Name>-U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@@ -250,7 +250,7 @@
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
@@ -410,7 +410,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
<Name>-U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@@ -428,40 +428,7 @@
<Name></Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>1004</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\source\User\Src\Public.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>1006</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\source\User\Src\Public.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
@@ -513,7 +480,7 @@
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
@@ -729,6 +696,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\User\Src\EthTask.c</PathWithFileName>
<FilenameWithoutPath>EthTask.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@@ -739,7 +718,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -751,7 +730,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -763,7 +742,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -775,7 +754,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -787,7 +766,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -799,7 +778,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -811,7 +790,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -823,7 +802,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -835,7 +814,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -847,7 +826,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -859,7 +838,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -871,7 +850,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -883,7 +862,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -895,7 +874,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -907,7 +886,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -919,7 +898,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -931,7 +910,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -951,7 +930,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -971,7 +950,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -983,7 +962,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1003,7 +982,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1015,7 +994,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1027,7 +1006,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1039,7 +1018,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1059,7 +1038,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1089,7 +1068,7 @@
<Group>
<GroupName>::RTOS</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>1</RteFlg>
+10
View File
@@ -493,6 +493,11 @@
<FileType>1</FileType>
<FilePath>..\source\User\Src\utils.c</FilePath>
</File>
<File>
<FileName>EthTask.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\EthTask.c</FilePath>
</File>
</Files>
</Group>
<Group>
@@ -1419,6 +1424,11 @@
<FileType>1</FileType>
<FilePath>..\source\User\Src\utils.c</FilePath>
</File>
<File>
<FileName>EthTask.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\EthTask.c</FilePath>
</File>
</Files>
</Group>
<Group>
+14 -3
View File
@@ -11,6 +11,9 @@
#include <rthw.h>
#include <rtthread.h>
#include "bsp.h"
#include "main.h"
extern GateWayPara_t GateWay;
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
@@ -73,16 +76,24 @@ void rt_hw_board_init(void)
static int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."
DbgUart_Config(500000);
DbgOrCat1Uart_Config(500000);
// RS485Ch1_Config(500000);
return 0;
}
INIT_BOARD_EXPORT(uart_init);
void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
rt_enter_critical();
DebugUartSend((uint8_t *)str, strlen(str));
if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_1) {
RS485Ch1UartSend((uint8_t *)str, strlen(str));
}
else if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_2) {
RS485Ch2UartSend((uint8_t *)str, strlen(str));
}
else {
DebugOrCat1UartSend((uint8_t *)str, strlen(str));
}
rt_exit_critical();
}
@@ -1,6 +1,7 @@
#include "main.h"
#include "bsp.h"
#include "CatOneTask.h"
#include "EthTask.h"
#include "RS485Task.h"
#include "Public.h"
#include <stdlib.h>
@@ -9,7 +10,7 @@
#define DBG_RX_LEN_MAX 128
//#define DBG_LOG(...) rt_kprintf(__VA_ARGS__)
#define DEBUG_CMD_CNT 31
#define DEBUG_CMD_CNT 29
#define DEBUG_BUFF_SIZE_MAX 512
#define DEBUG_BUFSIZE 200
@@ -106,7 +107,7 @@ void Debug_Thread_Entry(void *parameter)
if(DebugRev_Sem == RT_NULL) {
rt_kprintf("DebugRev Sem Create Failed!\r\n");
}
rt_kprintf("DebugRev Thread is running\r\n");
rt_kprintf("DebugRev Thread is running!\r\n");
while(1) {
result = rt_sem_take(DebugRev_Sem, RT_WAITING_FOREVER);
@@ -119,13 +120,18 @@ void Debug_Thread_Entry(void *parameter)
}
/*****************************************************************************************
* 函数名称: RS485Ch2RxIrqCallback
* 功能描述: RS485通道1中断处理回调函数
* 函数名称: DbgOrCat1RxIrqCallback
* 功能描述: 调试和Cat1中断处理回调函数
* 参 数: rData 接收到的数据
* 返 回 值: 无
*****************************************************************************************/
void DbgRxIrqCallback(uint8_t rData)
void DbgOrCat1RxIrqCallback(uint8_t rData)
{
if(GateWay->ConfigPara.Comm == CATONE_COMM) {
Cat1IrqCallback(rData);
return;
}
if(DebugRxTimeOut1mSCnt == 0)
DebugRxLen = 0;
@@ -136,8 +142,13 @@ void DbgRxIrqCallback(uint8_t rData)
}
void DebugRxOverhandler(void)
void DebugOrCat1RxOverhandler(void)
{
if(GateWay->ConfigPara.Comm == CATONE_COMM) {
Cat1OverHandler();
return;
}
if(DebugRxTimeOut1mSCnt > 0)
DebugRxTimeOut1mSCnt--;
@@ -247,6 +258,27 @@ void DebugCmdCat1OnOff(int argc, char *argv[])
}
}
void DebugCmdEthOnOff(int argc, char *argv[])
{
DBG_LOG("\r\n");
if(argc < 2)
return;
if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd: eth arg1\r\n");
DBG_LOG(" brief --> Turn the Eth_DBG on or off.\r\n");
DBG_LOG(" arg1 --> on/off\r\n\r\n");
return;
}
if(strcmp(argv[1], "on") == 0) {
ETHOnOff(true);
}
else if(strcmp(argv[1], "off") == 0) {
ETHOnOff(false);
}
}
/*****************************************************************************************
* 函数名称: DebugCmdCat1OnOff
* 功能描述: CAT1调试信息开关
@@ -682,9 +714,15 @@ void DebugCmdSetComm(int argc, char *argv[])
}
if(strcmp(argv[1], "cat1") == 0) {
if(GateWay->ConfigPara.DebugChannel == DEBUG_CH_DBG) {
DBG_LOG("dch is dbg, USART1 occupied. Please switch dch to ch1/ch2 first.\r\n");
return;
}
GateWay->SvrRegFlag = false;
GateWay->ConfigPara.Comm = CATONE_COMM;
ETHStop();
ETH_OFF();
DbgOrCat1Uart_Config(115200);
CAT1_ON();
CatOneReset();
DBG_LOG("Set the communication method to Cat1.\r\n");
@@ -697,45 +735,17 @@ void DebugCmdSetComm(int argc, char *argv[])
CatOneStop();
rt_thread_delay(3000);
CAT1_PWR_KEY_SET();
DBG_ON();
}
GateWay->SvrRegFlag = false;
GateWay->ConfigPara.Comm = ETH_COMM;
DbgOrCat1Uart_Config(500000);
ETH_ON();
ETHReset();
WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t));
}
}
/*****************************************************************************************
* 函数名称: DebugCmdSetCollTime
* 功能描述: 设置数据采集间隔
* 参 数: argc, 输入参数数量
argv, 输入参数
* 返 回 值: 无
*****************************************************************************************/
void DebugCmdSetCollTime(int argc, char *argv[])
{
DBG_LOG("\r\n");
if(argc < 2)
return;
if(strcmp(argv[1], "?") == 0) {
DBG_LOG("Debug Cmd: sct para\r\n");
DBG_LOG(" brief --> Set the data collection interval.\r\n");
DBG_LOG(" arg1 --> para: (10~3600),Set the range from 10 to 3600 seconds.\r\n\r\n");
return;
}
int time = atoi(argv[1]);
if(time < 10 || time > 7200) {
DBG_LOG("RS485 Cmd Para Error!\r\n");
return;
}
GateWay->ConfigPara.CommUnitReadInterval = time;
DBG_LOG("Set the collection time interval to %d seconds.\r\n", time);
WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t));
}
/*****************************************************************************************
* 函数名称: DebugCmdReadHisData
* 功能描述: 读取历史数据
@@ -1166,7 +1176,12 @@ void DebugCmdSelDebugChannel(int argc, char *argv[])
}
if(strcmp(argv[1], "dbg") == 0) {
if(GateWay->ConfigPara.Comm == CATONE_COMM) {
DBG_LOG("comm is cat1, USART1 occupied. Please switch comm to eth first.\r\n");
return;
}
DBG_LOG("Select Debug Channel is dbg\r\n");
DbgOrCat1Uart_Config(500000);
GateWay->ConfigPara.DebugChannel = DEBUG_CH_DBG;
WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t));
}
@@ -1948,6 +1963,7 @@ const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
"help", DebugCmdHelp,
"main", DebugCmdMainOnOff,
"cat1", DebugCmdCat1OnOff,
"eth", DebugCmdEthOnOff,
"rs485", DebugCmdRS485Ctrl,
"cudel", DebugCmdDelCommUnit,
"culs", DebugCmdLsCommUnit,
@@ -2,6 +2,6 @@
#define __DEBUG_CMD_H
void Debug_Thread_Entry(void *parameter);
void DebugRxOverhandler(void);
void DebugOrCat1RxOverhandler(void);
void Debug_Printf(char *format, ...);
#endif
+3 -43
View File
@@ -6,23 +6,6 @@
#define CAT_ONE_REV_TIMEOUT_MAX (10 * 60 * 1000)
#define CAT_ONE_REV_LEN_MAX 512
#define CAT_ONE_POW_ON() CAT1_POW_ON()
#define CAT_ONE_POW_OFF() CAT1_POW_OFF()
#define CAT_ONE_LINKA_GET() CAT1_LINKA_GET()
#define CAT_ONE_LINKB_GET() CAT1_LINKB_GET()
#define CAT_ONE_DELAY_1MS(X)
// ETH状态机相关宏定义
#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
#define ETH_LINK_WAIT_TIME_MAX (10 * 1000)
#define ETH_REG_TIMEOUT_MAX (30 * 1000)
#define ETH_SEND_TIMEOUT_MAX (5 * 1000)
#define ETH_RECV_TIMEOUT_MAX (60 * 1000)
#define ETH_SEND_RETRY_MAX 3
#define ETH_FIRST_REG_DELAY (5 * 1000)
typedef enum {
CAT_ONE_AT_NULL,
CAT_ONE_AT, //开机检测
@@ -58,17 +41,6 @@ typedef enum {
CAT_ONE_CLOSE_TCP,
}CatOneStatus_m;
typedef enum {
ETH_IDEL,
ETH_RESET,
ETH_WAIT_LINK,
ETH_REG_SVR,
ETH_WAIT_SEND,
ETH_SEND_DATA,
ETH_WAIT_RECV,
ETH_OFF,
}EthStatus_m;
typedef enum {
CAT_ONE_RET_NULL,
CAT_ONE_RET_OK,
@@ -110,30 +82,18 @@ typedef struct {
GateWayPara GateWay;
DataRevCallBack CatOneRevCallBack;
// ETH状态机相关字段
EthStatus_m EthStatus;
uint32_t EthResetDelayCnt;
uint32_t EthLinkWaitCnt;
uint32_t EthRecvTimeoutCnt;
uint8_t EthSendRetryCnt;
bool EthFirstRegFlag;
}CatOne_t, *pCatOne_t;
CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen);
void CatOneStart(void);
void CatOneStop(void);
void CatOneReset(void);
void ETHStop(void);
void ETHReset(void);
void Cat1DBGOnOff(bool OnOff);
void CatOneGetLocationInfo(int *Longitude, int *Latitude);
void CatOneGetIMEIAndSIM(char *Imei, char *Sim);
bool CatOneGetStatus(void);
bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen);
void CatOneTriggerRegister(void);
void ETHTriggerRegister(void);
void CatOne_Eth_Thread_Entry(void *parameter);
void EthRxOverhandler(void);
void CatOne_Thread_Entry(void *parameter);
void Cat1IrqCallback(uint8_t rData);
void Cat1OverHandler(void);
void CatReadImeiOrSim(char *Imei, char *Sim);
#endif
+47
View File
@@ -0,0 +1,47 @@
#ifndef __ETH_TASK_H
#define __ETH_TASK_H
#include "main.h"
#include "Public.h"
#define ETH_RX_LEN_MAX 512
#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
#define ETH_LINK_WAIT_TIME_MAX (10 * 1000)
#define ETH_RECV_TIMEOUT_MAX (60 * 1000)
#define ETH_SEND_RETRY_MAX 3
#define ETH_FIRST_REG_DELAY (5 * 1000)
typedef enum {
ETH_IDEL,
ETH_RESET,
ETH_WAIT_LINK,
ETH_REG_SVR,
ETH_WAIT_SEND,
ETH_SEND_DATA,
ETH_WAIT_RECV,
ETH_OFF,
} EthStatus_m;
typedef struct {
EthStatus_m Status;
uint32_t ResetDelayCnt;
uint32_t LinkWaitCnt;
uint32_t RecvTimeoutCnt;
uint8_t SendRetryCnt;
bool FirstRegFlag;
GateWayPara GateWay;
uint8_t TxBuff[ETH_RX_LEN_MAX];
uint16_t TxLen;
uint8_t Payload[ETH_RX_LEN_MAX];
char SendASCII[ETH_RX_LEN_MAX * 2];
} EthTask_t;
void Eth_Thread_Entry(void *parameter);
void EthIrqCallbackHandler(uint8_t rData);
void EthOverHandler(void);
void ETHStop(void);
void ETHReset(void);
void ETHTriggerRegister(void);
#endif
+75 -70
View File
@@ -63,36 +63,62 @@
#define RTC_IRQn Int001_IRQn
#define LORA_DIO0_IRQn Int005_IRQn
#define DBGUART_IRQn Int006_IRQn
#define DBGUART_EI_IRQn Int007_IRQn
#define RS485CH1_UART_IRQn Int008_IRQn
#define RS485CH1_UART_EI_IRQn Int009_IRQn
#define RS485CH2_UART_IRQn Int010_IRQn
#define RS485CH2_UART_EI_IRQn Int011_IRQn
#define ETH_OR_CAT1_UART_IRQn Int012_IRQn
#define ETH_OR_CAT1_UART_EI_IRQn Int013_IRQn
#define DBG_RXPIN_IRQn Int002_IRQn
#define LORA_DIO0_IRQn Int005_IRQn
//DEBUG
#define DBG_USART_CH (M4_USART1)
#define DBG_USART_RX_PORT (PortA)
#define DBG_USART_RX_PIN (Pin11)
#define DBG_USART_TX_PORT (PortA)
#define DBG_USART_TX_PIN (Pin12)
#define DBG_USART_RX_FUNC (Func_Usart1_Rx)
#define DBG_USART_TX_FUNC (Func_Usart1_Tx)
#define DBG_USART_RI_NUM (INT_USART1_RI)
#define DBG_USART_EI_NUM (INT_USART1_EI)
#define DBG_USART_TI_NUM (INT_USART1_TI)
#define DBG_USART_TCI_NUM (INT_USART1_TCI)
#define DBG_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1)
#define DBG_OR_CAT1_UART_IRQn Int006_IRQn
#define DBG_OR_CAT1_UART_EI_IRQn Int007_IRQn
#define ETH_UART_IRQn Int008_IRQn
#define ETH_UART_EI_IRQn Int009_IRQn
#define RS485CH1_UART_IRQn Int010_IRQn
#define RS485CH1_UART_EI_IRQn Int011_IRQn
#define RS485CH2_UART_IRQn Int012_IRQn
#define RS485CH2_UART_EI_IRQn Int013_IRQn
//DEBUG or CAT1
#define DBG_OR_CAT1_USART_CH (M4_USART1)
#define DBG_OR_CAT1_USART_RX_PORT (PortA)
#define DBG_OR_CAT1_USART_RX_PIN (Pin11)
#define DBG_OR_CAT1_USART_TX_PORT (PortA)
#define DBG_OR_CAT1_USART_TX_PIN (Pin12)
#define DBG_OR_CAT1_USART_RX_FUNC (Func_Usart1_Rx)
#define DBG_OR_CAT1_USART_TX_FUNC (Func_Usart1_Tx)
#define DBG_OR_CAT1_USART_RI_NUM (INT_USART1_RI)
#define DBG_OR_CAT1_USART_EI_NUM (INT_USART1_EI)
#define DBG_OR_CAT1_USART_TI_NUM (INT_USART1_TI)
#define DBG_OR_CAT1_USART_TCI_NUM (INT_USART1_TCI)
#define DBG_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1)
#define DBG_OR_CAT1_CTRL_PORT (PortB)
#define DBG_OR_CAT1_CTRL_PIN (Pin08)
#if (HARDWARE_VERSION == 12)
#define DBG_ON() PORT_SetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_ResetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
#elif (HARDWARE_VERSION >= 13)
#define DBG_ON() PORT_ResetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_SetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
#endif
#define CAT1_PWR_KEY_PORT (PortA)
#define CAT1_PWR_KEY_PIN (Pin03)
#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_RESET_PORT (PortA)
#define CAT1_RESET_PIN (Pin00)
#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define CAT1_WAKEUP_PORT (PortA)
#define CAT1_WAKEUP_PIN (Pin02)
#define CAT1_WAKEUP_CLR() PORT_SetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN)
#define CAT1_WAKEUP_SET() PORT_ResetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN)
//RS485 Ch1
#define RS485_CH1_USART_CH (M4_USART2)
@@ -152,45 +178,22 @@
//#define RS485_CH2_VOL_5V() PORT_SetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN)
//#define RS485_CH2_VOL_12V() PORT_ResetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN)
//ETH OR CAT1
#define ETH_OR_CAT1_USART_CH (M4_USART4)
#define ETH_OR_CAT1_USART_RX_PORT (PortB)
#define ETH_OR_CAT1_USART_RX_PIN (Pin09)
#define ETH_OR_CAT1_USART_TX_PORT (PortC)
#define ETH_OR_CAT1_USART_TX_PIN (Pin13)
#define ETH_OR_CAT1_USART_RX_FUNC (Func_Usart4_Rx)
#define ETH_OR_CAT1_USART_TX_FUNC (Func_Usart4_Tx)
#define ETH_OR_CAT1_USART_RI_NUM (INT_USART4_RI)
#define ETH_OR_CAT1_USART_EI_NUM (INT_USART4_EI)
#define ETH_OR_CAT1_USART_TI_NUM (INT_USART4_TI)
#define ETH_OR_CAT1_USART_TCI_NUM (INT_USART4_TCI)
#define ETH_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4)
//ETH
#define ETH_USART_CH (M4_USART4)
#define ETH_USART_RX_PORT (PortB)
#define ETH_USART_RX_PIN (Pin09)
#define ETH_USART_TX_PORT (PortC)
#define ETH_USART_TX_PIN (Pin13)
#define ETH_USART_RX_FUNC (Func_Usart4_Rx)
#define ETH_USART_TX_FUNC (Func_Usart4_Tx)
#define ETH_USART_RI_NUM (INT_USART4_RI)
#define ETH_USART_EI_NUM (INT_USART4_EI)
#define ETH_USART_TI_NUM (INT_USART4_TI)
#define ETH_USART_TCI_NUM (INT_USART4_TCI)
#define ETH_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4)
#define ETH_OR_CAT1_CTRL_PORT (PortB)
#define ETH_OR_CAT1_CTRL_PIN (Pin08)
#if (HARDWARE_VERSION == 12)
#define ETH_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#elif (HARDWARE_VERSION >= 13)
#define ETH_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#endif
//#define ETH_OR_CAT1_TX_CTRL_PORT (PortH)
//#define ETH_OR_CAT1_TX_CTRL_PIN (Pin02)
//#define ETH_ON() { PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_SetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN); }
//#define CAT1_ON() { PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_ResetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN);}
#define CAT1_PWR_KEY_PORT (PortA)
#define CAT1_PWR_KEY_PIN (Pin03)
#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_RESET_PORT (PortA)
#define CAT1_RESET_PIN (Pin00)
#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define ETH_ON() ETH_RESET_SET()
#define ETH_OFF() ETH_RESET_CLR()
#define ETH_RESET_PORT (PortB)
#define ETH_RESET_PIN (Pin05)
@@ -377,9 +380,10 @@ typedef struct {
void BSP_Init(void);
void DbgUart_Config(uint32_t BaudRate);
void DebugUartSend(uint8_t *sData, uint16_t sLen);
void DbgRxIrqCallback(uint8_t rData);
void DbgOrCat1Uart_Config(uint32_t BaudRate);
void DebugOrCat1UartSend(uint8_t *sData, uint16_t sLen);
void DbgOrCat1RxIrqCallback(uint8_t rData);
void Cat1RxIrqCallback(uint8_t rData);
void RS485Ch1_Config(uint32_t BaudRate);
void RS485Ch1UartSend(uint8_t *sData, uint16_t sLen);
@@ -389,8 +393,9 @@ void RS485Ch2_Config(uint32_t BaudRate);
void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen);
void RS485Ch2RxIrqCallback(uint8_t rData);
void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen);
void EthOrCat1RxIrqCallback(uint8_t rData);
void Eth_Config(uint32_t BaudRate);
void EthUartSend(uint8_t *sData, uint16_t sLen);
void EthIrqCallbackHandler(uint8_t rData);
void LoraTxRxIrqCallback(void);
+51 -301
View File
@@ -4,58 +4,32 @@
static rt_sem_t CatOneRev_Sem = RT_NULL;
static rt_sem_t CatOneIRQ_Sem = RT_NULL;
static rt_sem_t EthIRQ_Sem = RT_NULL;
static rt_thread_t Cat1Rev_Thread = RT_NULL;
static uint8_t CAT1DispEn = false;
static CatOne_t CatOne;
static char CatOneEthRxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneEthRxLen;
static char CatOneRxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneRxLen;
static uint8_t CatOneEthTxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneEthTxLen;
static uint8_t CatOneTxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneTxLen;
static uint8_t Payload[CAT_ONE_REV_LEN_MAX];
static char CommUnitSendASCII[CAT_ONE_REV_LEN_MAX * 2];
static uint8_t EthRevTimeOutCnt;
static uint8_t Cat1RevTimeOutCnt;
static uint16_t CatSendErrCnt = 0;
// ETH状态机相关变量已移至 CatOne_t 结构体中
#define CAT1_DBG_LOG(...) { if(CAT1DispEn) Debug_Printf(__VA_ARGS__);}
//#define CAT1_DBG_ARRAY(ARRAY, SIZE) { if(CAT1DispEn) {DBG_ARRAY(ARRAY,SIZE)}}
#define CATONE_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
//const char *CatOneATCmdStr[16] = {
// "NULL",
// "AT\r\n", //开机检测
// "ATE0\r\n", //关回显
// "AT+CPIN?\r\n", //识卡
//// "AT+CIMI\r\n", //IMEI
// "AT+CGSN=1\r\n",
// "AT+LCCID\r\n", //读卡号
// "AT+CEREG?\r\n", //查询注册状态
// "AT+CGPADDR=1\r\n", //查询IP地址
// "AT+CSQ\r\n", //查询信号强度
// "AT+LDNSGIP=gxjt.cui635.cn\r\n",
// "AT+LBS=0\r\n", //获取基站定位信息
// "AT+LIPOPEN=", //设置TCP服务器地址和端口,AT+LIPOPEN="TCP","114.55.52.96",6803
// "AT+LIPSEND=", //发送数据, AT+LIPSEND=0,1,20,"31313131313131323232323232"
// "AT+LIPCLOSE=0\r\n",//断开连接
// "AT+LBSPARA=http://locator-aep.xiot.senthink.com:80/locator/v0.1/locate,B84E427D95B1DF4A3F49B18DDF714C72\r\n",
// "AT+CCLK?\r\n", //获取时间
//};
const char *CatOneATCmdStr[16] = {
"NULL",
"AT\r\n", //开机检测
"ATE0\r\n", //关回显
"AT+CPIN?\r\n", //识卡
// "AT+CIMI\r\n", //IMEI
"AT+CGSN=1\r\n",
"AT+QCCID\r\n", //读卡号
"AT+CEREG?\r\n", //查询注册状态
@@ -63,9 +37,9 @@ const char *CatOneATCmdStr[16] = {
"AT+CSQ\r\n", //查询信号强度
"AT+LDNSGIP=gxjt.cui635.cn\r\n",
"AT+QLBS\r\n", //获取基站定位信息
"AT+QIOPEN=", //设置TCP服务器地址和端口AT+LIPOPEN="TCP","114.55.52.96",6803
"AT+QISEND=", //发送数据, AT+LIPSEND=0,1,20,"31313131313131323232323232"
"AT+QICLOSE=0\r\n",//断开连接
"AT+QIOPEN=", //设置TCP服务器地址和端口
"AT+QISEND=", //发送数据
"AT+QICLOSE=0\r\n", //断开连接
"AT+QLBSCFG=\"server\",http://locator-aep.xiot.senthink.com:80/locator/v0.1/locate\r\n",
"AT+QLBSCFG=\"token\",45B516D3078467E84DD2CFBF3532A4CB\r\n",
"AT+CCLK?\r\n", //获取时间
@@ -84,50 +58,20 @@ const CatOneATCMD_m CatOneModeSetCmdArray[] = {
CAT_ONE_AT_NULL,
CAT_ONE_AT,
CAT_ONE_ATE0,
//CAT_ONE_LBSPARA,
CAT_ONE_LCCID,
CAT_ONE_IMEI,
CAT_ONE_CPIN,
CAT_ONE_CEREG,
CAT_ONE_CSQ,
//CAT_ONE_LDNSGIP,
//CAT_ONE_LBS,
CAT_ONE_CCLK,
CAT_ONE_AT_CMD_END
};
//CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen)
//{
// rt_err_t result;
//
// if(CatOne.Cat1Status != CAT_ONE_IDEL && CatOne.Cat1Status != CAT_ONE_WAIT_SEND)
// return CAT_ONE_RET_ERR;
//
// //CatOne.Cat1Status = CAT_ONE_RESET;
// result = rt_mq_send(CatOneRev_MQ, sData, sLen);
// if(result != RT_EOK) {
// CAT1_DBG_LOG("CatOne MQ Send ERR...\r\n");
// return CAT_ONE_RET_ERR;
// }
// CAT1_DBG_LOG("CatOne Send Message: \r\n", sData);
// return CAT_ONE_RET_OK;
//}
void CatOneStop(void)
{
CatOne.Cat1Status = CAT_ONE_OFF;
}
void ETHStop(void)
{
CatOne.EthStatus = ETH_OFF;
}
void ETHReset(void)
{
CatOne.EthStatus = ETH_RESET;
}
void CatOneGetLocationInfo(int *Longitude, int *Latitude)
{
if(CatOne.LBSFlag) {
@@ -146,7 +90,6 @@ void CatOneGetIMEIAndSIM(char *Imei, char *Sim)
memcpy(Sim, CatOne.SIM, 20);
}
//返回true-busy, false-Idle
bool CatOneGetStatus(void)
{
if(CatOne.Cat1Status == CAT_ONE_IDEL)
@@ -229,10 +172,6 @@ void CatOneAtCmdAnalyze(char *RxBuff)
else {
memset(CatOne.IMEI, 0, 15);
}
// ret = sscanf(p, "+CGSN: \"%s\"\r\n", CatOne.IMEI);
// if(ret != 1) {
// memset(CatOne.IMEI, 0, 15);
// }
CatOne.IMEI[15] = 0;
break;
@@ -354,8 +293,7 @@ void CatOneAtCmdAnalyze(char *RxBuff)
else {
return;
}
//CatOne.Cat1Status = CAT_ONE_CLOSE_TCP;
rt_sem_release(CatOneRev_Sem);//接收任务
rt_sem_release(CatOneRev_Sem);
return;
}
default:
@@ -377,8 +315,8 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus)
{
CatOne.AtCmd = Cmd;
if(CatOne.AtCmd == CAT_ONE_LIPSEND) {
HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen);
sprintf(CatOne.CatOneSendBuff,"AT+LIPSEND=0,1,%d,\"%s\"\r\n",CatOneEthTxLen * 2, CommUnitSendASCII);
HexToAscii(CatOneTxBuff, CommUnitSendASCII, CatOneTxLen);
sprintf(CatOne.CatOneSendBuff,"AT+LIPSEND=0,1,%d,\"%s\"\r\n",CatOneTxLen * 2, CommUnitSendASCII);
CatOne.GateWay->BatteryReadDlyCnt = 30;
}
else if(CatOne.AtCmd == CAT_ONE_LIPOPEN) {
@@ -393,14 +331,14 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus)
strcpy(CatOne.CatOneSendBuff, CatOneATCmdStr[CatOne.AtCmd]);
}
CAT1_DBG_LOG(CatOne.CatOneSendBuff);
EthRevTimeOutCnt = 0;
EthOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff));
Cat1RevTimeOutCnt = 0;
DebugOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff));
CatOne.CatOne1mSDelayCnt = Dly;
CatOne.Cat1Status = CAT_ONE_WAIT_REV;
CatOne.NextStatus = NextStatus;
}
int GateWayRegister(uint8_t *TxBuff)
static int GateWayRegister(uint8_t *TxBuff)
{
uint16_t UnitCommCnt = 0;
uint8_t *p = &TxBuff[0];
@@ -459,7 +397,7 @@ void CatOneLoopHandler(void)
CatOneAtCmdSend(CatOne.AtCmd, 2000, CatOne.NextStatus);
CAT1_DBG_LOG("Cat1 Ret TimeOut, ReSend(%d)...\r\n", CatOne.AtCmdResendCnt);
}
else { //3次错误,关机
else {
CAT1_DBG_LOG("Cat1 error, Close!\r\n");
if(CatOne.AtCmd == CAT_ONE_LIPSEND)
CatOne.Cat1Status = CAT_ONE_CLOSE_TCP;
@@ -499,9 +437,9 @@ void CatOneLoopHandler(void)
}
break;
case CAT_ONE_REG_SVR: //注册服务器
ret = GateWayRegister(CatOneEthTxBuff);
rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret);
case CAT_ONE_REG_SVR:
ret = GateWayRegister(CatOneTxBuff);
rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneTxBuff, ret);
CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
break;
@@ -509,11 +447,11 @@ void CatOneLoopHandler(void)
result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 1000);
if(result == RT_EOK) {
CatSendErrCnt = 0;
CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff);
CatOneTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneTxBuff);
CatOne.Cat1Status = CAT_ONE_SEND_DATA;
}
else {
if(CatOne.Cat1Status == CAT_ONE_RESET || CatOne.Cat1Status == CAT_ONE_OFF) //外部命令执行,状态改变
if(CatOne.Cat1Status == CAT_ONE_RESET || CatOne.Cat1Status == CAT_ONE_OFF)
return;
if(!CatOne.TcpConnFlag) {
CatOne.Cat1Status = CAT_ONE_OFF;
@@ -554,7 +492,7 @@ void CatOneLoopHandler(void)
else {
Cat1RevErrCnt = 0;
}
if(CatOne.GateWay->SvrRegFlag == false) //设备没注册,关闭4G,等待下一次重新注册
if(CatOne.GateWay->SvrRegFlag == false)
CatOne.Cat1Status = CAT_ONE_OFF;
else
CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
@@ -566,7 +504,6 @@ void CatOneLoopHandler(void)
break;
case CAT_ONE_OFF:
//CAT1_POW_OFF();
CAT1_RESET_SET();
CAT1_PWR_KEY_CLR();
rt_thread_delay(3000);
@@ -576,15 +513,16 @@ void CatOneLoopHandler(void)
CAT1_DBG_LOG("Cat1 Power Off!\r\n");
CatOne.Cat1Status = CAT_ONE_IDEL;
CatOne.ResetDelayCnt = CATONE_RESET_DELAY_TIME_MAX;
DBG_ON();
break;
case CAT_ONE_RESET:
CatSendErrCnt = 0;
CatOne.GateWay->SvrRegFlag = false;
CAT1_DBG_LOG("Cat1 Reset!\r\n");
CAT1_ON();
CAT1_RESET_CLR();
CAT1_PWR_KEY_SET();
//CAT1_POW_ON();
rt_thread_delay(50);
CAT1_RESET_SET();
CAT1_PWR_KEY_CLR();
@@ -598,156 +536,6 @@ void CatOneLoopHandler(void)
}
}
void EthLoopHandler(void)
{
rt_err_t result;
switch(CatOne.EthStatus) {
case ETH_IDEL:
rt_thread_delay(1);
if(CatOne.EthResetDelayCnt > 0) {
CatOne.EthResetDelayCnt--;
}
else {
CatOne.EthStatus = ETH_RESET;
}
break;
case ETH_RESET:
CAT1_DBG_LOG("ETH Reset!\r\n");
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
rt_thread_delay(2000); // 延长复位后稳定时间到2秒
CatOne.EthStatus = ETH_WAIT_LINK;
CatOne.EthLinkWaitCnt = 0;
CatOne.EthFirstRegFlag = true; // 重置首次注册标志
break;
case ETH_WAIT_LINK:
if(CatOne.EthLinkWaitCnt == 0) {
/* 首次进入等待链路状态,等待模块完全启动 */
CAT1_DBG_LOG("ETH Waiting for module ready...\r\n");
rt_thread_delay(2000);
}
if(ETH_LINK_GET() == Reset) {
CAT1_DBG_LOG("ETH Link OK!\r\n");
if(CatOne.GateWay->SvrRegFlag == false) {
CatOne.EthStatus = ETH_REG_SVR;
}
else {
CatOne.EthStatus = ETH_WAIT_SEND;
}
}
else {
CatOne.EthLinkWaitCnt++;
if(CatOne.EthLinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) {
CAT1_DBG_LOG("ETH Link Timeout, Reset!\r\n");
CatOne.EthStatus = ETH_OFF;
}
rt_thread_delay(1);
}
break;
case ETH_REG_SVR:
{
// 首次注册时添加延迟,等待系统稳定
if(CatOne.EthFirstRegFlag) {
CAT1_DBG_LOG("ETH First Register, waiting for system stable...\r\n");
rt_thread_delay(ETH_FIRST_REG_DELAY);
CatOne.EthFirstRegFlag = false;
}
uint8_t ret = GateWayRegister(CatOneEthTxBuff);
rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret);
CAT1_DBG_LOG("ETH Register Server...\r\n");
CatOne.EthStatus = ETH_WAIT_SEND;
CatOne.EthSendRetryCnt = 0; // 重置重试计数器
}
break;
case ETH_WAIT_SEND:
result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100);
if(result == RT_EOK) {
CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff);
CatOne.EthStatus = ETH_SEND_DATA;
}
else {
if(CatOne.EthStatus == ETH_RESET || CatOne.EthStatus == ETH_OFF)
return;
if(ETH_LINK_GET() != Reset) {
CAT1_DBG_LOG("ETH Link Lost!\r\n");
CatOne.EthStatus = ETH_OFF;
}
else {
rt_thread_delay(1);
}
}
break;
case ETH_SEND_DATA:
HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen);
EthRevTimeOutCnt = 0;
EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2);
CommUnitSendASCII[CatOneEthTxLen * 2] = 0;
CAT1_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII);
CatOne.EthStatus = ETH_WAIT_RECV;
CatOne.EthRecvTimeoutCnt = 0;
CatOne.EthSendRetryCnt = 0;
break;
case ETH_WAIT_RECV:
rt_thread_delay(1);
CatOne.EthRecvTimeoutCnt++;
if(CatOne.EthRecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) {
CAT1_DBG_LOG("ETH Recv Timeout!\r\n");
CatOne.EthSendRetryCnt++;
if(CatOne.EthSendRetryCnt >= ETH_SEND_RETRY_MAX) {
CAT1_DBG_LOG("ETH Send Retry Max, Reset!\r\n");
CatOne.EthStatus = ETH_OFF;
}
else {
if(CatOne.GateWay->SvrRegFlag == false) {
CatOne.EthStatus = ETH_REG_SVR;
}
else {
CatOne.EthStatus = ETH_WAIT_SEND;
}
}
}
if(ETH_LINK_GET() != Reset) {
CAT1_DBG_LOG("ETH Link Lost During Wait!\r\n");
CatOne.EthStatus = ETH_OFF;
}
if(CatOne.GateWay->SvrRegFlag == true) {
CAT1_DBG_LOG("ETH Register Success!\r\n");
CatOne.EthStatus = ETH_WAIT_SEND;
CatOne.EthRecvTimeoutCnt = 0;
CatOne.EthSendRetryCnt = 0;
}
break;
case ETH_OFF:
CAT1_DBG_LOG("ETH Power Off!\r\n");
CatOne.GateWay->SvrRegFlag = false;
//ETH_RESET_CLR();
//rt_thread_delay(3000);
//ETH_RESET_SET();
CatOne.EthStatus = ETH_IDEL;
CatOne.EthResetDelayCnt = ETH_RESET_DELAY_TIME_MAX;
break;
default:
CatOne.EthStatus = ETH_RESET;
break;
}
}
bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen)
{
if(CatOne.GateWay->SvrRegFlag == false)
@@ -764,70 +552,44 @@ static void CatOneInit(GateWayPara GateWay)
CatOne.CatOneRevCallBack = GateWay->SvrRevCallBack;
}
void CatOneEthRev_Thread_Entry(void *parameter)
void CatOneRev_Thread_Entry(void *parameter)
{
rt_err_t result;
char RxBuffTemp[CAT_ONE_REV_LEN_MAX];
uint8_t HexData[CAT_ONE_REV_LEN_MAX / 2];
GateWayPara GateWay = (GateWayPara)parameter;
rt_kprintf("CatOneTthRev Thread is running!\r\n");
rt_kprintf("CatOneRev Thread is running!\r\n");
while(1) {
if(GateWay->ConfigPara.Comm == CATONE_COMM) {
result = rt_sem_take(CatOneIRQ_Sem, 500);
if(result == RT_EOK) {
memcpy(RxBuffTemp, CatOneEthRxBuff, CatOneEthRxLen);
RxBuffTemp[CatOneEthRxLen] = 0;
memcpy(RxBuffTemp, CatOneRxBuff, CatOneRxLen);
RxBuffTemp[CatOneRxLen] = 0;
CatOneAtCmdAnalyze(RxBuffTemp);
memset(CatOneEthRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
CatOneEthRxLen = 0;
}
//CatOneEthRxLen = 0;
}
else if(GateWay->ConfigPara.Comm == ETH_COMM) {
result = rt_sem_take(EthIRQ_Sem, 500);
if(result == RT_EOK) {
memcpy(RxBuffTemp, CatOneEthRxBuff, CatOneEthRxLen);
RxBuffTemp[CatOneEthRxLen] = 0;
CAT1_DBG_LOG("Eth Rev: %s\r\n",RxBuffTemp);
memset(HexData, 0x00, CatOneEthRxLen / 2);
uint8_t ret = AsciiToHex(RxBuffTemp, HexData, CatOneEthRxLen);
if(ret > 0)
GateWay->SvrRevCallBack(GateWay, HexData, ret);
memset(CatOneEthRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
CatOneEthRxLen = 0;
}
//CatOneEthRxLen = 0;
memset(CatOneRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
CatOneRxLen = 0;
}
}
}
void CatOne_Eth_Thread_Entry(void *parameter)
void CatOne_Thread_Entry(void *parameter)
{
GateWayPara GateWay = (GateWayPara)parameter;
CatOneRev_Sem = rt_sem_create("cat1r_sem", 0, RT_IPC_FLAG_FIFO);
if(CatOneRev_Sem == RT_NULL) {
rt_kprintf("CatOne Sem Create Failed!\r\n");
rt_kprintf("CatOneRev Sem Create Failed!\r\n");
}
EthIRQ_Sem = rt_sem_create("eth_sem", 0, RT_IPC_FLAG_FIFO);
if(EthIRQ_Sem == RT_NULL) {
rt_kprintf("Eth Sem Create Failed!\r\n");
}
CatOneIRQ_Sem = rt_sem_create("cat1_sem", 0, RT_IPC_FLAG_FIFO);
CatOneIRQ_Sem = rt_sem_create("cat1i_sem", 0, RT_IPC_FLAG_FIFO);
if(CatOneIRQ_Sem == RT_NULL) {
rt_kprintf("CatOneIRQ Sem Create Failed!\r\n");
}
CatOneInit(GateWay);
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
Cat1Rev_Thread = rt_thread_create("Cat1Rev", CatOneEthRev_Thread_Entry, parameter, 3000, 3, 20);
Cat1Rev_Thread = rt_thread_create("Cat1Rev", CatOneRev_Thread_Entry, parameter, 3000, 3, 20);
if (Cat1Rev_Thread != RT_NULL) {
rt_thread_startup(Cat1Rev_Thread);
}
@@ -835,44 +597,37 @@ void CatOne_Eth_Thread_Entry(void *parameter)
rt_kprintf("CatOneRev Thread Create Failed! Exit...\r\n");
return;
}
rt_kprintf("CatOne Thread is running\r\n");
rt_kprintf("CatOne Thread is running!\r\n");
while(1) {
//rt_mutex_take(GateWay->UartRevMutex, RT_WAITING_FOREVER);
if(GateWay->ConfigPara.Comm == CATONE_COMM)
if(GateWay->ConfigPara.Comm != CATONE_COMM) {
rt_thread_delay(100);
continue;
}
CatOneLoopHandler();
else if(GateWay->ConfigPara.Comm == ETH_COMM)
EthLoopHandler();
else
rt_thread_delay(1);
//rt_mutex_release(GateWay->UartRevMutex);
}
}
void EthOrCat1RxIrqCallback(uint8_t rData)
void Cat1IrqCallback(uint8_t rData)
{
if(EthRevTimeOutCnt == 0)
CatOneEthRxLen = 0;
if(Cat1RevTimeOutCnt == 0)
CatOneRxLen = 0;
if(CatOneEthRxLen < CAT_ONE_REV_LEN_MAX) {
CatOneEthRxBuff[CatOneEthRxLen++] = rData;
if(CatOneRxLen < CAT_ONE_REV_LEN_MAX) {
CatOneRxBuff[CatOneRxLen++] = rData;
}
EthRevTimeOutCnt = 3;
Cat1RevTimeOutCnt = 3;
}
void EthRxOverhandler(void)
void Cat1OverHandler(void)
{
if(EthRevTimeOutCnt > 0)
EthRevTimeOutCnt--;
if(Cat1RevTimeOutCnt > 0)
Cat1RevTimeOutCnt--;
if(CatOneEthRxLen > 5 && EthRevTimeOutCnt == 0) {
EthRevTimeOutCnt = 20;
if(CatOne.GateWay->ConfigPara.Comm == CATONE_COMM)
if(CatOneRxLen > 5 && Cat1RevTimeOutCnt == 0) {
Cat1RevTimeOutCnt = 20;
rt_sem_release(CatOneIRQ_Sem);
else
rt_sem_release(EthIRQ_Sem);
}
}
@@ -890,12 +645,7 @@ void CatReadImeiOrSim(char *Imei, char *Sim)
void CatOneTriggerRegister(void)
{
ETHStop();
CatOneStop();
CAT1_ON();
CatOneReset();
}
void ETHTriggerRegister(void)
{
CatOne.EthStatus = ETH_REG_SVR;
}
+311
View File
@@ -0,0 +1,311 @@
#include "EthTask.h"
#include "Public.h"
#include "DebugCmd.h"
static rt_sem_t EthIRQ_Sem = RT_NULL;
static rt_thread_t EthRev_Thread = RT_NULL;
static EthTask_t Eth;
static char EthRxBuff[ETH_RX_LEN_MAX];
static uint16_t EthRxLen;
static uint8_t EthRevTimeOutCnt;
static uint8_t Payload[ETH_RX_LEN_MAX];
static char CommUnitSendASCII[ETH_RX_LEN_MAX * 2];
static bool EthDispEn = false;
#define ETH_DBG_LOG(...) { if(EthDispEn) Debug_Printf(__VA_ARGS__);}
void ETHOnOff(bool OnOff)
{
EthDispEn = OnOff;
if(OnOff)
Debug_Printf("\r\nEth Display Enable!\r\n\r\n");
else
Debug_Printf("\r\nEth Display Disable!\r\n\r\n");
}
void ETHStop(void)
{
Eth.Status = ETH_OFF;
}
void ETHReset(void)
{
Eth.Status = ETH_RESET;
}
void ETHTriggerRegister(void)
{
Eth.Status = ETH_REG_SVR;
}
static int GateWayRegister(uint8_t *TxBuff)
{
uint16_t UnitCommCnt = 0;
uint8_t *p = &TxBuff[0];
uint16_t len = 5;
if(Eth.GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch1.Enable == true) {
UnitCommCnt++;
memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch1.CUPara.Para.Mac[0], 6);
len += 6;
}
if(Eth.GateWay->ConfigPara.Rs485Ch2.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch2.Enable == true) {
UnitCommCnt++;
memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch2.CUPara.Para.Mac[0], 6);
len += 6;
}
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
if(Eth.GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) {
for(int j = 0; j < Eth.GateWay->ConfigPara.CommUnitArray[i].SensorN; j++)
{
memcpy(&p[len], Eth.GateWay->ConfigPara.CommUnitArray[i].Mac[j], 6);
len += 6;
UnitCommCnt++;
}
}
}
TxBuff[0] = (len - 3) & 0x00ff;
TxBuff[1] = ((len - 3) >> 8) & 0x00ff;
TxBuff[2] = NET_COMM_CMD_REG;
TxBuff[3] = UnitCommCnt & 0x00ff;
TxBuff[4] = (UnitCommCnt >> 8) & 0x00ff;
return len;
}
void EthLoopHandler(void)
{
rt_err_t result;
switch(Eth.Status) {
case ETH_IDEL:
rt_thread_delay(1);
if(Eth.ResetDelayCnt > 0) {
Eth.ResetDelayCnt--;
}
else {
Eth.Status = ETH_RESET;
}
break;
case ETH_RESET:
ETH_DBG_LOG("ETH Reset!\r\n");
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
rt_thread_delay(2000);
Eth.Status = ETH_WAIT_LINK;
Eth.LinkWaitCnt = 0;
Eth.FirstRegFlag = true;
break;
case ETH_WAIT_LINK:
if(Eth.LinkWaitCnt == 0) {
ETH_DBG_LOG("ETH Waiting for module ready...\r\n");
rt_thread_delay(2000);
}
if(ETH_LINK_GET() == Reset) {
ETH_DBG_LOG("ETH Link OK!\r\n");
if(Eth.GateWay->SvrRegFlag == false) {
Eth.Status = ETH_REG_SVR;
}
else {
Eth.Status = ETH_WAIT_SEND;
}
}
else {
Eth.LinkWaitCnt++;
if(Eth.LinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) {
ETH_DBG_LOG("ETH Link Timeout, Reset!\r\n");
Eth.Status = ETH_OFF;
}
rt_thread_delay(1);
}
break;
case ETH_REG_SVR:
{
if(Eth.FirstRegFlag) {
ETH_DBG_LOG("ETH First Register, waiting for system stable...\r\n");
rt_thread_delay(ETH_FIRST_REG_DELAY);
Eth.FirstRegFlag = false;
}
uint8_t ret = GateWayRegister(Eth.TxBuff);
rt_mq_send(Eth.GateWay->NetSendData_MQ, Eth.TxBuff, ret);
ETH_DBG_LOG("ETH Register Server...\r\n");
Eth.Status = ETH_WAIT_SEND;
Eth.SendRetryCnt = 0;
}
break;
case ETH_WAIT_SEND:
result = rt_mq_recv(Eth.GateWay->NetSendData_MQ, Payload, ETH_RX_LEN_MAX, 100);
if(result == RT_EOK) {
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
Eth.Status = ETH_SEND_DATA;
}
else {
if(Eth.Status == ETH_RESET || Eth.Status == ETH_OFF)
return;
if(ETH_LINK_GET() != Reset) {
ETH_DBG_LOG("ETH Link Lost!\r\n");
Eth.Status = ETH_OFF;
}
else {
rt_thread_delay(1);
}
}
break;
case ETH_SEND_DATA:
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
EthRevTimeOutCnt = 0;
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
CommUnitSendASCII[Eth.TxLen * 2] = 0;
ETH_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII);
Eth.Status = ETH_WAIT_RECV;
Eth.RecvTimeoutCnt = 0;
Eth.SendRetryCnt = 0;
break;
case ETH_WAIT_RECV:
rt_thread_delay(1);
Eth.RecvTimeoutCnt++;
if(Eth.RecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) {
ETH_DBG_LOG("ETH Recv Timeout!\r\n");
Eth.SendRetryCnt++;
if(Eth.SendRetryCnt >= ETH_SEND_RETRY_MAX) {
ETH_DBG_LOG("ETH Send Retry Max, Reset!\r\n");
Eth.Status = ETH_OFF;
}
else {
if(Eth.GateWay->SvrRegFlag == false) {
Eth.Status = ETH_REG_SVR;
}
else {
Eth.Status = ETH_WAIT_SEND;
}
}
}
if(ETH_LINK_GET() != Reset) {
ETH_DBG_LOG("ETH Link Lost During Wait!\r\n");
Eth.Status = ETH_OFF;
}
if(Eth.GateWay->SvrRegFlag == true) {
ETH_DBG_LOG("ETH Register Success!\r\n");
Eth.Status = ETH_WAIT_SEND;
Eth.RecvTimeoutCnt = 0;
Eth.SendRetryCnt = 0;
}
break;
case ETH_OFF:
ETH_DBG_LOG("ETH Power Off!\r\n");
Eth.GateWay->SvrRegFlag = false;
Eth.Status = ETH_IDEL;
Eth.ResetDelayCnt = ETH_RESET_DELAY_TIME_MAX;
break;
default:
Eth.Status = ETH_RESET;
break;
}
}
static void EthInit(GateWayPara GateWay)
{
memset(&Eth, 0x00, sizeof(EthTask_t));
Eth.Status = ETH_RESET;
Eth.GateWay = GateWay;
}
void EthIrqCallbackHandler(uint8_t rData)
{
if(EthRevTimeOutCnt == 0)
EthRxLen = 0;
if(EthRxLen < ETH_RX_LEN_MAX) {
EthRxBuff[EthRxLen++] = rData;
}
EthRevTimeOutCnt = 3;
}
void EthOverHandler(void)
{
if(EthRevTimeOutCnt > 0)
EthRevTimeOutCnt--;
if(EthRxLen > 5 && EthRevTimeOutCnt == 0) {
EthRevTimeOutCnt = 20;
rt_sem_release(EthIRQ_Sem);
}
}
static void EthRev_Thread_Entry(void *parameter)
{
rt_err_t result;
char RxBuffTemp[ETH_RX_LEN_MAX];
uint8_t HexData[ETH_RX_LEN_MAX / 2];
GateWayPara GateWay = (GateWayPara)parameter;
rt_kprintf("EthRev Thread is running!\r\n");
while(1) {
result = rt_sem_take(EthIRQ_Sem, 500);
if(result == RT_EOK) {
memcpy(RxBuffTemp, EthRxBuff, EthRxLen);
RxBuffTemp[EthRxLen] = 0;
ETH_DBG_LOG("Eth Rev: %s\r\n", RxBuffTemp);
memset(HexData, 0x00, EthRxLen / 2);
uint8_t ret = AsciiToHex(RxBuffTemp, HexData, EthRxLen);
if(ret > 0)
GateWay->SvrRevCallBack(GateWay, HexData, ret);
memset(EthRxBuff, 0x00, ETH_RX_LEN_MAX);
EthRxLen = 0;
}
}
}
void Eth_Thread_Entry(void *parameter)
{
GateWayPara GateWay = (GateWayPara)parameter;
EthIRQ_Sem = rt_sem_create("ethi_sem", 0, RT_IPC_FLAG_FIFO);
if(EthIRQ_Sem == RT_NULL) {
rt_kprintf("EthIRQ Sem Create Failed!\r\n");
}
EthInit(GateWay);
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
EthRev_Thread = rt_thread_create("EthRev", EthRev_Thread_Entry, parameter, 3000, 3, 20);
if (EthRev_Thread != RT_NULL) {
rt_thread_startup(EthRev_Thread);
}
else {
rt_kprintf("EthRev Thread Create Failed! Exit...\r\n");
return;
}
rt_kprintf("Eth Thread is running!\r\n");
while(1) {
if(GateWay->ConfigPara.Comm != ETH_COMM) {
rt_thread_delay(100);
continue;
}
EthLoopHandler();
}
}
+3 -3
View File
@@ -41,7 +41,7 @@ void LoraIRQ_Thread_Entry(void *parameter)
rt_err_t result;
static uint16_t LoraErrCnt = 0;
Debug_Printf("LoraRev Thread is running\r\n");
Debug_Printf("LoraRev Thread is running!\r\n");
while(1) {
if(GateWay->ConfigPara.Lora.OnOff == false) {
rt_thread_delay(100);
@@ -57,7 +57,7 @@ void LoraIRQ_Thread_Entry(void *parameter)
LoraErrCnt++;
if(LoraErrCnt > LORA_ERR_RESET_DLY_MAX) { //15分钟内没有收到lora数据重启lora模块
LoraErrCnt = 0;
Debug_Printf("Lora Reset\r\n");
Debug_Printf("Lora Reset!\r\n");
Sx1276LoRaInit(LoraRevCallBack);
}
}
@@ -97,7 +97,7 @@ void Lora_Thread_Entry(void *parameter)
rt_thread_startup(LoraIRQ_Thread);
Sx1276LoRaInit(LoraRevCallBack);
Debug_Printf("Lora Thread is running\r\n");
Debug_Printf("Lora Thread is running!\r\n");
#ifdef LORA_LOWPOWER
while(1) {
if(GateWay->ConfigPara.Lora.OnOff == false) {
+1 -1
View File
@@ -653,7 +653,7 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData
// int16_t Rssi;
// int8_t Snr;
// SX1276LoCalcRssiSnr(&Rssi, &Snr);
MAIN_DBG_LOG("\r\nCUMac:%02X-%02X-%02X-%02X-%02X-%02X, Bat: %d%, SN: %dRssi:%d, Snr:%d\r\n",
MAIN_DBG_LOG("\r\nCUMac:%02X-%02X-%02X-%02X-%02X-%02X, Bat: %d%, SN: %d, Rssi:%d, Snr:%d\r\n",
CUHeader->DevMac[0], CUHeader->DevMac[1], CUHeader->DevMac[2], CUHeader->DevMac[3], CUHeader->DevMac[4], CUHeader->DevMac[5],
GateWay->ConfigPara.CommUnitArray[CommUnitIdx].BatLevel,
GateWay->ConfigPara.CommUnitArray[CommUnitIdx].SensorN,
+140 -114
View File
@@ -209,57 +209,57 @@ static void Xtal32_ClockConfig(void)
****************************************************************************************/
/*****************************************************************************************
* 函数名称: DbgUartRec
* 功能描述: 调试串口接收函数
* 函数名称: DbgOrCat1UartRec
* 功能描述: 调试和Cat1串口接收函数
* 参 数: 无
* 返 回 值: 返回收到的字符
*****************************************************************************************/
static uint8_t DbgUartRec(void)
static uint8_t DbgOrCat1UartRec(void)
{
uint16_t u16Data = USART_RecData(DBG_USART_CH);
uint16_t u16Data = USART_RecData(DBG_OR_CAT1_USART_CH);
return (uint8_t)u16Data;
}
/*****************************************************************************************
* 函数名称: DBGUsartErrIrqCallback
* 函数名称: DBGOrCat1UsartErrIrqCallback
* 功能描述: 调试串口错误中断回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void DBGUsartErrIrqCallback(void)
static void DBGOrCat1UsartErrIrqCallback(void)
{
if(DBG_USART_CH->SR_f.ORE) {
DBG_USART_CH->CR1_f.CORE = 1;
USART_RecData(DBG_USART_CH);
if(DBG_OR_CAT1_USART_CH->SR_f.ORE) {
DBG_OR_CAT1_USART_CH->CR1_f.CORE = 1;
USART_RecData(DBG_OR_CAT1_USART_CH);
}
if(DBG_USART_CH->SR_f.PE)
DBG_USART_CH->CR1_f.CPE = 1;
if(DBG_OR_CAT1_USART_CH->SR_f.PE)
DBG_OR_CAT1_USART_CH->CR1_f.CPE = 1;
if(DBG_USART_CH->SR_f.FE)
DBG_USART_CH->CR1_f.CFE = 1;
if(DBG_OR_CAT1_USART_CH->SR_f.FE)
DBG_OR_CAT1_USART_CH->CR1_f.CFE = 1;
}
/*****************************************************************************************
* 函数名称: DbgUsartRxIrqCallback
* 功能描述: 调试串口接收中断回调函数
* 函数名称: DbgOrCatUsartRxIrqCallback
* 功能描述: 调试和Cat1串口接收中断回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void DbgUsartRxIrqCallback(void)
static void DbgOrCat1UsartRxIrqCallback(void)
{
uint8_t rData = DbgUartRec();
DbgRxIrqCallback(rData);
uint8_t rData = DbgOrCat1UartRec();
DbgOrCat1RxIrqCallback(rData);
}
/*****************************************************************************************
* 函数名称: DbgUart_Config
* 功能描述: 调试串口配置函数
* 函数名称: DbgOrCat1Uart_Config
* 功能描述: 调试和cat1串口配置函数
* 参 数: BaudRate 串口波特率
* 返 回 值: 无
*****************************************************************************************/
void DbgUart_Config(uint32_t BaudRate)
void DbgOrCat1Uart_Config(uint32_t BaudRate)
{
stc_usart_uart_init_t stcInitCfg;
stc_irq_regi_conf_t stcIrqRegiCfg;
@@ -269,8 +269,8 @@ void DbgUart_Config(uint32_t BaudRate)
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinOType = Pin_OType_Cmos;
PORT_Init(DBG_USART_RX_PORT, DBG_USART_RX_PIN, &stcPortInit);
PORT_Init(DBG_USART_TX_PORT, DBG_USART_TX_PIN, &stcPortInit);
PORT_Init(DBG_OR_CAT1_USART_RX_PORT, DBG_OR_CAT1_USART_RX_PIN, &stcPortInit);
PORT_Init(DBG_OR_CAT1_USART_TX_PORT, DBG_OR_CAT1_USART_TX_PIN, &stcPortInit);
stcInitCfg.enClkMode = UsartIntClkCkNoOutput;
stcInitCfg.enClkDiv = UsartClkDiv_1;
@@ -282,35 +282,35 @@ void DbgUart_Config(uint32_t BaudRate)
stcInitCfg.enDetectMode = UsartStartBitFallEdge;
stcInitCfg.enHwFlow = UsartRtsEnable;
PWC_Fcg1PeriphClockCmd(DBG_FCG1_PERIPH, Enable);
PWC_Fcg1PeriphClockCmd(DBG_OR_CAT1_FCG1_PERIPH, Enable);
PORT_SetFunc(DBG_USART_RX_PORT, DBG_USART_RX_PIN, DBG_USART_RX_FUNC, Disable);
PORT_SetFunc(DBG_USART_TX_PORT, DBG_USART_TX_PIN, DBG_USART_TX_FUNC, Disable);
PORT_SetFunc(DBG_OR_CAT1_USART_RX_PORT, DBG_OR_CAT1_USART_RX_PIN, DBG_OR_CAT1_USART_RX_FUNC, Disable);
PORT_SetFunc(DBG_OR_CAT1_USART_TX_PORT, DBG_OR_CAT1_USART_TX_PIN, DBG_OR_CAT1_USART_TX_FUNC, Disable);
enRet = USART_UART_Init(DBG_USART_CH, &stcInitCfg);
enRet = USART_UART_Init(DBG_OR_CAT1_USART_CH, &stcInitCfg);
if(enRet != Ok) {
Error_Handler();
}
enRet = USART_SetBaudrate(DBG_USART_CH, BaudRate);
enRet = USART_SetBaudrate(DBG_OR_CAT1_USART_CH, BaudRate);
if(enRet != Ok) {
Error_Handler();
}
stcIrqRegiCfg.enIRQn = DBGUART_IRQn;
stcIrqRegiCfg.pfnCallback = &DbgUsartRxIrqCallback;
stcIrqRegiCfg.enIntSrc = DBG_USART_RI_NUM;
stcIrqRegiCfg.enIRQn = DBG_OR_CAT1_UART_IRQn;
stcIrqRegiCfg.pfnCallback = &DbgOrCat1UsartRxIrqCallback;
stcIrqRegiCfg.enIntSrc = DBG_OR_CAT1_USART_RI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
/* Set USART RX error IRQ */
stcIrqRegiCfg.enIRQn = DBGUART_EI_IRQn;
stcIrqRegiCfg.pfnCallback = &DBGUsartErrIrqCallback;
stcIrqRegiCfg.enIntSrc = DBG_USART_EI_NUM;
stcIrqRegiCfg.enIRQn = DBG_OR_CAT1_UART_EI_IRQn;
stcIrqRegiCfg.pfnCallback = &DBGOrCat1UsartErrIrqCallback;
stcIrqRegiCfg.enIntSrc = DBG_OR_CAT1_USART_EI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -320,7 +320,7 @@ void DbgUart_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -329,27 +329,27 @@ void DbgUart_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TCI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
#endif
USART_FuncCmd(DBG_USART_CH, UsartTx, Enable);
USART_FuncCmd(DBG_USART_CH, UsartRx, Enable);
USART_FuncCmd(DBG_USART_CH, UsartRxInt, Enable);
USART_FuncCmd(DBG_OR_CAT1_USART_CH, UsartTx, Enable);
USART_FuncCmd(DBG_OR_CAT1_USART_CH, UsartRx, Enable);
USART_FuncCmd(DBG_OR_CAT1_USART_CH, UsartRxInt, Enable);
}
/*****************************************************************************************
* 函数名称: DebugUartSend
* 功能描述: 调试串口发送函数
* 函数名称: DebugOrCat1UartSend
* 功能描述: 调试和Cat1串口发送函数
* 参 数: sData 发送数据入口指针
sLen 发送数据长度
* 返 回 值: 无
*****************************************************************************************/
void DebugUartSend(uint8_t *sData, uint16_t sLen)
void DebugOrCat1UartSend(uint8_t *sData, uint16_t sLen)
{
for(int i = 0; i < sLen; i++) {
USART_SendData(DBG_USART_CH, sData[i]);
while(USART_GetStatus(DBG_USART_CH, UsartTxComplete) == Reset);
USART_SendData(DBG_OR_CAT1_USART_CH, sData[i]);
while(USART_GetStatus(DBG_OR_CAT1_USART_CH, UsartTxComplete) == Reset);
}
}
@@ -450,7 +450,7 @@ void RS485Ch1_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartRxIrqCallback;
stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_RI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -460,7 +460,7 @@ void RS485Ch1_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartErrIrqCallback;
stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_EI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -470,7 +470,7 @@ void RS485Ch1_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -479,7 +479,7 @@ void RS485Ch1_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TCI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
#endif
@@ -600,7 +600,7 @@ void RS485Ch2_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartRxIrqCallback;
stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_RI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -610,7 +610,7 @@ void RS485Ch2_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartErrIrqCallback;
stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_EI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -620,7 +620,7 @@ void RS485Ch2_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -629,7 +629,7 @@ void RS485Ch2_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TCI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
#endif
@@ -662,57 +662,57 @@ void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen)
****************************************************************************************/
/*****************************************************************************************
* 函数名称: EthOrCat1UartRec
* 功能描述: cat1和eth串口接收函数
* 函数名称: EthUartRec
* 功能描述: eth串口接收函数
* 参 数: 无
* 返 回 值: 返回收到的字符
*****************************************************************************************/
static uint8_t EthOrCat1UartRec(void)
static uint8_t EthUartRec(void)
{
uint16_t u16Data = USART_RecData(ETH_OR_CAT1_USART_CH);
uint16_t u16Data = USART_RecData(ETH_USART_CH);
return (uint8_t)u16Data;
}
/*****************************************************************************************
* 函数名称: RS485Ch1UsartErrIrqCallback
* 功能描述: cat1和eth串口错误中断回调函数
* 函数名称: EthUsartErrIrqCallback
* 功能描述: eth串口错误中断回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void EthOrCat1UsartErrIrqCallback(void)
static void EthUsartErrIrqCallback(void)
{
if(ETH_OR_CAT1_USART_CH->SR_f.ORE) {
ETH_OR_CAT1_USART_CH->CR1_f.CORE = 1;
USART_RecData(ETH_OR_CAT1_USART_CH);
if(ETH_USART_CH->SR_f.ORE) {
ETH_USART_CH->CR1_f.CORE = 1;
USART_RecData(ETH_USART_CH);
}
if(ETH_OR_CAT1_USART_CH->SR_f.PE)
ETH_OR_CAT1_USART_CH->CR1_f.CPE = 1;
if(ETH_USART_CH->SR_f.PE)
ETH_USART_CH->CR1_f.CPE = 1;
if(ETH_OR_CAT1_USART_CH->SR_f.FE)
ETH_OR_CAT1_USART_CH->CR1_f.CFE = 1;
if(ETH_USART_CH->SR_f.FE)
ETH_USART_CH->CR1_f.CFE = 1;
}
/*****************************************************************************************
* 函数名称: RS485Ch1UsartRxIrqCallback
* 功能描述: cat1和eth串口接收中断回调函数
* 函数名称: EthUsartRxIrqCallback
* 功能描述: eth串口接收中断回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void EthOrCat1UsartRxIrqCallback(void)
static void EthUsartRxIrqCallback(void)
{
uint8_t rData =EthOrCat1UartRec();
EthOrCat1RxIrqCallback(rData);
uint8_t rData =EthUartRec();
EthIrqCallbackHandler(rData);
}
/*****************************************************************************************
* 函数名称: RS485Ch1_Config
* 功能描述: cat1和eth串口配置函数
* 函数名称: Eth_Config
* 功能描述: eth串口配置函数
* 参 数: BaudRate 串口波特率
* 返 回 值: 无
*****************************************************************************************/
void EthOrCat1_Config(uint32_t BaudRate)
void Eth_Config(uint32_t BaudRate)
{
stc_usart_uart_init_t stcInitCfg;
stc_irq_regi_conf_t stcIrqRegiCfg;
@@ -722,8 +722,8 @@ void EthOrCat1_Config(uint32_t BaudRate)
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinOType = Pin_OType_Cmos;
PORT_Init(ETH_OR_CAT1_USART_RX_PORT, ETH_OR_CAT1_USART_RX_PIN, &stcPortInit);
PORT_Init(ETH_OR_CAT1_USART_TX_PORT, ETH_OR_CAT1_USART_TX_PIN, &stcPortInit);
PORT_Init(ETH_USART_RX_PORT, ETH_USART_RX_PIN, &stcPortInit);
PORT_Init(ETH_USART_TX_PORT, ETH_USART_TX_PIN, &stcPortInit);
stcInitCfg.enClkMode = UsartIntClkCkNoOutput;
stcInitCfg.enClkDiv = UsartClkDiv_1;
@@ -735,35 +735,35 @@ void EthOrCat1_Config(uint32_t BaudRate)
stcInitCfg.enDetectMode = UsartStartBitFallEdge;
stcInitCfg.enHwFlow = UsartRtsEnable;
PWC_Fcg1PeriphClockCmd(ETH_OR_CAT1_FCG1_PERIPH, Enable);
PWC_Fcg1PeriphClockCmd(ETH_FCG1_PERIPH, Enable);
PORT_SetFunc(ETH_OR_CAT1_USART_RX_PORT, ETH_OR_CAT1_USART_RX_PIN, ETH_OR_CAT1_USART_RX_FUNC, Disable);
PORT_SetFunc(ETH_OR_CAT1_USART_TX_PORT, ETH_OR_CAT1_USART_TX_PIN, ETH_OR_CAT1_USART_TX_FUNC, Disable);
PORT_SetFunc(ETH_USART_RX_PORT, ETH_USART_RX_PIN, ETH_USART_RX_FUNC, Disable);
PORT_SetFunc(ETH_USART_TX_PORT, ETH_USART_TX_PIN, ETH_USART_TX_FUNC, Disable);
enRet = USART_UART_Init(ETH_OR_CAT1_USART_CH, &stcInitCfg);
enRet = USART_UART_Init(ETH_USART_CH, &stcInitCfg);
if(enRet != Ok) {
Error_Handler();
}
enRet = USART_SetBaudrate(ETH_OR_CAT1_USART_CH, BaudRate);
enRet = USART_SetBaudrate(ETH_USART_CH, BaudRate);
if(enRet != Ok) {
Error_Handler();
}
stcIrqRegiCfg.enIRQn = ETH_OR_CAT1_UART_IRQn;
stcIrqRegiCfg.pfnCallback = &EthOrCat1UsartRxIrqCallback;
stcIrqRegiCfg.enIntSrc = ETH_OR_CAT1_USART_RI_NUM;
stcIrqRegiCfg.enIRQn = ETH_UART_IRQn;
stcIrqRegiCfg.pfnCallback = &EthUsartRxIrqCallback;
stcIrqRegiCfg.enIntSrc = ETH_USART_RI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
/* Set USART RX error IRQ */
stcIrqRegiCfg.enIRQn = ETH_OR_CAT1_UART_EI_IRQn;
stcIrqRegiCfg.pfnCallback = &EthOrCat1UsartErrIrqCallback;
stcIrqRegiCfg.enIntSrc = ETH_OR_CAT1_USART_EI_NUM;
stcIrqRegiCfg.enIRQn = ETH_UART_EI_IRQn;
stcIrqRegiCfg.pfnCallback = &EthUsartErrIrqCallback;
stcIrqRegiCfg.enIntSrc = ETH_USART_EI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -773,7 +773,7 @@ void EthOrCat1_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
@@ -782,27 +782,27 @@ void EthOrCat1_Config(uint32_t BaudRate)
stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback;
stcIrqRegiCfg.enIntSrc = USART_TCI_NUM;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, ETH_USART_TCI_NUM);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
#endif
USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartTx, Enable);
USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartRx, Enable);
USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartRxInt, Enable);
USART_FuncCmd(ETH_USART_CH, UsartTx, Enable);
USART_FuncCmd(ETH_USART_CH, UsartRx, Enable);
USART_FuncCmd(ETH_USART_CH, UsartRxInt, Enable);
}
/*****************************************************************************************
* 函数名称: EthOrCat1UartSend
* 功能描述: cat1和eth串口发送函数
* 函数名称: EthUartSend
* 功能描述: eth串口发送函数
* 参 数: sData 发送数据入口指针
sLen 发送数据长度
* 返 回 值: 无
*****************************************************************************************/
void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen)
void EthUartSend(uint8_t *sData, uint16_t sLen)
{
for(int i = 0; i < sLen; i++) {
USART_SendData(ETH_OR_CAT1_USART_CH, sData[i]);
while(USART_GetStatus(ETH_OR_CAT1_USART_CH, UsartTxComplete) == Reset);
USART_SendData(ETH_USART_CH, sData[i]);
while(USART_GetStatus(ETH_USART_CH, UsartTxComplete) == Reset);
}
}
@@ -869,16 +869,15 @@ static void GPIO_Config(void)
// PORT_Init(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN, &stcPortInit);
// RS485_CH1_VOL_5V();
PORT_Init(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN, &stcPortInit);
// PORT_Init(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN, &stcPortInit);
ETH_ON();
PORT_Init(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN, &stcPortInit);
CAT1_PWR_KEY_SET();
PORT_Init(CAT1_RESET_PORT, CAT1_RESET_PIN, &stcPortInit);
CAT1_RESET_CLR();
// PORT_Init(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN, &stcPortInit);
// CAT1_WAKEUP_SET();
// PORT_Init(CAT1_POW_PORT, CAT1_POW_PIN, &stcPortInit);
// CAT1_POW_OFF();
@@ -912,6 +911,11 @@ static void GPIO_Config(void)
PORT_Init(LORA_POW_PORT, LORA_POW_PIN, &stcPortInit);
LORA_POW_OFF();
//stcPortInit.enPullUp = Enable;
PORT_Init(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN, &stcPortInit);
DBG_ON();
stcPortInit.enPullUp = Enable;
stcPortInit.enPinMode = Pin_Mode_In;
PORT_Init(ETH_LINK_PORT, ETH_LINK_PIN, &stcPortInit);
@@ -1194,7 +1198,7 @@ static void Rtc_Config(void)
// stcIrqRegiConf.pfnCallback = &RtcPeriod_IrqCallback;
// enIrqRegistration(&stcIrqRegiConf);
// NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
// NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
// NVIC_SetPriority(stcIrqRegiConf.enIRQn, ETH_USART_TCI_NUM);
// NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
// enIntWakeupEnable(RtcPeriodWU);
// /* Enable period interrupt */
@@ -1652,7 +1656,7 @@ int dev_boot_write_param(boot_para_t Param)
// PWC_ClkRecover();
// //SystemClockConfig();
// Spi_Config();
// DbgUart_Config(500000);
// DbgOrCat1Uart_Config(115200);
// //GPIO_Config();
// //SysTick_Resume();
// SysTick_Init(1000);
@@ -1710,8 +1714,8 @@ void BSP_Init(void)
SystemClockConfig();
Xtal32_ClockConfig();
DbgUart_Config(500000);
EthOrCat1_Config(115200);
DbgOrCat1Uart_Config(500000);
Eth_Config(115200);
// RS485Ch1_Config(9600);
// RS485Ch2_Config(9600);
#if USE_SD_CARD
@@ -1745,12 +1749,12 @@ __weak void LoraTxRxIrqCallback(void)
}
/*****************************************************************************************
* 函数名称: DbgRxIrqCallback
* 函数名称: DbgOrCat1RxIrqCallback
* 功能描述: 调试串口接收中断外部重定向回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
__weak void DbgRxIrqCallback(uint8_t rData)
__weak void DbgOrCat1RxIrqCallback(uint8_t rData)
{
}
@@ -1778,12 +1782,34 @@ __weak void RS485Ch2RxIrqCallback(uint8_t rData)
}
/*****************************************************************************************
* 函数名称: EthOrCat1RxIrqCallback
* 功能描述: Eth和Cat1串口接收中断外部重定向回调函数
* 函数名称: Cat1IrqCallback
* 功能描述: Cat1串口接收中断外部重定向回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
__weak void EthOrCat1RxIrqCallback(uint8_t rData)
__weak void Cat1IrqCallback(uint8_t rData)
{
}
/*****************************************************************************************
* 函数名称: Cat1OverHandler
* 功能描述: Cat1串口接收超时回调
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
__weak void Cat1OverHandler(void)
{
}
/*****************************************************************************************
* 函数名称: EthIrqCallbackHandler
* 功能描述: Eth串口接收中断外部重定向回调函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
__weak void EthIrqCallbackHandler(uint8_t rData)
{
}
+17 -38
View File
@@ -2,8 +2,8 @@
#include <math.h>
#include "main.h"
#include "CatOneTask.h"
#include "EthTask.h"
#include "LoraTask.h"
#include "CatOneTask.h"
#include "RS485Task.h"
#include "DebugCmd.h"
#include "spiflash.h"
@@ -34,7 +34,8 @@ static const uint8_t GateWayMac_BL10[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x0A};
bool MainDispEn = true;
static rt_thread_t Lora_Thread = RT_NULL;
static rt_thread_t Cat1Eth_Thread = RT_NULL;
static rt_thread_t Cat1_Thread = RT_NULL;
static rt_thread_t Eth_Thread = RT_NULL;
static rt_thread_t RS485Ch1_Thread = RT_NULL;
static rt_thread_t RS485Ch2_Thread = RT_NULL;
static rt_thread_t Debug_Thread = RT_NULL;
@@ -92,35 +93,6 @@ void SDCardTest(void)
}
#endif
void InfTest(void)
{
uint8_t sData[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
RS485_CH1_RX();
RS485_CH1_POW_ON();
rt_thread_delay(100);
RS485_CH1_POW_OFF();
RS485_CH2_POW_ON();
rt_thread_delay(100);
RS485_CH2_POW_OFF();
POWER_LED_OFF();
POWER_LED_ON();
LORA_RX_LED_SET();
LORA_RX_LED_CLR();
RS485_CH1_TX();
RS485_CH2_RX();
RS485Ch1_Config(500000);
RS485Ch2_Config(500000);
RS485Ch1UartSend(sData, 10);
rt_thread_delay(100);
RS485_CH2_TX();
RS485_CH1_RX();
RS485Ch2UartSend(sData, 10);
rt_thread_delay(100);
// SDCardTest();
}
void GateWayInit(void)
{
@@ -186,8 +158,7 @@ void GateWayInit(void)
#if MAC_ADDR_TYPE == 0
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6);
// GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
GateWay.ConfigPara.DebugChannel = DEBUG_CH_DBG;
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 1
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
@@ -318,9 +289,11 @@ void GateWayInit(void)
else
rt_kprintf("History Num: 0\r\n");
if(GateWay.ConfigPara.Comm == CATONE_COMM) {
DbgOrCat1Uart_Config(115200);
CAT1_ON();
}
else {
DBG_ON();
ETH_ON();
rt_thread_delay(1000);
ETHReset();
@@ -418,9 +391,15 @@ int main(void)
else
return -1;
Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20);
if (Cat1Eth_Thread != RT_NULL)
rt_thread_startup(Cat1Eth_Thread);
Cat1_Thread = rt_thread_create("Cat1", CatOne_Thread_Entry, &GateWay, 4096, 3, 20);
if (Cat1_Thread != RT_NULL)
rt_thread_startup(Cat1_Thread);
else
return -1;
Eth_Thread = rt_thread_create("Eth", Eth_Thread_Entry, &GateWay, 4096, 3, 20);
if (Eth_Thread != RT_NULL)
rt_thread_startup(Eth_Thread);
else
return -1;
@@ -437,9 +416,9 @@ int main(void)
POWER_LED_OFF();
}
}
EthRxOverhandler();
EthOverHandler();
RS485RxOverhandler();
DebugRxOverhandler();
DebugOrCat1RxOverhandler();
if(OneSecondDlyCnt % 200 == 0) {
FeedDog();
LORA_RX_TOGGLE();