[嵌入式软件][启蒙篇][仿真平台] 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) { //接收到了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数值与转换出的电压值一并打印。

#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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-4 轨迹追踪

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-4 轨迹追踪 1. 目标误差控制-误差的调节2. 稳态非零值控制3. 输入增量控制 1. 目标误差控制-误差的调节 2. 稳态非零值控制 3. 输入增量控制

【UE5】第一次尝试项目转插件(Plugin)的时候,无法编译

VS显示100条左右的错误&#xff0c;UE热编译也不能通过。原因可能是[名字.Build.cs]文件的错误&#xff0c;缺少一些内容&#xff0c;比如说如果要写UserWidget类&#xff0c;那么就要在 ]名字.Build.cs] 中加入如下内容&#xff1a; public class beibaoxitong : ModuleRules …

爬虫案例—爬取ChinaUnix.net论坛板块标题

爬虫案例—爬取ChinaUnix.net论坛板块标题 ChinaUnix.net论坛网址&#xff1a;http://bbs.chinaunix.net 目标&#xff1a;抓取各个板块的标题和内容的标题 网站截图&#xff1a; 利用requests和xpath实现目标。源码如下&#xff1a; import requests from lxml import etr…

Unity学习-逐帧图集动画制作

首先在文件部分创建一个Sprite Library Asset 然后点击创建出来的文件 点下面的加号添加对应的图 添加完成之后点一下Apply 然后新建一个物体 添加这三个组件 其中SpriteLibrary里面 把你刚刚创建的图集文件拉过来 Sprite Resolver选择对应的动作和图片 然后开始制作动画 An…

【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力&#xff1f; 可能很多初学者在学完 SpringBoot 之后&#xff0c;做了 1-2 个项目之后&#xff0c;不知道该去学习什么了&#xff0c;其实这时候需要去学习的东西还有很多&#xff0c;接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…

Science Robotics: 意大利IIT仿生软体机器人实验室研制具有自适应行为的软体生长机器人

FiloBot通过模仿攀爬植物的生长方式——通过在顶端增加材料来构建身体&#xff0c;实现在难以预测和复杂的环境中的导航。这种设计理念的核心在于能够适应多种地形并克服障碍&#xff0c;特别适用于密集森林或杂乱区域这样的非结构化环境。机器人使用添加制造技术&#xff08;特…

Docker(九)Docker Buildx

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Docker Buildx Docker Buildx 是一个 docker CLI 插件&#xff0c;其扩展了 docker 命令&#xff0c;支持 [Moby BuildKit] 提供的功能。提…

【C++】模板类vector的简单实现

文章目录 1. 迭代器2.构造和析构3. 容量4. 访问5.修改6.测试完整代码总结&#xff1a; 在C的STL库中&#xff0c;vector是一个非常常用的容器&#xff0c;它提供了动态数组的功能。今天我们将一起来实现一个简化版的vector模板类&#xff0c;以便更好地理解它的原理和实现过程。…

多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果…

蓝牙运动耳机什么牌子的好?2024年运动无线耳机推荐

​在选择运动耳机时&#xff0c;我们需要综合考虑音质、舒适度以及适应不同运动场景的能力。好的运动耳机能够提高运动效率&#xff0c;增添锻炼的乐趣。今天&#xff0c;我为大家介绍几款在音质、佩戴舒适度、防水防汗等方面表现卓越的运动耳机&#xff0c;助你选购最适合的一…

python 正则表达式学习(1)

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 1. 特殊符号 1.1 符号含义 模式描述^匹配字符串的开头$匹配字符串的末尾.匹配任意字符&#xff0c;除了换行符&#xff0c;当re.DOTALL标记被指定时&#xff0c;则可以匹配包…

词语的魔力:语言在我们生活中的艺术与影响

Words That Move Mountains: The Art and Impact of Language in Our Lives 词语的魔力&#xff1a;语言在我们生活中的艺术与影响 Hello there, wonderful people! Today, I’d like to gab about the magical essence of language that’s more than just a chatty tool in o…