前言
MB039 EVBoard
为灵动 MM32 新一代通用高性能 F 系列 MM32F3270
硬件评估测试板。 MB039
板载ADC通道采集和内部温度传感器采集。
硬件
MB039 具体接口图如下: 其中,RV1、RV2、RV3 电路图如下: A1、A2、A3 信号与 MM32F3270 引脚对应如下: 查阅数据手册后,ADC通道与引脚、电位器的对应关系如下:
引脚 | ADC通道 | 原理图 |
---|---|---|
PA1 | ADC1_CH1 | RV3 |
PA4 | ADC1_CH4 | RV2 |
PA5 | ADC1_CH5 | RV1 |
准备就绪后,开始编程
软件
配置流程:
- 开启ADC时钟、GPIOA时钟、DMA1时钟
- ADC结构初始化:
- 数值转换分辨率
- 12 bit
- 11 bit
- 10 bit
- 9 bit
- 8 bit
- 预分频系数:
/16
- 循环模式:
- 单次扫描
- 单周期扫描
- 连续扫描
- 数据对齐:
- 右对齐
- 左对齐
- 触发条件:
- 定时器1通道1捕获比较事件(default)
- 数值转换分辨率
- DMA 通道配置
- 配置通道:
-
DMA_CH1
-
- DMA搬运 - 源配置:
-
ADC1_DR
寄存器 - 地址不递增
- 16bit
-
- DMA搬运 - 目标配置:
-
ADC1Value[4]
数组 - 地址递增
- 16bit
-
- DMA搬运循环:
- 是
- 配置通道:
- ADC任意通道配置:
- 任意通道数量配置:
- 0~3通道
- 依次配置
ADC1_CH5
\ADC1_CH4
\ADC_CH1
以及内部温度传感器通道(ADC_CH14
) 顺序 - 使能任意配置模式
任意通道模式
覆盖MM32F0010
及之后的新产品
- 任意通道数量配置:
- 内部温度传感器使能、使能
EOC
中断、DMA功能 - 使能 DMA通道1
- 使能 ADC
代码如下:
void initADC()
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
COMMON_EnableIpClock(emCLOCK_ADC1);
COMMON_EnableIpClock(emCLOCK_DMA1);
COMMON_EnableIpClock(emCLOCK_GPIOA);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;
ADC_InitStructure.ADC_Mode = ADC_Mode_Continue;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC1_ExternalTrigConv_T1_CC1;
ADC_Init(ADC1, &ADC_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DMA_DeInit(DMA1_ch1);
DMA_InitStructure.PeripheralBaseAddr = (u32)&(ADC1->DR);
DMA_InitStructure.MemoryBaseAddr = (u32)&ADC1Value[0];
DMA_InitStructure.DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.BufferSize = 4;
DMA_InitStructure.PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.Mode = DMA_Mode_Circular;
DMA_InitStructure.Priority = DMA_Priority_High;
DMA_InitStructure.M2M = DMA_M2M_Disable;
DMA_Init(DMA1_ch1, &DMA_InitStructure);
ADC_ANY_Cmd(ADC1, DISABLE);
ADC_ANY_NUM_Config(ADC1, 3);
ADC_ANY_CH_Config(ADC1, 0, ADC_Channel_5);
ADC_ANY_CH_Config(ADC1, 1, ADC_Channel_4);
ADC_ANY_CH_Config(ADC1, 2, ADC_Channel_1);
ADC_ANY_CH_Config(ADC1, 3, ADC_Channel_TempSensor);
ADC_ANY_Cmd(ADC1, ENABLE);
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_DMACmd(ADC1, ENABLE);
DMA_Cmd(DMA1_ch1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
ADC转化结果如下: (数据处理,未完待续)