[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集
上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键
文章目录
- 一、串口输出
- (1) 简介
- (2) 示例代码
- (3) 仿真效果
- 二、串口输入
- (1) 简介
- (2) 示例代码
- (3) 仿真效果
- 三、ADC采集
- (1) 简介
- (2) 采集电压
- (3) 示例代码(电压)
- (4) 仿真效果 (电压)
- (5) 采集光敏
- (6) 示例代码(光敏)
- (6) 仿真效果 (光敏)
- (7) 内部温度
- (8) 示例代码(内部温度)
- (9) 仿真效果 (内部温度)
一、串口输出
(1) 简介
- 学C语言时,使用的printf()函数,就是通过串口打印出来的。
- 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块;
- 两个开发板之间通信,制定私有协议。
- 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) 简介
- 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块;
- 两个开发板之间通信,制定私有协议。
- 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) 仿真效果
- 操作:打开串口–发送消息:123456\r\n
三、ADC采集
这个实验需要添加电路,如下图:
- 将按钮移除
- 添加电压调节器
(1) 简介
- ADC是一个专门采集模拟量转为为数字信号的外设。
- 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) 仿真效果 (电压)
- 操作: 打开串口–调整电压
(5) 采集光敏
- 光敏电阻的特性:光线越亮,阻值越小。
- 一般用于走廊,白天不亮,晚上亮,做到省电的效果。
- 按下图搭建电路
(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) 仿真效果 (光敏)
- 操作:打开串口–调节光敏电阻–从0-100%调整–当阻值>2000,点亮;阻值<2000,熄灭。
(7) 内部温度
- 芯片内部温度,目的:让电阻计算更佳准确,因为温度会影响阻值。 (一般用不上,不精确)
- 测量CPU以及周围的温度,测量范围为-40~125度,误差为±1.5度
- 内部温度传感器更适合于检测温度的变化,需要测量精确温度的情况下,应使用外置传感器。
- 温度传感器模拟输入推荐采样时间是 17.1us。
- 温度的计算公式如下:
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采集
上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 文章目录 一、串口输出(1) 简介(2) 示例代码(3) 仿真效果 二、串口输入(1) 简介(2) 示例代码(3) 仿真效果 三、ADC采集(1) 简介(2) 采集电压(3) 示例代码(电压)(4) 仿真效果 …...

Deepin基本环境查看(四)【硬盘/分区、文件系统、硬连接/软连接】
Linux操作系统(Deepin、Ubuntu)操作系统中,硬盘分区的管理与Windows操作系统不同; 在Linux系统中维护着一个统一的文件目录体系,而硬盘和分区是以资源的形式由操作系统挂接和调度;此外Linux系统中连接(硬连…...

JS之打地鼠案例
需要素材的同学可以私信我 效果图: 上代码: <!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(滚动更新)存活探针(livenessProb)就绪探针(readiness) 4、ServiceClusterIPNodePortLoadBalancer 5、Ingres…...

EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码
这里是CIP资料的协议层级图,讲解协议构造。 ODVA(www.ODVA.org)成立于1995年,是一个全球性协会,其成员包括世界领先的自动化公司。结合其成员的支持,ODVA的使命是在工业自动化中推进开放、可互操作的信息和…...

Django(九)
1. 用户登录-Cookie和Session 什么是cookie和session? 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接:一次请求响应之后断开连接,再发请求重新连…...
解决Android Studio Unexpected tokens (use ; to separate expressions on the same line)
[TOC](Unexpected tokens (use ; to separate expressions on the same line)) 问题描述:Unexpected tokens (use ; to separate expressions on the same line) 原因:Android Studio 更新到最新的版本之后,gradle工程目录结构发生改变 问…...

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

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

前端开发提高效率的两大工具
一、浏览器中的开发者工具 怎么启动开发者工具? 在浏览器中按下F12或者鼠标右键点击检查 怎么利用(常用的几点)? 1、元素 点击标红的图标可以用于在页面选择元素,同时右侧会找到元素在前端代码中的位置 点击下方红…...

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

【Py/Java/C++三种语言详解】LeetCode每日一题240122【贪心】LeetCode670、最大交换
文章目录 题目链接题目描述解题思路为什么是贪心一个带图的例子 代码pythonjavacpp时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode670、最大交换 题目描述 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连…...

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

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

JVM-初始JVM
什么是JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: JVM的功能 1 - 解释和运行 2 - 内存管理 3 - 即时编译 解释和运行 解释…...
EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格
EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格 对应表格复制 Sub tableTest()Set winhttp CreateObject("winhttp.WinHttpRequest.5.1")Set HTML CreateObject("htmlfile")Set oWindow HTML.ParentWindowUrl "https://www.taiwanlo…...

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

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

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

小程序样例3:根据日历创建待办事项
基本功能 1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项: 3. 点击事项,查看详情 4、删除事项:删除事项3之后,剩余事项2 5、点击日期可以选择更多的月: 实现思路: 1、数据结构&a…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法
目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客:【写在创作纪念日】基于SpringBoot和PostG…...