GD32E23x 串口0和1DMA+空闲中断
这是一个从EmbeddedBuilder工程中移植过来的Keil工程,基于GD32E23x 创建使用。
- 🎉大部分功能代码实现,基于AI辅助完成生成。
- ✨功能经过烧录硬件验证。
🔧硬件平台
- 🌿芯片型号:GD32E23x系列
- 🌿开发环境:Keil MDK
📄功能说明
⚙️时钟配置
- 外部高速时钟(HXTAL):8MHz晶振
- 外部低速时钟(LXTAL):32.768KHz晶振(可选,通过宏
ENABLE_LXTAL配置) - 内部低速时钟(IRC40K):40KHz RC振荡器(默认使用)
- 系统时钟:72MHz(PLL倍频9倍)
- APB1时钟:72MHz
- APB2时钟:72MHz
📡串口外设
🔌USART0
- 引脚:PB6(TX), PB7(RX)
- 波特率:115200
- 数据位:8位
- 校验位:无
- 停止位:1位
- 功能:空闲中断 + DMA接收
- DMA通道:DMA_CH2
- 接收缓冲区:32字节
- printf重定向:默认输出到USART0
🔌USART1
- 引脚:PA2(TX), PA3(RX)
- 波特率:115200
- 数据位:8位
- 校验位:无
- 停止位:1位
- 功能:空闲中断 + DMA接收
- DMA通道:DMA_CH4
- 接收缓冲区:256字节
📤串口输出函数
printf():标准printf函数,默认输出到USART0usart_printf(USARTx, format, ...):可指定串口输出的格式化函数
💡LED指示灯
- 引脚:PC13
- 功能:RTC闹钟中断触发时翻转
🕐RTC实时时钟
- 时钟源:内部RC40KHz(默认)或外部LXTAL 32.768KHz
- 功能:
- 实时时钟显示
- 闹钟中断:默认每分钟第9秒触发
- 闹钟中断时翻转LED指示灯
🔄DMA配置
- DMA_CH2:USART0_RX接收
- DMA_CH4:USART1_RX接收
- 传输方向:外设到内存
- 数据宽度:8位
- 优先级:高优先级
📑使用说明
📝串口使用示例
💻USART0使用
c
// 标准printf输出到USART0
printf("Hello from USART0\n");
// 发送数据
USART0_SendData("Send to USART0\n");
💻USART1使用
c
// 指定串口输出
usart_printf(USART1, "Hello from USART1\n");
// 发送数据
USART1_SendData("Send to USART1\n");
📥串口接收处理
- USART0和USART1都使用DMA+空闲中断接收
- 接收完成后自动回显数据
- USART1接收的数据会通过USART0打印显示
⚙️RTC配置
- 在
gd32e23x_hal_init.c中设置ENABLE_LXTAL宏选择RTC时钟源#define ENABLE_LXTAL 0:使用内部RC40KHz(默认)#define ENABLE_LXTAL 1:使用外部LXTAL 32.768KHz
🛠引脚分配


| 外设 | 功能 | 引脚 | 复用功能 |
|---|---|---|---|
| USART0 | TX | PB6 | AF0 |
| USART0 | RX | PB7 | AF0 |
| USART1 | TX | PA2 | AF1 |
| USART1 | RX | PA3 | AF1 |
| LED | - | PC13 | GPIO |
🎯DMA通道映射
| DMA通道 | 外设 | 功能 |
|---|---|---|
| DMA_CH2 | USART0 | RX接收 |
| DMA_CH4 | USART1 | RX接收 |
⛳注意事项
- 串口0和串口1的DMA接收使用不同的DMA通道,不会产生冲突
- printf默认输出到USART0,如需输出到USART1请使用
usart_printf(USART1, ...) - RTC时钟源在编译时通过宏定义选择,修改后需重新编译
- 接收缓冲区大小可根据实际需求调整
🔖编译说明
- 使用Keil MDK打开
Template.uvprojx工程文件 - 选择对应的芯片型号(GD32E230C8等)
- 编译生成
Project.hex文件 - 使用DAP-Link或GD-Link下载器烧录程序
📚程序源码
c
通过网盘分享的文件:HAL_UART0_1_DMA.rar
链接: https://pan.baidu.com/s/13FXxC_ktdhwWO7fd9dZenA?pwd=kpsb 提取码: kpsb