GD32F103 GPIO复用表
时间: 2024-10-17 18:02:32 浏览: 85
GD32F103是一款基于Arm Cortex-M4内核的微控制器,它内置了丰富的GPIO (通用输入输出)资源,可用于多种功能,包括模拟输入、数字输入输出、PWM(脉宽调制)等。关于GPIO的复用,GD32F103的GPIO管脚支持多种模式配置:
1. **基本IO模式**:可以作为普通的输入输出口,如读取或设置电平。
2. **推挽输出**:适用于驱动外部负载,提供高电压或低电压信号。
3. **开漏输出**:无内部上拉电阻,允许外部电路连接电源来确定输出状态。
4. **输入捕获**:用于测量特定频率信号的周期。
5. **比较**:通过GPIO输入与预设值比较,产生中断。
6. **PWM模式**:生成可调占空比的方波,常用于马达控制或LED亮度调整。
7. **外部中断/事件线**:作为外设触发的中断源。
8. **模拟输入**:通过ADC转换器采集模拟信号。
9. **复用端口**:比如PA、PB、PC等,某些GPIO可以共享同一个引脚实现多种功能。
要查看具体的复用表,你可以参考GD32F103的数据手册,在其中的GPIO章节会详细列出每个GPIO引脚的不同功能选项以及对应的寄存器配置说明。此外,STM32Cube库也提供了相应的API函数,便于用户在实际项目中方便地管理GPIO复用。
相关问题
GD32f103 的usart2是使用GPIO A 还是GPIOB 的时钟
GD32f103 的 USART2 可以使用 GPIOA 或 GPIOB 的时钟,具体使用哪个时钟可以根据实际情况来选择。但是需要注意的是,在使用某个 GPIO 端口之前,需要先使能该端口的时钟,否则无法正常工作。
以下是使用 GPIOA 时钟的示例代码:
```c
/* 使能 GPIOA 和 USART2 时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART2);
/* 配置 PA2 和 PA3 为复用推挽输出模式 */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2 | GPIO_PIN_3);
```
以下是使用 GPIOB 时钟的示例代码:
```c
/* 使能 GPIOB 和 USART2 时钟 */
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_USART2);
/* 配置 PB10 和 PB11 为复用推挽输出模式 */
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11);
```
在上面的示例代码中,我们通过 `rcu_periph_clock_enable()` 函数使能了 GPIOA 或 GPIOB 和 USART2 的时钟,并使用 `gpio_init()` 函数将 PA2/PA3 或 PB10/PB11 配置为复用推挽输出模式。
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码值而非中途打断正在传送中的多字节序列。
阅读全文