GD32串口收发程序
时间: 2023-07-27 17:07:19 浏览: 87
以下是一个基于GD32F4xx系列芯片的串口收发程序示例:
```c
#include "gd32f4xx.h"
#define USART0 USART0_IRQn
void usart_init(void)
{
/* 使能USART0时钟 */
rcu_periph_clock_enable(RCU_USART0);
/* GPIOA时钟使能 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 配置PA9(TX)和PA10(RX)为复用推挽输出 */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* 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);
usart_enable(USART0);
/* 配置中断 */
eclic_global_interrupt_enable();
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
eclic_irq_enable(USART0, 1, 0);
}
void usart0_irq_handler(void)
{
/* 判断接收中断是否发生 */
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
/* 读取接收缓冲区数据 */
uint8_t data = usart_data_receive(USART0);
/* 发送数据到发送缓冲区 */
usart_data_transmit(USART0, data);
}
}
int main(void)
{
/* 初始化USART0 */
usart_init();
while(1) {
/* 主循环 */
}
}
```
此示例中,初始化函数 `usart_init()` 配置了USART0为115200bps,8位数据位,1位停止位,无校验位,关闭硬件流控制等。
在中断处理函数 `usart0_irq_handler()` 中判断接收数据是否有效,并在接收到数据后将其发送回去。
在主循环中可以执行其他任务。
阅读全文