gd32f103 的 usart_interrupt_enable如何使用
时间: 2023-07-15 19:15:32 浏览: 150
gd32f103 的 usart_interrupt_enable 函数可以用来使能 USART 的中断,具体用法如下:
```c
usart_interrupt_enable(USARTx, USART_INT_RXNE); // 使能接收中断
usart_interrupt_enable(USARTx, USART_INT_TXE); // 使能发送中断
```
其中,`USARTx` 是 USART 的外设地址,`USART_INT_RXNE` 表示接收缓冲区非空中断,`USART_INT_TXE` 表示发送缓冲区空中断。你可以根据需要选择使能相应的中断。
需要注意的是,使能中断后,要在中断服务函数中清除相应的中断标志位,否则会一直触发中断。例如,在接收中断服务函数中,可以使用如下代码清除接收中断标志位:
```c
if (usart_interrupt_flag_get(USARTx, USART_INT_FLAG_RXNE)) {
usart_data_receive(USARTx); // 读取接收缓冲区数据
usart_interrupt_flag_clear(USARTx, USART_INT_FLAG_RXNE); // 清除接收中断标志位
}
```
发送中断标志位的清除方法类似,这里不再赘述。
相关问题
gd32f103 使能usart 中断
要使能 GD32F103 的 USART 中断,你需要进行以下步骤:
1. 首先,你需要使用下面的代码来启用 NVIC 的 USART 中断:
```c
NVIC_EnableIRQ(USARTx_IRQn);
```
其中,`USARTx_IRQn` 是你要使用的 USART 中断号,x 表示 USART 的编号,比如使用 USART1,则对应的中断号为 `USART1_IRQn`。
2. 然后,你需要使用下面的代码来启用 USART 的中断:
```c
USART_INTConfig(USARTx, USART_INT_RDNE, ENABLE);
```
其中,`USARTx` 是你要使用的 USART 设备,比如使用 USART1,则对应的设备为 `USART1`。`USART_INT_RDNE` 表示接收缓冲区非空中断(Receive Data Not Empty Interrupt)。`ENABLE` 表示启用中断,如果要禁用中断,则可以使用 `DISABLE`。
3. 最后,你需要在中断服务函数中进行相应的处理,比如读取接收到的数据等。
```c
void USARTx_IRQHandler(void)
{
if(USART_GetITStatus(USARTx, USART_INT_FLAG_RDNE) != RESET)
{
// 处理接收到的数据
uint16_t data = USART_ReceiveData(USARTx);
// 清除中断标志位
USART_ClearITPendingBit(USARTx, USART_INT_FLAG_RDNE);
}
}
```
其中,`USARTx_IRQHandler` 是你要使用的 USART 中断服务函数,x 表示 USART 的编号,比如使用 USART1,则对应的中断服务函数为 `USART1_IRQHandler`。在服务函数中,先判断是否是接收缓冲区非空中断,如果是,则处理接收到的数据,并清除中断标志位。
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码值而非中途打断正在传送中的多字节序列。
阅读全文