ADC

ADC(Analog-to-Digital Converter), 即模拟信号 - 数字信号转换器

在STM32F103C8T6中, 同样具有ADC功能.

  • 以我们的芯片为例, 也存在2个片上外设ADC, 即ADC1和ADC2, 这两个ADC片上外设都挂载在APB2总线上.

  • 我们的ADC片上外设, 是一种具有12位逐次逼近型ADC,ADC转换的本质是不断的电压比较

如何把0~4095映射到0~3.3?

把3.3分成4096份,每份3.3/4095=8.06e-4,2000的离散值对应的电压是1.61

2v对应的离散值是4095/3.3*2=2481,对应的二进制是1001 1011 0.001

下面就是实现了4095/3.3*2这个过程,想一想二进制除法的实现

  1. 初始化:SAR 从最高位(MSB,即第11位)开始试探,其余位清零。

    • 例如,首次试探值:1000 0000 0000(即 2048,对应中间电压)。

  2. 比较判断

    • 若 VIN≥VDACVIN​≥VDAC​,保留该位为 1,否则置 0

  3. 逐位逼近

    • 移至下一位(如第10位),重复比较,直到最低位(LSB)。

  4. 完成转换

    • 经过 12次比较 后,SAR 中的值即为最终数字输出。

在配置使用ADC时, 通道是一个重要数据, 而ADC的通道和固定的引脚绑定.

// 在每次AD转换前配置规则组,这样可以灵活更改AD转换的通道
// 第一个参数: 采用ADC1还是ADC2
// 第二个参数: 使用那个通道, 比如ADC_Channel_1表示PA1通道; ADC_Channel_4表示PA4通道
// 第三个参数: 规则组可以有最多16个通道,可以指定该通道在规则组中的采样顺序
// 第四个参数: 对输入电压采样的时间长短; ADC_SampleTime_55Cycles5表示采样55.5个ADC时钟节拍ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);// 软件触发一次ADC1采样ADC_SoftwareStartConvCmd(ADC1, ENABLE);	
// 等待采样结束: 采样是否结束, 高根据寄存器EOC标志位来判断while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

规则组 和 注入组:在ADC中我们可以把采样分组, 无论是规则组还是注入组, 它的本质都是去记录采样的通道(要依次采样那几个通道, 以组划分)

注意: 注入组的优先级要比规则组,注入组最多可以配置同时采集4个通道, 并且每个通道的采集数据分别用一个寄存器存储。而规则组最多可以同时采集16个通道, 但是16个通道的采集数据, 共用一个寄存器存储, 有可能产生数据覆盖

连续转化: 上一次采集完毕, 立马进行下一次采集(完全不需要额外的软件触发或者硬件触发)

扫描模式:每次触发, 就把组内的配置的所有通道的数据都采集一遍

	// ADC初始化ADC_InitTypeDef ADC_InitStructure;	
// ADC模式选择: 暂时选择默认独立工作模式(即只使用ADC1)ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
// 数据对齐(和采样数据精度相关)ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// 选择触发采集模式(不用外部硬件触发, 使用软件触发)ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
// 不进行连续转化, 不开启, 必须触发过来, 才进行采样ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
// 不开启扫描模式, 因为我们准备每个组设置一个采样通道(通过设置, 采样, 修改设置, 采样的方式)ADC_InitStructure.ADC_ScanConvMode = DISABLE;
// 开启的通道数(给扫描模式指明扫描几个通过个数用的)ADC_InitStructure.ADC_NbrOfChannel = 1;
// 初始化ADC_Init(ADC1, &ADC_InitStructure);// 启动ADC

Flash

 主存储器: 用来存放程序代码和一些不可变数据(特点是断电不丢失)
起始地址0x08000000  当前默认64KB(0x08000000~0x0800FFFF)

信息块: 是STM32内部Flash额外划分的一部分, 主要用于存放设备的用户配置数据或校准数据.该区域通常是只读的, 不能随意修改.

接口寄存器: 用于控制和配置STM32的外设(如GPIO、USART、SPI、I2C、ADC等)

// addr: 页首地址
void erasePage(uint32_t addr) {FLASH_Unlock();					//解锁FLASH_ErasePage(addr);			//页擦除FLASH_Lock();					//加锁
}

看门狗

看门狗(Watchdog Timer, WDT)是一种硬件定时器, 用于防止系统死机或者长时间运行异常代码, 避免程序跑飞.

独立看门狗

 假设今天预分频设为4分频, 重装值设置为111111111111 -> 4095,求超时时间是多少?

40kHz/4=10kHz,所以0.1ms一个时钟节拍,所以超时时间是409.5ms

IWDG_ReloadCounter();  // 喂狗喂狗的本质, 就是通过键寄存器的修改(IWDG_KR), 要求递减计数器进行计数值的重装.避免计数值减为0.

窗口看门狗

窗口看门狗(WWDG)是一种 基于时间窗口 的看门狗定时器,主要用于 高可靠性嵌入式系统(如汽车电子、工业控制),确保程序在 严格的时间范围内 进行喂狗(刷新),避免 过早或过晚 喂狗导致的系统异常。

 窗口看门狗 vs 独立看门狗(IWDG)

特性窗口看门狗(WWDG)独立看门狗(IWDG)
时钟源来自 APB1(PCLK1)独立低速时钟(LSI,~32kHz)
复位条件喂狗时间 不在窗口内超时未喂狗
时间精度较高(依赖系统时钟)较低(依赖 LSI)
窗口约束必须 在最小和最大时间之间 喂狗只需 在超时前 喂狗
应用场景对 时序严格 的任务(如安全控制)防 程序跑飞(通用看门狗)

36MHz/4096/4=2197Hz第一次4096分频,第二次4分频

一个节拍0.46ms,WWDG_CR64个节拍复位64*0.46=29.44ms,最晚的时间

假设WWDG_CFR的值是112,并且一旦,它的数值小和喂狗时就会复位

计数器(WWDG_CR)

  • 7 位递减计数器(T6~T0),当 T6 从 1→0 时触发复位(即 0x40 → 0x3F)。
  • 喂狗通过写入 WWDG_CR 重置计数器值。

配置寄存器(WWDG_CFR)

  • 设置 窗口值(W6~W0),定义喂狗的 允许时间窗口
  • 设置 预分频器(WDGTB) 调整时钟频率。

时间窗口

  • 最小时间(上窗口 → “喂狗允许的起始点”):由 WWDG_CFR 的窗口值(W)决定,喂狗 不能早于 计数器值 > W。

  • 最大时间(下窗口 → “喂狗截止点”):计数器值从初始值递减到 0x3F(即 T6=0)时复位,喂狗 不能晚于 此点。

SPI

SPI协议的核心特性包括高位优先(MSB First)的数据传输方式、可配置的时钟极性(CPOL)和相位(CPHA), 以及灵活的时钟速率调整能力. 时钟极性(CPOL)决定了时钟信号在空闲状态下的电平(高或低), 而时钟相位(CPHA)则定义了数据采样相对于时钟边沿的位置. 通过组合CPOL和CPHA, SPI支持四种不同的工作模式(Mode0至Mode3),以适应不同设备的需求.此外,SPI协议允许主机通过软件或硬件方式控制片选信号(NSS/CS)从而实现对多个从机的灵活管理.

MISO:Master Input Slave Output/主设备数据输入,从设备数据输出
MOSI:Master Output Slave Input/主设备数据输出,从设备数据输入
SCK:Serial Clock/时钟信号,由主设备产生
CS:Chip Select/片选信号,由主设备控制

提问两台从机可以同时给,主机发消息吗?

不可以,会产生冲突

 需要注意的是: 
以W25Q64为例, 其总共占用64Mbit即8M字节
在其内部又以"块"->"扇区"->"页"来划分 :一个块=64K字节=16扇区、一个扇区=4K字节=16页
一个页=256字节

并且在对其进行操作的时候要求先擦除, 再写入
擦除要以扇区为单位

 对W25Q64进行操作的时候:
读取数据过程: 发送读取命令->发送地址->发送数据(是为了读数据)
写入数据过程: 发送写入命令->发送地址->发送写入内容

SPI 通过 时钟极性(CPOL) 和 时钟相位(CPHA) 定义数据传输时序,共有 4 种模式

模式CPOLCPHA时钟空闲状态数据采样边沿
000低电平上升沿
101低电平下降沿
210高电平下降沿
311高电平上升沿

MQTT

MQTT(Message Queuing Telemetry Transport)是一种轻量级的 发布/订阅(Pub-Sub) 消息协议,专为 低带宽、高延迟或不可靠网络 环境设计。

正常来讲,HTTP头部很大,这样就会导致许多问题,MQTT的轻量级,就体现在头部轻量

MQTT vs HTTP 对比

特性MQTT (消息队列遥测传输)HTTP (超文本传输协议)
协议类型发布/订阅(Pub-Sub)模型请求/响应(Request-Response)模型
设计目标低带宽、高延迟、不可靠网络(IoT 优化)通用 Web 通信(文档传输)
连接方式长连接(基于 TCP + 可选 TLS)短连接(默认无状态,HTTP/2 支持长连接)
消息大小极轻量(头部仅 2 字节起)较大(HTTP 头部通常几百字节)
通信模式异步(Broker 中转消息)同步(客户端主动请求,服务端响应)
QoS 支持✅ 3 个级别(0/1/2)❌ 无原生 QoS(依赖 TCP 重传)
实时性⚡ 高(低延迟推送)⏳ 较低(需轮询或 WebSocket)
适用场景IoT、传感器数据、实时控制Web 页面、REST API、文件传输
典型端口1883(明文)、8883(TLS)80(HTTP)、443(HTTPS)
广播/多播支持✅(Topic 订阅)❌(需额外协议如 WebSocket)
消息保留✅(Broker 可存储最后一条消息)❌(无状态,需额外实现)
连接开销⚡ 极低(适合嵌入式设备)⚠️ 较高(HTTP 头部 + Cookie 等)

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

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

相关文章

冷库设备远程监控物联网+省电节能解决方案

随着生鲜电商、医药冷链、跨境物流等行业的爆发式增长,我国冷库容量激增,但传统冷库管理模式正面临严峻挑战。据统计,国内冷链运输损耗率高达12%-15%,其中因温度失控导致的货损占比超60%。在某医药企业冷库事故中,因制…

如何开发一个运行在windows系统服务器上的服务

第一步:vs2022创建一个windows服务项目第二步:从工具箱拖拽出一个timer第三步:按下图所示进入,开始编辑业务逻辑下面给个例子using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; …

本地组策略编辑器无法打开(gpedit.msc命令异常)

一、本地组策略编辑器打开方式1、直接搜索打开(1)在搜索栏中直接输入以下内容进行搜索本地组策略编辑器(2)搜索到后直接点击打开即可(但是一部分同志无法搜索到,搜索到的内容基本都是网页信息而非本地系统的…

kafka部署集群模式

Kafka部署(3.7) 生产环境推荐的kafka部署方式为operator方式部署,Strimzi是目前最主流的operator方案。集群数据量较小的话,可以采用NFS共享存储,数据量较大的话可使用local pv存储 部署operator operator部署方式为he…

C语言中级_动态内存分配、指针和常量、各种指针类型、指针和数组、函数指针

0、前言: 动态内存分配是一个重要概念,要和静态数组对比着学习;指针和数组搭配在一起,让指针理解的难度上了一个台阶,尤其是二维数组搭配指针,要获取数组的值,什么时候“取地址”,什…

单变量单步时序预测:CNN-GRU卷积神经网络结合门控循环单元

目录预测效果1. **CNN-GRU的基本原理**2. **应用场景**3. **模型结构与实现**4. **优势与挑战**5. **相关研究与实现**6. **未来发展方向**结论代码设计预测效果 CNN-GRU卷积神经网络结合门控循环单元是一种结合了卷积神经网络(CNN)和门控循环单元&#…

MonoFusion 与 Genie 3

卡内基梅隆大学的研究者发明了一种叫 MonoFusion 的新技术,它能用很少的普通相机(比如4个),就能拍出像电影特效一样细腻流畅的动态3D场景(4D重建),比如弹钢琴、修自行车这种复杂动作&#xff0c…

kubernets命令行创建Token并附加权限给dashboard控制台登录

1、创建登录token kubectl create token default -n graph-node-test dgjeojrgopejgeropjgpsdjgerjglsdjfsjogjeojgeorjgortlfhj4yu493460uwperg3wef;lsj2y3r934tnrhifrlfe9t4h5tlhobdrmlgw485tw4yp653ut9ogogjerolj4w9erjgotj3fgjletyj49yr20o359truyo5u6908430jt5grjsdtgj49…

什么是SpringBoot

题目详细答案Spring Boot 是由 Pivotal 团队提供的一个基于 Spring 框架的项目,它旨在简化 Spring 应用的开发和部署。Spring Boot 通过提供一系列的约定和开箱即用的功能,使得开发者可以更快地构建独立的、生产级的 Spring 应用程序,而无需进…

从零开始设计一个分布式KV存储:基于Raft的协程化实现

从零开始设计一个分布式KV存储:基于Raft的协程化实现 本文将以一个最小可运行的分布式KV系统为例,带你拆解如何用C、Raft算法和协程模型构建高可用的Key-Value存储。 一、为什么需要分布式KV? 单机KV(如Redis)存在单点…

虚拟机或docker的ubuntu无界面安装完成后镜像源设置

ubuntu系统源 在装好虚拟机或者docker镜像后,直接使用apt update && apt upgrade是无法完更新的。 此时系统中也没有vim工具,我们可以在清华源的网站中找到帮助文档。mirrors.tuna.tsinghua.edu.cn/help/ubuntu/为了避免冲突,我们使用…

串口通信02 温度传感DS18B20 01 day49

九:串口通信 通信:无线和有线 ​ 单工 半双工 全双工 并行:多个数据线 串行:一根数据线 同步:通信双方使用同一个时钟,SPI信息帧,有CLK引脚 异步:通信双方使用不同时钟,双…

【FreeRTOS 】任务通知

FreeRTOS 任务通知任务通知简介一 、发送通知1.1 xTaskNotify()1.2 xTaskNotifyFromISR()1.3 xTaskNotifyGive()1.4 xTaskNotifyAndQuery()1.5 xTaskNotifyAndQueryFromISR()二、接收通知2.1 ulTaskNotifyTake()2.2 xTaskNotifyWait()三、清除通知状态和值3.1 xTaskNotifyState…

Android视图状态以及重绘

一、视图状态(View States)1. 五种核心状态状态作用修改方法特点enabled视图是否响应交互setEnabled(boolean)禁用状态下不响应onTouch事件focused视图是否获得焦点requestFocus()需同时满足focusable和focusableInTouchModewindow_focused视图所在窗口是…

vue3接收SSE流数据进行实时渲染日志

后端使用的是 Spring Boot WebFlux(响应式编程框架),并且返回的是 Server-Sent Events (SSE) 流式数据,那么在 Vue3 中,需要使用 EventSource API 或 fetch 流式读取 来正确获取响应内容。方案 1:使用 Eve…

每日五个pyecharts可视化图表-bars(6)

探索pyecharts库中条形图的高级用法与定制技巧 在数据可视化中,条形图是最常用的图表类型之一,它能够清晰地展示不同类别之间的数量对比。今天,我们将继续学习如何使用pyecharts创建5种不同风格的条形图。pyecahts源码 图表1:带…

【C语言】文件操作全解析

文章目录一、为什么需要文件操作?二、认识文件:不止是磁盘上的存储2.1 程序文件2.2 数据文件2.3 文件名的构成三、文本文件与二进制文件:数据的两种形态3.1 存储方式差异3.2 实例对比:整数10000的存储3.3 二进制文件操作示例四、文…

C结构体的几种定义形式 + typedef结合使用的好处

struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下: struct tag { member-list member-list member-list ... } variable-…

SPICE电容矩阵

SPICE电容矩阵: 如果有许多条传输线,就可以用下标来标记每一条线。例如,如果有5条线,就用1~5分别标记,依惯例把返回路径导体标记为导线0。图10.6给出了5条导线和一个公共返回平面的横截面图。首先研究电容器元件,下一节再讨论电感器元件。 在这个线的集合中,每对导线之间…

【Java】栈和队列

文章目录1.栈1.1 栈的定义1.2 栈的使用1.3 栈的模拟实现2.队列2.1 队列的定义2.2 队列的使用2.3 队列的模拟实现3.循环队列3.1 循环队列的概念3.2 循环队列判断空和满4.双端队列Deque1.栈 1.1 栈的定义 栈是一种特殊的线性表,其只允许在固定的一段进行数据的插入或…