Arm 带DMA的AT91SAM7上的ADC

Arm 带DMA的AT91SAM7上的ADC,arm,dma,keil,adc,Arm,Dma,Keil,Adc,我正在尝试为ADC DMA编写一个代码。在我看来,我正确地启动了ADC。但它不起作用,也不会中断。我错过了什么?我启动了ADC和中断,我愿意访问中断上的数据。 这是我的密码: void __irq ISR_adc(void) { volatile AT91PS_ADC pADC = AT91C_BASE_ADC; unsigned int AdcStatus = AT91C_BASE_ADC->ADC_SR; unsigned

我正在尝试为ADC DMA编写一个代码。在我看来,我正确地启动了ADC。但它不起作用,也不会中断。我错过了什么?我启动了ADC和中断,我愿意访问中断上的数据。 这是我的密码:

    void __irq ISR_adc(void)
    {
        volatile AT91PS_ADC pADC = AT91C_BASE_ADC;
        unsigned int AdcStatus = AT91C_BASE_ADC->ADC_SR;
        unsigned short* ADC_Ptr;
        unsigned short* ADC_Ptr_Next; 
        printf("ADC is: %d\n",Buffer1[0]);

    if(((AdcStatus & AT91C_ADC_RXBUFF) == AT91C_ADC_RXBUFF) &&
    ((AdcStatus & AT91C_ADC_ENDRX) == AT91C_ADC_ENDRX))
    {//Both bit set when get the end of next buffer

    pADC->ADC_RPR = (unsigned long) Buffer1; // Receive Pointer Register
    pADC->ADC_RCR = AD_DATA_BUFFER_SIZE; // Receive Counter Register
    pADC->ADC_RNPR = (unsigned long)0; // Receive Next Pointer Register
    pADC->ADC_RNCR = 0 ; // Receive Next Counter Registe 

    }
    else if((AdcStatus & AT91C_ADC_ENDRX) == AT91C_ADC_ENDRX)
    {//ENDRX bit set when reach the end of buffer. 
    pADC->ADC_RNCR = AD_DATA_BUFFER_SIZE; 

    }
    *AT91C_AIC_EOICR = 0;  // end of interrupts
}

void Configure_AD(void)
    {
    int i;
    volatile AT91PS_ADC pADC = AT91C_BASE_ADC;     // create a pointer to     USART0 structure
        volatile AT91PS_AIC pAIC = AT91C_BASE_AIC;          // pointer to AIC         data structure
    volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA;         // pointer to PIO data structure

    volatile AT91PS_PMC pPMC = AT91C_BASE_PMC;          // pointer to PMC data structure
#define AD_PRESCAL 1
#define AD_STARTUP 1
#define AD_SHTIM 2
// Enable peripheral clock
pPMC->PMC_PCER = 1 << AT91C_ID_ADC;

//Notice: After ADC_SR = 0xc000 after Reset;
pADC->ADC_CR = AT91C_ADC_SWRST; //Reset AD

//Rxternal trigger: TIOA2 output pulse; Get data using ISP.
pADC->ADC_MR = ((AD_SHTIM << 24) | (AD_STARTUP << 16) | (AD_PRESCAL <<8) | AT91C_ADC_TRGEN_EN | AT91C_ADC_TRGSEL_TIOA2);

pADC->ADC_CHER = AT91C_ADC_CH4; //channel 4 enable

//Configure PDC; Write Counter Register reset ADC_SR.


pADC->ADC_PTCR = AT91C_PDC_RXTDIS ;
pADC->ADC_RPR = (unsigned long)Buffer1; // Receive Pointer Register
pADC->ADC_RCR = AD_DATA_BUFFER_SIZE; // Receive Counter Register
pADC->ADC_RNPR = (unsigned long)0; // Receive Next Pointer Register
pADC-> ADC_RNCR = 0 ; // Receive Next Counter Register
pADC->ADC_PTCR = AT91C_PDC_RXTEN ; //Enable PDC



pADC->ADC_IER = AT91C_ADC_ENDRX | AT91C_ADC_RXBUFF; //enable interrupt on transfer complete



pAIC->AIC_IDCR = (1<<AT91C_ID_ADC);                 
pAIC->AIC_SVR[AT91C_ID_ADC] = (unsigned int)ISR_adc;                
pAIC->AIC_SMR[AT91C_ID_ADC] = (AT91C_AIC_PRIOR_LOWEST | 0x4 );      
pAIC->AIC_IECR = (1<<AT91C_ID_ADC);        

}
void\uuuu irq ISR\u adc(void)
{
易失性AT91PS_ADC pADC=AT91C_BASE_ADC;
无符号int AdcStatus=AT91C_BASE_ADC->ADC_SR;
无符号短*模数转换器Ptr;
无符号短*ADC_Ptr_Next;
printf(“ADC为:%d\n”,缓冲区1[0]);
if((AdcStatus&AT91C_ADC_RXBUFF)=AT91C_ADC_RXBUFF)&&
((AdcStatus和AT91C_ADC_ENDRX)=AT91C_ADC_ENDRX))
{//在获取下一个缓冲区的结尾时设置两个位
pADC->ADC_RPR=(无符号长)Buffer1;//接收指针寄存器
pADC->ADC\u RCR=AD\u DATA\u BUFFER\u SIZE;//接收计数器寄存器
pADC->ADC_RNPR=(无符号长)0;//接收下一个指针寄存器
pADC->ADC\u RNCR=0;//接收下一个计数器寄存器
}
否则如果((AdcStatus和AT91C_ADC_ENDRX)=AT91C_ADC_ENDRX)
{//ENDRX位在到达缓冲区末尾时设置。
pADC->ADC\u RNCR=AD\u数据\u缓冲区\u大小;
}
*AT91C_AIC_EOICR=0;//中断结束
}
无效配置广告(无效)
{
int i;
volatile AT91PS_ADC pADC=AT91C_BASE_ADC;//创建指向USART0结构的指针
volatile AT91PS_AIC pAIC=AT91C_BASE_AIC;//指向AIC数据结构的指针
volatile AT91PS_PIO pPIO=AT91C_BASE_PIOA;//指向PIO数据结构的指针
易失性AT91PS_PMC pPMC=AT91C_BASE_PMC;//指向PMC数据结构的指针
#定义AD_PRESCAL 1
#定义AD_启动1
#定义广告时间2
//启用外围时钟
pPMC->PMC\u PCER=1 ADC\u CR=AT91C\u ADC\u SWRST;//复位AD
//外部触发:TIOA2输出脉冲;使用ISP获取数据。
pADC->ADC_MR=((AD_SHTIM ADC_RCR=AD_DATA_BUFFER_SIZE;//接收计数器寄存器
pADC->ADC_RNPR=(无符号长)0;//接收下一个指针寄存器
pADC->ADC\u RNCR=0;//接收下一个计数器寄存器
pADC->ADC_PTCR=AT91C_PDC_RXTEN;//启用PDC
pADC->ADC_IER=AT91C_ADC_ENDRX | AT91C_ADC_RXBUFF;//传输完成时启用中断
pAIC->AIC_IDCR=(1AIC_SMR[AT91C_ID_ADC]=(AT91C_AIC_优先级|最低| 0x4);

pAIC->AIC\U IECR=(1是否启用了全局中断?是否启用了全局中断?