这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【AIcubeV1.01L】使用AIcube实现ADC的DMA传输方式

共1条 1/1 1 跳转至

【AIcubeV1.01L】使用AIcube实现ADC的DMA传输方式

高工
2026-05-08 17:33:12     打赏

一:ADC模数转换

STC32G系列单片机内部集成了一个12位高速A/D转换器。ADC的时钟频率为系统频率2分频再经过用户设置的分频系数进行再次分频(ADC的时钟频率范围为SYSck/2/1~SYSclk/2/16)。

ADC转换结果的数据格式有两种:左对齐和右对齐。可方便用户程序进行读取和引用。

STC32G 的 DMA 配合 ADC,核心价值在于“解放 CPU”。它可以自动完成多通道 ADC 转换并将结果存入内存,无需软件循环等待或频繁进入中断,非常适合需要连续、高速采集多路模拟信号的场景

二:软件编写流程:

2.1 配置ADC相关寄存器

I/O口模式:将所有要用作ADC输入的引脚(如P1.0-P1.7, P0.0-P0.6)设置为高阻输入模式(PxM1 = 0xff, PxM0 = 0x00)。

ADC时钟与采样时间:这是影响采样精度的关键。建议ADC时钟设置在3MHz左右,采样时间设置在5-10微秒之间。可通过ADCTIM(设置采样保持时间)和ADCCFG(设置ADC时钟速度 ADCCFG_SPEED)寄存器来配置。

使能ADC模块:设置ADC_CONTR寄存器的最高位(ADC_POWER)为1,开启ADC电源。

2.2配置DMA相关寄存器

设置存储地址:通过DMA_ADC_RXAL和DMA_ADC_RXAH寄存器,设置DMA在XRAM中存放转换结果的目标地址。

选择ADC通道:通过DMA_ADC_CHSW0和DMA_ADC_CHSW1寄存器来选择要扫描的ADC通道。每个位对应一个通道,置1使能。

设定转换次数:通过DMA_ADC_CFG2寄存器设置每个通道的转换次数。例如,设为0x09表示每个通道转换4次。

配置中断(可选):如需在DMA转换完成后自动处理数据,可在DMA_ADC_CFG寄存器中使能中断(DMA_ADC_IE = 1)。

2.3 启动DMA

最后,设置DMA_ADC_CR寄存器:DMA_ADC_CR = 0xC0,即同时使能DMA(DMA_ADC_ENABLE = 1)和启动传输(DMA_ADC_START = 1)

    三:AI cube 软件配置

    3.1 P10引脚配置如下:

    08-2 P10引脚配置.png

    3.2 ADC参数配置

    08-1 ADC配置.png

    四:软件代码

    4.1 ADC初始化:

    void ADC_Init(void)
    {
        ADC_SetClockDivider(0);             //设置ADC时钟
        ADC_ResultRightAlign();             //设置ADC结果右对齐(12位结果)
        ADC_SetRepeat16Times();             //ADC自动重复转换16次并取平均值
    
        ADC_SetCSSetupCycles(0);            //设置ADC通道选择建立时间
        ADC_SetCSHoldCycles(1);             //设置ADC通道选择保持时间
        ADC_SetSampleDutyCycles(9);         //设置ADC通道采样时间
    
    
        ADC_SetIntPriority(0);              //设置中断为最低优先级
        ADC_EnableInt();                    //使能ADC中断
        fADCConverted = 0;                  //初始化转换结束标志
    
        ADC_ActiveChannel(0);               //选择ADC通道
        ADC_Enable();                       //使能ADC功能
    
        DMA_ADC_SetAddress(pu8ADCDMABuffer); //设置ADC DMA缓冲区地址
        DMA_ADC_SetChannels(0x0001);        //设置ADC DMA扫描通道
        DMA_ADC_SetRepeat32Times();         //设置ADC DMA时每个通道重复转换次数
        DMA_ADC_ClearFlag();                //清除ADC DMA中断标志
        DMA_ADC_SetBusPriority(0);          //设置总线访问为最低优先级
        DMA_ADC_SetIntPriority(0);          //设置中断为最低优先级
        DMA_ADC_EnableInt();                //使能ADC DMA中断
        DMA_ADC_Enable();                   //使能ADC DMA功能
    //  DMA_ADC_Trigger();                  //触发ADC DMA
    
        //<<AICUBE_USER_ADC_INITIAL_BEGIN>>
        // 在此添加用户初始化代码  
        //<<AICUBE_USER_ADC_INITIAL_END>>
    }

    该代码配置好了,直接由AI cube 生成。

    4.2 读取ADC通道函数功能

    uint16_t ADC_Convert(uint8_t ch)
    {
        uint16_t res;                       //定义保存ADC结果的变量
    
        ADC_ActiveChannel(ch);              //选择ADC通道
        ADC_Start();                        //开始ADC转换
        while (!fADCConverted);             //等待ADC转换完成
        fADCConverted = 0;                  //清除ADC转换结束标志
        res = ADC_ReadResult();             //读取ADC转换结果
    
        return res;                         //返回ADC结果
    }

    该代码是轮询读取时候使用,并非DMA采集的ADC数据。

    4.3 ADC数据通过串口发送到PC端

    case 50:  main_test();                                
              count = ADC_Convert(0) ;
              printf("AD=%04d\r\n",count);
      break;

    五:实物验证图:

    08-3 串口数据图.png




    关键词: AIcubeV1.01L     ADC配置    

    共1条 1/1 1 跳转至

    回复

    匿名不能发帖!请先 [ 登陆 注册 ]