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:人外有人,天外有天,所以我潜心修炼。

相关推荐
qq_3855074521 分钟前
指针用法-指针解引用
单片机
BT-BOX27 分钟前
STM32各系列芯片编译支持包 Pack下载
stm32·单片机·嵌入式硬件
麦托团子44 分钟前
51单片机学习笔记5-模块化编程
单片机·嵌入式硬件
jiang153237942431 小时前
NUC977DK63YC 新唐 ARM9
arm开发·嵌入式硬件
夜月yeyue1 小时前
Netlink 套接字详解
linux·运维·服务器·网络·单片机·uboot
llilian_162 小时前
NTP时间同步服务器 卫星时钟同步服务器在气象监测方向的深度应用 授时服务器
服务器·功能测试·单片机·嵌入式硬件·测试工具
代码游侠2 小时前
学习笔记——嵌入式系统通信基础及串口开发
运维·arm开发·笔记·单片机·嵌入式硬件·学习
不怕犯错,就怕不做2 小时前
Linux内核默认允许多个进程打开同一字符设备
linux·驱动开发·嵌入式硬件
乡野码圣2 小时前
【RK3588 Android12】同步机制选型指南
嵌入式硬件
sweetone2 小时前
飞利浦HX333S冲牙器原理及维修
单片机·嵌入式硬件