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

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

文章目录

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

一、串口输出

(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) { //接收到了0x0d
				if (Res != 0x0a)
					USART_RX_STA = 0; //接收错误,重新开始
				else
					USART_RX_STA |= 0x8000; //接收完成了
			} else { //还没收到0X0D
				if (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数值与转换出的电压值一并打印。

#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(1000);
    }
}

(3) 仿真效果 (电压)

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

(4) 示例代码(光敏)

todo

(5) 仿真效果 (光敏)

todo

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

todo

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

todo

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX配置定时器输入捕获功能

STM32CubeMX配置定时器输入捕获功能 0.前言一、方法简介二、STM32CubeMX配置1.生成PWM信号2.配置TIM3_CH1进行采样3.占空比计算 三、总结 参考文章&#xff1a;CubeMX系列教程——11 定时器输入捕获 0.前言 最近在学习江科大STM32教程的原理部分时&#xff0c;发现该教程中使用…

【EI会议征稿通知】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and Computer Communications 第四届数字信号与计算机通信国际会议(DSCC 2024)将于2024年4月12日至14日在中国-香港举行。DSCC 2024旨…

使用Rancher管理Kubernetes集群

部署前规划 整个部署包括2个部分&#xff0c;一是管理集群部署&#xff0c;二是k8s集群部署。管理集群功能主要提供web界面方式管理k8s集群。正常情况&#xff0c;管理集群3个节点即可&#xff0c;k8s集群至少3个。本文以3节点管理集群&#xff0c;3节点k8s集群为例 说明部署过…

【大模型研究】(1):从零开始部署书生·浦语2-20B大模型,使用fastchat和webui部署测试,autodl申请2张显卡,占用显存40G可以运行

1&#xff0c;演示视频 https://www.bilibili.com/video/BV1pT4y1h7Af/ 【大模型研究】&#xff08;1&#xff09;&#xff1a;从零开始部署书生浦语2-20B大模型&#xff0c;使用fastchat和webui部署测试&#xff0c;autodl申请2张显卡&#xff0c;占用显存40G可以运行 2&…

【Web前端开发基础】CSS的盒子模型

CSS的盒子模型 一、学习目标 能够认识不同选择器的优先级公式能够进行CSS权重叠加计算&#xff0c;分析并解决CSS 冲突问题能够认识盒子模型的组成部分能够掌握盒子模型的边框、内边距、外边距的作用及简写形式能够计算盒子的实际大小能够了解外边距折叠现象&#xff0c;并知…

【Go面试向】rune和byte类型的认识与使用

【Go】rune和byte类型的认识与使用 大家好 我是寸铁&#x1f44a; 总结了一篇rune和byte类型的认识与使用的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; byte和rune类型定义 byte,占用1个字节&#xff0c;共8个比特位&#xff0c;所以它实际上和uint8没什么本质区别,它表示…

第十四课:eNSP AAA配置教程

一、AAA介绍 AAA是Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和Accounting&#xff08;计费&#xff09;的简称&#xff0c;是一种管理框架&#xff0c;它提供了授权部分用户访问指定资源和记录这些用户操作行为的安全机制。因其…

ip_vs 的管理以及 keepalived + lvs 案例

ip_vs 的管理 ipvsadm 与 keepalived for lvs ipvsadm 命令及参数介绍 部署和配置LVS服务会经常用到一些命令&#xff0c;如ipvsadm&#xff0c;可以使用“ipvsadm -help”命令查看使用帮助。 ipvsadm 命令的常用参数及其说明如下&#xff1a; # 添加虚拟服务器# 语法&#x…

计算机网络自顶向下Wireshark labs1-Intro

Wireshark labs1 实验文档&#xff1a;http://www-net.cs.umass.edu/wireshark-labs/Wireshark_Intro_v8.0.pdf 介绍 加深对网络协议的理解通常可以通过观察协议的运行和不断调试协议来大大加深&#xff0c;具体而言&#xff0c;就是观察两个协议实体之间交换的报文序列&…

python系列-顺序/条件/循环语句

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 顺序语句 条件语句 什么是条件语句 语法格式 缩进和代码块 空语句pass 循环语句 while循环 for循环 continue break 顺序语句 默认情况下&#xff0c;Python的代码执行…

精准核酸检测 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 为了达到新冠疫情精准防控的需要&#xff0c;为了避免全员核酸检测带来的浪费&#xff0c;需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析&a…

Linux第34步_TF-A移植的第2步_修改设备树和tf-a.tsv

在虚拟机中&#xff0c;使用VSCode打开linux /atk-mp1/atk-mp1/my-tfa/目录下tf-a.code-workspace”&#xff1b; 找到“tf-a-stm32mp-2.2.r1/fdts”目录&#xff0c;就是设备树文件所在的目录。 见下图&#xff1a; 一、修改“stm32mp157d-atk.dts” 修改后&#xff0c;见下…

日志平台搭建手册

1. Java环境安装和配置 JDK要求安装1.8版本&#xff0c;安装可以参考《Linux安装JDK完整步骤》。 2. 创建用户 创建elk用户&#xff0c;用来管理elk相关的服务&#xff0c;包括&#xff1a;filebeat、logstash、elasticsearch、kibana。执行命令&#xff1a; useradd elk …

VC++中使用OpenCV进行人脸检测

VC中使用OpenCV进行人脸检测 对于上面的图像&#xff0c;如何使用OpenCV进行人脸检测呢&#xff1f; 使用OpenCV进行人脸检测十分简单&#xff0c;OpenCV官网给了一个Python人脸检测的示例程序&#xff0c; objectDetection.py代码如下&#xff1a; from __future__ import p…

计算机网络-分层结构,协议,接口,服务

文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决&#xff0c;也就分层解决 怎样分层 每层相互独立&#xff0c;每层做的工作不同 界面自然清晰&#xff0c;层与层之间的接口能够体现…

(2)(2.1) Andruav Android Cellular(二)

文章目录 前言 5 Andruav Web Client 6 Andruav Telemetry 7 Andruav高级功能 8 将Andruav与SITL配合使用 9 FAQ 10 术语表 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 5 Andruav W…

【Java】IDEA集成开发环境工具切换JDK和设置环境变量

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

CTF CRYPTO 密码学-5

题目名称&#xff1a;山岚 题目描述&#xff1a; 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程&#xff1a; Step1&#xff1a;根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间&#xff0c;看出都是每3个字符的第1…

只会 Python 不行,不会 Python 万万不行 。。。

当下的环境大家有目共睹&#xff0c;未来一段时间情况如何&#xff0c;想必不少人心里也清楚&#xff0c;技术人走到中年&#xff0c;难免会焦虑&#xff0c;职场上干得不爽&#xff0c;但是跳槽也不容易&#xff0c;加上不少企业裁员&#xff0c;换个满意的工作更是难上加难。…

大学生图像采集上传成功的秘诀被破解了‼️

✅大学生毕业图像采集上传成功了我喜欢的 大学生图像采集可以自己上传 尤其是毕业采集&#xff0c; 很多同学都需要自己拍照上传&#xff0c;只要你照片人像比例对&#xff0c; 像素和大小对&#xff0c;真的分分钟上传成功&#xff01; 毕业采集照片要求&#xff1a; 像素480*…