关于apm32f030的多通道扫描ADC
这个是apm32f030的ADC多通道扫描的初始化程序,但是只能读到通道0的数据,其它两个通道读不到数据,这个是官方例程里的,不知道什么原因,各位大神帮个忙帮我看看,谢谢!/* ADC数据存储配置 */
#define ADC_CH_SIZE 3 // 定义ADC通道数量
#define ADC_DR_ADDR ((uint32_t)ADC_BASE + 0x40) // ADC数据寄存器地址
unsigned int adcData; // ADC转换结果存储数组
/*!
* @brief DMA初始化(用于ADC数据传输)
* @NOTE 配置DMA1通道1实现ADC数据自动搬运
* 采用外设到内存的循环传输模式
*/
void DMA_Init(void)
{
DMA_Config_T dmaConfig;
/* 使能DMA1时钟(AHB总线)*/
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1);
/* 配置DMA传输参数 */
dmaConfig.peripheralAddress = ADC_DR_ADDR; // ADC数据寄存器地址
dmaConfig.memoryAddress = (uint32_t)&adcData; // 内存目标地址(数组首地址)
dmaConfig.direction = DMA_DIR_PERIPHERAL; // 传输方向:外设→内存
dmaConfig.bufferSize = ADC_CH_SIZE; // 传输数据量(3通道)
dmaConfig.peripheralInc = DMA_PERIPHERAL_INC_DISABLE; // 外设地址固定
dmaConfig.memoryInc = DMA_MEMORY_INC_ENABLE; // 内存地址自增(存储多通道数据)
dmaConfig.peripheralDataSize = DMA_PERIPHERAL_DATASIZE_HALFWORD; // 外设数据宽度16位
dmaConfig.memoryDataSize = DMA_MEMORY_DATASIZE_HALFWORD; // 内存数据宽度16位
dmaConfig.circular = DMA_CIRCULAR_ENABLE; // 循环模式(持续传输)
dmaConfig.memoryTomemory = DMA_M2M_DISABLE; // 禁用内存到内存模式
dmaConfig.priority = DMA_PRIORITY_LEVEL_HIGHT; // 高优先级
DMA_Config(DMA1_CHANNEL_1, &dmaConfig); // 应用配置到DMA1通道1
DMA_Enable(DMA1_CHANNEL_1); // 启动DMA通道
}
/*!
* @brief ADC初始化(多通道扫描模式)
* @note 配置ADC1的3个通道(PA0/PA1/PA2),
* 通过DMA实现连续转换数据的自动存储
*/
void ADC_Init(void)
{
GPIO_Config_T gpioConfig;
ADC_Config_T adcConfig;
/* 1. GPIO配置(模拟输入模式)*/
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);// 使能GPIOA时钟
GPIO_ConfigStructInit(&gpioConfig);
gpioConfig.mode = GPIO_MODE_AN; // 模拟输入模式
gpioConfig.pupd = GPIO_PUPD_NO; // 无上下拉
gpioConfig.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; // 配置PA0-PA2为ADC通道
GPIO_Config(GPIOA, &gpioConfig);
/* 2. ADC基础配置 */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1); // 使能ADC1时钟
ADC_Reset(); // 复位ADC寄存器
ADC_ConfigStructInit(&adcConfig);
adcConfig.resolution = ADC_RESOLUTION_12B; // 12位分辨率
adcConfig.scanDir = ADC_SCAN_DIR_UPWARD; // 扫描方向:通道号升序
adcConfig.convMode = ADC_CONVERSION_CONTINUOUS;// 连续转换模式
adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT; // 数据右对齐
// adcConfig.extTrigConv = ADC_EXT_TRIG_CONV_TRG0;
adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;// 禁用外部触发
ADC_Config(&adcConfig); // 应用ADC配置
/* 3. 通道采样时间配置 */
ADC_ConfigChannel(ADC_CHANNEL_0, ADC_SAMPLE_TIME_239_5); // 通道0采样周期239.5周期
ADC_ConfigChannel(ADC_CHANNEL_1, ADC_SAMPLE_TIME_239_5); // 通道1
ADC_ConfigChannel(ADC_CHANNEL_2, ADC_SAMPLE_TIME_239_5); // 通道2
/* 4. DMA关联配置 */
DMA_Init(); // 初始化DMA(见上文)
ADC_ReadCalibrationFactor(); // ADC校准
ADC_EnableDMA(); // 使能ADC DMA请求
ADC_DMARequestMode(ADC_DMA_MODE_CIRCULAR); // DMA循环模式
ADC_Enable(); // 启动ADC
}
/*!
* @brief ADC多通道轮询处理函数
* @note 将DMA搬运的ADC原始值转换为实际电压值(单位:V)
* 通过串口打印3个通道的电压数据
*/
unsigned int ADC_MultiChannelPolling(unsigned char index)
{
returnadcData;
}
页:
[1]