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

相关推荐
智商偏低2 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen3 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森5 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白5 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D5 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术8 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt9 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘9 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang9 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n11 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件