写一个GD32的串口485模式通讯代码
时间: 2023-06-11 20:04:14 浏览: 728
GD32F470串口通讯 CAN通讯
好的,下面是一个简单的GD32串口485模式通讯代码的示例:
```
#include "gd32f1x0.h"
/* 定义串口设备号 */
#define USARTx USART1
/* 定义UART1外设GPIO引脚宏 */
#define USARTx_GPIO_CLK RCC_AHBPeriph_GPIOA
#define USARTx_GPIO_PORT GPIOA
#define USARTx_RxPin GPIO_Pin_10
#define USARTx_TxPin GPIO_Pin_9
/* 定义UART1外设时钟宏 */
#define USARTx_CLK RCC_APB2Periph_USART1
/* 定义485控制GPIO引脚宏 */
#define RS485_GPIO_CLK RCC_AHBPeriph_GPIOB
#define RS485_GPIO_PORT GPIOB
#define RS485_ENABLE_Pin GPIO_Pin_3
/* 定义函数返回值宏 */
#define SUCCESS 0
#define FAILURE -1
/* 函数声明 */
void USARTx_Init(void);
void RS485_Enable(void);
void RS485_Disable(void);
void USARTx_SendByte(uint8_t data);
int32_t USARTx_SendData(uint8_t * Data, uint32_t len);
int main(void)
{
uint8_t sendData[] = {0x01, 0x02, 0x03};
/* 初始化USART1 */
USARTx_Init();
/* 使能RS485发送 */
RS485_Enable();
/* 发送数据 */
if(USARTx_SendData(sendData, sizeof(sendData)) == FAILURE)
{
/* 数据发送失败 */
}
/* 禁止RS485发送 */
RS485_Disable();
while(1);
}
/**
* @brief USART1初始化函数
* @param 无
* @retval 无
*/
void USARTx_Init(void)
{
/* 使能USART1时钟 */
RCC_APB2PeriphClockCmd(USARTx_CLK, ENABLE);
/* 使能UART1外设GPIO引脚时钟 */
RCC_AHBPeriphClockCmd(USARTx_GPIO_CLK, ENABLE);
/* 使能485控制GPIO引脚时钟 */
RCC_AHBPeriphClockCmd(RS485_GPIO_CLK, ENABLE);
/* 配置USARTx Tx和Rx引脚 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = USARTx_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USARTx_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USARTx_TxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(USARTx_GPIO_PORT, &GPIO_InitStructure);
/* USART1配置 */
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStructure);
/* 使能USART1 */
USART_Cmd(USARTx, ENABLE);
}
/**
* @brief 使能485发送
* @param 无
* @retval 无
*/
void RS485_Enable(void)
{
/* 设置RS485控制引脚为输出状态 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = RS485_ENABLE_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(RS485_GPIO_PORT, &GPIO_InitStructure);
/* 使能发送 */
GPIO_WriteBit(RS485_GPIO_PORT, RS485_ENABLE_Pin, Bit_SET);
}
/**
* @brief 禁止485发送
* @param 无
* @retval 无
*/
void RS485_Disable(void)
{
/* 关闭发送 */
GPIO_WriteBit(RS485_GPIO_PORT, RS485_ENABLE_Pin, Bit_RESET);
/* 设置RS485控制引脚为输入状态 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = RS485_ENABLE_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(RS485_GPIO_PORT, &GPIO_InitStructure);
}
/**
* @brief USARTx发送一个字节
* @param data:要发送的字节
* @retval 无
*/
void USARTx_SendByte(uint8_t data)
{
/* 等待发送缓冲区为空 */
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
/* 通过USARTx发送数据 */
USART_SendData(USARTx, data);
/* 等待发送完成 */
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
}
/**
* @brief USARTx发送数据
* @param Data:要发送的数据指针
* @param len:要发送的数据长度
* @retval 发送结果,SUCCESS为成功,FAILURE为失败
*/
int32_t USARTx_SendData(uint8_t * Data, uint32_t len)
{
uint32_t i;
/* 检查输入参数 */
if (Data == NULL || len == 0)
{
return FAILURE;
}
/* 循环发送数据 */
for (i = 0; i < len; i++)
{
USARTx_SendByte(Data[i]);
}
return SUCCESS;
}
```
这个代码可以实现GD32的串口485模式通讯,通过RS485控制引脚使能发送和接收,通过USARTx发送和接收数据。你可以根据你的具体需求进行修改和优化。
阅读全文