- 打卡等级:常住居民III
- 打卡总天数:147
- 最近打卡:2025-08-11 00:11:03
超级版主
- 积分
- 13759
|
发表于 2025-7-26 16:40:08
|
显示全部楼层
#define CHANNELS 16 //定义DMA要扫描的ADC通道数
#define COUNTS 16 //定义每个ADC通道转换的次数, 数值只能是1、2、4、8、16、32、64、128、256次之一, 其余值将会得到不可知的错误
u16 xdata adc_buf[CHANNELS][COUNTS+2]; //ADC结果存放的数组, [n][0~(COUNTS-1)]为每次转换的值, [n][COUNTS]高字节为ADC通道号,低字节为取平均值后的余数, [n][COUNTS+1)]为平均值
bit B_ADC_DMA_ok; //ADC DMA已完成标志(用户标志), 用户清零
bit B_ADC_DMA_busy; //ADC DMA忙标志,用户层只可查询,但不可操作。
void ADC_DMA_config(void) //初始化ADC DMA函数
{
#if (COUNTS == 1)
DMA_ADC_CFG2 = 0; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 2)
DMA_ADC_CFG2 = 8; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 4)
DMA_ADC_CFG2 = 9; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 8)
DMA_ADC_CFG2 = 10; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 16)
DMA_ADC_CFG2 = 11; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 32)
DMA_ADC_CFG2 = 12; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 64)
DMA_ADC_CFG2 = 13; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 128)
DMA_ADC_CFG2 = 14; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 256)
DMA_ADC_CFG2 = 15; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#endif
DMA_ADC_CFG = (1<<7) + (0<<2) + 0; //bit7=1: 允许ADC_DMA中断, 0:禁止. bit3 bit2: ADC_DMA中断优先级(低0~3高), bit1 bit0: ADC_DMA数据总线访问优先级(低0~3高)
DMA_ADC_STA = 0; //bit0: ADC_DMA完成(中断请求)标志, 需要软件清0.
DMA_ADC_AMTH = 0; //重复次数 = 9DMA_ADC_AMTH*256+DMA_ADC_AMT)+1
DMA_ADC_AMT = 0; //
DMA_ADC_CHSW1 = 0xff; //ADC通道使能, bit7~bit0对应通道15~8.
DMA_ADC_CHSW0 = 0xff; //ADC通道使能, bit7~bit0对应通道7~0.
DMA_ADC_ITVH = 0; // ADC_DMA时间间隔寄存器高字节
DMA_ADC_ITVL = 0; // ADC_DMA时间间隔寄存器低字节
DMA_ADC_RXAH = (u8)((u16)(&adc_buf) /256); //存放的地址
DMA_ADC_RXAL = (u8)((u16)(&adc_buf) %256); //存放的地址
DMA_ADC_CR = (1<<7) + (1<<6); //启动ADC_DMA, bit7=1:允许ADC_DMA功能, 0:禁止. bit6=1:触发ADC_DMA功能.
B_ADC_DMA_busy = 1; //ADC DMA忙, 触发ADC DMA前要先判断为空闲
}
|
|