gd32f4xx 具体rte 1.0.3 标准库 串口5收发驱动程序
时间: 2024-05-13 16:18:21 浏览: 98
Keil.STM32F4xx_DFP.2.14.0.pack(官方STM32F4xx系列最新固件库for Keil MDK 5)
5星 · 资源好评率100%
以下是基于RTE 1.0.3标准库的串口5收发驱动程序的示例代码:
```c
#include "gd32f4xx.h"
/* 定义串口5的接收缓冲区 */
#define RX_BUF_SIZE 128
uint8_t rx_buf[RX_BUF_SIZE];
uint8_t rx_read = 0;
uint8_t rx_write = 0;
/* 定义串口5的发送缓冲区 */
#define TX_BUF_SIZE 128
uint8_t tx_buf[TX_BUF_SIZE];
uint8_t tx_read = 0;
uint8_t tx_write = 0;
/* 初始化串口5 */
void uart5_init(uint32_t baud_rate)
{
/* 使能USART5和GPIOC时钟 */
rcu_periph_clock_enable(RCU_USART5);
rcu_periph_clock_enable(RCU_GPIOC);
/* 配置PC12为USART5_TX,PC2为USART5_RX */
gpio_af_set(GPIOC, GPIO_AF_8, GPIO_PIN_12 | GPIO_PIN_2);
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_12 | GPIO_PIN_2);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
gpio_input_options_set(GPIOC, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
/* 配置USART5工作模式:8位数据位,1位停止位,无校验位 */
usart_word_length_set(UART5, USART_WL_8BIT);
usart_stop_bit_set(UART5, USART_STB_1BIT);
usart_parity_config(UART5, USART_PM_NONE);
/* 配置USART5波特率 */
usart_baudrate_set(UART5, baud_rate);
/* 使能USART5接收中断 */
usart_interrupt_enable(UART5, USART_INT_RBNE);
/* 使能USART5 */
usart_enable(UART5);
}
/* USART5中断处理函数 */
void USART5_IRQHandler(void)
{
if (usart_interrupt_flag_get(UART5, USART_INT_FLAG_RBNE) != RESET) {
/* 读取接收数据 */
uint8_t data = usart_data_receive(UART5);
/* 将接收数据存入接收缓冲区 */
uint8_t next_write = (rx_write + 1) % RX_BUF_SIZE;
if (next_write != rx_read) {
rx_buf[rx_write] = data;
rx_write = next_write;
}
}
if (usart_interrupt_flag_get(UART5, USART_INT_FLAG_TC) != RESET) {
/* 清除发送完成中断标志 */
usart_interrupt_flag_clear(UART5, USART_INT_FLAG_TC);
/* 如果发送缓冲区中还有数据,继续发送 */
if (tx_read != tx_write) {
usart_data_transmit(UART5, tx_buf[tx_read]);
tx_read = (tx_read + 1) % TX_BUF_SIZE;
}
}
}
/* 从串口5接收数据 */
uint16_t uart5_recv(uint8_t *buf, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i++) {
/* 如果接收缓冲区中没有数据,返回已经接收的数据个数 */
if (rx_read == rx_write) {
break;
}
/* 从接收缓冲区取出一字节数据 */
buf[i] = rx_buf[rx_read];
rx_read = (rx_read + 1) % RX_BUF_SIZE;
}
return i;
}
/* 向串口5发送数据 */
void uart5_send(uint8_t *buf, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i++) {
/* 将数据存入发送缓冲区 */
uint8_t next_write = (tx_write + 1) % TX_BUF_SIZE;
if (next_write != tx_read) {
tx_buf[tx_write] = buf[i];
tx_write = next_write;
}
}
/* 如果USART5发送寄存器为空,直接发送第一个字节 */
if (usart_flag_get(UART5, USART_FLAG_TBE) != RESET) {
usart_data_transmit(UART5, tx_buf[tx_read]);
tx_read = (tx_read + 1) % TX_BUF_SIZE;
}
}
```
该程序初始化了USART5作为串口,并实现了从串口接收数据和向串口发送数据的函数。在程序中使用了两个缓冲区rx_buf和tx_buf来分别存储串口接收和发送的数据。当接收到数据时,将数据存入rx_buf中;当要发送数据时,将数据存入tx_buf中,并调用USART5的发送函数。USART5的中断处理函数USART5_IRQHandler()会在接收完成和发送完成时被调用,分别处理接收和发送的数据。
阅读全文