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();
}
|