求助,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这个也没超。
通道0-5对应的ADC2-7通道
逻辑不合理+访问越界
ercircle 发表于 2025-5-21 17:29
逻辑不合理+访问越界
用于测试,只使能了通道2和通道3 数组长度是64 通道数量是2 下面ADC_tmp 这个没有进行转换 只使能ADC通道2和3 qadiosvm 发表于 2025-5-21 17:34
用于测试,只使能了通道2和通道3 数组长度是64 通道数量是2 下面ADC_tmp 这个没有进行转换 ...
访问越界,代码跑飞。
另外是如何判断"数组里有通道0的数据"?
使能了几个通道,数组里就是对应通道的数据。
最新测试, 使能ADC通道2 3 4 转换次数32次还是有通道0.正常应该是 convert0=ADC_tmp; //读取通道0转换的平均值
ModbusReg=ADC_tmp>>8;对应通道2的数据 现在是对应通道0的数据。 ercircle 发表于 2025-5-21 17:42
访问越界,代码跑飞。
另外是如何判断"数组里有通道0的数据"?
使能了几个通道,数组里就是对应通道的数据 ...
因为我用的MODBUS 协议读 所以采用的16为整形数组, 我是这样理解的,不知道对不对, DMA转换32次,如果用char形数组, 对应转换次数*2字节+4字节 = 68字节长度 如果用的int整形数组, 32次对应 32次*1+2=34个整形长度 , 其中数组元素33中高字节对应通道号 低字节对应余数数组元素34对应 平均值的我是这样理解,不知道对不对 qadiosvm 发表于 2025-5-21 17:48
因为我用的MODBUS 协议读 所以采用的16为整形数组, 我是这样理解的,不知道对不对, DMA转换32次,如 ...
int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。 ercircle 发表于 2025-5-21 17:56
int类型数组,数组下标32 高字节为通道号,数组下标33 平均值。数组下标从0开始。 ...
是这样的,没错啊, 但是数组ADC_tmp>>8 读出通道就是0啊正常应该是2啊
页:
[1]
2