(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 ()
{
//将485芯片设置为发送模式
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
TxByte = 0x88;
//发送数据
HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, , 0xFF);
//将485芯片设置为接收模式
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_Delay();
}
(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, , 0xFF);
}
else
{
TxByte = 0x02;
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);
HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, , 0xFF);
}
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);
//重新使能串口接收中断
HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, );
}
(3)默认是要使能485接收的,那么串口接收中断默认应该也是开启的,所以在main函数的while(1)之前添加上下面的代码:
HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, );
齐活,下载验证:

(7)STM32使用HAL库实现RS485通讯(全双工串口)的更多相关文章
- STM32 之 HAL库(固件库) _
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- STM32 之 HAL库(固件库)
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- (4)STM32使用HAL库实现串口通讯——理论讲解
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...
- (2)STM32使用HAL库操作外部中断——理论讲解
1.中断触发过程 对主程序压栈--把中断服务函数的地址写入到程序计数器(PC)--执行中断服务函数 2.中断向量表 中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分): 如上表所示, ...
- STM32之HAL库、标准外设库、LL库(STM32 Embedded Software)-(转载)
STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是 ...
- STM32基于HAL库通过DMA读写SDIO
通过STM32CUBEMX生成DMA读写sdio的工程,再读写过程中总会卡死在DMA中断等待读写完成的while中,最终发现while等待的标志在SDIO的中断里置位的,而SDIO中断优先级如果小于或 ...
- (1)STM32使用HAL库操作GPIO
一 初始化GPIO 使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成. 自动生成的HAL库GPIO初始化代码: static void MX_GPIO_Init( ...
- stm32 HAL库笔记(一)——串口的操作
昨天分析了普通io口的使用,和初始化代码流程,回顾一下,首先定义一个配置io口功能的结构体,然后开启时钟,再去配置这个结构体里面的各个成员变量,每个成员变量都有很多种选择,可以看各个成员变量 后面的注 ...
- STM32 关于HAL库硬件SPI要注意的问题总结
利用STM32CUbeMx编写程序,大大方便了开发,最近做的项目利用到了 STM32CUbeMx的硬件SP,这里对SPI的使用做一个总结. HAL库里的硬件SPI主要有以下几个库函数: /* hspi ...
随机推荐
- java基础语法(一)
java基础语法(一) 1.类是一种抽象的概念,对象是类的一种具体表示形式,是具体的概念.先有类,然后由类来生成 对象(Object).对象又叫做实例(Instance). 2.类由两大部分构成:属性 ...
- 以太坊智能合约虚拟机(EVM)原理与实现
以太坊 EVM原理与实现 以太坊底层通过EVM模块支持合约的执行与调用,调用时根据合约地址获取到代码,生成环境后载入到EVM中运行.通常智能合约的开发流程是用solidlity编写逻辑代码,再通过编译 ...
- Centos7 时区的设置
Linux 系统(我特指发行版, 没说内核) 下大部分软件的风格就是不会仔细去考虑向后 的兼容性, 比如你上个版本能用这种程序配置, 没准到了下一个版本, 该程序已经不见了. 比如 sysvinit ...
- MySQL数据库开发规范知识点
前言: 设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一. 约定优先于配置(Convention Over Configuration ...
- Fast Paxos
http://blog.csdn.net/chen77716/article/details/7297122 自从Lamport在1998年发表Paxos算法后,对Paxos的各种改进工作就从未停止, ...
- linux 系统centOS 7 怎么在线安装mysql
以下操作,注意空格,为避免出错,可以选择直接copy 第一步: 输入命令行 yum list installed | grep mysql 检查是否已经安装mysql 已安装输入 ...
- (function($){...})(jQuery) 含义 【转】
经常用,今天总结一下,下文摘自某网友的总结: (function($){...})(jQuery)实际上是匿名函数,不懂得朋友可以继续往下看. 这里实际上是匿名函数 function(arg){... ...
- 使用伪类before和after
.content { padding: 20px } .content::before { content: "我是before添加的内容"; font-weight: bold ...
- JDBC、DBUtils
JDBC(Java Data Base Connectivity) java数据连接 可以为多种数据库,提供统一访问,它由一组用java语言编写的类和接口组成,也是java访问数据库的规范. my ...
- 【多线程】-Thread
Thread介绍(实例化): Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数.微软官网给出的 ...