0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第十七讲 USART-中断串口收发实验

聚沃科技 2024-06-17 09:53 次阅读
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

17.1实验内容

通过本实验主要学习以下内容:

  • 使用中断进行串口收发

17.2实验原理

前面章节中我们已经学习了串口的状态标志位,本实验就是使用TBE中断和RBNE中断来实现中断收发数据,实验原理是RBNE中断用来接受数据,IDLE中断用于判断发送方数据结束,TBE中断用于发送数据。

17.3硬件设计

本实验仍然使用USBUART接口,硬件设计见前面章节。

17.4代码解析

17.4.1串口中断发送函数

在driver_uart.c中定义了串口中断发送函数:

C
Drv_Err driver_uart_int_transmit(typdef_uart_struct *uartx,uint8_t *pbuff,uint16_t length)
{
uint32_t timeout = driver_tick;
while(uartx->uart_control.Com_Flag.Bits.SendState==1){
if((timeout+UART_TIMEOUT_MS) <= driver_tick) {              
uartx->uart_control.Com_Flag.Bits.SendState=0;
return DRV_ERROR;
}
}

uartx->uart_control.Com_Flag.Bits.SendSucess=0;
uartx->uart_control.Com_Flag.Bits.SendState=1;
uartx->uart_control.p_Send=pbuff;
uartx->uart_control.SendSize=length;
uartx->uart_control.SendCount=0;

usart_flag_clear(uartx->uart_x,USART_FLAG_TC);
usart_interrupt_enable(uartx->uart_x,USART_INT_TBE);

return DRV_SUCCESS;
}

17.4.2串口中断接受函数

在driver_uart.c中定义了串口中断接受函数:

C
Drv_Err driver_uart_int_receive(typdef_uart_struct *uartx,uint8_t *pbuff,uint16_t length)
{
uint32_t timeout = driver_tick;
while(uartx->uart_control.Com_Flag.Bits.RecState==1){
if((timeout+UART_TIMEOUT_MS) <= driver_tick) {              
uartx->uart_control.Com_Flag.Bits.RecState=0;
return DRV_ERROR;
}
}

uartx->uart_control.Com_Flag.Bits.RecSuccess=0;
uartx->uart_control.Com_Flag.Bits.RecState=1;
uartx->uart_control.p_Rec=pbuff;
uartx->uart_control.RecSize=length;
uartx->uart_control.RecCount=0;

usart_flag_clear(uartx->uart_x,USART_FLAG_IDLE);
USART_STAT0(uartx->uart_x);
USART_DATA(uartx->uart_x);

usart_interrupt_enable(uartx->uart_x,USART_INT_RBNE);
usart_interrupt_enable(uartx->uart_x,USART_INT_IDLE);


return DRV_SUCCESS;
}

17.4.3main函数实现

以下为main函数代码:

C
int main(void)
{
delay_init();
//初始化UART为中断模式,注册接受完成(IDLE)回调函数
BOARD_UART.uart_mode_tx=MODE_INT;
BOARD_UART.uart_mode_rx=MODE_INT;
BOARD_UART.uart_idle_callback=user_receive_complete_callback;
bsp_uart_init(&BOARD_UART);
nvic_irq_enable(USART0_IRQn,2,0);
delay_ms(1000);
printf("uart interrupt mode sends and receives loopback packets of indefinite length.\r\n");
//配置UART接受,最长100byte
driver_uart_int_receive(&BOARD_UART,uart_rec_buff,100);
while (1)
{
//查询到接受完成回调函数标志
if(uart_receive_complete_flag==SET)
{
uart_receive_complete_flag=RESET;
//发送刚接受到的数据
driver_uart_int_transmit(&BOARD_UART,uart_rec_buff,uart_receive_count);
}
}
}

本例程main函数首先进行了延时函数初始化,再初始化UART为中断模式,接着配置串口BOARD_UART,开启串口中断NVIC,这里使用到了IDLE中断,TBE中断和RBNE中断,然后配置串口D中断接受,最长100个字节,所以我们可以给串口发送100个字节以下长度的数据。在while(1)循环中循环查询uart_receive_complete_flag标志位,当该标志位为“SET”时,表示IDLE中断被触发,一帧数据接受完,最后将接收到的帧数据通过中断发送方式原封不动发送到串口上。

17.4.4中断函数

本实验中中断函数和DMA串口收发实验用到的中断函数相同。

17.5实验结果

使用USB-TypeC线,连接电脑和板上USB to UART口后,使用串口调试助手发送一帧数据到MCU,MCU会将这帧数据回发到串口调试助手中。

wKgZomZCzhqAd1-uAAAEQNN_QRI502.pngwKgZomZCziKAWcJsAAAIXPeWoWw536.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44554

    浏览量

    634635
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304808
  • 串口
    +关注

    关注

    14

    文章

    1551

    浏览量

    76422
  • 开发板
    +关注

    关注

    25

    文章

    5032

    浏览量

    97372
  • USART
    +关注

    关注

    1

    文章

    195

    浏览量

    30835
收藏 人收藏

    评论

    相关推荐

    STM32CUBEMX开发GD32F303(8)----USART收发配置

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。
    的头像 发表于 11-29 10:40 3170次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(8)----<b class='flag-5'>USART</b><b class='flag-5'>收发</b>配置

    STM32CUBEMX开发GD32F303(9)----USART通过DMA收发

    概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验
    的头像 发表于 11-29 11:15 2101次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(9)----<b class='flag-5'>USART</b>通过DMA<b class='flag-5'>收发</b>

    GD32F303】星空介绍

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 09-11 17:55

    【星空GD32F303开发板试用体验】开箱+环境搭建

    Watchpoint: 4Load "G:\\星空GD32F303开发板\\03 例程\\Project\\04_USART_Printf\\MDK-ARM\\output
    发表于 10-18 14:15

    【星空GD32F303开发板试用体验】开箱+环境搭建

    完全,APM32F0xx_SDK解包,到星空GD32F303开发板\03 例程\Project\04_USART_printf\MDK-A
    发表于 11-02 15:36

    星空GD32F303开发板的相关资料下载

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 12-10 08:27

    GD32F303开发板介绍

    目录如下,持续更新~~【1】星空GD32F303开发板介绍 与 文章目录1. 串口基础概念USART数据格式一般分为启动位、数据帧、可能的
    发表于 01-17 08:06

    STM32CUBEMX开发GD32F303(15)----外部中断EXTI

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 使用外部中断EXTI进行驱
    的头像 发表于 07-26 15:53 1325次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(15)----外部<b class='flag-5'>中断</b>EXTI

    GD32F303固件库开发

    的可以加群申请:615061293 。 GD32F303固件库开发(1)----前期准备与烧录 使用GDLINK、jlink、串口下载程序到GD芯片。 [https://blog.cs
    的头像 发表于 07-27 09:27 1163次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>

    GD32F470紫藤开发板使用手册第十 USART-中断串口收发实验

    通过本实验主要学习以下内容: •使用中断进行串口收发
    的头像 发表于 05-14 10:39 795次阅读
    【<b class='flag-5'>GD32F</b>470紫藤<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第十</b><b class='flag-5'>讲</b> <b class='flag-5'>USART-</b><b class='flag-5'>中断</b><b class='flag-5'>串口</b><b class='flag-5'>收发</b><b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册第十 USART-中断串口收发实验

    通过本实验主要学习以下内容: •使用中断进行串口收发
    的头像 发表于 05-16 10:30 661次阅读
    【<b class='flag-5'>GD</b>32H757Z海棠<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第十</b><b class='flag-5'>讲</b> <b class='flag-5'>USART-</b><b class='flag-5'>中断</b><b class='flag-5'>串口</b><b class='flag-5'>收发</b><b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二 GPIO-流水灯实验

    GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0
    的头像 发表于 05-29 10:02 1631次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二<b class='flag-5'>讲</b> GPIO-流水灯<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第五 FMC-片内Flash擦写读实验

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也
    的头像 发表于 06-02 10:05 765次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b> FMC-片内Flash擦写读<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册第十 USART-DMA串口收发实验

    在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串口的TX和RX分别对应DMA的不同通道,比如USART0的TX对应DMA0的
    的头像 发表于 06-15 09:54 1063次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第十</b>六<b class='flag-5'>讲</b> <b class='flag-5'>USART</b>-DMA<b class='flag-5'>串口</b><b class='flag-5'>收发</b><b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二十 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 886次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二十<b class='flag-5'>讲</b> SPI-SPI NAND FLASH读写<b class='flag-5'>实验</b>