| @@ -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; | |||
| @@ -122,4 +122,4 @@ void ModbusHardwareInit(void) | |||
| ModbusUsartInit(); | |||
| ModbusDmaInit(); | |||
| ModbusNvicInit(); | |||
| } | |||
| } | |||
| @@ -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> | |||
| @@ -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> | |||
| @@ -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; | |||
| @@ -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 | |||
| @@ -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++) | |||
| { | |||