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底层基本分布式原理,并具有机器人建…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
