STM32F103RCT6 ADC_DMA综合授课指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:STM32F103RCT6微控制器是STM32系列中的基础型号,具备强大的性能和丰富的外设接口。本资料详细讲解了如何在该微控制器上实现高效的数据采集与传输,涉及ADC、TIM和DMA三大关键功能模块。通过使用CubeMX配置工具,学生将学习如何设置ADC和DMA,以及如何利用定时器TIM作为硬件触发源来提高数据采集的实时性和系统效率。同时,资料包含了基于软件触发和TIM+DMA触发的示例代码,帮助学生深入理解并掌握相关编程技巧。

1. STM32F103RCT6微控制器特点

微控制器概述与核心架构

STM32F103RCT6是基于ARM Cortex-M3内核的高性能32位微控制器,由STMicroelectronics生产,广泛应用于各种工业和消费电子项目中。它提供了一个平衡的处理性能、存储资源、以及外设接口的集合,使得开发者能够构建从简单的应用到复杂的控制任务的解决方案。

STM32F103RCT6的特性详解

该微控制器的特性包括丰富的通信接口、定时器、模数转换器(ADC)、直接内存访问(DMA)以及温度传感器等。其最大工作频率可达72 MHz,拥有高达256 KB的闪存和48 KB的RAM,为运行复杂的程序提供了足够的内存空间。

主流应用场景分析

STM32F103RCT6微控制器的应用场景非常广泛,包括电机控制、医疗设备、汽车电子、嵌入式系统、物联网设备等。其高性能和灵活的配置能力使其成为众多项目首选的微控制器。在本章中,我们将详细了解其关键特性和优势,并探讨它在不同领域的应用案例。

2. ADC模拟数字转换器应用

2.1 ADC基础理论与工作原理

2.1.1 模拟信号与数字信号的转换

在信息处理和通信系统中,模拟信号与数字信号的转换是一个基础而又至关重要的过程。模拟信号是由连续的波形表示的信号,可以是温度、声音、光线强度等自然界中的物理量。而数字信号则是由二进制数表示的离散信号,用0和1的组合来存储、传输和处理信息。

模拟数字转换器(ADC)的作用就是将这种连续变化的模拟信号转换为计算机能够识别和处理的数字信号。通过采样、量化、编码这三个步骤,ADC将连续的信号转换为离散的数字信号。

2.1.2 ADC转换过程与关键参数

ADC转换过程大致包括以下几个关键步骤:

  1. 采样(Sampling) :采样过程是按照一定的时间间隔将模拟信号的幅度值取样的过程。根据奈奎斯特定理,为了避免混叠现象,采样频率应至少为模拟信号最高频率的两倍。

  2. 量化(Quantization) :量化是将采样得到的连续幅值转换为有限数量级别的过程,这一过程会产生量化误差。量化级别越多,转换的精度越高,但同时也会增加系统复杂度。

  3. 编码(Encodation) :编码过程将量化后的信号转换为二进制代码,这一过程是可逆的,而编码后的数字信号就可以用于数字系统处理。

关键参数包括分辨率(决定量化级别的数量)、转换速率(影响每秒可以转换多少个模拟信号值)、信噪比(SNR,衡量信号质量的参数)、以及线性误差和差分非线性误差等。

2.2 STM32F103RCT6中的ADC应用

2.2.1 内置ADC模块的配置

STM32F103RCT6微控制器内部集成了多个ADC模块,它们支持多个通道进行模拟信号的采样和转换。在使用ADC之前,必须对ADC模块进行适当的初始化和配置。以下是配置STM32F103RCT6内置ADC模块的基本步骤:

  1. 时钟使能 :首先需要为ADC模块开启时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  1. GPIO配置 :将ADC的输入引脚设置为模拟输入模式。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 假设使用PA0作为ADC输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  1. ADC初始化 :配置ADC的分辨率、数据对齐方式、触发源、连续转换模式等。
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
  1. 校准与启动 :进行ADC校准,并启动ADC转换。
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

2.2.2 数据采集与处理方法

数据采集完成后,我们需要对采集到的数字信号进行处理。这通常包括数据的存储、滤波、和转换为实际的物理量值(如电压、温度等)。

uint16_t ADC_ConvertedValue; // 用于存储转换后的值
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
while(1) {
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 等待转换结束
    ADC_ConvertedValue = ADC_GetConversionValue(ADC1); // 获取转换后的值

    // 将ADC值转换为电压
    float voltage = (float)ADC_ConvertedValue * (3.3f / 4096.0f);
    // 现在 voltage 变量中存有转换后的电压值
}

在上述代码中,我们通过查询标志位 EOC (End of Conversion,转换结束)来确定何时可以读取ADC转换结果。然后,根据ADC的分辨率和参考电压计算出电压值。这个值可以进一步用于计算对应的物理量,或者被用在其他算法中。

3. TIM定时器触发源配置

3.1 TIM定时器的作用与原理

3.1.1 定时器的基本概念与功能

在嵌入式系统中,定时器(TIM)是一个至关重要的组件,它能够产生精确的时间延迟、时间测量、事件计数以及波形生成等功能。在微控制器中,定时器模块能够执行计数器的操作,如上溢、下溢和比较匹配等,这使得它成为实现时间相关的任务不可或缺的一部分。

定时器的功能远不止计时那么简单,它可以配置为输入捕获、输出比较、PWM(脉冲宽度调制)输出、和单脉冲模式等多种模式,还可以通过定时器的中断功能配合其他模块使用,例如,可以用来触发ADC(模拟数字转换器)进行数据采集。

3.1.2 STM32中的TIM定时器配置

STM32F103RCT6微控制器中集成了多个定时器,其中包括高级控制定时器、通用定时器和基本定时器。这些定时器可以独立工作,也可以级联起来实现更复杂的定时需求。在配置TIM定时器时,首先需要确定定时器的工作模式,比如是否需要外部触发、中断或者DMA(直接内存访问)请求等。

在配置定时器时,主要需要设置定时器的预分频器(Prescaler)、自动重装载寄存器(Auto-reload register)以及捕获比较模式寄存器(Capture/Compare mode register),这些设置会直接影响定时器的工作频率和精度。

3.2 定时器触发ADC数据采集

3.2.1 定时触发的配置过程

为了实现定时器触发ADC数据采集,需要将定时器的某个输出通道配置为触发输出(例如,通过设置捕获比较输出模式为PWM模式,并配置为触发事件)。接下来,定时器被配置为周期性中断模式,以产生连续的触发脉冲。

当定时器产生触发信号时,该信号可以被配置为启动ADC转换。在STM32的固件库或者HAL库中,提供了相应的API来配置这些功能。例如,在HAL库中,可以使用 HAL_TIM_Base_Start_IT() 函数来启动定时器的中断模式,然后在中断服务程序中调用 HAL_ADC_Start_IT() 来启动ADC。

3.2.2 触发源的设置与优化

为了优化定时器触发ADC的性能,可以对定时器的触发源进行精心设置。这包括合理配置定时器的预分频值和自动重装载值,以达到所需的触发频率。同时,需要保证定时器的中断优先级高于ADC的中断优先级,以避免丢失触发信号。

在某些应用场合,还可以利用DMA来进一步提高ADC采集的效率。当定时器触发ADC开始转换时,DMA可以自动从ADC的数据寄存器中读取数据,存储到内存中,这样可以减少CPU的负担,提高数据采集的效率。

以下是STM32 HAL库中配置TIM定时器触发ADC的代码示例:

/* 初始化定时器基本参数 */
HAL_TIM_Base_InitTypeDef sBaseTIM_InitStructure;
sBaseTIM_InitStructure.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 预分频器设置,计数频率为1MHz
sBaseTIM_InitStructure.Period = 1000 - 1; // 自动重装载寄存器值,产生1ms的时间基准
sBaseTIM_InitStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1;
sBaseTIM_InitStructure.CounterMode = TIM_COUNTERMODE_UP;

/* 配置定时器 */
HAL_TIM_Base_Init(&htim);

/* 配置ADC触发 */
HAL_TIM_Base_Start_IT(&htim); // 启动定时器中断模式

/* ADC触发配置 */
__HAL_TIM_SET_COUNTER(&htim, 0); // 设置计数器初值为0
__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, 999); // 设置比较匹配值,产生触发信号

/* ADC初始化配置 */
ADC_HandleTypeDef AdcHandle;
/* ADC初始化代码省略,包括时钟使能、GPIO配置等 */

/* 开始ADC转换 */
HAL_ADC_Start_IT(&AdcHandle);

在上述代码中,我们设置了定时器的基本参数,使其每1ms产生一个周期信号,并通过配置将此信号关联到ADC的触发输入。通过 HAL_TIM_Base_Start_IT 函数启动定时器中断模式,并在定时器中断服务函数中启动ADC的中断模式,以此实现定时器触发ADC数据采集。通过优化预分频值和自动重装载值,可以实现对触发频率的精确控制。

通过定时器触发ADC数据采集,我们可以在不需要CPU干预的情况下连续地进行数据采集,从而让CPU可以执行其他任务,提高整个系统的效率。此外,通过合理配置预分频器和自动重装载寄存器,我们还可以根据不同的应用需求,调整ADC数据采集的速率和分辨率,实现更精确的时间控制。

在优化过程中,还可以考虑使用DMA进行数据传输,以降低CPU的负载。在高级应用中,可以利用定时器的多个通道,实现多路ADC的同时触发和数据采集,这样可以进一步提升数据采集系统的性能和效率。

在实际应用中,对于复杂的系统,还可以使用STM32CubeMX工具进行定时器和ADC的配置。通过图形化界面,可以更加直观和便捷地设置这些参数,自动生成代码,极大地提高开发效率。

4. DMA直接内存访问原理

直接内存访问(DMA)是一种允许外设直接读写系统内存的技术,无需CPU的参与。这在数据传输任务繁忙时,可以显著减少CPU负担,提高系统性能。

4.1 DMA的基本概念与优势

4.1.1 直接内存访问的工作机制

直接内存访问的工作机制允许外设在不需要CPU介入的情况下,直接与内存交换数据。在传统的I/O操作中,CPU必须负责数据的移动,这涉及以下步骤:

  1. CPU执行程序指令将数据地址加载到I/O端口。
  2. CPU执行程序指令写入或读取I/O端口数据。
  3. 数据被传送到或从CPU寄存器中移动到内存中。

然而,在DMA操作中,外设可以直接与内存通信,从而绕过CPU,减少中断频率,提升数据处理速度。

4.1.2 DMA在数据传输中的作用

DMA在数据传输中的作用体现在以下几个方面:

  • 减少CPU负担 :CPU可以专注于处理逻辑而非数据传输,提高CPU的处理效率。
  • 加快数据传输速率 :利用DMA进行大块数据的传输,速度比通过程序指令控制的I/O操作快得多。
  • 降低功耗 :减少CPU参与数据传输的频率,进而减少整体系统的能耗。

4.2 STM32F103RCT6中的DMA配置与应用

STM32F103RCT6微控制器支持DMA控制器,用于各种外设的数据传输。

4.2.1 DMA控制器的初始化与设置

初始化STM32F103RCT6中的DMA控制器,需要进行以下步骤:

  • 选择DMA通道 :根据要传输数据的外设,选择相应的DMA通道。
  • 配置DMA请求 :为选定的DMA通道配置触发源(例如ADC完成、定时器更新等)。
  • 设置传输参数 :设置传输方向、数据大小、内存增量和外设增量等参数。
  • 启用中断(可选) :如果需要在传输完成后进行处理,可以启用DMA传输完成中断。
// DMA 初始化代码示例
void DMA_Configuration(void)
{
    // 初始化结构体变量
    DMA_InitTypeDef DMA_InitStructure;
    // 选择DMA通道并配置
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adc_value;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 1;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    // 使能DMA通道
    DMA_Cmd(DMA1_Channel1, ENABLE);
}

4.2.2 DMA与ADC结合的数据处理实例

以STM32F103RCT6的DMA与ADC结合的数据处理为例,下面展示一个数据处理的实例:

  • 启动DMA传输 :在ADC的配置完成后,使能DMA传输。
  • 处理数据 :在DMA传输完成后,读取内存中的数据进行进一步处理。
// 使能DMA传输
ADC_DMACmd(ADC1, ENABLE);

// ADC开始转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

// DMA传输完成中断服务函数,假设使用DMA1_Channel1
void DMA1_Channel1_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_IT_TC1))
    {
        // 清除中断标志位
        DMA_ClearITPendingBit(DMA1_IT_TC1);
        // 数据处理逻辑
        ProcessData(adc_value);
    }
}

在这个示例中, ADC_DMACmd 函数用于启动与ADC相关的DMA传输, ADC_SoftwareStartConvCmd 函数启动ADC的转换过程。在DMA传输完成后,通过DMA1_Channel1的中断服务函数 DMA1_Channel1_IRQHandler 处理数据。

通过以上步骤,我们配置和使用了STM32F103RCT6中的DMA控制器,利用其高效的数据传输能力,将ADC采集到的数据快速传输到内存,用于后续的处理。

5. CubeMX配置工具使用

在本章中,我们将深入了解STM32CubeMX这一强大的配置工具。STM32CubeMX是ST公司提供的一个图形化配置工具,它的目的是简化微控制器的配置和初始化代码的生成,这使得开发者可以将更多的时间和精力投入到业务逻辑的实现上。

5.1 CubeMX的安装与配置

5.1.1 初识CubeMX

在上手之前,我们首先需要从ST官方网站下载STM32CubeMX软件。CubeMX支持Windows, macOS, Linux等主流操作系统,用户可以根据自己的计算机环境进行选择。安装过程相对简单,基本上一路"下一步"即可完成。

CubeMX界面分为几个主要的区域,包括:

  • 设备选择区 :用户可以在此选择自己将要使用的STM32系列微控制器。
  • 中间配置区 :这个区域会根据用户选择的微控制器,展示出所有的可配置硬件模块,包括时钟树、外设等。
  • 代码生成区域 :用户可以在此设置生成的代码的项目名称、路径以及一些特定的代码配置选项。
  • 实时预览区 :可以预览生成代码的效果和外设配置的结果。

5.1.2 创建项目与配置步骤

创建项目的第一步是选择微控制器。在设备选择区中,可以通过搜索框直接输入型号,例如STM32F103RCT6,CubeMX会列出所有匹配的设备。选择完毕后,点击"Start Project"。

接下来,用户需要在中间配置区中选择所需的外设。以ADC和DMA为例,用户可以展开相应的选项,然后根据实际需求进行配置。每个外设的配置界面通常包括参数设定和工作模式选择等。

配置完成后,点击"Project"菜单,进行项目设置。在这里,用户可以输入项目名称、选择项目路径以及配置高级设置等。值得注意的是,在高级设置中,用户还可以选择生成中间件的代码,例如FatFS文件系统、FreeRTOS等。

最后,点击"GENERATE CODE"按钮,CubeMX会根据用户的配置生成工程文件。用户可以选择多种IDE进行代码管理,包括但不限于Keil、IAR、SW4STM32和STM32CubeIDE。

5.2 利用CubeMX配置ADC与DMA

5.2.1 GUI下的硬件配置

在硬件配置阶段,用户需要打开CubeMX的"Pinout & Configuration"视图。在这个视图中,可以通过图形化界面直接配置ADC和DMA的相关参数。

以ADC为例,用户可以指定特定的通道,设置采样时间,以及分辨率等参数。对于DMA,同样可以指定内存地址、传输方向、数据宽度等。

5.2.2 代码生成与项目管理

在配置好ADC和DMA后,我们可以生成代码并观察CubeMX是如何帮助我们管理项目结构的。代码生成步骤在上文已提及,生成后的项目结构是根据STM32 HAL库的框架结构设计的,代码结构清晰,易于理解。

CubeMX还会在生成的代码中插入一些初始化函数,如 MX_DMA_Init() MX_ADC1_Init() 。在主循环中,开发者可以调用这些函数来完成初始化任务。同时,由于CubeMX是基于HAL库设计的,因此其生成的代码具有很好的可读性和可维护性。

此外,CubeMX还支持库的升级,用户可以通过CubeMX自动下载最新版本的HAL库和中间件,确保项目使用的是最新且最稳定的库版本。

为了管理项目的版本和依赖关系,CubeMX还支持生成各种配置文件,如 .ioc 文件,其中包含所有配置信息。用户可以将此文件提交到版本控制系统中,确保协作过程中的配置一致性。

综上所述,通过使用STM32CubeMX配置工具,开发人员可以更加快速和直观地搭建起基于STM32微控制器的项目框架,为后续的软件开发提供了便利。

6. 软件触发与硬件触发数据采集对比

在数据采集系统中,触发源的配置是影响系统性能的重要因素。软件触发和硬件触发是两种常见的触发方式,它们在数据采集系统中扮演着不同的角色。在本章节中,我们将深入了解这两种触发方式的原理、实现方法、优缺点以及如何优化它们以提高数据采集的效率和实时性。

6.1 软件触发数据采集的原理与实现

软件触发数据采集是通过编程指令启动数据采集过程。这种方式简单易行,适用于对实时性要求不高的场合。

6.1.1 软件触发方式的优缺点

优点: - 简单易用,容易集成到现有的软件流程中。 - 可以在任意时刻通过程序控制数据采集的开始和结束,灵活性高。 - 不需要额外的硬件支持。

缺点: - 依赖处理器的处理速度,可能会引入不可预测的延迟。 - 需要占用处理器资源,影响其他任务的执行。 - 可能受软件状态和操作系统的调度影响,实时性较差。

6.1.2 编程实现软件触发采集

以下是一个使用STM32 HAL库进行软件触发ADC采集的简单示例代码。

// 初始化ADC
HAL_ADC_Init(&hadc);

// 开始软件触发ADC转换
HAL_ADC_Start(&hadc);

// 等待转换完成
HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);

// 读取ADC转换结果
uint32_t adcValue = HAL_ADC_GetValue(&hadc);

// 停止ADC转换
HAL_ADC_Stop(&hadc);

在这个例子中, HAL_ADC_Start 函数启动了ADC的转换过程,并且 HAL_ADC_PollForConversion 函数会一直等待直到转换完成。

6.2 硬件触发数据采集的原理与实现

与软件触发相对的是硬件触发,它是由外部事件(如定时器溢出、外部信号等)直接启动的。

6.2.1 硬件触发方式的优缺点

优点: - 实时性高,几乎不受CPU处理能力的影响。 - 可以由专门的硬件模块管理,减轻CPU负担。 - 对于复杂的同步和触发模式提供了更高的灵活性和控制能力。

缺点: - 需要额外的硬件支持,增加了系统的复杂性和成本。 - 配置相对复杂,需要对硬件的详细了解。 - 需要预先设计和配置触发源和触发条件。

6.2.2 编程实现硬件触发采集

硬件触发数据采集的示例代码如下:

// 初始化ADC并配置为硬件触发模式
HAL_ADCEx_TriggerConfig(&hadc, ADC_EXTERNALTRIGConv_T6_TRGO);

// 启动硬件触发ADC转换
HAL_ADC_Start_IT(&hadc);

// 实现ADC中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle) {
    uint32_t adcValue = HAL_ADC_GetValue(AdcHandle);
    // 处理采集到的数据
}

在上述代码中, HAL_ADCEx_TriggerConfig 函数用于配置ADC的硬件触发源, HAL_ADC_Start_IT 函数启动了中断驱动的ADC转换。当中断发生时, HAL_ADC_ConvCpltCallback 函数会被调用以处理ADC数据。

6.3 数据采集效率与实时性分析

软件触发和硬件触发方式的效率和实时性直接关系到整个数据采集系统的表现。

6.3.1 不同触发方式的效率比较

效率的比较通常基于两个主要指标:响应时间和数据吞吐量。硬件触发由于减少了CPU的干预,其响应时间往往短于软件触发。数据吞吐量方面,硬件触发也更稳定,因为它不会受到CPU负载的影响。

6.3.2 系统性能优化策略

为了进一步优化性能,可以采取以下策略:

  • 对于软件触发:减少不必要的软件开销,优化数据处理流程。
  • 对于硬件触发:合理配置触发源和优先级,减少中断延迟。
  • 考虑使用DMA进行数据传输,减少CPU负载,提高数据处理效率。

通过以上分析,我们可以看到,软件触发和硬件触发各有优劣,选择合适的触发方式需要根据具体应用场景和系统需求来决定。在下一章节中,我们将通过实例代码学习和应用来进一步巩固这些理论知识。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:STM32F103RCT6微控制器是STM32系列中的基础型号,具备强大的性能和丰富的外设接口。本资料详细讲解了如何在该微控制器上实现高效的数据采集与传输,涉及ADC、TIM和DMA三大关键功能模块。通过使用CubeMX配置工具,学生将学习如何设置ADC和DMA,以及如何利用定时器TIM作为硬件触发源来提高数据采集的实时性和系统效率。同时,资料包含了基于软件触发和TIM+DMA触发的示例代码,帮助学生深入理解并掌握相关编程技巧。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

### STM32F103RCT6 ADC 配置和使用 #### 硬件资源概述 STM32F103RCT6微控制器内置了一个12位逐次逼近型模数转换器(ADC),能够实现单端输入或多差分通道模式下的模拟信号采集。该器件支持多达18个外部多路复用通道以及两个内部温度传感器和Vrefint电压源测量功能[^1]。 #### 初始化设置 为了启动ADC模块,在初始化阶段需完成如下操作: - 启动相应的时钟使能寄存器(RCC_APB2ENR)中的ADC接口与时钟。 - 设置GPIO引脚为模拟输入模式,通过修改对应端口的配置寄存器(CRL/CRH)[^1]。 ```c // 开启ADC外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // GPIOA 通道配置 (假设PA0作为ADC输入) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` #### 软件配置流程 接下来是对ADC本身的具体参数设定过程: - 创建并填充`ADC_InitTypeDef`结构体变量来指定采样时间、扫描方向等选项; - 如果计划采用DMA方式进行数据传输,则还需额外调用`ADC_DMACmd()`开启此特性[^1]; ```c ADC_InitTypeDef ADC_InitStructure; /* ADC Init */ ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC⚗📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值