打印

GD32F310微控制器上使用USART(串行异步通信)

[复制链接]
470|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GD32F310微控制器上使用USART(串行异步通信)进行中断驱动的串口收发实验,需要配置USART的相关硬件和中断处理函数。以下是一个基本的示例代码,演示了如何使用HAL库进行USART的中断驱动串口收发。

1. 初始化USART
首先需要初始化USART,并配置相关的GPIO引脚作为USART的TX和RX引脚。

c
#include "gd32f3xx_hal.h"

#define USARTx USART0
#define USARTx_CLK_ENABLE()              rcu_periph_clock_enable(RCU_USART0)
#define USARTx_TX_GPIO_CLK_ENABLE()      rcu_periph_clock_enable(RCU_GPIOB)
#define USARTx_RX_GPIO_CLK_ENABLE()      rcu_periph_clock_enable(RCU_GPIOB)

#define USARTx_FORCE_RESET()             rcu_periph_reset_enable(RCU_USART0RST)
#define USARTx_RELEASE_RESET()           rcu_periph_reset_disable(RCU_USART0RST)

/* Definition for USARTx Pins */
#define USARTx_TX_PIN                    GPIO_PIN_6
#define USARTx_TX_GPIO_PORT              GPIOB
#define USARTx_TX_AF                     GPIO_AF1_USART0
#define USARTx_RX_PIN                    GPIO_PIN_7
#define USARTx_RX_GPIO_PORT              GPIOB
#define USARTx_RX_AF                     GPIO_AF1_USART0

/* Definition for USARTx's NVIC */
#define USARTx_IRQn                      USART0_IRQn
#define USARTx_IRQHandler                USART0_IRQHandler

UART_HandleTypeDef huart;

void USART_Config(void) {
    huart.Instance = USARTx;
    huart.Init.BaudRate = 9600;
    huart.Init.WordLength = UART_WORDLENGTH_8B;
    huart.Init.StopBits = UART_STOPBITS_1;
    huart.Init.Parity = UART_PARITY_NONE;
    huart.Init.Mode = UART_MODE_TX_RX;
    huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart) != HAL_OK) {
        /* Initialization Error */
        while (1);
    }
}

void GPIO_Config(void) {
    GPIO_InitTypeDef GPIO_InitStruct;

    USARTx_TX_GPIO_CLK_ENABLE();
    USARTx_RX_GPIO_CLK_ENABLE();

    GPIO_InitStruct.Pin = USARTx_TX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = USARTx_TX_AF;
    HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = USARTx_RX_PIN;
    GPIO_InitStruct.Alternate = USARTx_RX_AF;
    HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart) {
    GPIO_Config();
    USARTx_CLK_ENABLE();
}

void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) {
    HAL_GPIO_DeInit(USARTx_TX_GPIO_PORT, USARTx_TX_PIN);
    HAL_GPIO_DeInit(USARTx_RX_GPIO_PORT, USARTx_RX_PIN);
    USARTx_RELEASE_RESET();
}



使用特权

评论回复
沙发
工程师犹饿死|  楼主 | 2024-6-30 12:23 | 只看该作者
中断处理函数
设置USART的中断处理函数,并处理接收和发送中断。

c
void USARTx_IRQHandler(void) {
    HAL_UART_IRQHandler(&huart);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    // 串口接收完成回调函数
    // 在这里处理接收到的数据
}

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
    // 串口错误回调函数
    // 在这里处理错误
}

使用特权

评论回复
板凳
工程师犹饿死|  楼主 | 2024-6-30 12:24 | 只看该作者
发送和接收数据
使用HAL库函数进行数据的发送和接收。

c

uint8_t txData[] = "Hello, USART!";
uint8_t rxData[20];

int main(void) {
    HAL_Init();
    SystemClock_Config();

    USART_Config();

    HAL_UART_Receive_IT(&huart, rxData, sizeof(rxData)); // 开启中断接收

    while (1) {
        HAL_UART_Transmit(&huart, txData, sizeof(txData), HAL_MAX_DELAY); // 同步发送
        HAL_Delay(1000); // 延时1秒
    }
}


使用特权

评论回复
地板
工程师犹饿死|  楼主 | 2024-6-30 12:24 | 只看该作者
编写主函数
在主函数中进行USART的初始化和调用相关函数。

以上是基本的USART中断驱动串口收发实验的示例代码。根据实际应用需求,可以进一步扩展和优化代码,例如处理更复杂的通讯协议、增加错误处理机制等。

使用特权

评论回复
5
wangtaohui| | 2024-7-31 22:04 | 只看该作者
在GD32F310微控制器上使用USART进行中断驱动的串口收发实验,需要正确配置USART硬件和中断处理函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

886

帖子

0

粉丝