- 打卡等级:初来乍到
- 打卡总天数:4
- 最近打卡:2025-08-13 10:27:55
已绑定手机
新手上路
- 积分
- 33
|
这个是STC官方例程,
#include "config.h"
bit B_ADC_DMA_busy;
bit B_ADC_DMA_ok;
u16 xdata adc_tmp[CHANNELS][COUNTS+2];
//adc存放的数组, [n][0~(COUNTS-1)]为每次转换的值, [n][COUNTS]高字节为ADC通道号,低字节为取平均值后的余数,
//[n][COUNTS+1)]为平均值
void ADC_DMA_Init()
{
//P1n_HighZ(0x3b); //设置要做ADC的IO做高阻输入, P1.0(ADC0) P1.1(ADC1) P1.3(ADC3) P1.4(ADC4) P1.5(ADC5)
//P5n_HighZ(0x00); //设置要做ADC的IO做高阻输入, P5.4(ADC2)
ADC_CONTR = 0x80 + 0; //ADC on + channel
ADCCFG = RES_FMT + ADC_SPEED;
ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
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_CFG2 = 9; //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
DMA_ADC_CHSW1 = 0x00; //ADC通道使能, bit7~bit0对应通道15~8.
DMA_ADC_CHSW0 = 0x3f; //ADC通道使能, bit7~bit0对应通道7~0.
}
void ADC_DMA_TRIG(u16 xdata *AdcBuf)
{
u16 i;
if(B_ADC_DMA_busy) return; //DMA正忙则返回,避免重复触发
i = (u16)AdcBuf; //要发送数据的首地址
DMA_ADC_RXAH = (u8)(i >> 8); //存放的地址高字节
DMA_ADC_RXAL = (u8)i; //存放的地址低字节
DMA_ADC_STA = 0; //bit0: ADC_DMA完成(中断请求)标志, 需要软件清0.
B_ADC_DMA_busy = 1; //标志ADC-DMA忙,ADC DMA中断中清除此标志,使用ADC DMA前要确认此标志为0
DMA_ADC_CR = (1<<7) + (1<<6); //启动ADC_DMA, bit7=1:允许ADC_DMA功能, 0:禁止. bit6=1:触发ADC_DMA功能.
}
void ADC_DMA()
{
u8 i,k;
static u16 j = 0;
delay_ms(1);
if(++j >= 1000) //每隔1000ms触发一次DMA_ADC
{
j = 0;
ADC_DMA_TRIG(&adc_tmp[0][0]); //启动ADC_DMA
}
if(B_ADC_DMA_ok) //已完成
{
B_ADC_DMA_ok = 0;
for(i=0; i<CHANNELS; i++)
{
//printf("ADC%u: ", adc_tmp[i][COUNTS]>>8); //打印通道号ADCn:
printf("ADC%u: ", adc_tmp[i][COUNTS]); //打印通道号ADCn:
for(k=0; k<COUNTS; k++)
{
//printf("采样%u= ", (int)k); //打印提示采样值序号 采样x
// printf("%u, ", adc_tmp[i][k]); //使用printf()发送,字符不对齐
//Tx_u16(adc_tmp[i][k]); //使用Tx_u16()发送,字符对齐
}
//printf("平均值=%u.\r\n", adc_tmp[i][COUNTS+1]);
}
}
}
void ADC_DMA_Interrupt(void) interrupt 13
{
DMA_ADC_STA = 0; //清除ADC_DMA完成(中断请求)标志
B_ADC_DMA_busy = 0; //清除ADC-DMA忙标志
B_ADC_DMA_ok = 1; //标志已完成
}
|
|