lgm_sz 发表于 2025-7-29 13:42

关于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]
查看完整版本: 关于apm32f030的多通道扫描ADC