gd32f103单片机两个串口初始化
时间: 2023-10-13 14:03:12 浏览: 255
要初始化gd32f103单片机的两个串口,首先需要打开串口时钟。通常情况下,USART1的时钟默认是开启的,如果需要使用USART2,需要手动开启其时钟。
步骤如下:
1. 首先,在库文件中找到对应的寄存器地址。USART1的寄存器地址是0x40013800,USART2的寄存器地址是0x40004400。
2. 对串口1进行初始化:将USART1的时钟使能位USART1EN设置为1,即RCC_APB2ENR寄存器中对应位设置为1。然后设置寄存器USART1_CR1的UE位为1,使能USART1。
3. 对串口2进行初始化:同样设置USART2的时钟使能位USART2EN为1,即RCC_APB1ENR寄存器中对应位设置为1。然后设置寄存器USART2_CR1的UE位为1,使能USART2。
4. 接下来,需要设置串口的波特率、数据位数、停止位、校验位等参数。这些参数需要根据具体需求进行配置。
5. 最后,需要设置串口的工作模式。可以选择同步模式或异步模式,以及各种中断模式。
需要注意的是,在配置完以上参数后,还需要设置GPIO相应的引脚为串口的功能引脚,以及配置引脚的工作模式(推挽输出或开漏输出),也可以选择是否配置硬件流控等功能。
以上是大致的初始化步骤,具体的代码实现与工具选择会根据不同的开发环境和库文件而有所变化。在具体开发中,可以参考相关的手册和例程来完成串口的初始化操作。
相关问题
GD32F103RCT6串口3
### 关于GD32F103RCT6单片机串口3的配置与使用
#### USART3初始化设置
对于GD32F103RCT6而言,USART3位于APB1总线上,默认情况下其时钟源来自PCLK1。为了使能USART3的功能并完成初步设定,需先通过RCC控制器开启对应外设时钟,并指定GPIO端口模式为复用推挽输出形式[^1]。
```c
/* 开启USART3及时钟 */
rcu_periph_clock_enable(RCU_USART3);
rcu_periph_clock_enable(RCU_GPIOA);
/* GPIO初始化结构体定义 */
gpio_init_type gpio_init_struct;
void usart_gpio_config(void){
/* 复位PA8, PA9引脚 */
gpio_pin_reset(GPIOA, GPIO_PIN_8 | GPIO_PIN_9);
/* 设置PA8(TX), PA9(RX)为复用推挽输出 */
gpio_init_struct.gpio_mode = GPIO_MODE_AF_PP;
gpio_init_struct.gpio_out_speed = GPIO_OSPEED_50MHZ;
/* 初始化PA8(PA9同理)*/
gpio_init(GPIOA, &gpio_init_struct);
}
```
#### 配置波特率及其他参数
接着是对通信速率(即波特率)、字长、停止位等属性的具体规定。这里采用标准异步半双工传输协议,数据帧由起始位、8个数据位构成,不带校验位且仅有一个终止位[^2]。
```c
usart_init_type usart_init_struct;
void usart_parameter_config(void){
/* 波特率为115200bps */
usart_init_struct.baud_rate = 115200U;
/* 字符长度为8位 */
usart_init_struct.word_length = USART_WL_8BIT;
/* 奇偶校验关闭 */
usart_init_struct.stop_bits = USART_STPB_1;
/* 禁用硬件流控制 */
usart_init_struct.hardWARE_flow_control = USART_HFC_DISABLE;
/* 发送/接收使能 */
usart_init_struct.transmit_enable = USART_TE_ENABLE;
usart_init_struct.receive_enable = USART_RE_ENABLE;
/* 应用于USART3实例化对象上 */
usart_init(USART3,&usart_init_struct);
}
```
#### 中断服务程序设计
当希望利用中断机制处理接收到的数据包时,则还需注册相应的ISR入口地址至向量表内,并编写具体的响应逻辑[^4]。
```c
extern "C" void USART3_IRQHandler(void){
if(RESET != usart_interrupt_flag_get(USART3, USART_INT_FLAG_RBNE)){
char ch = usart_data_receive(USART3);
// 用户自定义业务流程...
usart_interrupt_flag_clear(USART3, USART_INT_FLAG_RBNE);
}
}
// 启动接收中断请求
usart_interrupt_enable(USART3, USART_INT_RBNE);
NVIC_EnableIRQ(USART3_IRQn);
```
以上便是针对GD32F103RCT6型号MCU中USART3接口的一般性介绍及其基础应用示范。值得注意的是实际项目里可能还会涉及到更复杂的场景比如DMA批量传送或是LIN/LPUART低功耗特性支持等问题,在具体实践中应参照官方手册进一步深入研究。
gd32f103使用串口
### 关于GD32F103单片机串口通信的使用方法
#### 串口初始化设置
为了使能并配置GD32F103系列微控制器上的UART接口用于异步串行通讯,需先完成必要的硬件资源分配以及参数设定工作。这通常涉及到开启对应外设时钟、指定GPIO引脚功能复用为USART收发模式,并调整传输速率(即波特率)、字符长度等属性。
对于具体的实现细节,在`stm32f10x_usart.c`源文件中有详细的函数定义来辅助开发者快速搭建起基本框架[^1]。例如:
```c
void USART_Configuration(void){
/* 配置USART */
usart_init(USART0, 115200); // 设置波特率为115200 bps
/* GPIO端口配置 */
gpio_mode_set(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_10);
/* 打开USART中断 */
nvic_enable_irq(NVIC_USART0_IRQ);
}
```
上述代码片段展示了如何通过调用库函数来进行初步的串口初始化操作,其中包含了对USART模块本身及其关联I/O管脚的功能选择与速度等级设定;同时也开启了相应的NVIC中断请求通道以便后续处理接收到的数据流事件。
#### 数据发送接收流程
当完成了前期准备工作之后,则可以利用预封装好的API接口轻松地向目标设备传递消息或是读取其反馈的信息包。下面给出了一组简单的例子说明怎样执行这些任务:
```c
// 发送字符串给另一台机器
char *str = "Hello World!";
usart_transmit_data8(USART0, (uint8_t *) str, strlen(str));
// 接受来自其他装置的消息
while (!usart_flag_get(USART0, USART_FLAG_RBNE));
char received_char = usart_receive_data8(USART0);
printf("Received char: %c\n", received_char);
```
这里分别演示了两种典型的应用场景——一是主动推送一段文本至远端节点;二是被动监听是否有新的输入到达本侧,并将其显示出来供调试人员查看验证。
#### 中断服务程序设计
考虑到实时响应的需求,往往还需要编写专门针对特定异常状况下的ISR(Interrupt Service Routine),比如检测到错误条件发生时采取适当措施加以恢复,或者是每当有新字节进入缓冲区就触发一次回调机制通知应用程序层做进一步解析等工作。如下所示是一个典型的模板结构:
```c
void USART0_IRQHandler(void){
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
uint8_t ch;
while(!usart_flag_get(USART0, USART_FLAG_TBE));
ch = usart_receive_data8(USART0);
printf("%c",ch);
}
}
```
这段代码实现了对接收到的新字符立即打印输出的功能,同时确保每次只处理一个完整的ASCII码值而非中途打断正在传送中的多字节序列。
阅读全文