找回密码
 立即注册
楼主: 2456043232

32G8K64, ADC-DMA 采集数据错序

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2025-4-3 14:58:06 | 显示全部楼层
24560*** 发表于 2025-4-3 14:30
对,手册上是这么写的但是实际上不对吗,官方例程下载进去一样的情况问题。找原因?如何解决,STC32G8K48 ...

STC32G12K128与STC32G8K64的ADC-DMA是兼容的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-06 09:27:31
已绑定手机

1

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-4-3 15:04:28 | 显示全部楼层
梁*** 发表于 2025-4-3 14:58
STC32G12K128与STC32G8K64的ADC-DMA是兼容的。

dma没有多复杂的地方,不知道哪里没设置对还是怎么地,官方例程下载进去都一样的情形,不知道哪里会有影响。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-06 09:27:31
已绑定手机

1

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-4-3 15:09:32 | 显示全部楼层
梁*** 发表于 2025-4-3 14:58
STC32G12K128与STC32G8K64的ADC-DMA是兼容的。

官方例程结果,频率设置的例程一样
截图202504031509015726.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-06 09:27:31
已绑定手机

1

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-4-4 10:12:58 | 显示全部楼层
梁*** 发表于 2025-4-3 14:58
STC32G12K128与STC32G8K64的ADC-DMA是兼容的。

把CKCON = 1;   时数据就正常了,=0时数据都是对的就是根本数据位置错位。
为什么设置=1时数据位置就对了,
官方也没有CKCON设置不同值时条件。

点评

我们都是程序一开始就是: WTST = 0; CKCON = 0; EAXFR = 1; //SFR enable, 允许访问扩展寄存器 [attachimg]91646[/attachimg]  详情 回复 发表于 2025-4-4 22:04
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2025-4-4 22:04:15 | 显示全部楼层
24560*** 发表于 2025-4-4 10:12
把CKCON = 1;   时数据就正常了,=0时数据都是对的就是根本数据位置错位。
为什么设置=1时数据位置就对了 ...

我们都是程序一开始就是:


        WTST  = 0;
        CKCON = 0;
        EAXFR = 1;        //SFR enable, 允许访问扩展寄存器


截图202504042204094830.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2025-05-02 08:23:56
已绑定手机

5

主题

28

回帖

319

积分

中级会员

积分
319
发表于 2025-4-5 07:45:30 | 显示全部楼层
我采用STC32G12K128  DMA采集数据 按照官方手册配置完全正确。采集六路  运行稳定。你把程序贴上来,方便大家帮忙分析。没有程序 说啥也没用
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-06 09:27:31
已绑定手机

1

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-4-5 09:21:24 | 显示全部楼层
13259*** 发表于 2025-4-5 07:45
我采用STC32G12K128  DMA采集数据 按照官方手册配置完全正确。采集六路  运行稳定。你把程序贴上来,方便大 ...

官方例程测试的,把CKCON = 1;   时数据就正常了,=0时数据都是对的就是根本数据位置错位

#include "..\..\comm\STC32G.h"
#include "intrins.h"
#include "stdio.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

/*************        ±¾µØ³£Á¿ÉùÃ÷        **************/

#define MAIN_Fosc     22118400L        //¶¨ÒåÖ÷ʱÖÓ
#define Baudrate      115200L
#define TM            (65536 -(MAIN_Fosc/Baudrate/4))

#define        ADC_SPEED        15                        /* 0~15, ADCת»»Ê±¼ä(CPUʱÖÓÊý) = (n+1)*32  ADCCFG */
#define        RES_FMT                (1<<5)        /* ADC½á¹û¸ñʽ 0: ×ó¶ÔÆë, ADC_RES: D11 D10 D9 D8 D7 D6 D5 D4, ADC_RESL: D3 D2 D1 D0 0 0 0 0 */
                          /* ADCCFG     1: ÓÒ¶ÔÆë, ADC_RES: 0 0 0 0 D11 D10 D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */

#define        ADC_CH                16                        /* 1~16, ADCת»»Í¨µÀÊý, Ðèͬ²½ÐÞ¸Ä DMA_ADC_CHSW ת»»Í¨µÀ */
#define        ADC_DATA        12                        /* 6~n, ÿ¸öͨµÀADCת»»Êý¾Ý×ÜÊý, 2*ת»»´ÎÊý+4, Ðèͬ²½ÐÞ¸Ä DMA_ADC_CFG2 ת»»´ÎÊý */
#define        DMA_ADDR        0x000                /* DMAÊý¾Ý´æ·ÅµØÖ· */

/*************        ±¾µØ±äÁ¿ÉùÃ÷        **************/

bit        DmaFlag;

u8 xdata DmaBuffer[ADC_CH][ADC_DATA] _at_ DMA_ADDR;//

u8 temp[20];
/*************        ±¾µØº¯ÊýÉùÃ÷        **************/

void        delay_ms(u8 ms);
void        DMA_Config(void);

/******************** ´®¿Ú´òÓ¡º¯Êý ********************/
void UartInit(void)
{
        S2_S = 1;       //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7
    S2CFG |= 0x01;  //ʹÓô®¿Ú2ʱ£¬W1λ±ØÐèÉèÖÃΪ1£¬·ñÔò¿ÉÄÜ»á²úÉú²»¿ÉÔ¤ÆÚµÄ´íÎó
        S2CON = (S2CON & 0x3f) | 0x40;
        T2L  = TM;
        T2H  = TM>>8;
        AUXR |= 0x14;              //¶¨Ê±Æ÷2ʱÖÓ1Tģʽ,¿ªÊ¼¼ÆÊ±
}

void UartPutc(unsigned char dat)
{
        S2BUF  = dat;
        while(S2TI == 0);
        S2TI = 0;    //Clear Tx flag
}

char putchar(char c)
{
        UartPutc(c);
        return c;
}

/**********************************************/
void main(void)
{
        u8        i,n;

    WTST = 0;  //ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È

    P0M1 = 0x7f;   P0M0 = 0x00;   //ÉèÖÃÒª×öADCµÄIO×ö¸ß×èÊäÈë
    P1M1 = 0xfb;   P1M0 = 0x00;   //ÉèÖÃÒª×öADCµÄIO×ö¸ß×èÊäÈë
    P2M1 = 0x3c;   P2M0 = 0x3c;   //ÉèÖÃP2.2~P2.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P3M1 = 0x50;   P3M0 = 0x50;   //ÉèÖÃP3.4¡¢P3.6Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //ÉèÖÃP4.2~P4.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P5M1 = 0x1c;   P5M0 = 0x0c;   //ÉèÖÃP5.2¡¢P5.3Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)£¬ÉèÖÃP5.4Ϊ¸ß×èÊäÈë
    P6M1 = 0xff;   P6M0 = 0xff;   //ÉèÖÃΪ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
        
        ADCTIM = 0x3f;  //ÉèÖÃͨµÀÑ¡Ôñʱ¼ä¡¢±£³Öʱ¼ä¡¢²ÉÑùʱ¼ä
        ADCCFG = RES_FMT + ADC_SPEED;
        //ADCÄ£¿éµçÔ´´ò¿ªºó£¬ÐèµÈ´ý1ms£¬MCUÄÚ²¿ADCµçÔ´Îȶ¨ºóÔÙ½øÐÐADת»»
        ADC_CONTR = 0x80 + 0;        //ADC on + channel

        //UartInit();
        DMA_Config();
        EA = 1;
        //printf("STC32GϵÁÐADC DMA²âÊÔ³ÌÐò!\r\n");

        while (1)
        {
                delay_ms(200);
                if(DmaFlag)
                {
                        DmaFlag = 0;
//                        for(i=0; i<ADC_CH; i++)
//                        {
//                                for(n=0; n<ADC_DATA; n++)
//                                {
//                                        printf("0x%02x ",DmaBuffer[n]);
//                                }
//                                printf("\r\n");
//                        }
//                        printf("\r\n");
                        DMA_ADC_CR = 0xc0;                //bit7 1:Enable ADC_DMA, bit6 1:Start ADC_DMA
                }
        }
}

//========================================================================
// º¯Êý: void DMA_Config(void)
// ÃèÊö: ADC DMA ¹¦ÄÜÅäÖÃ.
// ²ÎÊý: none.
// ·µ»Ø: none.
// °æ±¾: V1.0, 2021-5-6
//========================================================================
void DMA_Config(void)
{
        DMA_ADC_STA = 0x00;
        DMA_ADC_CFG = 0x80;                //bit7 1:Enable Interrupt
        DMA_ADC_RXAH = (u8)(DMA_ADDR >> 8);        //ADCת»»Êý¾Ý´æ´¢µØÖ·
        DMA_ADC_RXAL = (u8)DMA_ADDR;
        DMA_ADC_CFG2 = 0x09;        //ÿ¸öͨµÀADCת»»´ÎÊý:4
        DMA_ADC_CHSW0 = 0xff;        //ADCͨµÀʹÄܼĴæÆ÷ ADC7~ADC0
        DMA_ADC_CHSW1 = 0xff;        //ADCͨµÀʹÄܼĴæÆ÷ ADC15~ADC8
        DMA_ADC_CR = 0xc0;                //bit7 1:Enable ADC_DMA, bit6 1:Start ADC_DMA
}

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2013-4-1
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
        u16 i;
        do
        {
                i = MAIN_Fosc / 6000;
                while(--i);
        }while(--ms);
}

//========================================================================
// º¯Êý: void ADC_DMA_Interrupt (void) interrupt 48
// ÃèÊö: ADC DMAÖжϺ¯Êý
// ²ÎÊý: none.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-5-8
// ±¸×¢:
//========================================================================
void ADC_DMA_Interrupt(void) interrupt 13
{
        DMA_ADC_STA = 0;
        DmaFlag = 1;
}

16路ADC转换使用DMA-串口2返回结果.rar

41.69 KB, 下载次数: 6

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2025-4-5 14:13:50 | 显示全部楼层
专门写个程序测试,没有你说的问题:

用户请先别修改程序, 直接下载"16-15路12位ADC转换-DMA-串口1(P3.1)返回结果-C语言"里的"ADC.hex"测试.
下载时选择主频11.0592MHZ. 测试时, 电脑的串口助手设置115200,8,n,1.

本程序演示15路ADC和bandgap DMA采样,通过串口1(P3.1)发送给上位机,波特率115200,8,n,1.
输入只有ADC0-P1.0、ADC1-P1.1接了电压,其余ADC输入端悬空,读数会跳动,请忽略其读数。
ADC0-P1.0 接输入电压VREF*2/8,理论读数1024。
ADC1-P1.1 接输入电压VREF*3/8,理论读数1536。
ADC15为内部BandGap电压的ADC读数。

截图202504051412249778.jpg

截图202504051413239174.jpg

16-STC32G-16路12位ADC转换-DMA-串口1(P3.1)返回结果.rar (61.92 KB, 下载次数: 6)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-06 09:27:31
已绑定手机

1

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-4-5 17:16:51 | 显示全部楼层
梁*** 发表于 2025-4-5 14:13
专门写个程序测试,没有你说的问题:

用户请先别修改程序, 直接下载"16-15路12位ADC转换-DMA-串口1(P3.1) ...

谢谢你百忙之中验证代码。

官方的代码和我的代码可能都是没错的。
可能是keil软件在线调试和单片机之间有一点问题。

在线调试显示的值和打印出来的值不一样。

在线调试显示的值和打印出来的值不一样。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2025-4-5 17:35:07 | 显示全部楼层
直接烧录到 MCU 中看结果,先不要仿真
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:41 , Processed in 0.179743 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表