找回密码
 立即注册
查看: 342|回复: 11

STC32G8K64-42I(LQFP48) 用官方程序读取ADC0通道,数据始终为0,这是怎么回事?

[复制链接]
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 2026-6-9 09:06:38 | 显示全部楼层 |阅读模式

/******************* IOÅäÖú¯Êý *******************/
void        GPIO_config(void)
{
        P0_MODE_IN_HIZ(GPIO_Pin_LOW | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);        //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë
        P1_MODE_IN_HIZ(GPIO_Pin_All);                //P1.0~P1.7 ÉèÖÃΪ¸ß×èÊäÈë
        P3_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1);        //P3.0,P3.1 ÉèÖÃΪ׼˫Ïò¿Ú
}

/******************* ADÅäÖú¯Êý *******************/
void        ADC_config(void)
{
        ADC_InitTypeDef                ADC_InitStructure;                //½á¹¹¶¨Òå
        ADC_InitStructure.ADC_SMPduty   = 31;                //ADC Ä£ÄâÐźŲÉÑùʱ¼ä¿ØÖÆ, 0~31£¨×¢Ò⣺ SMPDUTY Ò»¶¨²»ÄÜÉèÖÃСÓÚ 10£©
        ADC_InitStructure.ADC_CsSetup   = 0;                //ADC ͨµÀÑ¡Ôñʱ¼ä¿ØÖÆ 0(ĬÈÏ),1
        ADC_InitStructure.ADC_CsHold    = 1;                //ADC ͨµÀÑ¡Ôñ±£³Öʱ¼ä¿ØÖÆ 0,1(ĬÈÏ),2,3
        ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X16T;                //ÉèÖà ADC ¹¤×÷ʱÖÓÆµÂÊ        ADC_SPEED_2X1T~ADC_SPEED_2X16T
        ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;        //ADC½á¹ûµ÷Õû,        ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
        ADC_Inilize(&ADC_InitStructure);                //³õʼ»¯
        ADC_PowerControl(ENABLE);                                                //ADCµçÔ´¿ª¹Ø, ENABLE»òDISABLE
        NVIC_ADC_Init(DISABLE,Priority_0);                //ÖжÏʹÄÜ, ENABLE/DISABLE; ÓÅÏȼ¶(µÍµ½¸ß) Priority_0,Priority_1,Priority_2,Priority_3
}

/***************  ´®¿Ú³õʼ»¯º¯Êý *****************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                                        //½á¹¹¶¨Òå
        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //ģʽ,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
        COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                        //Ñ¡Ôñ²¨ÌØÂÊ·¢ÉúÆ÷, BRT_Timer1,BRT_Timer2 (×¢Òâ: ´®¿Ú2¹Ì¶¨Ê¹ÓÃBRT_Timer2)
        COMx_InitStructure.UART_BaudRate  = 115200ul;                        //²¨ÌØÂÊ,     110 ~ 115200
        COMx_InitStructure.UART_RxEnable  = ENABLE;                                //½ÓÊÕÔÊÐí,   ENABLE»òDISABLE
        UART_Configuration(UART1, &COMx_InitStructure);                //³õʼ»¯´®¿Ú UART1,UART2,UART3,UART4
        NVIC_UART1_Init(ENABLE,Priority_1);                //ÖжÏʹÄÜ, ENABLE/DISABLE; ÓÅÏȼ¶(µÍµ½¸ß) Priority_0,Priority_1,Priority_2,Priority_3

        UART1_SW(UART1_SW_P30_P31);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

/**********************************************/
void main(void)
{
        u8        i;
        u16        j;

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

        GPIO_config();
        //UART_config();
        ADC_config();
        EA = 1;

        //printf("STC32G AD to UART Test Programme!\r\n");        //UART·¢ËÍÒ»¸ö×Ö·û´®

        while (1)
        {
                //for(i=0; i<16; i++)
                {
                        delay_ms(200);

                        //Get_ADCResult(i);                //²ÎÊý0~15,²éѯ·½Ê½×öÒ»´ÎADC, ¶ªÆúÒ»´Î
                        j = Get_ADCResult(0);        //²ÎÊý0~15,²éѯ·½Ê½×öÒ»´ÎADC, ·µ»ØÖµ¾ÍÊǽá¹û, == 4096 Ϊ´íÎó
                        //printf("AD%02d=%04d ",i,j);
                        //if((i & 7) == 7)        printf("\r\n");
                }
                //printf("\r\n");
        }
}
截图202606090904248039.jpg
回复

使用道具 举报 送花

已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2026-6-9 09:07:11 | 显示全部楼层

#include        "STC32G_ADC.h"

//========================================================================
// º¯Êý: u8        ADC_Inilize(ADC_InitTypeDef *ADCx)
// ÃèÊö: ADC³õʼ»¯³ÌÐò.
// ²ÎÊý: ADCx: ½á¹¹²ÎÊý,Çë²Î¿¼adc.hÀïµÄ¶¨Òå.
// ·µ»Ø: none.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
u8        ADC_Inilize(ADC_InitTypeDef *ADCx)
{
        ADCCFG = (ADCCFG & ~ADC_SPEED_2X16T) | ADCx->ADC_Speed;        //ÉèÖÃADC¹¤×÷ʱÖÓÆµÂÊ
        ADC_Justify(ADCx->ADC_AdjResult);                //ADת»»½á¹û¶ÔÆë·½Ê½

        if(ADCx->ADC_SMPduty > 31)        return FAIL;        //´íÎó
        if(ADCx->ADC_CsSetup > 1)        return FAIL;        //´íÎó
        if(ADCx->ADC_CsHold > 3)        return FAIL;        //´íÎó

        ADCTIM = (ADCx->ADC_CsSetup << 7) | (ADCx->ADC_CsHold << 5) | ADCx->ADC_SMPduty ;                //ÉèÖà ADC ÄÚ²¿Ê±Ðò£¬ADC²ÉÑùʱ¼ä½¨ÒéÉè×î´óÖµ
        return SUCCESS;
}


//========================================================================
// º¯Êý: void        ADC_PowerControl(u8 pwr)
// ÃèÊö: ADCµçÔ´¿ØÖƳÌÐò.
// ²ÎÊý: pwr: µçÔ´¿ØÖÆ,ENABLE»òDISABLE.
// ·µ»Ø: none.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
void        ADC_PowerControl(u8 pwr)
{
        if(pwr == ENABLE)        ADC_POWER = 1;
        else                                ADC_POWER = 0;
}

//========================================================================
// º¯Êý: u16        Get_ADCResult(u8 channel)
// ÃèÊö: ²éѯ·¨¶ÁÒ»´ÎADCת»»½á¹û.
// ²ÎÊý: channel: Ñ¡ÔñҪת»»µÄADCͨµÀ.
// ·µ»Ø: ADCת»»½á¹û.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
u16        Get_ADCResult(u8 channel)        //channel = 0~15
{
        u16        adc;
        u8        i;

        if(channel > ADC_CH15)        return        4096;        //´íÎó,·µ»Ø4096,µ÷ÓõijÌÐòÅжϠ      
        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //ÉèÖÃADCת»»Í¨µÀ
        ADC_START = 1;//Æô¶¯ADCת»»
        NOP(10);                        //¶ÔADC_CONTR²Ù×÷ºóÒª4TÖ®ºó²ÅÄÜ·ÃÎÊ

        for(i=0; i<250; i++)                //µÈ´ýת»»Íê³É£¬³¬Ê±·µ»Ø£¬Õý³£iµÈÓÚ10ÒÔÄھͿÉÒÔת»»Íê³É
        {
                if(ADC_FLAG)
                {
                        ADC_FLAG = 0;        //Çå³ýADCת»»½áÊø±êÖ¾
                        if(RESFMT)                //ת»»½á¹ûÓÒ¶ÔÆë¡£
                        {
                                adc = ((u16)ADC_RES << 8) | ADC_RESL;
                        }
                        else                //ת»»½á¹û×ó¶ÔÆë¡£
                        {
                                adc = (u16)ADC_RES;
                                adc = (adc << 4) | ((ADC_RESL >> 4) & 0x0f);
                        }
                        return        adc;
                }
        }
        return        4096;        //´íÎó,·µ»Ø4096,µ÷ÓõijÌÐòÅжÏ
}
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-6-9 09:25:02 | 显示全部楼层
官方程序对应的芯片
可能要考虑封装
偶尔看看玩玩
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11465
发表于 2026-6-9 09:30:06 | 显示全部楼层

都没打印出来如何确认的0?仿真?使用屠龙刀例程测试先看串口 结果
https://www.stcaimcu.com/data/do ... DIP64-DEMO-CODE.zip
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2026-6-9 09:33:31 | 显示全部楼层
芯片和封装都对应设置过了,现在发现鼠标指向ADC_RES和ADC_RESL都是有数据的,但读到变量里就是零了,难道是编译器哪里的问题?
截图202606090932293023.jpg
回复

使用道具 举报 送花

已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2026-6-9 09:34:23 | 显示全部楼层
erci*** 发表于 2026-6-9 09:30
都没打印出来如何确认的0?仿真?使用屠龙刀例程测试先看串口 结果
https://www.stcaimcu.com/data/downlo ...

仿真调试的时候读变量

点评

仿真有仿真的问题,用串口确认实际ADC结果。或者仿真时减小优化等级加上volatile关键字测试 keil仿真异常常见场景汇总 - C语言,汇编语言,Proteus MCU软件仿真 国芯人工智能技术交流网站 - AI32位8051交流社区  详情 回复 发表于 2026-6-9 09:39
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11465
发表于 2026-6-9 09:39:20 | 显示全部楼层
hzs*** 发表于 2026-6-9 09:34
仿真调试的时候读变量


仿真有仿真的问题,用串口确认实际ADC结果。或者仿真时减小优化等级加上volatile关键字测试
keil仿真异常常见场景汇总 - C语言,汇编语言,Proteus MCU软件仿真 国芯人工智能技术交流网站 - AI32位8051交流社区
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

74

主题

1019

回帖

3777

积分

论坛元老

初出茅庐&无甚本事

积分
3777
发表于 2026-6-9 09:41:53 | 显示全部楼层
hzs*** 发表于 2026-6-9 09:33
芯片和封装都对应设置过了,现在发现鼠标指向ADC_RES和ADC_RESL都是有数据的,但读到变量里就是零了,难道 ...

如果ADC_RES和ADC_RESL都是有数据的
尝试先读出到变量里
再进行转换看看
偶尔看看玩玩
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
发表于 2026-6-9 11:16:42 | 显示全部楼层
串口返回看看,不用仿真。
回复

使用道具 举报 送花

已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2026-6-9 11:17:55 | 显示全部楼层
试过了,串口返回的数据是对的。

点评

那就是搞定 ADC了  详情 回复 发表于 2026-6-9 20:20
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-11-8 01:13 , Processed in 0.077833 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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