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

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

 名词解释:

ADC: Analog-to-Digital
SAR:Successive Approximation Register

        本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践:单通道采集芯片内部温度传感器(ADC1_ch16);利用软件触发单次触发多通道DMA ADC采集;利用定时器单次/连续触发多通道DMA ADC采集。

1. 什么是ADC?

1.1 ADC概念

1.1.0 ADC采集方法-逐次逼近寄存器型ADC

        通过 “逐位试探比较” 的方式,从最高位(MSB)到最低位(LSB)依次确定每一位的二进制值,最终生成与输入模拟信号对应的数字代码。其结构框图如下:

        

        一个4位转换示例,y轴(和图中的粗线)表示DAC的输出电压。本例中,第一次比较表明VIN < VDAC。所以,位3置为0。然后DAC被置为0b0100,并执行第二次比较。由于VIN > VDAC,位2保持为1。DAC置为0b0110,执行第三次比较。根据比较结果,位1置0,DAC又设置为0b0101,执行最后一次比较。最后,由于VIN > VDAC,位0确定为1。

        

1.1.1 ADC功能

        STM32的ADC(Analog-to-Digital Converter)是一个 ​12位逐次逼近型(SAR)模数转换器,支持多通道、多模式信号采集,

  • 分辨率​:可配置为12位、10位、8位或6位(通过牺牲分辨率提升转换速度)。
  • 输入通道​:最多19个复用通道,包括:
    • 16个外部引脚​(如温度、电压、电流传感器输入)。
    • 2个内部信号源​(内部温度传感器、内部参考电压)。
    • VBAT通道​:直接测量电池电压(需特定型号支持)。
  • 转换模式​:单次、连续、扫描、不连续采样模式。
  • 数据存储​:16位数据寄存器,支持左对齐或右对齐格式。
  • ADC 电源要求:全速运行时为 2.4 V 3.6 V ,慢速运行时为 1.8 V
  • ADC 输入范围: V REF-   <=  VIN  <= VREF+
  • 模拟看门狗(Analog Watchdog, AWD)​​:监测输入电压是否超出用户设定的阈值范围,触发中断或事件

1.1.2 ADC框图

        

        
        

    1.2 ADC功能介绍

    1.2.1 ADC开关控制、时钟选择、ADC通道选择

    1. ADC开关控制

    ADC_CR2.ADON (A/D Converter ON / OFF):(0为禁止ADC;1为使能ADC)
    ADC_CR2.SWSTART(Start conversion of regular channels):开始转换规则通道(1为开始转换)
    ADC_CR2.JSWSTART(Start conversion of injected channels):开始转换注入通道(1为开始转换)

    2. ADC时钟选择

    1. 模拟电路时钟(ADCCLK)- 所有 ADC 共用
      · 驱动ADC的模拟电路部分,包括采样保持电路(Sample&Hold)和SARADC。
      · RCC_CFGR中的ADCPRE位,设置ADC分频系数。
    2. 数字接口时钟
      · 等效时钟​:直接使用APB2总线时钟(f_{PCLK2}),无分频。
      · 使能控制​:通过RCC_APB2ENR寄存器为每个ADC独立使能/禁用数字接口时钟。
      __HAL_RCC_ADC1_CLK_ENABLE();   // 使能ADC1数字接口时钟

    3. ADC通道选择(分为规则转换和注入转换

            

            一个规则转换组最多由 16 个转换构成。必须在 ADC_SQRx 寄存器中选择转换序列的规则通道及其顺序。规则转换组中的转换总数必须写入 ADC_SQR1 寄存器中的 L[3:0] 位。
            

            下图为正点原子总结的规则组与寄存器对应表
            
            一个注入转换组 最多由 4 个转换构成。必须在 ADC_JSQR 寄存器中选择转换序列的注入通道及其顺序。注入转换组中的转换总数必须写入 ADC_JSQR 寄存器中的 L[1:0] 位。

            下图为正点原子总结的注入组与寄存器对应表
            

    1.2.2 模拟看门狗

    1. 发生模拟看门狗标志
      ADC_SR.AWD
    2. 模拟看门狗中断使能
      ADC_CR1.AWDIE
    3. 模拟看门狗保护区域
    4. 阈值上下限设置(V = VREF*HTR(LTR)/4096)
      ADC_HTR 与 ADC_LTR
    5. 模拟看门狗通道选择(ADC_CR1.AWDCH[4:0])


    1.2.3 单次转换模式、连续转换模式(ADC_CR2.CONT)

            ADC_CR2.CONT:0为单次转换模式;1为连续转换模式

            

    1. 单次转换触发方式

            ● 将 ADC_CR2 寄存器中的 SWSTART 位置 1(仅适用于规则通道)
            ● 将 JSWSTART 位置 1(适用于注入通道)
            ● 外部触发(适用于规则通道或注入通道)

    2. 单次转换流程

    • 规则通道转换完成​:
      1. 数据存储​:结果存入ADC_DR(16位数据寄存器)。
      2. 标志位​:EOC=1(转换结束标志)。
      3. 中断触发​:若EOCIE=1,产生中断通知CPU读取数据。
      4. ADC状态​:自动停止,等待下次触发。
    • 注入通道转换完成​:
      1. 数据存储​:结果存入ADC_JDR1(注入数据寄存器)。
      2. 标志位​:JEOC=1(注入转换结束标志)。
      3. 中断触发​:若JEOCIE=1,产生中断。
      4. ADC状态​:自动停止。

    3. 连续转换触发方式

    • 规则通道​:
      • 软件触发​:置位ADC_CR2.SWSTART=1
      • 外部触发​:配置外部触发源(如PWM同步信号)。
    • 注入通道限制​:
      • 默认禁止连续转换​:注入通道无法独立启动连续转换。
      • 唯一例外​:若使能自动注入(JAUTO=1),注入通道可在规则通道组之后 ​自动插入转换

    4. 连续转换触发方式

    规则通道组转换完成​:

    1. 数据存储​:最新结果覆盖ADC_DR寄存器。
    2. 标志位​:EOC=1(每次转换结束均置位)。
    3. 中断触发​:若EOCIE=1,每次转换均触发中断。
    4. ADC状态​:立即启动下一轮转换,无需外部触发

    自动注入模式(JAUTO=1)​

    • 功能​:在规则通道组转换完成后,自动插入注入通道转换。
    • 流程​:
      1. 规则通道组转换完成 → 触发注入通道转换。
      2. 注入通道结果存入ADC_JDR1JEOC=1
      3. 中断触发:若JEOCIE=1,通知CPU处理注入数据。
      4. ADC继续下一轮规则通道转换。

    1.2.4 扫描模式、注入通道管理

    1. 扫描模式

            ● ADC_CR1.SCAN 置1-选择扫描模式;
            ● 如果将 CONT 位置 1,规则通道转换不会在组中最后一个所选通道处停止,而是再次从第一个所选通道继续转换。

            ● ADC_SR.EOC:规则通道转换结束 (Regular channel end of conversion)
                    0:转换未完成 (EOCS=0) 或转换序列未完成 (EOCS=1)
                    1:转换已完成 (EOCS=0) 或转换序列已完成 (EOCS=1)
            ● ADC_CR2.EOCS:结束转换选择 (End of conversion selection)
                    0:在每个规则组转换序列结束时将
    EOC 位置 1。溢出检测仅在 DMA=1 时使能。
                    1:在每个规则通道转换结束时将 EOC 位置
    1。使能溢出检测。

    2. 注入通道管理(ADC_CR1.JAUTO
            

    ● 触发注入-配置条件

    • JAUTO位清零​:ADC_CR1.JAUTO=0(禁用自动注入)。
    • 触发源选择​:
      • 外部触发​:通过ADC_CR2.JEXTSEL选择触发源(如定时器、外部引脚)。
      • 软件触发​:置位ADC_CR2.JSWSTART=1

    ● 触发注入-工作流程

    • 启动规则通道组转换​:
      • 外部触发或软件触发规则组转换(如定时器触发)。
    • 触发注入事件​:
      • 在规则组转换期间,若检测到注入触发信号:
        • 复位当前规则转换​:立即停止当前规则通道的转换。
        • 执行注入组转换​:以单次扫描模式完成注入通道组的转换。
    • 恢复规则转换​:
      • 注入组完成后,从被中断的规则通道继续转换。

    ● 自动注入-配置条件

    • JAUTO位置1​:ADC_CR1.JAUTO=1(启用自动注入)。
    • 禁用注入触发​:必须关闭外部触发(ADC_CR2.JEXTEN=0)。
    • 连续模式支持​:
      • ADC_CR2.CONT=1,规则组和注入组将循环转换。

    ● 自动注入-工作流程

    • 规则组转换完成​:
      • 规则组转换结束后,自动启动注入组转换。
    • 注入组转换​:
      • ADC_JSQR配置的顺序转换注入通道,结果存入ADC_JDR1~4
    • 循环转换(CONT=1时)​​:
      • 注入组完成后,立即重启规则组转换。

    1.2.5 不连续采样模式

    1. 规则组

            ADC_CR1.DISCEN - 不连续采样模式使能
            ADC_CR1.DISCNUM[2:0] - n个子序列组
           
    ADC_SQR1.L[3:0] - 定义总序列长度
            

    2. 注入组

            ADC_CR1.JDISCEN - 不连续采样模式使能
            ADC_JSQR1.L[1:0] - 定义总序列长度
            

            不能同时使用自动注入和不连续采样模式。
            不得同时为规则组和注入组设置不连续采样模式。只能针对一个组使能不连续采样模式。

    1.3 数据对齐、通道采样时间、快速转换模式

    1.3.0 规则/注入数据寄存器

    1. 规则数据寄存器(ADC_DR

            

    2. 注入数据寄存器(ADC_JOFRx、ADC_JDRx

            ADC_JDRx = 结果 - ADC_JOFRX (取16位补码)
            SEXT位(扩展的符号值):负数填充1;正数填充0

            

    1.3.1 数据对齐ADC_CR2.ALIGN

            ALIGN =0 右对齐(默认);=1 左对齐。

    1. 右对齐(参考1.3.0)

            

    2. 左对齐(参考1.3.0)

            

    1.3.2 通道采样时间与转换时间

            通过ADC_SMPR1、ADC_SMPR2的SMPx[2:0]控制各个通道的采样周期。

            

    1.3.3 快速转换模式(降低精度转换)ADC_CR1.RES 

            可通过降低 ADC 分辨率来执行快速转换。下列为转换时间。
            

            ● 12 位:3 + 12 = 15 ADCCLK 周期
            ● 10 位:3 + 10 = 13 ADCCLK 周期
            ● 8 位:3 + 8 = 11 ADCCLK 周期
            ● 6 位:3 + 6 = 9 ADCCLK 周期

    1.4 外部触发和触发极性

    1.4.1 外部触发极性

            

            

    1.4.2. 外部触发条件

     

    1.5 ADC数据采集方式(三种)

    1.5.1 使用 DMA(ADC_CR2.DMA 置1)

    0. DDS决定DMA是否可以连续请求
            如果将 ADC_CR2 寄存器中的 DDS 位清零,则不会向 DMA 控制器发出新的 DMA 请求(这可避免产生溢出错误)。不过,硬件不会将 DMA 位清零。必须将该位写入 0 然后写入 1 才能启动新的传输。
            如果将 DDS 位置 1 ,则可继续生成请求。从而允许在双缓冲区循环模式下配置 DMA

    1. 配置步骤

    • 使能DMA:置位ADC_CR2寄存器中的DMA位。
    • 配置DMA控制器:设置目标地址(内存缓冲区)和传输次数(NDTR计数器)。

    2. 数据丢失(溢出)处理

    • 溢出标志​:若数据未及时读取且DMA未传输,ADC_SR寄存器中的OVR位会置1,并可能触发中断(需使能OVRIE位)。
    • 溢出后果​:
      • DMA传输被禁止,后续DMA请求被忽略。
      • 正在进行的规则转换被中止,后续规则触发无效。
    • 恢复步骤​:
      1. 重新初始化DMA​:调整目标地址和NDTR计数器。
      2. 清除溢出标志​:将ADC_SR中的OVR位清零。
      3. 重启转换​:触发ADC开始新的转换。

    3. DMA传输结束

    • ADC_CR2DDS位为0,最后一次传输后停止DMA请求,需手动复位DMA位(先写0再写1)重启。
    • DDS位为1,DMA继续生成请求,支持双缓冲区循环模式(适合连续流数据)。

    1.5.2 在不使用 DMA 的情况下管理转换序列

    1. 配置步骤

    • 禁止DMA:ADC_CR2DMA位清零。
    • 使能每次转换结束中断:置位ADC_CR1EOCS位为1(EOC在每次转换结束时置1)。
    • 溢出处理​:
      • 与DMA模式相同:需手动清除OVR位并重启转换。

    2. 配置步骤

    • 启动转换序列​:触发ADC开始转换。
    • 等待EOC标志​:每次转换结束,EOC位置1。
    • 读取数据​:从ADC_DR读取当前通道数据。
    • 处理溢出​(若发生):清除OVR位并重启转换。

    1.5.3 在不使用 DMA 和溢出检测的情况下进行转换

    • 禁止DMA:ADC_CR2DMA位清零。
    • 仅在序列结束置位EOC:EOCS位清零。
    • 禁用溢出检测:默认情况下溢出检测已关闭。

    1.6 多重 ADC 模式

    1.6.1 多重 ADC 模式介绍(ADC_CCR.MULTI[4:0])

            

    1. 四种模式(也可以组合使用)

            ● 注入同时模式
            ● 规则同时模式
            ● 交替模式
            ● 交替触发模式
            ● 注入同时模式 + 规则同时模式
            ● 规则同时模式 + 交替触发模式

    2. 多重ADC框图

    注: 1. 尽管 ADC2 ADC3 上存在外部触发,但它们并未显示在此图中。
            2. 在双重 ADC 模式下,不存在 ADC3 从器件部分。
            3. 在三重 ADC 模式下,ADC 通用数据寄存器 (ADC_CDR) 包含 ADC1ADC2 ADC3 的规则转换数据。按照所选的存储顺序使用全部 32 个寄存器位。在双重 ADC 模式下,ADC 通用数据寄存器 (ADC_CDR) 包含 ADC1 ADC2 的规则转换数据。使用全部32个寄存器位。

    1.6.2 多重模式下DMA模式(ADC_CCR.DMA[1:0])(三种)

            

    1. DMA模式1(半字传输)

    1. 核心特性
      传输单位​:每个DMA请求传输 ​一个半字(16位)​,对应单个ADC的转换结果。
      触发条件​:每完成一次ADC转换(一个数据项可用)时触发DMA请求。
    2. 数据传输顺序
      · 两重模式
      请求顺序为 ​ADC1→ADC2→ADC1→ADC2...​,依次循环。

      · 三重模式
      请求顺序为 ​ADC1→ADC2→ADC3→ADC1→ADC2→ADC3...​,依次循环。
    3. 应用场景
      规则同时模式​:需要逐个读取多ADC数据的场景。
      示例​:多通道温度监测,ADC1、ADC2、ADC3分别采集不同区域的温度值。

    2. DMA模式2(字传输)

    1. 核心特性
      传输单位​:每个DMA请求传输 ​一个字(32位)​,包含 ​两个半字​(两个ADC的转换结果)。
      触发条件​:每完成两次ADC转换(两个数据项可用)时触发DMA请求。
    2. 数据传输顺序

       · 两重模式
      每个字的高16位存储 ​ADC2数据,低16位存储 ​ADC1数据

      · 三重模式
      按 ​固定组合顺序​ 传输三个ADC的数据,每个字包含两个半字:

    3. 应用场景
      交替模式​:需要同时读取两个ADC数据的场景,例如电机控制中电流和电压同步采集。
      示例​:双重交替模式下,ADC1采集电流信号,ADC2采集电压信号,每个DMA请求同时传输两者数据。

    3. DMA模式3(字节传输)

    1. 核心特性
      传输单位​:每个DMA请求传输 ​两个字节(8位×2)​,适用于 ​6位或8位分辨率​ 的ADC。
      触发条件​:每完成两次ADC转换(两个数据项可用)时触发DMA请求。
    2. 数据传输顺序
       · 两重模式
      每个DMA请求的高8位存储 ​ADC2数据,低8位存储 ​ADC1数据
      · 三重模式
      数据传输顺序与DMA模式2相似,但以字节为单位:
    3. 应用场景
      规则同时模式​:适用于6位或8位ADC的快速数据采集,简单传感器信号(如光敏电阻)。
      示例​:ADC1和ADC2分别采集两个低分辨率传感器的开关状态。

    1.7 多重 ADC 模式

    1.7.1 注入同时模式

            此模式可转换注入通道组。外部触发源来自 ADC1 的注入组多路复用器(通过 ADC1_CR2寄存器中的 JEXTSEL[3:0] 位进行选择)。同时触发可用于 ADC2 ADC3
    注:
            1.  不要在两个 / 三个 ADC 上转换同一通道
            2. 使用同一长度来转换序列,或必须确保触发之间的间隔长于 2 个序列(双重 ADC 模式)/3 个序列(三重 ADC 模式)中的较长时间。
     
    1. 双重ADC
            ● 转换的数据会存储在各个 ADC 接口的 ADC_JDRx 寄存器中。
            ● 当 ADC1/ADC2 的注入通道全部完成转换后,会生成一个 JEOC 中断(如果已在两个 ADC 接口中的一个接口上使能)。
    2. 三重ADC
            ● 转换的数据会存储在各个 ADC 接口的 ADC_JDRx 寄存器中。
            ● 当 ADC1/ADC2/ADC3 的注入通道全部完成转换后,会生成一个 JEOC 中断(如果已在三个 ADC 接口中的一个接口上使能)。
            

    1.7.2 规则同时模式(ADC_CDR

    ADC_CDR:适用于双重和三重模式的 ADC 通用规则数据寄存器

            用于规则通道组。外部触发源来自 ADC1 的规则组多路复用器(通过 ADC1_CR2 寄存器中的 EXTSEL[3:0] 位进行选择)。同时触发可用于 ADC2 ADC3

    注:必须禁止注入转换。

            

    1. 双重ADC

    • 触发条件​:当任意一个ADC(ADC1或ADC2)完成一次转换时,触发DMA请求。
    • DMA配置​:
      • 设置 ADC_CCR 寄存器的 DMA[1:0] = 0b10
      • 生成 ​单次32位DMA传输请求,将 ​ADC2和ADC1的转换数据​ 组合传输。
    • 数据格式​:
      • 32位数据寄存器 ADC_CDR 的高16位存储 ​ADC2的转换结果,低16位存储 ​ADC1的转换结果
      • 示例:若ADC1转换值为 0x1234,ADC2转换值为 0x5678,则 ADC_CDR = 0x56781234
    • 传输流程​:
      1. DMA将 ADC_CDR 高16位(ADC2数据)写入SRAM目标地址。
      2. DMA将 ADC_CDR 低16位(ADC1数据)写入下一个SRAM地址。
      3. 重复直到所有通道转换完成。

        • ​中断生成:
             EOC中断
    ​:当 ​所有常规通道均完成转换​ 后,触发EOC(转换结束)中断。
             中断使能​:需在 ​至少一个ADC接口​ 的 ADC_CR1 寄存器中使能 EOCIE 位。

            

    2. 三重ADC

    • 触发条件​:当任意一个ADC(ADC1、ADC2或ADC3)完成一次转换时,触发DMA请求。
    • DMA配置​:
      • 设置 ADC_CCR 寄存器的 DMA[1:0] = 0b01
      • 生成 ​三次32位DMA传输请求,分别传输 ​ADC1、ADC2、ADC3的转换数据
    • 数据格式​:
      • 每个ADC的转换结果存储在独立的 ADC_CDR 寄存器中。
      • 传输顺序:先ADC1→再ADC2→最后ADC3。
    • 传输流程​:
      1. 第一次DMA传输:ADC1数据写入SRAM地址A。
      2. 第二次DMA传输:ADC2数据写入地址A+4(32位对齐)。
      3. 第三次DMA传输:ADC3数据写入地址A+8。
      4. 重复直到所有通道转换完成。
    • 中断生成
      EOC中断​:当 ​所有常规通道均完成转换​ 后,触发EOC(转换结束)中断。
      中断使能​:需在 ​至少一个ADC接口​ 的 ADC_CR1 寄存器中使能 EOCIE 位。

            

    1.7.3 交替模式

    此模式只能用于规则组(通常为一个通道)。外部触发源来自 ADC1 的规则通道多路复用器
    ADC_CCR.DELAY[3:0] - 设置交替模式下的采样时间。

            

    1. 双重 ADC 模式

            ADC1立即启动,经过几个ADC时钟周期延迟后ADC2启动。

            只有一共ADC能够对输入信号采样,即DELAY设置的延迟时间小于采用时间时,延迟时间=采样时间+2个ADC_CLK时钟周期。如果 ADC1 和 ADC2 上的 CONT 位均置 1,则这两个 ADC 所选规则通道会连续进行转换。

            

            

    2. 三重 ADC 模式

            ADC1 立即启动,经过几个ADC时钟周期延迟后ADC2启动,在ADC2转换经过几个ADC时钟周期的延迟后ADC3启动。

            
            

    1.7.4 交替触发模式

            只能用于注入组。外部触发源来自 ADC1 的注入组多路复用器。

            

    1. 双重 ADC 模式

            发生第一次触发时,将转换ADC1中注入组的所有通道
                    当组中的所有注入 ADC1 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)
            发生第二次触发时,将转换ADC2中注入组的所有通道
                    当组中的所有注入 ADC2 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)

            

    如果使能 ADC1 和 ADC2 的注入不连续采样模式:

            ● 发生第一次触发时,将转换第一个注入 ADC1 通道
            ● 发生第二次触发时,将转换第一个注入 ADC2 通道
            ● 发生第三次触发时,将转换第二个注入 ADC1 通道
            ● 发生第四次触发时,将转换第二个注入 ADC2 通道
            ……
            当组中的所有注入 ADC1 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)
            当组中的所有注入
    ADC2 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)

            

    2. 三重 ADC 模式

            发生第一次触发时,将转换ADC1中注入组的所有通道
                    当组中的所有注入 ADC1 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)
            发生第二次触发时,将转换ADC2中注入组的所有通道
                    当组中的所有注入 ADC2 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)
            ● 发生第三次触发时,将转换ADC3中注入组的所有通道
                    当组中的所有注入 ADC3 通道都转换完成后,会生成一个 JEOC 中断(如果已使能)

            

    1.7.5 混合型规则/注入同时模式

    可以中断规则组的同时转换,然后开始注入组的同时转换。

    1.7.6 规则同时 + 交替触发组合模式

            可以中断规则组的同时转换,然后开始注入组的交替触发转换。

            注入事件后立即开始注入交替转换。当规则转换处于运行状态时,为确保在注入转换后实现同步,所有的(主/从) ADC规则转换均将停止,并会在注入转换结束时得以恢复运行。
            

            

    1.8 ADC中断

    ADC_SR 寄存器中存在另外两个标志,但这两个标志不存在中断相关性:
            ● JSTRT(开始转换注入组的通道)
            ● STRT(开始转换规则组的通道)
    中断事件标志位使能控制位触发条件
    规则组转换结束EOCEOCIE规则通道组所有通道转换完成(单通道或扫描模式)
    注入组转换结束JEOCJEOCIE注入通道组所有通道转换完成(需外部触发或自动注入)
    模拟看门狗状态位置 1AWDAWDIE输入电压超过模拟看门狗阈值(高 / 低阈值由 ADC_HTR 和 ADC_LTR 定义)
    数据溢出(Overrun)OVROVRIE数据寄存器(ADC_DR 或 ADC_JDRx)未及时读取,新数据覆盖旧值

    2. 基于HAL库配置ADC外设

    2.1 CubeMX配置ADC外设

    2.1.1 单通道采集内部温度传感器

             

    2.1.2 多通道ADC采集(单次DMA请求)

            

            

    2.1.3 多通道ADC采集 (定时器触发ADC采集(单次/连续))

             
            

    2.2 基本定时器寄存器基地址

            

    2.3 基本定时器寄存器

            
            

    3. ADC实践

    本次实践分为三个部分:单通道采集芯片内部温度传感器(ADC1_ch16);利用软件触发单次触发多通道DMA ADC采集;利用定时器单次/连续触发多通道DMA ADC采集。

    多通道是内部温度传感器(ADC1_ch16)、光敏传感器(ADC1_ch1)

    3.1 单通道采集内部温度传感器(查询)

    1. main函数
    2. 功能函数

    3. 实践结果

     3.2 多通道ADC采集(单次DMA)

    1. main函数
    2. 中断回调函数
    3. 实践结果

            

     3.3 多通道ADC采集(定时器单次/连续触发DMA)

    1. main函数
    2. 中断回调函数
    3. 实践结果

    4. 本文的工程文件下载链接

    工程Github下载链接:https://github.com/chipdynkid/MCU-DL-STM32
    (国内)工程Gitcode下载链接https://gitcode.com/chipdynkid/MCU-DL-STM32

    相关文章:

    MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

    名词解释&#xff1a; ADC&#xff1a; Analog-to-Digital SAR&#xff1a;Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践&#xff1a;单通道采集芯片内部温度传感器&#xff08;ADC1_ch16&#xff09;&a…...

    MacOS中安装Python(homebrew,pyenv)

    前言 由于MacOS中自带Python&#xff0c;而自带的Python关联到许多系统组件&#xff0c;不推荐 禁止使用自带Python 安装homebrew包管理器 homebrew官网 打开终端&#xff08;terminal&#xff09;输入以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercon…...

    从物理到预测:数据驱动的深度学习的结构化探索及AI推理

    在当今科学探索的时代&#xff0c;理解的前沿不再仅仅存在于我们书写的方程式中&#xff0c;也存在于我们收集的数据和构建的模型中。在物理学和机器学习的交汇处&#xff0c;一个快速发展的领域正在兴起&#xff0c;它不仅观察宇宙&#xff0c;更是在学习宇宙。 AI推理 我们…...

    新书速览|Hadoop与Spark大数据全景解析(视频教学版)

    《Hadoop与Spark大数据全景解析:视频教学版》 01 本书内容 《Hadoop与Spark大数据全景解析:视频教学版》结合作者多年在大数据领域的开发实践经验&#xff0c;采用“理论实战”的形式&#xff0c;以大量实例全面介绍Hadoop和Spark的基础知识及其高级应用。作者将丰富的教学经…...

    Linux:42线程控制lesson30

    代码1&#xff1a;验证join可以去的线程执行完后的退出码/返回值 #include<iostream> #include<unistd.h> #include<pthread.h> #include<string> using namespace std;void* routine(void* arg){string name static_cast<const char*>(arg);i…...

    配置 Apache 的 HTTPS

    证书文件 文件名 作用 来源 example.com.key 服务器的私钥&#xff0c;用于加密和解密数据。 本地生成 -----BEGIN PRIVATE KEY----- MIIEowIBAAKCAQEAqp5c... -----END PRIVATE KEY----- example.com.csr Certificate Signing Request 证书签名请求文件&#xff0c;包…...

    【Flutter高效开发】GetX指南:一文学会状态管理、路由与依赖注入

    GetX是Flutter生态中最受欢迎的轻量级全能框架&#xff0c;以其简洁的API设计和卓越的性能著称。本文将带你全面掌握GetX的核心功能和使用技巧&#xff0c;提升你的Flutter开发效率。 一、GetX框架核心优势 1. 三位一体架构设计 模块功能传统方案对比状态管理响应式状态控制…...

    第四节:核心概念高频题-Vue生命周期钩子变化

    重命名&#xff1a;beforeDestroy→beforeUnmount&#xff0c;destroyed→unmounted 新增&#xff1a;onServerPrefetch&#xff08;SSR场景&#xff09; Vue 生命周期钩子变化详解&#xff08;Vue2 → Vue3&#xff09; 一、核心钩子重命名与语义优化 销毁阶段语义化升级 • …...

    安全邮件系统的Maple实现详解

    代码改进版&#xff1a; # # 安全邮件系统实现 - 结合DES和RSA加密 # 功能&#xff1a;实现安全的消息加密、签名和传输 # # -------------------------- # 第一部分&#xff1a;消息准备和加密 # --------------------------# 原始消息内容 message : "This is an atte…...

    VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)

    参考&#xff1a; 安装VTK 详细图文讲解CMake编译VTK&#xff0c;包含详细的编译环境版本 Visual Studio 2022 配置VTK9.3.0 VTK-8.2.0源码编译和初步使用(CmakeVS2015Qt5.14.2) 文章目录 下载编译编译环境介绍配置CMake信息BUILD_SHARED_LIBS控制生成的库是动态链接库&#xf…...

    【playwright】学习--持续汇总

    seleniumplaywrightselenium 需要结合其他自动化框架&#xff0c;比如pytest之后才能支持web自动化测试playwright 不需要其他自动化框架selenium库》webdriver》浏览器驱动playwright库》playwright driver》浏览器驱动 目录 安装playwright通过pip安装通过VScode安装 安装pla…...

    深度解析算法之模拟

    39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#…...

    leetcode刷题日记——插入区间

    [ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; intervals 有序&#xff0c;需要将一个新的范围插入&#xff0c;然后进行整合方法一&#xff0c;将新的范围插入原 intervals 区间&#xff0c;然后使用 56 题的合并区间函数直接解决方法二&#xff0c; 找出能够包容 newInte…...

    gbase8s存储学习一 rootdbs存储结构以及寻址分析

    主要层次自下而上为 最小物理存储单元page &#xff0c;多个page 组成逻辑存储单元extent,多个extent 组成物理存储单元chunk ,而多个chunk组成逻辑存储单元dbspace&#xff0c;多个dbspace 组成一个数据库实例 在数据库初始化阶段会生成一个rootdbs表空间&#xff0c;该表空…...

    学习设计模式《五》——工厂方法模式

    一、基础概念 工厂方法模式的本质是【延迟到子类来选择实现】&#xff1b; 工厂方法模式的定义&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类&#xff0c;FactoryMethod使一个类的实例化延迟到其子类 。 工厂方法模式的功能 序号说明0工厂方法模…...

    如何将 Azure Active Directory (Azure AD) 作为 SAML IdP 对接到 Keycloak

    ✅ 一、在 Azure AD 创建 SAML 应用 &#x1f527; 1. 登录 Azure 门户 前往 https://portal.azure.com&#xff0c;使用管理员账号登录。 &#x1f4cc; 2. 创建企业应用&#xff08;Enterprise Application&#xff09; 左侧菜单进入 “企业应用程序”。点击 “新建应用程…...

    OCR之身份证识别

    前言 OCR身份证识别是光学字符识别技术在身份证领域的应用。通过扫描或拍照获取身份证图像&#xff0c;利用图像处理、深度学习等技术&#xff0c;自动提取姓名、性别、民族、出生日期、地址、身份证号等信息&#xff0c;可大幅提升信息录入效率&#xff0c;广泛应用于政务、金…...

    JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践

    在现代网络应用中&#xff0c;动态网页内容的爬取一直是开发者面临的挑战之一。Puppeteer 作为一种强大的浏览器自动化工具&#xff0c;为这一问题提供了优雅的解决方案。本文将深入探讨 Puppeteer 的高级技巧&#xff0c;包括动态内容抓取、性能优化、反检测与伪装、复杂自动化…...

    组织级项目管理OPM

    组织级项目管理(Organizational Project Management, OPM)是一种系统化的管理方法,旨在通过整合项目组合、项目集和项目管理,确保组织的战略目标与项目执行的一致性,提升资源利用效率和项目成功率。以下是其核心内容与框架的详述: 一、组织级项目管理的定义与目标 定义 组…...

    HTML与Web 性能优化:构建高速响应的现代网站

    HTML 与 Web 性能优化&#xff1a;构建高速响应的现代网站 引言 随着互联网用户对网站加载速度期望的不断提高&#xff0c;前端性能优化已经成为现代 Web 开发的核心竞争力。据 Google 研究表明&#xff0c;页面加载时间每增加 1 秒&#xff0c;用户跳出率就会增加 32%。用户…...

    模型 观测者效应

    系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。观察即影响&#xff0c;存在因注视而变。 1 观测者效应的应用 1.1 工业心理学—霍桑实验中的生产效率谜题 行业背景&#xff1a;20世纪20年代西方电气公司霍桑工厂&#xff0c;研究者试图通过优化照明…...

    Ubuntu启动SMB(Samba)服务步骤

    目录 1.基本的Samba服务器搭建流程主要分为四个步骤。 2.Samba工作流程&#xff1a; 3.解读主要配置文件smb.conf 4.开始安装Samba 5.检查Samba服务状态 6.创建Samba共享文件夹 7.配置Samba文件以及设置Samba用户密码 8.重启Samba服务器 9.关闭防火墙 10.Linux客户端…...

    使用react的ant-design-pro框架写一个地图组件,可以搜索地图,可以点击地图获取点击的位置及经纬度

    首先&#xff0c;先创建一个地图页面&#xff0c;用于显示地图组件&#xff0c;我是在pages文件中创建了一个mapSearch组件。 然后在routes.ts中注册页面。 {path: /mapSearch,name: mapSearch,icon: smile,component: ./mapSearch,}, 第三步就是使用高德地图来创建地图。 关键…...

    【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题

    文章目录 昨日内容复习已经建立了 TCP 连接&#xff0c;客户端突然出现故障怎么办&#xff1f;什么时候用长连接&#xff1f;短连接&#xff1f;TCP 的半连接队列与全连接队列&#xff1f;什么是 SYN 攻击&#xff1f;如何避免&#xff1f;TIME_WAIT 的作用&#xff1f;过多如何…...

    Git远程操作与标签管理

    目录 1.理解分布式版本控制系统 2.远程仓库 3.新建远程仓库 4.克隆远程仓库 5.向远程仓库推送 6.拉取远程仓库 7.配置Git 7.1.忽略特殊文件 7.2.给命令配置别名 8.标签管理 8.1.理解标签 8.2.创建标签 8.3.操作标签 1.理解分布式版本控制系统 Git是目前世界上…...

    Element Plus消息通知体系深度解析:从基础到企业级实践

    一、核心组件与技术定位 Element Plus的消息通知体系由三个核心组件构成&#xff1a;ElMessage&#xff08;全局提示&#xff09;、ElNotification&#xff08;通知弹窗&#xff09;和ElMessageBox&#xff08;交互式对话框&#xff09;。这套体系的设计目标是为开发者提供轻量…...

    SpringCloud组件——Eureka

    一.背景 1.问题提出 我们在一个父项目下写了两个子项目&#xff0c;需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源&#xff0c;具体实现的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...

    [Godot] C#2D平台游戏基础移动和进阶跳跃代码

    本文章给大家分享一下如何实现基本的移动和进阶的跳跃&#xff08;跳跃缓冲、可变跳跃、土狼时间&#xff09;以及相对应的重力代码&#xff0c;大家可以根据自己的需要自行修改 实现效果 场景搭建 因为Godot不像Unity&#xff0c;一个节点只能绑定一个脚本&#xff0c;所以我…...

    C语言对n进制的处理

    先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换&#xff1f; 简单来说&#xff0c;进制就是数位的表示方法。 十进制&#xff08;常用&am…...

    rk3568main.cc解析

    rk3568main.cc解析 前言解析总结前言 正点原子rk3568学习,rk官方RKNN_MODEL_ZOO文件中 rknn_model_zoo-main/examples/mobilenet/cpp/main.cc 从执行命令:./build-linux.sh -t rk3568 -a aarch64 -d mobilenet 到: cmake ../../examples/mobilenet/cpp \-DTARGET_SOC=rk3…...

    【白雪讲堂】[特殊字符]内容战略地图|GEO优化框架下的内容全景布局

    &#x1f4cd;内容战略地图&#xff5c;GEO优化框架下的内容全景布局 1️⃣ 顶层目标&#xff1a;GEO优化战略 目标关键词&#xff1a; 被AI理解&#xff08;AEO&#xff09; 被AI优先推荐&#xff08;GEO&#xff09; 在关键场景中被AI复读引用 2️⃣ 三大引擎逻辑&#x…...

    S32K144学习(16)-Bootloader

    1.什么是bootloader Bootloader&#xff08;引导加载程序&#xff09; 是存储在设备非易失性存储器&#xff08;如 ROM、Flash&#xff09;中的一段特殊程序&#xff0c;负责在设备上电后初始化硬件、加载操作系统&#xff08;OS&#xff09;或用户应用程序&#xff0c;并最终…...

    反素数c++

    先上代码 #include<bits/stdc.h> using namespace std; typedef long long ll; ll n; ll p[]{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; int maxd,maxval; void dfs(int pl,ll tmp,int num,int up){ if((num>maxd)||(nummaxd&&maxval>tmp)){ …...

    C++ linux打包运行方案(cmake)

    文章目录 背景动态库打包方案动态库转静态库动态库打到软件包中 运行 背景 使用C编写的一个小项目&#xff0c;需要打包成ubuntu下的可执行文件&#xff0c;方便分发给其他ubuntu执行&#xff0c;因为docker镜像方案过于臃肿&#xff0c;所以需要把项目的动态库都打在软件包中…...

    JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧

    进一步探讨如何使用 Puppeteer 进行动态网页爬取&#xff0c;特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时&#xff0c;确保页面元素完全加载是获取完整数据的关键。Puppeteer…...

    AI数字人:元宇宙舞台上的闪耀新星(7/10)

    摘要&#xff1a;AI数字人作为元宇宙核心角色&#xff0c;提升交互体验&#xff0c;推动内容生产变革&#xff0c;助力产业数字化转型。其应用场景涵盖虚拟社交、智能客服、教育、商业营销等&#xff0c;面临技术瓶颈与行业规范缺失等挑战&#xff0c;未来有望突破技术限制&…...

    测试基础笔记第九天

    提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、数据类型和约束1.数据类型2.约束3.主键4.不为空5.唯一6.默认值 二、数据库操作1.创建数据库2.使用数据库3.修改数据库4.删除数据库和查看所有数据库5.重点&…...

    C++抽象基类定义与使用

    在 C 中&#xff0c;抽象基类&#xff08;Abstract Base Class, ABC&#xff09; 是一种特殊的类&#xff0c;用于定义接口规范和约束派生类的行为。它通过纯虚函数&#xff08;Pure Virtual Function&#xff09;强制要求派生类实现特定功能&#xff0c;自身不能被实例化。以下…...

    20.4 显示数据库数据

    版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 20.4.1 设计时进行简单绑定 【例 20.22】【项目&#xff1a;code20-022】设计时关联数据库。 设计时设置DataGridView的DataSource属…...

    PyTorch 多 GPU 入门:深入解析 nn.DataParallel 的工作原理与局限

    当你发现单个 GPU 已经无法满足你训练庞大模型或处理海量数据的需求时&#xff0c;利用多 GPU 进行并行训练就成了自然的选择。PyTorch 提供了几种实现方式&#xff0c;其中 torch.nn.DataParallel (简称 DP) 因其使用的便捷性&#xff0c;常常是初学者接触多 GPU 训练的第一站…...

    UDP协议理解

    文章目录 UDP协议理解UDP 协议的特点&#xff1a;UDP协议图示UDP 的头部结构&#xff1a;UDP数据传输图示 UDP 的应用场景&#xff1a;TCP 与UDP对比UDP的传输丢包和顺序错乱问题&#xff08;了解&#xff09;丢包的解决方法&#xff1a;顺序错乱的解决方法&#xff1a;综合应用…...

    微信小程序拖拽排序有效果图

    效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…...

    算力网络的早期有关论文——自用笔记

    2023年底至2024年初阅读有关论文的自用笔记&#xff0c;作为参考。 算力网络架构 https://baijiahao.baidu.com/s?id1727377583404975414&wfrspider&forpc think&note 是否可以和cpu进程调度联系。 目前&#xff1a;看一些综述深一步了解背景和发展现状,完善认…...

    卷积神经网络基础(四)

    今天我们继续学习各个激活函数层的实现过程。 目录 5.2 Sigmoid层 六、Affine/Softmax层实现 6.1 Affine层 6.2 批处理版本 5.2 Sigmoid层 sigmoid函数的表达式如下&#xff1a; 用计算图表示的话如下&#xff1a; 计算过程稍微有些复杂&#xff0c;且这里除了乘法和加法…...

    【MySQL数据库】表的约束

    目录 1&#xff0c;空属性 2&#xff0c;默认值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主键primary key 6&#xff0c;自增长auto_increment 7&#xff0c;唯一键unique 8&#xff0c;外键foreign key 在MySQL中&#xff0c;表的约束是指用于插入的…...

    网络威胁情报 | Friday Overtime Trooper

    本文将分别从两个环境出发&#xff0c;以实践来体验利用威胁情报分析可疑文件的过程。 Friday Overtime 现在你是一位安全分析人员&#xff0c;正在美美等待周五过去&#xff0c;但就在即将下班之时意外发生了&#xff1a;你的客户发来求助&#xff0c;说他们发现了一些可疑文…...

    GPIO(通用输入输出端口)详细介绍

    一、基本概念 GPIO&#xff08;General - Purpose Input/Output&#xff09;即通用输入输出端口&#xff0c;是微控制器&#xff08;如 STM32 系列&#xff09;中非常重要的一个外设。它是一种软件可编程的引脚&#xff0c;用户能够通过编程来控制这些引脚的输入或输出状态。在…...

    学习笔记——《Java面向对象程序设计》-继承

    参考教材&#xff1a; Java面向对象程序设计&#xff08;第3版&#xff09;微课视频版 清华大学出版社 1、定义子类 class 子类名 extends 父类名{...... }如&#xff1a; class Student extends People{...... } &#xff08;1&#xff09;如果一个类的声明中没有extends关…...

    基于javaweb的SpringBoot校园失物招领系统设计与实现(源码+文档+部署讲解)

    技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

    什么事Nginx,及使用Nginx部署vue项目(非服务器Nginx压缩包版)

    什么是 Nginx? Nginx(发音为 “engine-x”)是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。它以其高性能、高并发处理能力和低资源消耗而闻名。以下是 Nginx 的主要特性和用途: 主要特性 高性能和高并发 Nginx 能够处理大量并发连接,适合高…...