【Uart串口-GD32无标题】

GD32串口配置:

复制代码
typedef struct
{
uint32_t uartNo;//哪一个串口号
	rcu_periph_enum rcuUart;//哪一个串口时钟
	rcu_periph_enum rcuGpio;//哪一个 GPIO 的时钟
uint32_t gpio;//哪一组 GPIO
uint32_t txPin;// PIN
uint32_t rxPin;//  rx PIN
} UartHwInfo_t;

static UartHwInfo_t g_uartHwInfo = {USART0, RCU_USART0, RCU_GPIOA, GPIOA, GPIO_PIN_9, GPIO_PIN_10}; //初始化结构体

static void Usb2ComGpioInit(void)
{
rcu_periph_clock_enable(g_uartHwInfo.rcuGpio);//使能 GPIO 时钟
gpio_init(g_uartHwInfo.gpio, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, g_uartHwInfo.txPin);// 复用推挽输出模式,速度10MHZ 
gpio_init(g_uartHwInfo.gpio, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, g_uartHwInfo.rxPin);//上拉输出模式 RX
}


//串口 初始化
static void Usb2ComUartInit(uint32_t baudRate)
{
/* 使能UART时钟;*/
rcu_periph_clock_enable(g_uartHwInfo.rcuUart); 
/* 复位UART;*/
usart_deinit (g_uartHwInfo.uartNo);
/* 通过USART_CTL0寄存器的WL设置字长;*/ 
//usart_word_length_set(g_uartHwInfo.uartNo, USART_WL_8BIT);//数据位8
/* 通过USART_CTL0寄存器的PCEN设置校验位;*/ 
//usart_parity_config(g_uartHwInfo.uartNo, USART_PM_NONE);  //无校验
/* 在USART_CTL1寄存器中写STB[1:0]位来设置停止位的长度;*/ 
//usart_stop_bit_set(g_uartHwInfo.uartNo, USART_STB_1BIT);  //停止位1    // 注释掉这三行,默认也是  数据位8,、无校验、停止位1
/* 在USART_BAUD寄存器中设置波特率;*/ 
usart_baudrate_set(g_uartHwInfo.uartNo, baudRate);
/* 在USART_CTL0寄存器中设置TEN位,使能发送功能;*/
usart_transmit_config(g_uartHwInfo.uartNo, USART_TRANSMIT_ENABLE);
    /* 在USART_CTL0寄存器中设置TEN位,使能发送功能;*/
    usart_receive_config(g_uartHwInfo.uartNo, USART_RECEIVE_ENABLE);
/* 在USART_CTL0寄存器中置位UEN位,使能UART0;*/ 
usart_enable(g_uartHwInfo.uartNo);
}

发送函数:Usb2ComTest 外部调用

usart_data_transmit 串口发送函数

复制代码
void Usb2ComTest(void)
{
for (uint8_t i = 0; i <= 250; i++)
	{
usart_data_transmit(g_uartHwInfo.uartNo, i);//发送 250 个数据,
while (RESET == usart_flag_get(g_uartHwInfo.uartNo, USART_FLAG_TBE)); //等待 TBE 数据寄存器为空,为空时 TBE = 1;
	}
//usart_flag_get 这个是看发送发送数据缓冲区空标志(USART_FLAG_TBE)是否为空,发送完数据后,函数返回0,否则1


//	while (RESET == usart_flag_get(g_uartHwInfo.uartNo, USART_FLAG_TC)); //等待 移位寄存器 为空时
//	usart_transmit_config(g_uartHwInfo.uartNo, USART_TRANSMIT_DISABLE);   //关闭发送功能
//USART_FLAG_TC发送完成标志
}

USART_FLAG_TBE,发送数据寄存器空:

可以往 TDR 写入下一个字节;移位寄存器还在向外发数据

USART_FLAG_TC 发送完成:

当前这一帧完整全部发送完毕,TX 引脚回到空闲电平

注意:如果你发送完要切换引脚功能、进入低功耗,必须等待

USART_FLAG_TC发送完成,不能等待 USART_FLAG_TBE。 如果只等 TBE,移位寄存器还在往外发,此时关闭串口会把正在发送的数据截断。

外部调用函数:

复制代码
***********************************************************
* @brief  USB转串口硬件初始化  外部调用函数
* @param
* @return 
***********************************************************
*/
void Usb2ComDrvInit(void)
{
	Usb2ComGpioInit();  //
	Usb2ComUartInit(115200);  //
}

/**
***********************************************************
* @brief printf函数默认打印输出到显示器,如果要输出到串口,
		 必须重新实现fputc函数,将输出指向串口,称为重定向
* @param
* @return 
***********************************************************
*/
int fputc(int ch, FILE *f)
{
	usart_data_transmit(g_uartHwInfo.uartNo, (uint8_t)ch);
	while (RESET == usart_flag_get(g_uartHwInfo.uartNo, USART_FLAG_TBE));
	return ch;
}

代码来自郭天祥

相关推荐
西峰u1 小时前
Java Socket网络编程|TCP与UDP深度梳理
单片机·嵌入式硬件
至为芯1 小时前
PY32F002B至为芯集成32位ARM内核的低成本MCU单片机
单片机·集成电路·芯片
亮工硬件1 小时前
1-8 简易串口通讯协议(UART + 自定义帧协议)
笔记·stm32·单片机·嵌入式硬件·学习
星栖与芯2 小时前
STM32MP157 M4 指针避坑(三):生命周期与内存踩踏——HardFault 重灾区
java·网络·stm32
三佛科技-187366133972 小时前
小家电/玩具MCU选型指南,国产低成本MCU替代之选
单片机·嵌入式硬件
花 满 楼2 小时前
TPWM — PWM 测量模式(TIM PWM Measurement Mode)
单片机·嵌入式硬件·fpga开发
wuyk5553 小时前
从零吃透 MQTT 通信|第 6 章 MQTT 主题、过滤器、通配符、订阅管理、拒收机制详解与代码实现
c语言·stm32·学习
周洲083012 小时前
STM32 最简工程搭建|标准库/HAL库规范化模板,零冗余可直接落地
stm32·单片机·嵌入式硬件
ACP广源盛1392462567313 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#YLB3116 中端多盘存储扩展在 AI 服务中的机会与应用场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos