当前位置: 首页 > news >正文

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集

上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键
本文章使用的电路,见上一篇。

文章目录

  • 一、串口输出
    • (1) 简介
    • (2) 示例代码
    • (3) 仿真效果
  • 二、串口输入
    • (1) 简介
    • (2) 示例代码
    • (3) 仿真效果
  • 三、ADC采集
    • (1) 简介
    • (2) 采集电压
    • (3) 示例代码(电压)
    • (4) 仿真效果 (电压)
    • (5) 采集光敏
    • (6) 示例代码(光敏)
    • (6) 仿真效果 (光敏)
    • (7) 内部温度
    • (8) 示例代码(内部温度)
    • (9) 仿真效果 (内部温度)

一、串口输出

(1) 简介

  1. 学C语言时,使用的printf()函数,就是通过串口打印出来的。
  2. 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块;
  3. 两个开发板之间通信,制定私有协议。
  4. PC电脑通信,使用上位机显示数据或控制下位机。

(2) 示例代码

#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"int main() {// LED初始化LED_Init();// 按键初始化KEY_Init();//串口初始化uart_init(115200);// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)while(1) {if (Key_Scan(GPIOA, GPIO_Pin_1)) { // 检测按键整个过程。按下->松开LED = !LED;  // 每次按下,切换开关。低电平点亮 高电平熄灭printf("key pressed. led state:%u\n", LED);}}
}

(3) 仿真效果

  1. 操作:打开串口–按下按键

在这里插入图片描述



二、串口输入

(1) 简介

  1. 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块;
  2. 两个开发板之间通信,制定私有协议。
  3. PC电脑通信,使用上位机输入参数或控制下位机。

(2) 示例代码

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"int main() {// LED初始化LED_Init();// 按键初始化KEY_Init();//串口初始化uart_init(115200);// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)while(1) {if (Key_Scan(GPIOA, GPIO_Pin_1)) { // 检测按键整个过程。按下->松开LED = !LED;  // 每次按下,切换开关。低电平点亮 高电平熄灭printf("key pressed. led state:%u\n", LED);}if ((USART_RX_STA & 0x8000) == 0x8000) { // 接收完成printf("rx:%s\r\n", USART_RX_BUF); // 打印刚刚接收的数据USART_RX_STA = 0; // 继续接收数据memset(USART_RX_BUF, 0, USART_REC_LEN); // 将刚刚接收到的数据清空}}
}

重点:还有一个地方需要小修改(平台没有实现,我们这里替换下就行),有兴趣可以研究下功能的实现

在这里插入图片描述

void USART1_IRQHandler(void) { //串口1中断服务程序uint16_t Res;// 接收中断(接收到的数据必须是0x0d 0x0a结尾, 就是换行符\r\n)if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {Res = USART_ReceiveData(USART1); //读取接收到的数据if ((USART_RX_STA & 0x8000) == 0) { //接收未完成if (USART_RX_STA & 0x4000) { //接收到了0x0dif (Res != 0x0a)USART_RX_STA = 0; //接收错误,重新开始elseUSART_RX_STA |= 0x8000; //接收完成了} else { //还没收到0X0Dif (Res == 0x0d)USART_RX_STA |= 0x4000;else {USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res;USART_RX_STA++;if (USART_RX_STA > (USART_REC_LEN - 1))USART_RX_STA = 0; //接收数据错误,重新开始接收}}}}
}

(3) 仿真效果

  1. 操作:打开串口–发送消息:123456\r\n
    在这里插入图片描述


三、ADC采集

这个实验需要添加电路,如下图:

  1. 将按钮移除
    在这里插入图片描述
  2. 添加电压调节器
    在这里插入图片描述

(1) 简介

  1. ADC是一个专门采集模拟量转为为数字信号的外设。
  2. ADC一般采集电压、电流、光敏(光亮度)、温度、湿度、压力、声音等等。

(2) 采集电压

本实验使用STM32采样ADC模拟输入器的数据,开启仿真后,串口助手将ADC数值与转换出的电压值一并打印。

(3) 示例代码(电压)

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "adc.h"
#include "usart.h"uint32_t adc_value = 0;
float voltage_value = 0;        //用于保存转换计算后的电压值int main() {// LED初始化LED_Init();// ADC1通道1初始化Adc_Init();//串口初始化uart_init(115200);while(1) {// 通过ADC_GetConversionValue函数查询ADC的DR寄存器获取ADC转换结果值adc_value = Get_Adc(1);// 计算出模拟输入的电压值voltage_value=(float)adc_value*(3.3/4095);           // 打印ADC转换结果值printf("AD value is %d\n", adc_value);//打印计算出的电压值printf("voltage value is %f V\n", voltage_value);LED = !LED;delay_ms(50);}
}

(4) 仿真效果 (电压)

  1. 操作: 打开串口–调整电压
    在这里插入图片描述



(5) 采集光敏

  1. 光敏电阻的特性:光线越亮,阻值越小。
  2. 一般用于走廊,白天不亮,晚上亮,做到省电的效果。
  3. 按下图搭建电路
    在这里插入图片描述

(6) 示例代码(光敏)

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "adc.h"
#include "usart.h"//设定基于ADC信号的模拟光强阈值
#define lux 2200
uint32_t adc_value = 0;int main() {// LED初始化LED_Init();// ADC1通道1初始化Adc_Init();//串口初始化uart_init(115200);while(1) {// 通过ADC_GetConversionValue函数查询ADC的DR寄存器获取ADC转换结果值adc_value = Get_Adc(1);// 打印ADC转换结果值printf("AD value is %d\n", adc_value);if (adc_value > lux) {LED = 0; // 点亮} else {LED = 1; // 熄灭}delay_ms(50);}
}

(6) 仿真效果 (光敏)

  1. 操作:打开串口–调节光敏电阻–从0-100%调整–当阻值>2000,点亮;阻值<2000,熄灭。
    在这里插入图片描述

(7) 内部温度

  1. 芯片内部温度,目的:让电阻计算更佳准确,因为温度会影响阻值。 (一般用不上,不精确)
  2. 测量CPU以及周围的温度,测量范围为-40~125度,误差为±1.5度
  3. 内部温度传感器更适合于检测温度的变化,需要测量精确温度的情况下,应使用外置传感器。
  4. 温度传感器模拟输入推荐采样时间是 17.1us。
  5. 温度的计算公式如下:
    T(℃)= {( V25-Vsense)/ Avg_Slope} + 25
    上式中:V25=Vsense 在 25 度时的数值(典型值为: 1.43)。
    Avg_Slope=温度与 Vsense 曲线的平均斜率(单位: mv/℃或 uv/℃)(典型值: 4.3mv/℃)。

(8) 示例代码(内部温度)

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "adc.h"
#include "usart.h"float temperate = 0;        //用于保存转换计算后的温度值
uint32_t adc_value = 0;int main() {// LED初始化LED_Init();// ADC1通道1初始化Adc_Init();//串口初始化uart_init(115200);while(1) {// 通过ADC_GetConversionValue函数查询ADC的DR寄存器获取ADC转换结果值adc_value = Get_Adc(1);// 打印ADC转换结果值printf("AD value is %d\n", adc_value);temperate = (float)adc_value * (3.3 / 4095); // 先转成电压值temperate = (1.43 - temperate) / 0.0043 + 25;  // 再转换为温度值//打印计算出的温度值printf("MCU temperature is %f C \n", temperate);LED = !LED;delay_ms(50);}
}

(9) 仿真效果 (内部温度)

在这里插入图片描述



下一篇:[嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器

相关文章:

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集

上一篇&#xff1a;[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 文章目录 一、串口输出(1) 简介(2) 示例代码(3) 仿真效果 二、串口输入(1) 简介(2) 示例代码(3) 仿真效果 三、ADC采集(1) 简介(2) 采集电压(3) 示例代码&#xff08;电压&#xff09;(4) 仿真效果 …...

Deepin基本环境查看(四)【硬盘/分区、文件系统、硬连接/软连接】

Linux操作系统(Deepin、Ubuntu&#xff09;操作系统中&#xff0c;硬盘分区的管理与Windows操作系统不同&#xff1b; 在Linux系统中维护着一个统一的文件目录体系&#xff0c;而硬盘和分区是以资源的形式由操作系统挂接和调度&#xff1b;此外Linux系统中连接&#xff08;硬连…...

JS之打地鼠案例

需要素材的同学可以私信我 效果图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…...

Kubernetes入门

k8s相关基础知识 文章目录 k8s相关基础知识1、Container2、PodPod 与 Container 的不同Pod 其它命令 3、Deployment扩容升级版本Rolling update(滚动更新)存活探针&#xff08;livenessProb&#xff09;就绪探针(readiness) 4、ServiceClusterIPNodePortLoadBalancer 5、Ingres…...

EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码

这里是CIP资料的协议层级图&#xff0c;讲解协议构造。 ODVA&#xff08;www.ODVA.org&#xff09;成立于1995年&#xff0c;是一个全球性协会&#xff0c;其成员包括世界领先的自动化公司。结合其成员的支持&#xff0c;ODVA的使命是在工业自动化中推进开放、可互操作的信息和…...

Django(九)

1. 用户登录-Cookie和Session 什么是cookie和session&#xff1f; 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接&#xff1a;一次请求响应之后断开连接&#xff0c;再发请求重新连…...

解决Android Studio Unexpected tokens (use ; to separate expressions on the same line)

[TOC](Unexpected tokens (use ; to separate expressions on the same line)) 问题描述&#xff1a;Unexpected tokens (use ; to separate expressions on the same line) 原因&#xff1a;Android Studio 更新到最新的版本之后&#xff0c;gradle工程目录结构发生改变 问…...

【云原生】Docker网络模式和Cgroup资源限制

目录 一、Docker 网络实现原理 二、Docker 的网络模式 #网络模式详解&#xff1a; 第一种&#xff1a;host模式 第二种&#xff1a;bridge模式 第三种&#xff1a;container模式 第四种&#xff1a;none模式 第五种&#xff1a;自定义网络 三、Cgroup资源控制 第一种&a…...

实战:加密传输数据解密

前言 下面将分享一些实际的渗透测试经验&#xff0c;帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主&#xff0c;技巧为辅&#xff0c;进入逆向的大门。 技巧 开局先讲一下技巧&#xff0c;掌握好了技巧&#xff0c;方便逆向的时候可以更加快速的找到关键…...

前端开发提高效率的两大工具

一、浏览器中的开发者工具 怎么启动开发者工具&#xff1f; 在浏览器中按下F12或者鼠标右键点击检查 怎么利用&#xff08;常用的几点&#xff09;&#xff1f; 1、元素 点击标红的图标可以用于在页面选择元素&#xff0c;同时右侧会找到元素在前端代码中的位置 点击下方红…...

探索设计模式的魅力:深入理解面向对象设计的深层原则与思维

如何同时提高一个软件系统的可维护性 和 可复用性是面向对象对象要解决的核心问题。 通过学习和应用设计模式&#xff0c;可以更加深入地理解面向对象的设计理念&#xff0c;从而帮助设计师改善自己的系统设计。但是&#xff0c;设计模式并不能够提供具有普遍性的设计指导原则。…...

【Py/Java/C++三种语言详解】LeetCode每日一题240122【贪心】LeetCode670、最大交换

文章目录 题目链接题目描述解题思路为什么是贪心一个带图的例子 代码pythonjavacpp时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode670、最大交换 题目描述 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连…...

Linux/Doctor

Enumeration nmap 已知目标开放了22,80,8089端口&#xff0c;扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口&#xff0c;有一个infodoctors.htb的电子邮件&#xff0c;点击其他的也没有什么反应&#xff0c;猜测有可能需要域名访问 在/et…...

嵌入式linux学习之系统烧录

1.所需文件 1. 开发板为正点原子stm32mp157,文件可按照linux驱动教程编译&#xff0c;也可在正点原子文档->08、系统镜像\02、出厂系统镜像中找到&#xff1a; 2.烧录 1.拨码开关为000(usb启动)&#xff0c;otg接口接入虚拟机&#xff0c;打开stm32cubeProgrammer: 2.页面…...

JVM-初始JVM

什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; JVM的功能 1 - 解释和运行 2 - 内存管理 3 - 即时编译 解释和运行 解释…...

EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格

EXCEL VBA网抓技巧-复制网页表格&#xff0c;不用遍历单元格 对应表格复制 Sub tableTest()Set winhttp CreateObject("winhttp.WinHttpRequest.5.1")Set HTML CreateObject("htmlfile")Set oWindow HTML.ParentWindowUrl "https://www.taiwanlo…...

动态规划——炮兵回城【集训笔记】

题目描述 游戏盘面是一个m行n列的方格矩阵&#xff0c;将每个方格用坐标表示&#xff0c;行坐标从下到上依次递增&#xff0c;列坐标从左至右依次递增&#xff0c;左下角方格的坐标为(1,1)&#xff0c;则右上角方格的坐标为(m,n)。 游戏结束盘上只剩下一枚炮兵没有回到城池中&a…...

低成本扫码点餐:1000元全包

在数字化时代&#xff0c;扫码点餐已经成为餐饮行业的标配。然而&#xff0c;对于许多小规模或初创的餐饮企业来说&#xff0c;开发一套完整的扫码点餐系统是一项成本高昂的任务。今天&#xff0c;我们将向您介绍一个低成本、高效的方法&#xff0c;让您用1000块钱轻松搞定一套…...

五款焊在电脑上的效率软件

在当今快节奏的商业环境中&#xff0c;提高工作效率成为了每个人都渴望实现的目标。尤其是在面对繁忙的工作日程、庞杂的任务清单和团队合作的压力时&#xff0c;我们需要一些可靠的工具来帮助我们更好地管理时间、组织工作和提高生产力。幸运的是&#xff0c;现在有许多高效的…...

小程序样例3:根据日历创建待办事项

基本功能 1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项&#xff1a; 3. 点击事项&#xff0c;查看详情 4、删除事项&#xff1a;删除事项3之后&#xff0c;剩余事项2 5、点击日期可以选择更多的月&#xff1a; 实现思路&#xff1a; 1、数据结构&a…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...