芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

芯片解密STM8 RS485的modbus通迅(主机及从机)程序代码

芯片解密stm8单片机源程序(从机)如下:

  1. /* Includes ------------------------------------------------------------------*/
  2. 芯片解密v#include "stm8s_lib.h"
  3. 芯片解密#include "functions.h"
  4. //#include "STM8S103F.h"
  5. #include "stm8s_tim1.h"

  6. /* Private typedef -----------------------------------------------------------*/
  7. /* Private define ------------------------------------------------------------*/

  8. u16                                          re_CRC16;
  9. u8                                                 CRC_Len;
  10. u8                                                 Data_Len;
  11. u8                                                 OffsetAdr;
  12. u8                                                 SlaveAdr;
  13. u8                                                 ModbusFC;
  14. ModBusData                 ModbusRAM[ModBusRAM_LEN_MAX];

  15. void Respond_ModbusREQ(void);
  16. void Init_Clock(void);
  17. /*
  18. void Init_GPIO(void);
  19. void Init_GPIO(void)
  20. {
  21.     GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);                                //UART1 RX
  22.           GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);                //UART1 TX
  23. }
  24. */
  25. void Init_Clock(void)//
  26. {
  27.     /* Select fCPU = 16MHz*/
  28.                 CLK_DeInit();
  29.     CLK_HSICmd(ENABLE);
  30.     CLK_HSECmd(DISABLE);
  31.                 CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);//CLK_PRESCALER_CPUDIV1 16mhz
  32.                 nop();nop();nop();nop();nop();nop();
  33.     //CLK_CCOConfig(CLK_OUTPUT_CPU);                                /* For test purpose output Fcpu on MCO pin */
  34. }
  35. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
  36. void Respond_ModbusREQ(void)
  37.         {               
  38.                 u8 tmpMODBUS[RX_LEN_MAX];
  39.                 u8 i;
  40.                
  41.                 ModbusFC = MODBUS[1];
  42.                 Data_Len = MODBUS[5];
  43.                
  44.                 switch(ModbusFC)
  45.                         {
  46.                                 case 0x03:
  47.                                         i = 8;
  48.                                         break;
  49.                                        
  50.                                 case 0x10:
  51.                                         i = (u8)(9 +  (Data_Len * 2));
  52.                                         break;
  53.                                 
  54.                                 default:
  55.                                         i = 0;
  56.                                         break;
  57.                         }
  58.                 if(i>0)
  59.                         {
  60.                                 CRC_Len = (u8)(i - 2);
  61.                                 
  62.                                 while(i>0)
  63.                                 {
  64.                                         tmpMODBUS[i-1] = MODBUS[i-1];
  65.                                         i--;
  66.                                 }
  67.                                 
  68.                                 re_CRC16 = tmpMODBUS[CRC_Len + 1];
  69.                                 re_CRC16 = (re_CRC16<<8)+tmpMODBUS[CRC_Len];                                //寻找接收的CRC码
  70.                                 CRC16    = crc16(tmpMODBUS,CRC_Len);                                                                //计算接收数据的CRC
  71.                                 if((re_CRC16 == CRC16)&&(OffsetAdr<ModBusRAM_LEN_MAX))//如果校验正确  判断功能码和数据起始地址
  72.                                         {
  73.                                                 OffsetAdr = (u8)((tmpMODBUS[3]) * 2);                                                //OffsetAdr = tmpMODBUS[2] * 256 + tmpMODBUS[3];
  74.                                                 Data_Len  = (u8)(tmpMODBUS[5] * 2);                                                        //读写寄存器数量
  75.                                                 switch(ModbusFC)
  76.                                                         {  
  77.                                                                 case 0x03:                                                                                                                                         //判断功能码响应指令 发送被召唤数据
  78.                                                                 {
  79.                                                                         //if(tmpMODBUS[3] == 0x01)
  80.                                                                         //        {                                       
  81.                                                                         tmpMODBUS[2] = Data_Len;                                                                        //字节数=寄存器数量*2
  82.                                                                         for(i=0;i<Data_Len;i++)
  83.                                                                         {
  84.                                                                                 if(i & 0x01)
  85.                                                                                         tmpMODBUS[3 + i] = (u8)(ModbusRAM[((OffsetAdr+i)>>1)].ModBus16Word % 0x100);
  86.                                                                                 else
  87.                                                                                         tmpMODBUS[3 + i] = (u8)(ModbusRAM[((OffsetAdr+i)>>1)].ModBus16Word / 0x100);
  88.                                                                         }
  89.                                                                         
  90.                                                                         CRC_Len = (u8)(3 + Data_Len);
  91.                                                                         CRC16   = crc16(tmpMODBUS,CRC_Len);                                //计算接收数据的CRC
  92.                                                                         tmpMODBUS[CRC_Len]=(u8)(CRC16);                                                //LSB
  93.                                                                         tmpMODBUS[CRC_Len+1]=(u8)(CRC16>>8);                        //MSB
  94.                                                                         SEND_ON
  95.                                                                         for(i=0;i<CRC_Len+2;i++)                                                                        //发送应答数据        多寄存器读命令返回
  96.                                                                                 {
  97.                                                                                         UART1->DR=tmpMODBUS[i];
  98.                                                                                         while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);                        //
  99.                                                                                 }



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信