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


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

    联系:

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

    区别:

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

    范例:

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

    1. #include "stm32f10x.h" // 包含STM32F10x系列微控制器的头文件
    2. #include "stdio.h" // 包含标准输入输出库的头文件
    3. void ADC1_Init(void) // 定义ADC1初始化函数
    4. {
    5. GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
    6. ADC_InitTypeDef ADC_InitStructure; // 定义ADC初始化结构体
    7. DMA_InitTypeDef DMA_InitStructure; // 定义DMA初始化结构体
    8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); // 使能GPIOA和ADC1的时钟
    9. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能DMA1的时钟
    10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置GPIOA的第1个引脚
    11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 配置为模拟输入模式
    12. GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
    13. DMA_DeInit(DMA1_Channel1); // 复位DMA1的通道1
    14. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; // 配置DMA的外设基地址为ADC1的数据寄存器地址
    15. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; // 配置DMA的内存基地址为ADC_ConvertedValue的地址
    16. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 配置DMA的数据传输方向为外设到内存
    17. DMA_InitStructure.DMA_BufferSize = 1; // 配置DMA的数据缓存大小为1
    18. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 禁止外设地址自增
    19. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 允许内存地址自增
    20. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 配置外设数据宽度为半字(16位)
    21. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 配置内存数据宽度为半字(16位)
    22. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 配置DMA的循环模式
    23. DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 配置DMA的优先级为高
    24. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁止DMA的内存到内存传输
    25. DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 初始化DMA1的通道1
    26. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 配置ADC的工作模式为独立模式
    27. ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 禁止扫描模式
    28. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 允许连续转换模式
    29. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 禁止外部触发转换
    30. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 配置ADC数据对齐方式为右对齐
    31. ADC_InitStructure.ADC_NbrOfChannel = 1; // 配置ADC的转换通道数为1
    32. ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
    33. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // 配置ADC的常规通道为通道1,采样时间为239.5个时钟周期
    34. ADC_DMACmd(ADC1, ENABLE); // 使能ADC1的DMA传输
    35. ADC_Cmd(ADC1, ENABLE); // 使能ADC1
    36. DMA_Cmd(DMA1_Channel1, ENABLE); // 使能DMA1的通道1
    37. ADC_ResetCalibration(ADC1); // 复位ADC1的校准寄存器
    38. while(ADC_GetResetCalibrationStatus(ADC1)); // 等待ADC1的校准寄存器复位完成
    39. ADC_StartCalibration(ADC1); // 开始ADC1的校准
    40. while(ADC_GetCalibrationStatus(ADC1)); // 等待ADC1的校准完成
    41. }
    42. int main(void) // 主函数
    43. {
    44. float temperature; // 定义温度变量
    45. ADC1_Init(); // 初始化ADC1
    46. while(1) // 无限循环
    47. {
    48. temperature = (float)(ADC_ConvertedValue * 3.3 / 4096 - 0.76) / 0.0025 + 25; // 计算温度
    49. printf("Temperature is: %.2fC\n", temperature); // 输出温度
    50. }
    51. }

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

  • 相关阅读:
    自学黑客技术(网络安全)
    Java架构师常见基础面试题(附答案)
    从0实战一个 vue3+ ts+element-plus 项目
    Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(三)
    vue3+Cesium 遇到的问题及解决办法(持续更新)
    【数据结构】图综合练习--构建邻接表
    eyb:工资账套页面设计到聊天数据显示(五)
    thinkphp5.0.24反序列化漏洞分析
    Perforce P4 error: Unable to determine client host name
    实验室管理系统
  • 原文地址:https://blog.csdn.net/m0_74000148/article/details/134374934