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;}
}
中断函数
-
中断函数的名称是在CMSIS的汇编接口中定义的


-
中断触发需要进行配置
......
// 接收功能配置
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
串口接收流程(了解)
寄存器与电路。
- 数据接收缓存寄存器(接收和发送其实公用一个寄存器)
- 状态寄存器
外部通过串口发送数据到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) {}
}相关文章:
ARM32开发——串口输入
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求串口数据接收中断函数IDLE中断串口接收流程(了解)完整示例 需求 串口接收PC机发送的数据。 串口数据接…...
个人笔记--python用tanh画圆形,正方形,长方形(epsilon界面宽度)
用tanh函数画图 圆形 import numpy as np import matplotlib.pyplot as plt# 创建一个二维网格 xx np.linspace(-1, 1, 1000) yy np.linspace(-1, 1, 1000) x_i, y_i np.meshgrid(xx, yy)# 圆的半径和中心 r 0.4 center_x, center_y 0, 0 # 假设圆心在(0, 0)# 计算每个网…...
学习Java,stringbuilder用法
有sb.append添加元素,sb.reverse反转内容,sb.tostring转换成字符串,sb.length计算长度。...
16-云原生监控体系-rabbitmq_exporter监控 RabbitMQ-[部署Dashborad告警规则实战]
文章目录 1. 二进制方式部署1.1. 二进制包下载和部署1.2. 配置1.2.1. 可用的环境变量1.2.2. 使用变量2. docker-compose 方式部署3. 配置到 Prometheus3. Metrics3.1. 全局3.2. 基础信息3.3. Queues3.3.1 Queues - Gauge3.3.2. Queues - Counter...
四大运营商频段-2024
四大运营商频段-2023 中国移动900MHz(Band8),889-904/934-949MHz:1.8GHz(Band3),1710-1735/1805-1830MHz:1.9GHz(Band39),1885-1915MHz:2GHz(Band34),2010-2025MHz:2.3GHz(Band40),2320-2370MHz:2.6GHz(Band41,n41),25…...
260只出现一次的数字
一:题目描述 二:思路讲解 三:代码 class Solution { public:vector<int> singleNumber(vector<int>& nums) {int sum 0;for(const int& e : nums){sum ^ e;}int l (sum INT_MIN ? sum : sum&(-sum));int sum1 0…...
【高阶数据结构(八)】跳表详解
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:高阶数据结构专栏⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学习更多数据结构 🔝🔝 高阶数据结构 1. 前言2. 跳表的概…...
用旧安卓手机当 linux 开发机
1. 下载 Termux (快速链接,如果失效或者要下载最新版请去github release 下载 ) 注意手机硬件,我这个是 64 的所以下 64 的 https://github.com/termux/termux-app/releases/download/v0.118.0/termux-app_v0.118.0github-debug_arm64-v8a.apk 2. 弄到…...
discuz如何添加主导航
大家好,今天教大家怎么样给discuz添加主导航。方法其实很简单,大家跟着我操作既可。一个网站的导航栏是非常重要的,一般用户进入网站的第一印象就是看网站的导航栏。如果大家想看效果的话可以搜索下网创有方,或者直接点击查看效果…...
[每日一练]患某种疾病的患者,正则表达式的匹配
该题目来源于力扣: 1527. 患某种疾病的患者 - 力扣(LeetCode) 题目要求: 患者信息表: Patients ----------------------- | Column Name | Type | ----------------------- | patient_id | int | | pati…...
PHP身份证识别接口、线上平台如何实现身份证实名认证功能?
线上平台实现身份证实名认证的功能,需要结合身份证识别接口来完成。首先,用户通过上传身份证图片或者拍照的方式实现证件信息的提取,身份证实名认证接口通过对提取到的证件信息进行核验,以此来实现线上用户身份的实名认证…...
若依:mybatis查询的结果未映射到实体类报null
开启驼峰命名转换: mapUnderscoreToCamelCase: true 我的是mtybatis配置开启驼峰命名转换不生效,还需要在MyBatisConfig中配置 // 配置mybatis自动转驼峰 生效 sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true)&#x…...
成都百洲文化传媒有限公司电商服务可信吗?
在当今数字化浪潮席卷之下,电商行业蓬勃发展,成为推动经济增长的重要引擎。在这一领域,成都百洲文化传媒有限公司凭借其专业的电商服务,迅速崛起,成为行业的佼佼者。该公司不仅深谙电商市场的运营之道,更以…...
【递归、搜索与回溯】递归、搜索与回溯准备+递归主题
递归、搜索与回溯准备递归主题 1.递归2.搜索3.回溯与剪枝4.汉诺塔问题5.合并两个有序链表6.反转链表7.两两交换链表中的节点8.Pow(x, n)-快速幂(medium) 点赞👍👍收藏🌟🌟关注💖💖 你…...
MVC前端怎么写:深入解析与实战指南
MVC前端怎么写:深入解析与实战指南 在Web开发领域,MVC(Model-View-Controller)是一种广泛使用的架构模式,它将应用程序的数据、界面和控制逻辑分离,使得代码更加清晰、易于维护。本文将详细探讨MVC前端如何…...
LINUX网络设置
一、1.1.ifconfig:当前设备正在启动的网卡(启动的) ifconfig -a :当前所有设备的网卡(启动的和没有启动的都包括) 1.2.ifconfig展示的ens33各行含意: 1.2.1 ens33: flags 4163<UP, …...
双指针解题
验证回文数(验证回文数-CSDN博客)和判断在子序列(判断子序列-CSDN博客)已经在之前进行了计算,今天有三个新的双指针问题: 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers ࿰…...
【Text2SQL 论文】DIN-SQL:分解任务 + 自我纠正 + in-context 让 LLM 完成 Text2SQL
论文:DIN-SQL: Decomposed In-Context Learning of Text-to-SQL with Self-Correction ⭐⭐⭐⭐ NeurIPS 2023, arXiv:2304.11015 Code: Few-shot-NL2SQL-with-prompting | GitHub 文章目录 一、论文速读1.1 Schema Linking Module1.2 Classification & Decompo…...
基于Springboot+vue实现的汽车服务管理系统
作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…...
ROS2从入门到精通4-3:全局路径规划插件开发案例(以A*算法为例)
目录 0 专栏介绍1 路径规划插件的意义2 全局规划插件编写模板2.1 构造规划插件类2.2 注册并导出插件2.3 编译与使用插件 3 全局规划插件开发案例(A*算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建…...
Gemma 4重磅发布:256K超长上下文的多模态AI模型
Gemma 4重磅发布:256K超长上下文的多模态AI模型 【免费下载链接】gemma-4-26B-A4B-it 项目地址: https://ai.gitcode.com/hf_mirrors/google/gemma-4-26B-A4B-it 导语:Google DeepMind推出Gemma 4系列多模态AI模型,以256K超长上下文窗…...
Qwen3.5-2B多场景落地:跨境电商独立站商品图→多语言标题+卖点文案+SEO关键词
Qwen3.5-2B多场景落地:跨境电商独立站商品图→多语言标题卖点文案SEO关键词 1. 跨境电商内容创作的痛点与机遇 跨境电商独立站运营者每天面临三大内容挑战: 商品图片处理:需要专业摄影和后期,成本高周期长多语言文案创作&#…...
笔试训练48天:拼三角(枚举/dfs)
链接:https://ac.nowcoder.com/acm/problem/219046 来源:牛客网 题目描述 给出6根棍子,能否在选出3根拼成一个三角形的同时剩下的3根也能组成一个三角形? 输入描述: 输出描述: 在一行中输出 “Yes” or “No” 示例1 输入…...
SimpleScreenRecorder多线程架构设计:如何避免死锁并提升录制性能
SimpleScreenRecorder多线程架构设计:如何避免死锁并提升录制性能 【免费下载链接】ssr SimpleScreenRecorder, a screen recorder for Linux 项目地址: https://gitcode.com/gh_mirrors/ss/ssr SimpleScreenRecorder作为一款Linux平台下的专业屏幕录制工具&…...
OpenClaw模型微调集成:Qwen3-14b_int4_awq领域适配实战
OpenClaw模型微调集成:Qwen3-14b_int4_awq领域适配实战 1. 为什么需要领域专用模型 去年我在处理法律合同自动化生成项目时,发现通用大模型在专业术语和条款逻辑上总是差强人意。模型要么生成过于笼统的表述,要么在引用法律条文时出现事实性…...
Ollama快速体验Llama-3.2-3B:生成工作总结和报告实测
Ollama快速体验Llama-3.2-3B:生成工作总结和报告实测 1. 模型介绍与部署准备 1.1 Llama-3.2-3B模型特点 Llama-3.2-3B是Meta公司开发的多语言大型语言模型,专为文本生成任务优化。这个3B参数的版本在保持轻量级的同时,提供了出色的文本生成…...
DeepSeek总结的DuckLake 中的数据内联:为数据湖解锁流式处理
原文地址:https://ducklake.select/2026/04/02/data-inlining-in-ducklake/ DuckLake 中的数据内联:为数据湖解锁流式处理 Pedro Holanda 2026-04-02 TL;DR: DuckLake 的数据内联功能将小批量更新直接存储在目录中,从而消除了“小…...
从空调到电动车:拆解NTC和PTC热敏电阻在你身边电子产品里的‘隐藏任务’
从空调到电动车:拆解NTC和PTC热敏电阻在你身边电子产品里的‘隐藏任务’ 你有没有想过,为什么手机快充时充电头不会烫到冒烟?汽车座椅加热为什么不会越坐越烫?这些看似简单的日常体验背后,其实都藏着一对神奇的电子元件…...
煤矸石自动分离机设计【论文+CAD图纸】
煤矸石作为煤炭开采与洗选过程中产生的固体废弃物,其成分复杂、粒度分布不均,传统人工分选效率低且精度难以保证。煤矸石自动分离机的设计以机械结构优化与物料特性分析为核心,通过多级筛分与智能识别技术的结合,实现煤矸石与煤炭…...
C++的std--ranges编译器内联
C的std::ranges编译器内联:现代C的高效编程利器 随着C20标准的发布,std::ranges库的引入彻底改变了算法与数据结构的交互方式。这一特性不仅简化了代码编写,还通过编译器的内联优化显著提升了运行时性能。对于追求高效与简洁的开发者而言&am…...
