Bläddra i källkod

代码结构略微修改

main
the_deepest 4 dagar sedan
förälder
incheckning
e30017820a
9 ändrade filer med 1055 tillägg och 1056 borttagningar
  1. +3
    -2
      app/main.c
  2. +1
    -1
      app/src/hardware.c
  3. +14
    -14
      iar/settings/F407_uCOSii_Modbus.wsdt
  4. +4
    -4
      iar/settings/uCOS_Modbus.dbgdt
  5. +2
    -2
      iar/settings/uCOS_Modbus.dnx
  6. +941
    -941
      iar/uCOS_Modbus.dep
  7. +75
    -90
      modbus/modbus.c
  8. +12
    -1
      modbus/modbus.h
  9. +3
    -1
      modbus/modbus_flash.c

+ 3
- 2
app/main.c Visa fil

@@ -18,8 +18,8 @@ void AppTaskModbusParse (void *p_arg);
void AppTaskModbusWriteFlash(void *p_arg);
static void AppTaskModbusConnect(void *p_arg);

extern uint8_t ModbusCoil[1250]; /*10000/8=1250*/
extern uint16_t ModbusReg[10000];
//extern uint8_t ModbusCoil[1250]; /*10000/8=1250*/
//extern uint16_t ModbusReg[10000];


int main()
@@ -110,6 +110,7 @@ void AppTaskStart(void *p_arg)
OS_EXIT_CRITICAL(); /* 开中断 */
}

/*判断modbus是否连接任务*/
static void AppTaskModbusConnect(void *p_arg)
{
OS_ERR err;


+ 1
- 1
app/src/hardware.c Visa fil

@@ -122,4 +122,4 @@ void ModbusHardwareInit(void)
ModbusUsartInit();
ModbusDmaInit();
ModbusNvicInit();
}
}

+ 14
- 14
iar/settings/F407_uCOSii_Modbus.wsdt
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 4
- 4
iar/settings/uCOS_Modbus.dbgdt Visa fil

@@ -153,11 +153,11 @@
<RecentlyUsedMenus>1</RecentlyUsedMenus>
<MenuShadows>1</MenuShadows>
<ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay>
<CommandsUsage>B80200001D001B8F000001000000138600000B00000010860000CF00000020810000010000000C810000020000000D800000020000000486000002000000568600001B0100000084000001000000148100000100000030840000010000000E810000010000005E8600000B0000001F8100000B0000008E8600000100000000E10000010000000B81000001000000058400000100000069860000010000001486000003000000198F00000100000005810000010000000284000002000000118600006800000000860000020000001084000006000000468100003500000008860000020000005D86000004000000</CommandsUsage>
<CommandsUsage>C20200001D00138600000B0000001B8F00000100000010860000D400000020810000010000000D800000020000000C810000020000000486000002000000568600001B0100001481000001000000008400000100000030840000010000001F8100000B0000005E8600000B0000000E810000010000000B8100000100000000E10000010000008E860000010000001486000003000000698600000100000005840000010000000086000002000000118600006C00000002840000020000000581000001000000198F000001000000468100003600000010840000060000005D860000040000000886000002000000</CommandsUsage>
</MFCToolBarParameters>
<CommandManager>
<CommandsWithoutImages>0400FFFFFFFF838600005886000004DC0000</CommandsWithoutImages>
<MenuUserImages>1C000286000013000000578600001C0000000D8600001900000023920000000000000A8600002D000000078600002A000000048600002700000001860000120000009A8600001A000000008400007A0000000C860000180000001A86000034000000098600002C00000006860000290000008E8600003D0000000386000014000000698600003A000000008600001100000055860000080000000E8600001B0000000B8600002E000000C386000004000000A18600003E000000088600002B0000000586000028000000C08600000E00000037870000030000001686000033000000</MenuUserImages>
<MenuUserImages>1C00578600001C000000028600001300000023920000000000000D860000190000000A8600002D000000078600002A00000004860000270000009A8600001A0000000186000012000000008400007A0000000C86000018000000098600002C0000001A860000340000008E8600003D0000000686000029000000698600003A0000000386000014000000558600000800000000860000110000000E8600001B0000000B8600002E000000088600002B000000A18600003E000000C38600000400000016860000330000003787000003000000C08600000E0000000586000028000000</MenuUserImages>
</CommandManager>
<Pane-59393>
<ID>0</ID>
@@ -1125,7 +1125,7 @@
</BasePane-34049>
<MFCToolBar-34050>
<Name>Trace</Name>
<Buttons>00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6E53920000000004008A000000FFFEFF03450054004D0000000000000000000000000001000000010000000180549200000000000025000000FFFEFF03530057004F00000000000000000000000000010000000100000000000000FFFEFF05540072006100630065002F000000</Buttons>
<Buttons>00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6E539200000000040089000000FFFEFF03450054004D0000000000000000000000000001000000010000000180549200000000000025000000FFFEFF03530057004F00000000000000000000000000010000000100000000000000FFFEFF05540072006100630065002F000000</Buttons>
</MFCToolBar-34050>
<Pane-34050>
<ID>34050</ID>
@@ -1142,7 +1142,7 @@
</BasePane-34050>
<MFCToolBar-34051>
<Name>Main</Name>
<Buttons>00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000067000000FFFEFF000000000000000000000000000100000001000000018001E100000000000068000000FFFEFF000000000000000000000000000100000001000000018003E10000000000006A000000FFFEFF000000000000000000000000000100000001000000018000810000000000004B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018025E100000000000071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040074000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040075000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005E000000FFFEFF000000000000000000000000000100000001000000018024E100000000000070000000FFFEFF000000000000000000000000000100000001000000018028E100000000040072000000FFFEFF000000000000000000000000000100000001000000018029E100000000000073000000FFFEFF000000000000000000000000000100000001000000018002810000000000004D000000FFFEFF0000000000000000000000000001000000010000000180298100000000000062000000FFFEFF0000000000000000000000000001000000010000000180278100000000000060000000FFFEFF0000000000000000000000000001000000010000000180288100000000000061000000FFFEFF00000000000000000000000000010000000100000001801D810000000000005A000000FFFEFF00000000000000000000000000010000000100000001801E810000000004005B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000000000051000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000052000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000066000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005C000000FFFEFF000000000000000000000000000100000001000000018020810000000000005D000000FFFEFF0000000000000000000000000001000000010000000180468100000000020064000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000</Buttons>
<Buttons>00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000066000000FFFEFF000000000000000000000000000100000001000000018001E100000000000067000000FFFEFF000000000000000000000000000100000001000000018003E100000000000069000000FFFEFF000000000000000000000000000100000001000000018000810000000000004A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018025E100000000000070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040073000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040074000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005D000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006F000000FFFEFF000000000000000000000000000100000001000000018028E100000000040071000000FFFEFF000000000000000000000000000100000001000000018029E100000000000072000000FFFEFF000000000000000000000000000100000001000000018002810000000000004C000000FFFEFF0000000000000000000000000001000000010000000180298100000000000061000000FFFEFF000000000000000000000000000100000001000000018027810000000000005F000000FFFEFF0000000000000000000000000001000000010000000180288100000000000060000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040059000000FFFEFF00000000000000000000000000010000000100000001801E810000000004005A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000000000050000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000051000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000065000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005B000000FFFEFF000000000000000000000000000100000001000000018020810000000000005C000000FFFEFF0000000000000000000000000001000000010000000180468100000000020063000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000</Buttons>
</MFCToolBar-34051>
<Pane-34051>
<ID>34051</ID>


+ 2
- 2
iar/settings/uCOS_Modbus.dnx Visa fil

@@ -16,7 +16,7 @@
<ShowSource>1</ShowSource>
</Trace1>
<StLinkDriver>
<stlinkserialNo>30303031</stlinkserialNo>
<stlinkserialNo>24230357</stlinkserialNo>
<stlinkfoundProbes />
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>0</stlinkResetStrategy>
@@ -24,7 +24,7 @@
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</StLinkDriver>
<DebugChecksum>
<Checksum>3595631932</Checksum>
<Checksum>2248251518</Checksum>
</DebugChecksum>
<Exceptions>
<StopOnUncaught>_ 0</StopOnUncaught>


+ 941
- 941
iar/uCOS_Modbus.dep
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 75
- 90
modbus/modbus.c Visa fil

@@ -24,93 +24,6 @@ uint8_t ModbusTxBuf[MODBUS_TX_BUF_SIZE]; /*发送数组*/
uint16_t ModbusTxLen = 0; /*发送数据长度*/


uint8_t ModbusErrReply(uint8_t func, uint8_t err);
uint16_t Crc16(const uint8_t *data, uint16_t length);
void AddCrc16(uint8_t *data, uint16_t length);
int8_t ChcekCrc16(uint16_t recCrc16, uint8_t *data, uint16_t length);
uint8_t ModbusReadCoils(uint16_t addres, uint16_t num);
uint8_t ModbusWriteCoils(uint16_t addres, uint16_t num, uint8_t *data);
uint8_t ModbusReadRegs(uint16_t addres, uint16_t num);
uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data);
uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data);
uint8_t ModbusWriteCoil(uint16_t addres, uint8_t *data);
uint8_t ModbusExtReadOdd(uint16_t num);



/*USART接收空闲中断*/
void USART1_IRQHandler(void)
{
OSIntEnter(); /*进入中断*/

uint32_t temp;
uint16_t rxLenRemain;
if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
{
/*在计算数据长度之前先关闭DMA接收通道,防止计算过程中DMA继续转运数据*/
DMA_Cmd(DMA2_Stream2, DISABLE);
/*清除IDLE中断标志位*/
temp = USART1->SR;
temp = USART1->DR;
(void)temp;

/*清除传输已经完成TCIF2、传输已经完成一半HTIF2标志位*/
DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2);
/*计算数据长度*/
rxLenRemain = DMA_GetCurrDataCounter(DMA2_Stream2);
ModbusRxLen = MODBUS_RX_BUF_SIZE - rxLenRemain;

/*释放接收到数据帧信号量,唤醒帧解析任务*/
if(ModbusRxLen != 0)
{
OSSemPost(ModbusReceived);
}
/*重新指定接收地址*/
DMA_MemoryTargetConfig(DMA2_Stream2, (uint32_t)ModbusRxBuf, DMA_Memory_0);
/*重启DMA*/
DMA_SetCurrDataCounter(DMA2_Stream2, MODBUS_RX_BUF_SIZE);
DMA_Cmd(DMA2_Stream2, ENABLE);
}
OSIntExit(); /*退出中断*/
}


/*modbus响应帧发送*/
void ModbusSend(uint8_t *txBuf, uint16_t len)
{
if(DMA_GetCmdStatus(DMA2_Stream7) == ENABLE)
{
/*等待DMA发送完成*/
while(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
}

/*先关闭DMA发送通道*/
DMA_Cmd(DMA2_Stream7, DISABLE);

/*等待DMA关闭*/
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE);

/*清除传输已经完成TCIF7、传输已经完成一半HTIF7、FIFO错误FEIF7标志位*/
DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_FEIF7 | DMA_FLAG_HTIF7 | DMA_FLAG_TCIF7);
/*配置发送地址和长度*/
DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0);
DMA_SetCurrDataCounter(DMA2_Stream7, len);

/*等待串口发送完成*/
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
/*在此处等待3.5个字符的时间*/
/*启动 DMA 发送*/
DMA_Cmd(DMA2_Stream7, ENABLE);
}


/*modbus协议帧解析任务*/
void AppTaskModbusParse (void *p_arg)
{
@@ -129,9 +42,9 @@ void AppTaskModbusParse (void *p_arg)
memcpy(rxBuf, ModbusRxBuf, rxLen);

/*帧分解*/
frame.crc = ((uint16_t)(rxBuf[rxLen - 2])) | ((uint16_t)rxBuf[rxLen - 1] << 8);
frame.slaveAddres = rxBuf[0];
frame.func = rxBuf[1];
frame.crc = ((uint16_t)(rxBuf[rxLen - 2])) | ((uint16_t)rxBuf[rxLen - 1] << 8);
frame.opeAddres = ((uint16_t)rxBuf[2] << 8) | ((uint16_t)rxBuf[3]);
frame.opeNum = ((uint16_t)rxBuf[4] << 8) | ((uint16_t)rxBuf[5]);

@@ -197,8 +110,7 @@ void AppTaskModbusParse (void *p_arg)
ModbusSend(ModbusTxBuf, ModbusTxLen);
}

if(ModbusErr == 0 && (frame.func == 0x0F
|| frame.func == 0x10
if(ModbusErr == 0 && (frame.func == 0x0F || frame.func == 0x10
|| frame.func == 0x05 || frame.func == 0x06))
{
/*释放写FLASH信号量*/
@@ -566,6 +478,77 @@ uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data)
return 0;
}

/*USART接收空闲中断*/
void USART1_IRQHandler(void)
{
OSIntEnter(); /*进入中断*/

uint32_t temp;
uint16_t rxLenRemain;
if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET)
{
/*在计算数据长度之前先关闭DMA接收通道,防止计算过程中DMA继续转运数据*/
DMA_Cmd(DMA2_Stream2, DISABLE);
/*清除IDLE中断标志位*/
temp = USART1->SR;
temp = USART1->DR;
(void)temp;

/*清除传输已经完成TCIF2、传输已经完成一半HTIF2标志位*/
DMA_ClearFlag(DMA2_Stream2, DMA_FLAG_TCIF2 | DMA_FLAG_HTIF2);
/*计算数据长度*/
rxLenRemain = DMA_GetCurrDataCounter(DMA2_Stream2);
ModbusRxLen = MODBUS_RX_BUF_SIZE - rxLenRemain;

/*释放接收到数据帧信号量,唤醒帧解析任务*/
if(ModbusRxLen != 0)
{
OSSemPost(ModbusReceived);
}
/*重新指定接收地址*/
DMA_MemoryTargetConfig(DMA2_Stream2, (uint32_t)ModbusRxBuf, DMA_Memory_0);
/*重启DMA*/
DMA_SetCurrDataCounter(DMA2_Stream2, MODBUS_RX_BUF_SIZE);
DMA_Cmd(DMA2_Stream2, ENABLE);
}
OSIntExit(); /*退出中断*/
}


/*modbus响应帧发送*/
void ModbusSend(uint8_t *txBuf, uint16_t len)
{
if(DMA_GetCmdStatus(DMA2_Stream7) == ENABLE)
{
/*等待DMA发送完成*/
while(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
}

/*先关闭DMA发送通道*/
DMA_Cmd(DMA2_Stream7, DISABLE);

/*等待DMA关闭*/
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE);

/*清除传输已经完成TCIF7、传输已经完成一半HTIF7、FIFO错误FEIF7标志位*/
DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_FEIF7 | DMA_FLAG_HTIF7 | DMA_FLAG_TCIF7);
/*配置发送地址和长度*/
DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0);
DMA_SetCurrDataCounter(DMA2_Stream7, len);

/*等待串口发送完成*/
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
/*启动 DMA 发送*/
DMA_Cmd(DMA2_Stream7, ENABLE);
}

uint8_t ModbusExtReadOdd(uint16_t num)
{
uint8_t i = 0;
@@ -622,6 +605,8 @@ uint8_t ModbusExtReadOdd(uint16_t num)
AddCrc16(ModbusTxBuf, 3 + dataLen);
ModbusTxLen = 5 + dataLen;
}
/*演示2ms*/
OSTimeDly(OS_TICKS_PER_SEC / 500);
ModbusSend(ModbusTxBuf, ModbusTxLen);
}
return 0;


+ 12
- 1
modbus/modbus.h Visa fil

@@ -40,7 +40,18 @@ typedef struct Modbus_Frame
/*接收到数据帧信号量*/
extern OS_EVENT *ModbusReceived;


uint8_t ModbusErrReply(uint8_t func, uint8_t err);
uint16_t Crc16(const uint8_t *data, uint16_t length);
void AddCrc16(uint8_t *data, uint16_t length);
int8_t ChcekCrc16(uint16_t recCrc16, uint8_t *data, uint16_t length);
uint8_t ModbusReadCoils(uint16_t addres, uint16_t num);
uint8_t ModbusWriteCoils(uint16_t addres, uint16_t num, uint8_t *data);
uint8_t ModbusReadRegs(uint16_t addres, uint16_t num);
uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data);
uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data);
uint8_t ModbusWriteCoil(uint16_t addres, uint8_t *data);
uint8_t ModbusExtReadOdd(uint16_t num);
void ModbusSend(uint8_t *txBuf, uint16_t len);


#endif

+ 3
- 1
modbus/modbus_flash.c Visa fil

@@ -15,6 +15,7 @@ uint8_t ModbusFlashWrite(void);
uint8_t ModbusErrReply(uint8_t func, uint8_t err);


/*flash写入任务*/
void AppTaskModbusWriteFlash(void *p_arg)
{
OS_ERR err;
@@ -24,7 +25,7 @@ void AppTaskModbusWriteFlash(void *p_arg)
OSTimeDly(OS_TICKS_PER_SEC);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

// ModbusErr = ModbusFlashWrite();
ModbusErr = ModbusFlashWrite();
}
}

@@ -62,6 +63,7 @@ uint8_t ModbusFlashWrite(void)

addres += 2;
}
addres = MODBUS_FLASH_REG_ADDR;
for(uint16_t i = 0; i < 10000; i++)
{


Laddar…
Avbryt
Spara