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

news2024/10/7 15:22:16

17.1 实验内容

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

  • 使用中断进行串口收发

17.2 实验原理

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

17.3 硬件设计

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

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.3 main函数实现

以下为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会将这帧数据回发到串口调试助手中。

由聚沃科技原创,来源于【红枫派开发板】第十七讲 USART-中断串口收发实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com) 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 年最新 windows 操作系统部署安装 redis 数据库详细教程(更新中)

Redis 数据库概述 Redis 是一个开源的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中介。Redis&#xff08;Remote Dictionary Server &#xff09;&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基…

Vmess协议是什么意思? VLESS与VMess有什么区别?

VMess 是一个基于 TCP 的加密传输协议&#xff0c;所有数据使用 TCP 传输&#xff0c;是由 V2Ray 原创并使用于 V2Ray 的加密传输协议&#xff0c;它分为入站和出站两部分&#xff0c;其作用是帮助客户端跟服务器之间建立通信。在 V2Ray 上客户端与服务器的通信主要是通过 VMes…

vue3中如何使用pinia -- pinia使用教程(一)

vue3中如何使用pinia -- pinia使用教程&#xff08;一&#xff09; 安装使用创建 store使用 store访问修改 store 使用组合式 api 创建 store -- setup storepinia 和 hook 的完美结合如何解决上面的问题 使用 hook 管理全局状态和 pinia 有何优缺点&#xff1f;参考小结 pinia…

基于springboot+vue的供应商管理系统

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 员工注册 02. 登录 03. 管理员-首页 04. 管理员-个人中心-修改密码 05. …

CSP-J/S初赛01 计算机基础知识:计算机概述和计算机硬件系统

第1节 计算机概述 1.1 计算机的发展 代别 年代 逻辑&#xff08;电子&#xff09;元件 第一代 1946&#xff0d;1958 真空电子管 第二代 1959&#xff0d;1964 晶体管 第三代 1965&#xff0d;1970 集成电路 第四代 1971&#xff0d;至今 大规模、超大规模集成电…

华为 HarmonyOS 中国市场份额一季度超越苹果 iOS

华为 HarmonyOS 中国市场份额一季度超越苹果 iOS 根据最新发布的数据&#xff0c;研究机构Counterpoint Research指出&#xff0c;在2024年第一季度&#xff0c;华为的操作系统HarmonyOS在中国市场超越了苹果的iOS&#xff0c;成为中国市场上的第二大操作系统。 ![在这里插入…

Oracle 系列数据库使用 listagg去重,删除重复数据的几种方法

listagg聚合之后很多重复数据&#xff0c;下面是解决重复数据问题 案例表 create table "dept_tag_info" ( "tag_id" bigint not null, "tag_code" varchar(200), "tag_name" varchar(500), "tag_level" varchar(200), &…

解决ubuntu22.04共享文件夹问题

刚开机发现ubuntu里面的共享文件夹访问不了了 ubuntuwxy:/mnt/hgfs$ ls找了几篇博客&#xff0c;设置如下指令即可&#xff0c;记得退出当前目录重新进入刷新一下 sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid1000 仅供参考

数据库入门知识点

目录 常见简答问题 数据库系统概述 1.数据库基本概念 2.数据库系统的特点 3.DBMS 的主要功能? 4.数据库系统组成 5.数据库的三级模式定义 6.数据库两级映像的作用? 信息与数据模型 1.信息的三种世界是什么?彼此之间的联系是什么? 2.数据模型的三个要素: 3.数据库…

VL53L4CD TOF开发(4)----单次测量(One-Shot)模式

VL53L4CD TOF开发.4--单次测量&#xff08;One-Shot&#xff09;模式 概述视频教学样品申请完整代码下载实现demo硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释主程序演示结果 概述 最近在弄ST和瑞萨RA的…

展会预热|邀您共赴2024华南国际工业展览会

展会预告 在数字化转型的浪潮中&#xff0c;广东盘古信息科技股份有限公司&#xff08;以下简称“盘古信息”&#xff09;作为工业软件业内的领军企业&#xff0c;为制造企业提供全面的数字化生产制造运营管理系统及系统集成解决方案。我们将于2024年6月19日至21日亮相华南工博…

Nuxt3 实战 (九):使用 Supabase 实现 Github 认证鉴权

前言 Supabase 使用的是 postgresql 的 Row Level Security (RLS)&#xff0c;可以限制不同用户对同一张表的不同数据行的访问权限。这种安全机制可以确保只有授权用户才能访问其所需要的数据行&#xff0c;保护敏感数据免受未授权的访问和操作。 Auth Providers 打开 Supab…

图知识蒸馏综述:算法分类与应用分析

源自&#xff1a;软件学报 作者&#xff1a;陈哲涵 黎学臻 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 图数据, 如引文网络, 社交网络和交通网络, 广泛地存在现实生活中. 图神经网络凭借强大的表现力受到广泛…

5月70城房价:一线城市新建房价格唯上海反弹 二手房全线降幅扩大 M1下行的根源:地方政府压降债务

5月份&#xff0c;一线城市新建商品住宅销售价格同比下降3.2%&#xff0c;降幅比上月扩大0.7个百分点。其中&#xff0c;北京、广州和深圳分别下降1.8%、8.3%和7.4%&#xff0c;上海上涨4.5%。 2024年5月份&#xff0c;70个大中城市中&#xff0c;各线城市商品住宅销售价格环比…

Linux 下VS Code 弹出 快速修复,导致 BackSpace 无法删除

最近在Linux下使用VSCode&#xff0c;发现有错误的代码选中了无法删除 这个时候&#xff0c;你按BackSpace 是无法删除的&#xff0c;很恼火&#xff01; 把这个禁用了之后&#xff0c;就不会弹出这个框&#xff0c;这样可以顺利选中删除&#xff01; 感觉这个是不是vs code 插…

聚观早报 | GPT-4通过图灵测试;哪吒新车将交付

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月17日消息 GPT-4通过图灵测试 哪吒新车将交付 SpaceX星舰将进行第五次试飞 马斯克称新款Roadster可以飞 华为…

跨平台兼容性优化:确保短剧APP小程序在不同系统上的稳定运行(二)

在上一篇帖子中&#xff0c;我们初步探讨了跨平台兼容性优化的重要性以及不同操作系统和设备对小程序的影响。本篇帖子将进一步深入分析如何优化代码和界面布局&#xff0c;以确保短剧APP小程序在不同平台上都能稳定运行。 一、代码优化策略 减少依赖和冗余&#xff1a;确保代…

Office办公软件如何下载安装?Office 2021最佳的办公软件安装包资源分享!

Office软件这种文档格式的普及&#xff0c;得益于其高度的兼容性和通用性&#xff0c;使得用户能够轻松地在不同的电脑和平台上打开和编辑文件。 Office软件文档格式的通用性&#xff0c;意味着无论是Windows、macOS还是Linux等操作系统&#xff0c;用户都能无障碍地打开和浏览…

triton矩阵乘以及缓存优化

这里triton.cdiv(M, META[BLOCK_SIZE_M]) * triton.cdiv(N, META[BLOCK_SIZE_N])&#xff0c;所以grid的形状是一维的。 观察函数内部 pid tl.program_id(axis0)&#xff0c;因为grid是一维的&#xff0c;所以这里就是总块数&#xff0c;我们假设实际A*BC&#xff0c; A&…

2024文件找回:怎么恢复删除的数据?6种实用的数据恢复汇总锦集!

怎么恢复删除的数据&#xff1f;在当今数字化的时代&#xff0c;我们的电脑中存储了大量的重要数据&#xff0c;一旦数据丢失&#xff0c;可能会对我们的工作和生活造成极大的困扰。因此&#xff0c;掌握一些有效的电脑数据恢复方法是非常必要的。下面&#xff0c;我将介绍六种…