找回密码
 立即注册
查看: 533|回复: 18

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 17:18:59 | 显示全部楼层 |阅读模式
第一次使用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][65];   //读取通道0转换的平均值
                        ModbusReg[72]=ADC_tmp[0][64]>>8;
      ModbusReg[66]=  convert0;
      convert1=ADC_tmp[1][65];   //读取通道1转换的平均值
                        ModbusReg[73]=ADC_tmp[1][64]>>8;
      ModbusReg[67]=  convert1;
                        ModbusReg[74]=ADC_tmp[2][64]>>8;                        
                        convert2=ADC_tmp[2][65];   //读取通道2转换的平均值
      ModbusReg[68]=  convert2;
                        convert3=ADC_tmp[3][65];   //读取通道3转换的平均值
      ModbusReg[69]=  convert3;
                        convert4=ADC_tmp[4][17];   //读取通道4转换的平均值
      ModbusReg[70]=  convert4;
                        convert5=ADC_tmp[5][17];   //读取通道5转换的平均值
      ModbusReg[71]=  convert5;
    }
   
     DMA_ADC_CR |=0xC0;     //开启ADC_DMA 并触发DMA
}



#define  COUNTS  64 //定义每个ADC通道转换的次数
#define  CHANNELS 2  //定义DMA要扫描的ADC通道数

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




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


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

XDATA这个也没超。  

截图202505211713577138.jpg
截图202505211714134825.jpg
截图202505211718095036.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 17:19:55 | 显示全部楼层
通道0-5对应的ADC2-7通道
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 2025-5-21 17:29:16 | 显示全部楼层
逻辑不合理+访问越界
截图202505211729147079.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 17:34:00 | 显示全部楼层
erci*** 发表于 2025-5-21 17:29
逻辑不合理+访问越界

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

点评

访问越界,代码跑飞。 另外是如何判断"数组里有通道0的数据"? 使能了几个通道,数组里就是对应通道的数据。 [attachimg]100957[/attachimg]  详情 回复 发表于 2025-5-21 17:42
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 17:35:16 | 显示全部楼层
只使能ADC通道2和3
截图202505211735011312.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 2025-5-21 17:42:38 | 显示全部楼层
qadi*** 发表于 2025-5-21 17:34
用于测试,只使能了通道2和通道3   数组长度是64 通道数量是2 下面ADC_tmp[5][17] 这个没有进行转换 ...

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

截图202505211740462594.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 17:43:21 | 显示全部楼层
最新测试, 使能ADC通道2 3 4   转换次数32次  还是有通道0.正常应该是       convert0=ADC_tmp[0][33];   //读取通道0转换的平均值
                        ModbusReg[72]=ADC_tmp[0][32]>>8;  对应通道2的数据   现在是对应通道0的数据。
截图202505211740475378.jpg
截图202505211741566189.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 17:48:40 | 显示全部楼层
erci*** 发表于 2025-5-21 17:42
访问越界,代码跑飞。
另外是如何判断"数组里有通道0的数据"?
使能了几个通道,数组里就是对应通道的数据 ...

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

点评

int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。  详情 回复 发表于 2025-5-21 17:56
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 2025-5-21 17:56:05 | 显示全部楼层
qadi*** 发表于 2025-5-21 17:48
因为我用的MODBUS 协议读   所以采用的16为整形数组, 我是这样理解的,不知道对不对, DMA转换32次,如 ...

int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-05-21 17:18:59
已绑定手机

3

主题

20

回帖

83

积分

注册会员

积分
83
发表于 2025-5-21 18:09:02 | 显示全部楼层
erci*** 发表于 2025-5-21 17:56
int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。 ...

是这样的,没错啊, 但是数组ADC_tmp[0][62]>>8 读出通道就是0啊  正常应该是2啊
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 18:24 , Processed in 0.220034 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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