ARM32开发——串口输入

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • 需求
    • 串口数据接收
    • 中断函数
    • IDLE中断
    • 串口接收流程(了解)
    • 完整示例

需求

在这里插入图片描述

串口接收PC机发送的数据。

串口数据接收

static void USART_config() {uint32_t usartx_tx_rcu = RCU_GPIOA;uint32_t usartx_tx_port = GPIOA;uint32_t usartx_tx_pin = GPIO_PIN_9;uint32_t usartx_tx_af = GPIO_AF_7;uint32_t usartx_rx_rcu = RCU_GPIOA;uint32_t usartx_rx_port = GPIOA;uint32_t usartx_rx_pin = GPIO_PIN_10;uint32_t usartx_rx_af = GPIO_AF_7;uint32_t usartx = USART0;uint32_t usartx_rcu = RCU_USART0;uint32_t usartx_irqn = USART0_IRQn;uint32_t usartx_p_baudrate = 115200;uint32_t usartx_p_parity = USART_PM_NONE;uint32_t usartx_p_wl = USART_WL_8BIT;uint32_t usartx_p_stop_bit = USART_STB_1BIT;uint32_t usartx_p_data_first = USART_MSBF_LSB;/************** gpio config **************/// txrcu_periph_clock_enable(usartx_tx_rcu);	// 配置时钟gpio_mode_set(usartx_tx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, usartx_tx_pin);gpio_af_set(usartx_tx_port, usartx_tx_af, usartx_tx_pin);gpio_output_options_set(usartx_tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, usartx_tx_pin);// rxrcu_periph_clock_enable(usartx_rx_rcu); // 配置时钟gpio_mode_set(usartx_rx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, usartx_rx_pin);gpio_af_set(usartx_rx_port, usartx_rx_af, usartx_rx_pin);gpio_output_options_set(usartx_rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, usartx_rx_pin);/************** usart config **************/// 串口时钟rcu_periph_clock_enable(RCU_USART0);// USART复位usart_deinit(usartx);usart_baudrate_set(usartx, usartx_p_baudrate);	// 波特率usart_parity_config(usartx, usartx_p_parity); // 校验位usart_word_length_set(usartx, usartx_p_wl); // 数据位数usart_stop_bit_set(usartx, usartx_p_stop_bit); // 停止位usart_data_first_config(usartx, usartx_p_data_first); // 先发送高位还是低位// 发送功能配置usart_transmit_config(usartx, USART_TRANSMIT_ENABLE); // 接收功能配置usart_receive_config(usartx, USART_RECEIVE_ENABLE);// 接收中断配置nvic_irq_enable(usartx_irqn, 2, 2);// usart int rbneusart_interrupt_enable(usartx, USART_INT_RBNE);usart_interrupt_enable(usartx, USART_INT_IDLE);// 使能串口usart_enable(usartx); 
}
#define USART_RECEIVE_LENGTH  1024
//串口接收缓冲区大小
uint8_t g_recv_buff[USART_RECEIVE_LENGTH];   // 接收缓冲区
//接收到字符存放的位置
int g_recv_length = 0;void USART0_IRQHandler(void) {if ((usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) == SET) {usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);uint16_t value = usart_data_receive(USART0);g_recv_buff[g_recv_length] = value;		g_recv_length++;}if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) == SET) {//读取缓冲区,清空缓冲区usart_data_receive(USART0);g_recv_buff[g_recv_length] = '\0';// TODO: g_recv_buff为接收的数据,g_recv_length为接收的长度g_recv_length = 0;}
}

中断函数

  1. 中断函数的名称是在CMSIS的汇编接口中定义的
    在这里插入图片描述
    在这里插入图片描述

  2. 中断触发需要进行配置

......
// 接收功能配置
usart_receive_config(usartx, USART_RECEIVE_ENABLE);
// 接收中断配置
nvic_irq_enable(usartx_irqn, 2, 2);
// usart int rbne
usart_interrupt_enable(usartx, USART_INT_RBNE);
usart_interrupt_enable(usartx, USART_INT_IDLE);
......

IDLE中断

在这里插入图片描述
当检测到RX引脚空闲(高电平)时间超过传输一个字符帧所需的时间时,产生空闲标志IDLE

串口接收流程(了解)

寄存器与电路。

  1. 数据接收缓存寄存器(接收和发送其实公用一个寄存器)
  2. 状态寄存器
    外部通过串口发送数据到MCU中来时,首先会把高低电平进行转换为单个byte,接着存储到这个缓存寄存器,存储一个byte的时候,会改变寄存器状态,然后会触发中断,我们在中断中,我们就知道接收到了一个byte,我们就可以去数据接收缓存寄存器中取数据,取完后,接收方又去存,这样周而复始的进行接收。知道外部不发送数据了,这个时候如果长期没有收到数据,就会触发闲置寄存器标记。

完整示例

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"/**
PA9		TXD
PA10	RXD
**/#define USART_RECEIVE_LENGTH  1024
//串口接收缓冲区大小
uint8_t g_recv_buff[USART_RECEIVE_LENGTH];   // 接收缓冲区
//接收到字符存放的位置
int g_recv_length = 0;static void USART_config() {uint32_t usartx_tx_rcu = RCU_GPIOA;uint32_t usartx_tx_port = GPIOA;uint32_t usartx_tx_pin = GPIO_PIN_9;uint32_t usartx_tx_af = GPIO_AF_7;uint32_t usartx_rx_rcu = RCU_GPIOA;uint32_t usartx_rx_port = GPIOA;uint32_t usartx_rx_pin = GPIO_PIN_10;uint32_t usartx_rx_af = GPIO_AF_7;uint32_t usartx = USART0;uint32_t usartx_rcu = RCU_USART0;uint32_t usartx_irqn = USART0_IRQn;uint32_t usartx_p_baudrate = 115200;uint32_t usartx_p_parity = USART_PM_NONE;uint32_t usartx_p_wl = USART_WL_8BIT;uint32_t usartx_p_stop_bit = USART_STB_1BIT;uint32_t usartx_p_data_first = USART_MSBF_LSB;/************** gpio config **************/// txrcu_periph_clock_enable(usartx_tx_rcu);	// 配置时钟gpio_mode_set(usartx_tx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, usartx_tx_pin);gpio_af_set(usartx_tx_port, usartx_tx_af, usartx_tx_pin);gpio_output_options_set(usartx_tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, usartx_tx_pin);// rxrcu_periph_clock_enable(usartx_rx_rcu); // 配置时钟gpio_mode_set(usartx_rx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, usartx_rx_pin);gpio_af_set(usartx_rx_port, usartx_rx_af, usartx_rx_pin);//gpio_output_options_set(usartx_rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, usartx_rx_pin);/************** usart config **************/// 串口时钟rcu_periph_clock_enable(RCU_USART0);// USART复位usart_deinit(usartx);usart_baudrate_set(usartx, usartx_p_baudrate);	// 波特率usart_parity_config(usartx, usartx_p_parity); // 校验位usart_word_length_set(usartx, usartx_p_wl); // 数据位数usart_stop_bit_set(usartx, usartx_p_stop_bit); // 停止位usart_data_first_config(usartx, usartx_p_data_first); // 先发送高位还是低位// 发送功能配置usart_transmit_config(usartx, USART_TRANSMIT_ENABLE); // 接收功能配置usart_receive_config(usartx, USART_RECEIVE_ENABLE);// 接收中断配置nvic_irq_enable(usartx_irqn, 2, 2);// usart int rbneusart_interrupt_enable(usartx, USART_INT_RBNE);usart_interrupt_enable(usartx, USART_INT_IDLE);// 使能串口usart_enable(usartx); 
}//发送一byte数据
void send_byte(uint8_t data) {//通过USART发送usart_data_transmit(USART0, data);//判断缓冲区是否已经空了//FlagStatus state = usart_flag_get(USART_NUM,USART_FLAG_TBE);while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}// 发送多个byte数据
void send_data(uint8_t* data, uint32_t len) {while(data && len--) {send_byte(*data);data++;}
}//发送字符串
void send_string(char *data){//满足: 1.data指针不为空  2.发送的数据不是\0结束标记while(data && *data){send_byte((uint8_t)(*data));data++;}
}//重写fputc方法  调用printf,会自动调用这个方法实现打印
int fputc(int ch, FILE *f){send_byte((uint8_t)ch);return ch;
}void USART0_IRQHandler(void) {if ((usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) == SET) {usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);uint16_t value = usart_data_receive(USART0);g_recv_buff[g_recv_length] = value;		g_recv_length++;}if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) == SET) {//读取缓冲区,清空缓冲区usart_data_receive(USART0);g_recv_buff[g_recv_length] = '\0';// TODO: g_recv_buff为接收的数据,g_recv_length为接收的长度printf("%s", g_recv_buff);g_recv_length = 0;}
}int main(void)
{systick_config();USART_config();while(1) {}
}

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

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

相关文章

【ASP】asp中变量、requst参数在html、asp、sql中的调用格式

一、html页面 - 变量 <input name"T_ID" type"hidden" value"<%T_ID%>"> <input name"T_ID" type"hidden" value"<%T_ID%>"> 二、html页面 - requst参数 <input type"hidden&…

如何在 Vue 中实现自定义的响应式系统?

在 Vue 中,我们可以通过自定义响应式系统来实现更复杂的数据处理需求。以下是一个简单的示例,演示如何在 Vue 中创建一个自定义的响应式系统: // 定义一个响应式系统 class ReactiveSystem {constructor() {this.dependencies = new Map();}// 定义一个依赖收集函数track(targe…

primAlgorithm普利姆算法

primAlgorithm普利姆算法 背景代码实现&#xff08;Java&#xff09; 背景 修路问题&#xff08;最短路径&#xff09; 代码实现&#xff08;Java&#xff09; package test01;import java.util.Arrays;/** 普利姆算法解决修路最短路径的问题* 满足条件为&#xff1a;* 1要把…

【fido2100:工业自动化新标杆——高性能DLR交换机引领精准时间同步新时代】

在现代工业自动化和通信网络中&#xff0c;对于高速、稳定和精准的时间同步有着极高的要求&#xff0c;随着工业4.0的提出和智能制造的发展&#xff0c;工业以太网应运而生&#xff0c;而在工业以太网之中交换机是保证通信稳定的重要的一环。工业以太网交换机广泛应用于工业控制…

html+CSS+js部分基础运用13

一、三级联动 效果如下图所示&#xff1a; 图1 三级联动 二、设计江苏福彩投注站彩票投注助手 编程实现江苏福彩投注站彩票投注助手&#xff0c;页面布局效果如图2所示。 图2福彩投注站彩票助手页面 功能要求如下&#xff1a; 单击“机选1注”、“机选5注”或“机选10注”…

一周速览丨YOLOv10 模型+应用一站式体验!一键部署 Llama 3-Chinese-Chat-8b

公共资源速递 This Weekly Snapshots &#xff01;5 个数据集&#xff1a; Llama3 中文化数据集皮马印第安人糖尿病数据集VehicleID 车辆识别数据集LCCC 大规模净化汉语会话语料库NWPU VHR-10 地理空间物体检测遥感数据集 2 个模型&#xff1a; YOLOv10Llama 3-Chinese-Cha…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心&#xff0c;所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…

香港移民政策放开了,2024拿香港身份的8种方式,申请条件解读

​香港移民政策放开了&#xff0c;2024拿香港身份的8种方式&#xff01; 都2024年了&#xff0c;香港身份还受欢迎吗&#xff1f; 当然受欢迎&#xff0c;我们从数据上就能看出来&#xff0c;去年有超过24万人通过各类人才引入计划申请来港&#xff0c;其中超过14万获批&…

三生随记——作家的噩梦

月光斑驳&#xff0c;李轩独坐于老屋的木桌前&#xff0c;四周的静谧被笔尖划过纸张的沙沙声打破。作为一个小有名气的作家&#xff0c;他的文字总是充满魔力&#xff0c;让读者深陷其中。但今晚&#xff0c;他的故事似乎有些不同寻常。 故事的主角&#xff0c;一个名叫林浩的探…

Java虚拟机的优化方法

随着时间的推移&#xff0c;许多优化已经提高了 JVM 的性能。然而&#xff0c;尽管 Java 通常是第一个成功实现它们的虚拟机&#xff0c;但它们也经常被用于其他类似的平台。 1.即时编译 早期的 JVM 总是解释 Java 字节码。在普通应用程序中&#xff0c;Java 的性能损失比 C …

静态网页实现-人脸识别-案例(web)

&#x1f933;人脸识别&#xff08;web) 基于开源大模型&#xff0c;将人脸识别功能整合到网页中&#xff0c;提供用户友好的界面和强大的功能。 核心功能 人脸轮廓识别&#xff1a; 通过深度学习算法&#xff0c;精确识别人脸的轮廓&#xff0c;包括眼睛、鼻子、嘴巴等关键部…

Sql注入漏洞汇总-上

产生的原因 当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,带入数据库中进行查询,从而导致数据的泄露或者修改。 02 分类 1、按照查询的类型分类 数字型 select * from user whe…

在QML中调用 C++ 函数的方法(四)

文章目录 前言一、qml 和 c++ 交互的官方文档介绍二、QML 中调用 C++ 实现的函数的方法1. Exposing Attributes of C++ Types to QML1.1 暴露 Properties1.2 暴露 Methods(槽函数和Q_INVOKABLE 修饰的函数)1.3 暴露 Signals2. Defining QML Types from C++3. 代码实例3.1 创建一…

【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 )

文章目录 一、ArkTS Component 自定义组件生命周期1、自定义组件生命周期2、aboutToAppear 函数执行时机和作用3、aboutToDisappear 函数执行时机和作用4、代码示例 二、ArkTS Entry 页面生命周期1、Entry 页面生命周期2、onBackPress 和 onPageHide 回调函数无关联 三、代码示…

文化若想挣钱,真的很可怕吗?

文化若想挣钱&#xff0c;真的很可怕吗&#xff1f; 近日&#xff0c;我看到受人尊敬的静思有我先生的一个音频作品《会挣钱&#xff0c;遇上有文化&#xff0c;这个地方很可怕》&#xff0c;把这个标题在网上搜一搜&#xff0c;在它下面就跟着有这样一篇文章--商人不可怕&…

vscode 1.85安装remote-ssh后左侧没有图标

vscode安装remote-ssh插件后左侧没有图标。 解决方法 想要左侧有图标&#xff0c;是另一个插件起作用&#xff1a;Remote Explorer 但是这个插件最新版需要1.87&#xff0c;可以switch to Pre-release version之后就能用了。 其实&#xff0c;最后再switch to Release Versio…

PHP网络编程是什么:深入探索其四个方面、五个方面、六个方面与七个方面的核心奥秘

PHP网络编程是什么&#xff1a;深入探索其四个方面、五个方面、六个方面与七个方面的核心奥秘 PHP网络编程&#xff0c;这个看似简单的概念&#xff0c;实则蕴含着丰富的内涵和无尽的探索空间。它不仅是现代网络应用开发的重要基石&#xff0c;更是无数开发者实现创意与梦想的…

动静态库【Linux】

文章目录 静态库的打包动态库的打包 静态库的打包 把我们提供的方法&#xff0c;给别人用: 1、把源文件直接给别人 2、把源代码打包成库库.h 例如 &#xff1b;有a.c b.c c.c d.c ,四个.c文件 &#xff0c; 将a.c 形成a.o ,b.c形成b.o c.c形成c.o d.c形成d.o文件&#xff0c;…

JS片段:生成 UUID

Hi&#xff0c;这里是松桑&#xff0c;每天学习一个 JS 片段&#xff0c;涨涨&#x1f9c0;&#xff01;今天带来的是如何生成 UUID&#xff0c;UUID作为全局唯一标识&#xff0c;使用常见广泛&#xff0c;包括分布式系统、数据库主键、会话标识、消息队列、日志追踪等等。 什么…

【前端Vue3】——JQuery知识点总结(超详细)

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门知识专栏&#xff1a;&#x1f387;【MySQL&#…