zoukankan      html  css  js  c++  java
  • (7)STM32使用HAL库实现RS485通讯(全双工串口)

    一、硬件

    如下图所示,485芯片链接到单片机的USART2上,但是默认的USART2并不是在PD5和PD6上,这里是需要重映射的。另外PG4作为485收发的控制(在485协议中,RE、DE同时为高电平那么芯片使能发送,如果同时为低电平那么芯片使能接收)

    二、软件设计

    1.软件功能

    默认485芯片是接收功能,每隔1s发送一个0x88,如果接收到0x55那么返回0x01,如果接收到的数据不是0x55就返回0x00。

    2.CubeMX操作

    (1)时钟

    (2)调试

    注意:这里一定要选择上,否则会导致Jlink无法下载,Cube这里默认是不使能的,那么调试引脚就会被配置成普通IO。

    (3)usart2

    (4)重映射

    (5)配置485芯片使能引脚-PG4

    (6)配置时钟,这个要根据具体的芯片与晶振来配置

    (7)配置串口,这里默认就行

    (8)配置串口中断

    (9)配置485收发使能引脚PG4

    默认是接收功能,所以是低电平

    (10)点击生成工程

    3.软件设计

    (1)根据功能,系统要每一秒发送一个0x88出去,那么就在main的while(1)循环中填写如下代码:

      while (1)
      {
            //将485芯片设置为发送模式
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
            TxByte = 0x88;
            //发送数据
            HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
            //将485芯片设置为接收模式
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);
            HAL_Delay(1000);
      }

    (2)如果接收到0x55那么返回0x01,如果接收到的数据不是0x55就返回0x00。

    这里用到中断,写一个中断回调函数如下:

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        if (0x55 == RxByte)
        {
            TxByte = 0x01;
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
            HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
        }
        else
        {
            TxByte = 0x02;
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
            HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
        }
        HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);
      //重新使能串口接收中断 HAL_UART_Receive_IT(
    &huart2, (uint8_t *)&RxByte, 1); }

    (3)默认是要使能485接收的,那么串口接收中断默认应该也是开启的,所以在main函数的while(1)之前添加上下面的代码: 

    HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, 1);

    齐活,下载验证:

  • 相关阅读:
    第2章—装配Bean—通过java代码装配bean
    第2章—装配Bean—自动化装配Bean
    第1章—Spring之旅—Spring模块介绍
    第1章—Spring之旅—容纳你的Bean
    第1章—Spring之旅—简化Spring的java开发
    Spring由于web配置导致的spring配置文件找不到的问题的解决方案
    java中Filter过滤器处理中文乱码的方法
    JAVA的NIO的新特性和小Demo,进一步了解NIO
    Azure linux centos 默认登陆账号是什么?
    Linux 获取文件时间信息 判断文件是否存在
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/7403118.html
Copyright © 2011-2022 走看看