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

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

芯片破解stm32F407单片机实现RS485通讯程序

芯片破解stm32F407单片机源程序如下:

  1. /*485-2 */
  2. #define RS485_RE_GPIO_PORT                  GPIOB
  3. #define RS485_RE_GPIO_PIN                   SYS_GPIO_PIN15
  4. #define RS485_RE_GPIO_CLK_ENABLE()          do{ RCC->AHB1ENR |= 1 << 1; }while(0)   /* PB口时钟使能 */

  5. #define RS485_TX_GPIO_PORT                  GPIOD
  6. #define RS485_TX_GPIO_PIN                   SYS_GPIO_PIN8
  7. #define RS485_TX_GPIO_AF                    7                                       /* AF功能选择 */
  8. #define RS485_TX_GPIO_CLK_ENABLE()          do{ RCC->AHB1ENR |= 1 << 3; }while(0)   /* PD口时钟使能 */

  9. #define RS485_RX_GPIO_PORT                  GPIOD
  10. #define RS485_RX_GPIO_PIN                   SYS_GPIO_PIN9
  11. #define RS485_RX_GPIO_AF                    7                                       /* AF功能选择 */
  12. #define RS485_RX_GPIO_CLK_ENABLE()          do{ RCC->AHB1ENR |= 1 << 3; }while(0)   /* PD口时钟使能 */

  13. #define RS485_UX                            USART3
  14. #define RS485_UX_IRQn                       USART3_IRQn
  15. #define RS485_UX_IRQHandler                 USART3_IRQHandler
  16. #define RS485_UX_CLK_ENABLE()               do{ RCC->APB1ENR |= 1 << 18; }while(0)  /* USART3 时钟使能 */
  17. /*485-2 END */
  18. /* 控制RS485_RE脚, 控制RS485发送/接收状态
  19. * RS485_RE = 0, 进入接收模式
  20. * RS485_RE = 1, 进入发送模式
  21. */
  22. #define RS485_RE(x)     sys_gpio_pin_set(RS485_RE_GPIO_PORT, RS485_RE_GPIO_PIN, x)


  23. #define RS485_REC_LEN               64          /* 定义最大接收字节数 64 */
  24. #define RS485_EN_RX                 1           /* 使能(1)/禁止(0)RS485接收 */


  25. extern uint8_t g_RS485_rx_buf[RS485_REC_LEN];   /* 接收缓冲,最大RS485_REC_LEN个字节 */
  26. extern uint8_t g_RS485_rx_cnt;                  /* 接收数据长度 */


  27. void rs485_init(uint32_t sclk, uint32_t baudrate);  /* RS485初始化 */
  28. void rs485_send_data(uint8_t *buf, uint8_t len);    /* RS485发送数据 */
  29. void rs485_receive_data(uint8_t *buf, uint8_t *len);/* RS485接收数据 */
  30. extern void UartDriver(void); /* 485接收数据处理 */

  31. #endif
  32. //串口驱动函数,检测数据帧的接收,调度功能函数,需在主循环中调用
  33. void UartDriver(void)
  34. {
  35.         unsigned char i=0,cnt;
  36.         unsigned int crc;
  37.         unsigned char crch,crcl;
  38.         static uint8_t len;
  39.         static uint8_t buf[60];
  40.         if(flagFrame)            //帧接收完成标志,即接收到一帧新数据
  41.         {
  42.                 flagFrame=0;           //帧接收完成标志清零
  43.                 len = UartRead(buf,sizeof(buf));   //将接收到的命令读到缓冲区中
  44.                 if(buf[0]==0x01)                   //判断地址是不是0x01
  45.                 {
  46.                         crc=GetCRC16(buf,len-2);       //计算CRC校验值,出去CRC校验值
  47.                         crch=crc>>8;                                    //crc高位
  48.                         crcl=crc&0xFF;                                        //crc低位
  49.                         if((buf[len-2]==crch)&&(buf[len-1]==crcl))  //判断CRC校验是否正确
  50.                         {
  51.                                 switch (buf[1])  //按功能码执行操作
  52.                                 {
  53.                                         case 0x03:     //读数据
  54.                                                 if((buf[2]==0x00)&&(buf[3]<=0x05))  //寄存器地址支持0x0000~0x0005
  55.                                                 {
  56.                                                         
  57.                                                         if(buf[3]<=0x04)
  58.                                                         {
  59.                                                                 i=buf[3];//提取寄存器地址
  60.                                                                 cnt=buf[5];  //提取待读取的寄存器数量
  61.                                                                 buf[2]=cnt*2;  //读取数据的字节数,为寄存器*2,因modbus定义的寄存器为16位
  62.                                                                 len=3;                                                        
  63.                                                                 while(cnt--)
  64.                                                                 {
  65.                                                                         buf[len++]=0x00;                                //寄存器高字节补0
  66.                                                                         buf[len++]=regGroup[i++];                //低字节
  67.                                                         }
  68.                                                         
  69.                                                 }
  70.                                                         break;
  71.                                         }
  72.                                                 else  //寄存器地址不被支持时,返回错误码
  73.                                                 {   
  74.                                                         buf[1]=0x83;  //功能码最高位置1
  75.                                                         buf[2]=0x02;  //设置异常码为02-无效地址
  76.                                                         len=3;
  77.                                                         break;
  78.                                                 }
  79.                                         case 0x06:           //写入单个寄存器
  80.                                                 if((buf[2]==0x00)&&(buf[3]<=0x05))   //寄存器地址支持0x0000-0x0005
  81.                                                 {
  82.                                                         if(buf[3]<=0x04)
  83.                                                         {
  84.                                                                 i=buf[3];                                //提取寄存器地址
  85.                                                                 regGroup[i]=buf[5];                //保存寄存器数据
  86.                                                                 LED0(0);
  87.                                                         }
  88.                                                         len -=2;                 //长度-2以重新计算CRC并返回原帧
  89.                                                         break;
  90.                                                 }



联系方式

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

在线客服
热线电话

企业微信