新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2019-9-26
- 在线时间
- 0 小时
|
1金钱
本人最近想要用定时采样数据,定时中断为100us,这个测试后没问题,因为有多通道数据采样要求,所以尝试用DMA模式,结果发现ADC采样值正确,但是数据搬不到制定的存储区。在线仿真看,从DMA和ADC的寄存器可以读到在给DMA数据传输完成中断标志位清零前,的确是已经被置1了,是不是可以说明DMA存储器缓冲区数据都被传送出来,那数据怎么就没有到ADC_Regs这个机构提中呢?具体相关代码如下,请各位多多指教!谢谢啦!
ADC初始化配置部分:
ADC1_Regs.CR.all = 0;
ADC1_Regs.CR.bit.ADVREGEN = 1; //ADVREGEN=1,使能ADC稳压器
while((mbx++) < 1000000); //等待稳压器启动完成,约10us,这里延时大一点,没关系.
ADC1_Regs.PCSEL.all = 0xffff;
ADC1_Regs.CFGR.all = 0x80000005; // 选择ADC-DMA模式,14bit
ADC1_Regs.SMPR1.all = 0x24924924; // 32.5个ADC时钟周期 TCONV =2us //0x1B6DB6D8; // 0x3 16.5Clk ADC1_Regs.SMPR2.all = 0x24924924; //0x1B6DB6DB; // 0x3 16.5Clk
// ADC1_Regs.SQR1.bit.L = 6 - 1;
ADC1_Regs.SQR1.bit.L = 1-1;
ADC1_Regs.SQR1.bit.SQ1 = 2; //IMA
// ADC1_Regs.SQR1.bit.SQ2 = 8; //IMB
// ADC1_Regs.SQR1.bit.SQ3 = 9; //IMC
//// ADC1_Regs.SQR1.bit.SQ4 = 16;//ICA
//// ADC1_Regs.SQR2.bit.SQ5 = 17;//ICB
// ADC1_Regs.SQR1.bit.SQ4 = 0;//ICA
// ADC1_Regs.SQR2.bit.SQ5 = 1;//ICB
// ADC1_Regs.SQR2.bit.SQ6 = 6; //UMA
ADC1_Regs.CR.bit.ADCALLIN = 1; //ADCALLIN=1,线性校准
ADC1_Regs.CR.bit.ADCAL = 1; //开启校准
while(ADC1_Regs.CR.bit.ADCAL == 1); //等待校准完成
ADC1_Regs.CR.all = 0x10000101;
DMA初始化配置部分:
DMAMUX1_Regs.C0CR.all = 0x00000009; // 选择9通道(ADC1)
DMA1_Regs.S0PAR = (uint32)&ADC1_Regs.DR;
DMA1_Regs.S0M0AR = (uint32)&ADC_Regs.Ima;
DMA1_Regs.S0NDTR = 1;
DMA1_Regs.S0CR.all = 0x00032C20; // MINC.MSIZE.PSIZE.PFCTRL=1,PL=3
// ****************************************************************************
// 系统定时器中断,100us
// ****************************************************************************
uint32 sts;
uint32 xft;
void SysTick_Handler(void)
{
uint16 amx;
uint16 bmx;
DMA1_Regs.S0CR.bit.EN = 0;
sts = DMA1_Regs.LISR.all;
if(0x00000020 != (sts & 0x0000003d))
{
xft++;
}
//***************************************************************************
// 用于Time计时使用
// ****************************************************************************
if(++Time.Cnt_100us > 10) // 100us*10 = 1mS时间
{
Time.Cnt_100us = 0;
Time.Tick.bit.msec = 1;
}
DMA1_Regs.LIFCR.all = 0x0f7d0f7d;
DMA1_Regs.HIFCR.all = 0x0f7d0f7d;
DMA1_Regs.S0NDTR = 1;
DMA1_Regs.S0CR.bit.EN = 1;
ADC1_Regs.CR.bit.ADSTART = 1;
}
|
|