stm32-10ADC实验(DMA方式)
一、ADC相关
1. 介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
2. 框图
3. 方法
ADC采集转换 -> ADC数据寄存器 -> 内存ADC_ConvertedValue -> 串口
- ADC1_GPIO_Config();//ADC端口初始化
- 打开ADC,DMA,GPIO相关时钟
- 配置GPIO引脚,模式等
- ADC1_Mode_Config();//ADC模式设置
- DMA初始化
- 将 DMA 的通道 x 寄存器重设为缺省值
- 为DMA_Init结构体赋值
u32 DMA_PeripheralBaseAddr;
u32 DMA_MemoryBaseAddr;
u32 DMA_DIR;
u32 DMA_BufferSize;
u32 DMA_PeripheralInc;
u32 DMA_MemoryInc;
u32 DMA_PeripheralDataSize;
u32 DMA_MemoryDataSize;
u32 DMA_Mode;
u32 DMA_Priority;
u32 DMA_M2M; - 初始化DMA相关寄存器
- ADC初始化:
- 为ADC_Init结构体赋值
uint32_t ADC_Mode;
FunctionalState ADC_ScanConvMode;
FunctionalState ADC_ContinuousConvMode;
uint32_t ADC_ExternalTrigConv;
uint32_t ADC_DataAlign;
uint8_t ADC_NbrOfChannel; - 初始化ADC相关寄存器
- 为ADC_Init结构体赋值
- ADC转换时间配置
- 配置ADC时钟
- 配置采样周期
- 使能ADC1的DMA
- 使能ADC1
- ADC自校准
- 复位校准寄存器
- 等待复位完成
- 校准ADC
- 等待
- 设置启动触发方式:软件开启转化
- 读取转换的AD值
- 打印到串口调试助手
二、程序分析
1. main.c
- 配置 USART1:将采集的模拟电压值显示到串口调试助手
- 配置ADC:采集电压值并用DMA传输到SRAM
- 打印
#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_adc.h"
//time : pc1-1 0 1us
// pc1-2 0 0.5us 1.5us
// pc1-3 0 0.5us 0.8us
// ADC1转换的电压值通过MDA方式传送到SRAM:ADC_ConvertedValue
extern __IO uint16_t ADC_ConvertedValue;
// 局部变量,用于保存转化计算后的电压值
float ADC_ConvertedValueLocal;
// 软件简单延时函数
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/* USART1 config */
USART1_Config();
/* enable adc1 and config adc1 to dma mode */
ADC1_Init();
printf("\r\n ----这是一个ADC实验(采用DMA传输)----\r\n");
while (1)
{
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096 * 3.3; // 读取转换AD的值
printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal);
Delay(0xffffee);
}
}
2.ADC1_Init()
void ADC1_Init(void)
{
ADC1_GPIO_Config();//ADC端口初始化
ADC1_Mode_Config();//ADC模式设置
}
1.关于ADC1_GPIO_Config函数
/**
* @brief 使能ADC1和MDA1的时钟,初始化PC.01
* @param
* @retval
*/
static void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable DMA clock */