ADC、DMA以及串口之间的联系和区别?

ADC、DMA和串口都是嵌入式系统中常用的模块,它们之间有以下联系和区别:

联系:

ADC和DMA都是用于数据采集和传输的模块,ADC可以将模拟信号转换为数字信号,DMA可以在不经过CPU的情况下实现数据的高速传输。而串口则是一种通信接口,可以将数字信号转换为串行数据进行传输。

区别:

ADC和DMA是硬件模块,而串口可以是硬件模块也可以是软件模拟。ADC和DMA的主要功能是数据采集和传输,而串口的主要功能是数据通信。ADC和DMA的使用需要进行硬件配置和编程,而串口的使用则需要进行串口参数配置和通信协议的制定。

范例:

如何在STM32中使用内部温度传感器进行温度测量? 以下是在STM32中使用内部温度传感器进行温度测量的代码示例:

cpp 复制代码
#include "stm32f10x.h" // 包含STM32F10x系列微控制器的头文件
#include "stdio.h" // 包含标准输入输出库的头文件
 
void ADC1_Init(void) // 定义ADC1初始化函数
{
    GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
    ADC_InitTypeDef ADC_InitStructure; // 定义ADC初始化结构体
    DMA_InitTypeDef DMA_InitStructure; // 定义DMA初始化结构体
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); // 使能GPIOA和ADC1的时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能DMA1的时钟
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置GPIOA的第1个引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 配置为模拟输入模式
    GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
 
    DMA_DeInit(DMA1_Channel1); // 复位DMA1的通道1
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; // 配置DMA的外设基地址为ADC1的数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; // 配置DMA的内存基地址为ADC_ConvertedValue的地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 配置DMA的数据传输方向为外设到内存
    DMA_InitStructure.DMA_BufferSize = 1; // 配置DMA的数据缓存大小为1
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 禁止外设地址自增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 允许内存地址自增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 配置外设数据宽度为半字(16位)
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 配置内存数据宽度为半字(16位)
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 配置DMA的循环模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 配置DMA的优先级为高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁止DMA的内存到内存传输
    DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 初始化DMA1的通道1
 
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 配置ADC的工作模式为独立模式
    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数据对齐方式为右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1; // 配置ADC的转换通道数为1
    ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
 
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // 配置ADC的常规通道为通道1,采样时间为239.5个时钟周期
 
    ADC_DMACmd(ADC1, ENABLE); // 使能ADC1的DMA传输
    ADC_Cmd(ADC1, ENABLE); // 使能ADC1
 
    DMA_Cmd(DMA1_Channel1, ENABLE); // 使能DMA1的通道1
 
    ADC_ResetCalibration(ADC1); // 复位ADC1的校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1)); // 等待ADC1的校准寄存器复位完成
 
    ADC_StartCalibration(ADC1); // 开始ADC1的校准
    while(ADC_GetCalibrationStatus(ADC1)); // 等待ADC1的校准完成
}
 
int main(void) // 主函数
{
    float temperature; // 定义温度变量
 
    ADC1_Init(); // 初始化ADC1
 
    while(1) // 无限循环
    {
        temperature = (float)(ADC_ConvertedValue * 3.3 / 4096 - 0.76) / 0.0025 + 25; // 计算温度
        printf("Temperature is: %.2fC\n", temperature); // 输出温度
    }
}

END:人外有人,天外有天,所以我潜心修炼。

相关推荐
梁朝辉38 分钟前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者2 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间3 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious3 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng7 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计8 小时前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
KaifuZeng21 小时前
通信与接口协议面试一、基本概念
嵌入式硬件·通信与接口协议
wuyk5551 天前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
☆cwlulu1 天前
调试排查工具介绍(gdb、strace、Valgrind等)
开发语言·c++·嵌入式硬件·ubuntu
lzqrzpt1 天前
LED驱动电源选型标准与工程应用技术要点解析
python·单片机·嵌入式硬件·物联网