qadiosvm 发表于 2025-5-21 17:18:59

求助,32G单片机遇到问题!请大家帮忙看看!

第一次使用32G单片机,现在遇到2个问题:
1.DMA_ADC 转换问题
我这边使能ADC通道2 和通道3, 转换次数为64次。但是转换完数组里的数据会有通道0的数据, 代码如下:


//========================================================================
//                              ADC初始化函数
//========================================================================
void ADC_lnit (void)
{
   
    P1M0 &= ~0xf8; P1M1 |= 0xf8;    //P13-P17设置为高阻模式
          P5M0 &= ~0x10; P5M1 |= 0x10;    //P5.4设置为高阻输入 通道2

               
    ADCTIM = 0x3F;         //设置ADC内部时序 选择1个时钟,保持2个时钟,转换32个时钟
    ADCCFG |= 0x0F;         //设置ADC工作时钟频率:系统时钟/2/16
    ADCCFG|=0x20;            // 设置ADC结果右边对齐
   
    ADC_CONTR |= 0x82;      //使能ADC模块
                  
}



//========================================================================
//                              ADC_DMA初始化函数
//========================================================================
void ADC_DMA_lnit()
{
   DMA_ADC_CFG2|=0X0D;    //ADC转换64次
    DMA_ADC_CHSW0|=0X0C;   //ADC_DMA通道使能2 和3 4
    DMA_ADC_RXAH =(unsigned int)&ADC_tmp >>8;
    DMA_ADC_RXAL =(unsigned int)&ADC_tmp;//ADC数据存放的地址
    DMA_ADC_CFG|=0X80;      //使能ADC_DMA中断   中断优先级0访问优先级 0   0-3低至高
   
    DMA_ADC_STA=0;          // 清除DMA中断标志位
   
    DMA_ADC_CR |=0xC0;   //开启ADC_DMA 并触发DMA
}



void ADC_DMA_convert ()
   
{

    if(B_ADC_DMA_ok)   //DMA转换完成标志
    {
      B_ADC_DMA_ok=0;   // 清除标志位
      convert0=ADC_tmp;   //读取通道0转换的平均值
                        ModbusReg=ADC_tmp>>8;
      ModbusReg=convert0;
      convert1=ADC_tmp;   //读取通道1转换的平均值
                        ModbusReg=ADC_tmp>>8;
      ModbusReg=convert1;
                        ModbusReg=ADC_tmp>>8;                        
                        convert2=ADC_tmp;   //读取通道2转换的平均值
      ModbusReg=convert2;
                        convert3=ADC_tmp;   //读取通道3转换的平均值
      ModbusReg=convert3;
                        convert4=ADC_tmp;   //读取通道4转换的平均值
      ModbusReg=convert4;
                        convert5=ADC_tmp;   //读取通道5转换的平均值
      ModbusReg=convert5;
    }
   
   DMA_ADC_CR |=0xC0;   //开启ADC_DMA 并触发DMA
}



#defineCOUNTS64 //定义每个ADC通道转换的次数
#defineCHANNELS 2//定义DMA要扫描的ADC通道数

unsigned int xdata ADC_tmp ;    //adc存放的数组,转换数据+1通道号和余数+1转换次数平均值




正常应该是没有通道0的数据。这个是为什么呢!大家有没有遇到过。


2.第二问题,我使能DMA_ADC转换次数32次。使能ADC2-7通道, 单片机出现运行缓慢。
用例程测试,256次都没有这个问题。

XDATA这个也没超。

qadiosvm 发表于 2025-5-21 17:19:55

通道0-5对应的ADC2-7通道

ercircle 发表于 2025-5-21 17:29:16

逻辑不合理+访问越界

qadiosvm 发表于 2025-5-21 17:34:00

ercircle 发表于 2025-5-21 17:29
逻辑不合理+访问越界

用于测试,只使能了通道2和通道3   数组长度是64 通道数量是2 下面ADC_tmp 这个没有进行转换

qadiosvm 发表于 2025-5-21 17:35:16

只使能ADC通道2和3

ercircle 发表于 2025-5-21 17:42:38

qadiosvm 发表于 2025-5-21 17:34
用于测试,只使能了通道2和通道3   数组长度是64 通道数量是2 下面ADC_tmp 这个没有进行转换 ...

访问越界,代码跑飞。
另外是如何判断"数组里有通道0的数据"?
使能了几个通道,数组里就是对应通道的数据。


qadiosvm 发表于 2025-5-21 17:43:21

最新测试, 使能ADC通道2 3 4   转换次数32次还是有通道0.正常应该是       convert0=ADC_tmp;   //读取通道0转换的平均值
                        ModbusReg=ADC_tmp>>8;对应通道2的数据   现在是对应通道0的数据。

qadiosvm 发表于 2025-5-21 17:48:40

ercircle 发表于 2025-5-21 17:42
访问越界,代码跑飞。
另外是如何判断"数组里有通道0的数据"?
使能了几个通道,数组里就是对应通道的数据 ...

因为我用的MODBUS 协议读   所以采用的16为整形数组, 我是这样理解的,不知道对不对, DMA转换32次,如果用char形数组, 对应转换次数*2字节+4字节 = 68字节长度   如果用的int整形数组, 32次对应 32次*1+2=34个整形长度 ,   其中数组元素33中高字节对应通道号 低字节对应余数数组元素34对应 平均值的我是这样理解,不知道对不对

ercircle 发表于 2025-5-21 17:56:05

qadiosvm 发表于 2025-5-21 17:48
因为我用的MODBUS 协议读   所以采用的16为整形数组, 我是这样理解的,不知道对不对, DMA转换32次,如 ...

int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。

qadiosvm 发表于 2025-5-21 18:09:02

ercircle 发表于 2025-5-21 17:56
int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。 ...

是这样的,没错啊, 但是数组ADC_tmp>>8 读出通道就是0啊正常应该是2啊
页: [1] 2
查看完整版本: 求助,32G单片机遇到问题!请大家帮忙看看!