历史上的今天
返回首页

历史上的今天

今天是:2025年07月28日(星期一)

正在发生

2021年07月28日 | STM32CubeMX | 37 - 使用RS485总线进行双板通信(SP3485)

2021-07-28 来源:eefocus

本篇详细的记录了如何使用STM32CubeMX配置 STM32F407ZGT6 使用 RS485 总线与另一个开发板之间通信。


STM32CubeMX_07 | 使用USART发送和接收数据(中断模式)。


创建并添加驱动文件

首先在工程目录下,新建文件夹和两个文件,存放编写的RS485驱动程序:

然后将rs485_drv.c添加到工程目录中:

再将rs485_drv.h所在路径添加到头文件路径中:

编写头文件

#ifndef _RS485_DRV_H_

#define _RS485_DRV_H_


#include "usart.h"


/* User Config */

#define RS485_USART         huart2

#define RS485_RE_GPIO_PORT  GPIOG

#define RS485_RE_GPIO_PIN   GPIO_PIN_8


/* RS485 TX/RX Control */

#define RS485_TX_ENABLE()   HAL_Delay(1);

                            HAL_GPIO_WritePin(RS485_RE_GPIO_PORT, RS485_RE_GPIO_PIN, GPIO_PIN_SET);

                            HAL_Delay(1);


#define RS485_RX_ENABLE()   HAL_Delay(1);

                            HAL_GPIO_WritePin(RS485_RE_GPIO_PORT, RS485_RE_GPIO_PIN, GPIO_PIN_RESET);

                            HAL_Delay(1);


void RS485_Init(void);

int RS485_Transmit(uint8_t *data, uint16_t len);


#endif /* _RS485_DRV_H_ */


其中最重要的是RS485_TX_ENABLE和RS485_RX_ENABLE这两个宏定义,用来控制RS485收发器的工作模式。


编写初始化函数

因为STM32CubeMX自动生成的代码中已经完成了串口初始化和控制GPIO初始化,所以在RS485的初始化函数中,只需要使能串口中断 ,控制RS485收发器处于接收模式即可:


/**

* @breif   初始化RS485收发器为接收模式

* @param   无

* @retval  无

* @note    在调用此函数之前,确保已经初始化通信串口和控制GPIO

*/

void RS485_Init()

{

    /* 使能串口接收中断 */

    HAL_UART_Receive_IT(&RS485_USART, rx_data, 4);

    

    RS485_RX_ENABLE();

}


编写发送函数

RS485发送函数与普通串口发送基本一样,只不过在发送之前需要先控制RS485收发器处于发送模式,在发送之后控制RS485收发器处于接收模式即可。


/**

* @breif   控制RS485收发器发送数据

* @param   data 要发送的数据

* @param   len  要发送数据的长度

* @retval  0 - 发送成功,-1 = 发送失败

*/

int RS485_Transmit(uint8_t *data, uint16_t len)

{

    HAL_StatusTypeDef status;

    

    RS485_TX_ENABLE();

    

    status = HAL_UART_Transmit(&RS485_USART, data, len, 0xFFFF);

    

    HAL_Delay(1);

    

    RS485_RX_ENABLE();

    

    return status == HAL_OK ? 0 : -1;

}


编写串口接收中断处理函数

RS485的串口接收中断处理和普通的串口接收一样,直接编写回调函数即可:


/**

 * @brief   串口中断回调函数

 * @note    此函数属于弱定义函数的重新实现,HAL库会自动调用

*/

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    /* 判断是哪个串口触发的中断 */

    if(huart ->Instance == USART2)

    {

        //将接收到的数据打印

        printf("RX Data[0]:0x%02xrn", rx_data[0]);

        printf("RX Data[1]:0x%02xrn", rx_data[1]);

        printf("RX Data[2]:0x%02xrn", rx_data[2]);

        printf("RX Data[3]:0x%02xrn", rx_data[3]);

        

        //重新使能串口接收中断

        HAL_UART_Receive_IT(&RS485_USART, rx_data, 4);

    }

}


此处为了演示我将接收到的数据打印,实际使用中建议此处使用环形缓冲区存储接收数据,具体参考文章:ringbuff | 通用FIFO环形缓冲区实现库。


4. 编写RS485测试函数

① 在main.c中包含刚刚编写的驱动头文件:


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include

#include "rs485_drv.h"

/* USER CODE END Includes */


② 然后在main函数中调用初始化函数:


/* USER CODE BEGIN 2 */

printf("----- RS485 1# Board -----rn");


RS485_Init();


/* USER CODE END 2 */


③ 在main函数最开始前定义发送测试数据:


/* USER CODE BEGIN 1 */

uint8_t data[4] = {0x01, 0x02, 0x03, 0x04};


/* USER CODE END 1 */


然后在while(1)循环中每隔5s发送一次:


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

RS485_Transmit(data, 4);

HAL_Delay(5000);

}

/* USER CODE END 3 */


5. 编写2#实验板的测试程序

2#实验板的配置方法、程序编写和前面的一样,不再讲述。


① 修改2#实验板发送的测试数据:


② 修改2#实验板的打印日志:

编译、下载到2#开发板中。


6. 实验结果

1#实验板的日志如下:

2#实验板的日志如下:

推荐阅读

史海拾趣

BOPLA公司的发展小趣事

在国内市场取得一定成绩后,BOPLA开始将目光投向海外市场。通过参加国际电子展会、与海外客户建立合作关系等方式,公司成功将产品打入国际市场。同时,BOPLA还积极调整产品策略,根据不同国家和地区的市场需求,推出定制化的电子元件产品,进一步扩大了市场份额。

歌尔(Goertek)公司的发展小趣事

BOPLA公司成立于XXXX年,初期主要致力于电子开关、熔断器等基础电子元件的研发与生产。创始人凭借对电子行业的深厚理解和敏锐的市场洞察力,带领公司逐步在竞争激烈的市场中站稳脚跟。通过不断的技术创新和品质提升,BOPLA的产品逐渐获得了客户的认可,为公司后续的发展奠定了坚实的基础。

智浦欣(Chipstar)公司的发展小趣事

在2010年4月的上海张江高科技园区,一群志同道合的工程师和创业者聚集在一起,共同创立了上海智浦欣微电子有限公司。他们怀揣着对模拟及数模混合IC技术的深厚理解和热爱,立志要在消费类电子市场占据一席之地。起初,公司面临着资金紧张、技术挑战和市场压力等多重困难,但团队成员凭借对技术的执着和对市场的敏锐洞察,逐步攻克难题,研发出了几款性能优越的音频放大器和电源管理产品,为公司赢得了初步的市场认可。

Densei-Lambda (TDK)公司的发展小趣事

随着技术的不断进步和市场需求的日益增长,智浦欣公司意识到,只有不断创新和突破,才能在激烈的市场竞争中立于不败之地。于是,公司加大了对研发团队的投入,引进了一批国内外顶尖的模拟器件和混合信号设计人才。经过数月的努力,团队成功研发出了一款具有高性价比的WLED驱动器产品,该产品以其卓越的性能和稳定的质量赢得了客户的广泛好评。随后,公司又相继推出了多款具有竞争力的新产品,进一步巩固了其在消费类电子市场的地位。

EBK Kruger GmbH & Co KG公司的发展小趣事

随着公司技术的不断成熟和产品的多样化,EBK Kruger开始将目光投向国际市场。公司参加了多个国际电子展会,并成功与多家国际知名企业建立了合作关系。通过与这些企业的合作,EBK Kruger不仅扩大了市场份额,还学到了先进的国际管理经验和技术知识,为公司的发展注入了新的活力。

Foxboro I C T Inc公司的发展小趣事

在电子行业的初期,EBK Kruger GmbH & Co KG由创始人Klaus Kruger在德国的一个小镇创立。Klaus是一位电子工程师,对新型电子元器件的研发充满热情。他带领团队成功研发出一种具有更高稳定性和更低能耗的新型电阻器,这一技术突破让公司在行业中崭露头角。通过不断的技术创新和产品优化,EBK Kruger逐渐赢得了市场的认可。

问答坊 | AI 解惑

智林测控开发板.强烈推荐

这是个ARM最小系统开发板,大家可以上淘宝买一个玩,不到50元的成本, [ 本帖最后由 jxb01033016 于 2009-9-17 11:57 编辑 ]…

查看全部问答>

欢迎大家到我的博客看看

http://c8051fmcu.blog.sohu.com…

查看全部问答>

EVC和VC2005开发的比较

EVC和VC2005开发智能设备的程序,相互比较各自有什么优点和缺点?谢谢大家了…

查看全部问答>

求STM32MCKIT电机控制的程序和库

怎么ST网站上找不到演示程序和库呢 哪里有下载呢 谢谢啦!准备在万利的STM3210B上跑跑 俺的需求是做3相交流异步的驱动…

查看全部问答>

求指导一下

 我问大家一个问题,我的电路板作为了一个客户端,如果服务器主动断开连接,我在哪里可以找到一个提示或者说是标致,然后我可以判断,然后让客户端从新建立连接…

查看全部问答>

3517的试用分享咧?

被收起来了么?俺想找找看都找不到嘞,是不是应该归拢一下哦?…

查看全部问答>

OP放大电路设计

不要问我什么事OP哦 …

查看全部问答>

竞赛必须用到的模块制作指导

本帖最后由 paulhyde 于 2014-9-15 03:43 编辑 就是你想要!!!  …

查看全部问答>

给大家转发个MSP430 JTAG(USB的和并口的)与目标板连接需要注意的几点总结

经常看到有初学MSP430的朋友在坛里询问MSP430 JTAG与目标板连接方面的问题,我在这里给大家总结一下,希望能给初学MSP430的朋友拨云见日,不再疑惑。 MSP430的JTAG连接主要有两种方式:4线JTAG方式(包含TDO、TDI、TMS、TCK四路标准JTAG ...…

查看全部问答>

任哲书ucosII提问

任哲书配套例程中每个source文件中有个test.lnk,应该是个链接文件吧?怎么看到其中的内容,并进行修改呢?…

查看全部问答>