gd32串口中断收发程序
时间: 2023-09-22 22:07:33 浏览: 119
下面是一个基于GD32F4xx系列单片机的串口中断收发程序示例:
```c
#include "gd32f4xx.h"
#define USART0 USART0
#define USART0_CLK RCU_USART0
#define USART0_GPIO_PORT GPIOA
#define USART0_GPIO_CLK RCU_GPIOA
#define USART0_GPIO_TX GPIO_PIN_9
#define USART0_GPIO_RX GPIO_PIN_10
#define USART0_GPIO_AF GPIO_AF_USART0
#define USART0_RXNE_IRQ USART0_IRQn
uint8_t rx_buf[50];
uint8_t rx_len = 0;
/* 初始化USART0 */
void usart0_init(void)
{
/* 使能USART0和GPIOA时钟 */
rcu_periph_clock_enable(USART0_CLK);
rcu_periph_clock_enable(USART0_GPIO_CLK);
/* 配置PA9为USART0_TX,PA10为USART0_RX */
gpio_init(USART0_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART0_GPIO_TX);
gpio_init(USART0_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART0_GPIO_RX);
/* 配置USART0参数 */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
/* 使能USART0接收中断 */
usart_interrupt_enable(USART0, USART_INT_RBNE);
nvic_irq_enable(USART0_RXNE_IRQ, 0, 0);
/* 使能USART0 */
usart_enable(USART0);
}
/* USART0中断服务函数 */
void USART0_IRQHandler(void)
{
if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET) {
/* 读取接收数据 */
uint8_t data = (uint8_t)usart_data_receive(USART0);
rx_buf[rx_len++] = data;
if (rx_len >= 50) {
rx_len = 0;
}
}
}
/* 发送数据到USART0 */
void usart0_send(uint8_t *buf, uint32_t len)
{
uint32_t i = 0;
for (i = 0; i < len; i++) {
/* 等待发送区为空 */
while (usart_flag_get(USART0, USART_FLAG_TBE) == RESET);
/* 发送数据 */
usart_data_transmit(USART0, buf[i]);
}
}
int main(void)
{
/* 初始化USART0 */
usart0_init();
while (1) {
/* 接收到的数据回发 */
if (rx_len > 0) {
usart0_send(rx_buf, rx_len);
rx_len = 0;
}
}
}
```
在上面的示例中,我们使用了USART0进行串口通信。首先,在`usart0_init()`函数中初始化了USART0和GPIOA,并配置了USART0的参数。然后,我们使能了USART0的接收中断,并在中断服务函数`USART0_IRQHandler()`中读取接收到的数据。最后,在主函数中,我们通过调用`usart0_send()`函数将接收到的数据回发。
需要注意的是,在使用串口通信时,要确保发送端和接收端的波特率、数据位、校验位、停止位等参数设置一致,否则可能会出现通信失败的情况。同时,在中断服务函数中,要尽量避免使用过多的代码,以免影响串口通信的实时性。
阅读全文