Arm 如何使我的ADC在tm4c123gxl微控制器中工作?

Arm 如何使我的ADC在tm4c123gxl微控制器中工作?,arm,keil,cortex-m,microprocessors,Arm,Keil,Cortex M,Microprocessors,我的步骤如下: 为ADC和AIN10(PB4)端口启用时钟。 禁用对应于引脚B4的DEN和DIR寄存器中的相应位。 启用AFSEL寄存器和PCTL寄存器*中的相应引脚。 设置寄存器:采样率、优先级(SS3)等,如代码所示 然后我在另一个函数中触发它,但不知何故,我的ADC没有读取任何其他施加电压的值 我的第一个问题是关于PCTL以及我们需要在其上启用ADC的价值是什么 我已经试着解决它大约一天了,但我还没有弄明白。非常感谢您的帮助 // Register definitions for

我的步骤如下: 为ADC和AIN10(PB4)端口启用时钟。 禁用对应于引脚B4的DEN和DIR寄存器中的相应位。 启用AFSEL寄存器和PCTL寄存器*中的相应引脚。 设置寄存器:采样率、优先级(SS3)等,如代码所示

然后我在另一个函数中触发它,但不知何故,我的ADC没有读取任何其他施加电压的值

我的第一个问题是关于PCTL以及我们需要在其上启用ADC的价值是什么

我已经试着解决它大约一天了,但我还没有弄明白。非常感谢您的帮助

   //  Register definitions for clock enable
#define SYSCTL_RCGCGPIO_R ( * ( ( volatile unsigned long *) 0x400FE608 ) )
#define SYSCTL_RCGCADC_R ( * ( ( volatile unsigned long *) 0x400FE638 ) )
#define GPIO_PORTB_AFSEL_R ( * ( ( volatile unsigned long *) 0x40058420 ) )
#define GPIO_PORTB_PCTL_R (*(( volatile unsigned long *)0x4005952C))


// Register definitions for GPIO port B        ;;;;;         AIN10 = PB4
#define GPIO_PORTB_DATA_R ( * ( ( volatile unsigned long *) 0x400053FC) )
#define GPIO_PORTB_DIR_R ( * ( ( volatile unsigned long *) 0x40005400 ) )
#define GPIO_PORTB_DEN_R (  *( ( volatile unsigned long *) 0x4000551C) )


//  Register definitions for ADC0 and Sample Sequencer 3
#define ADC0_PC_R ( * ( ( volatile unsigned long *) 0x40038FC4 ) )
#define ADC0_SSPRI_R ( * ( ( volatile unsigned long *) 0x40038020 ) )
#define ADC0_ACTSS_R ( * ( ( volatile unsigned long *) 0x40038000 ) )
#define ADC0_IM_R ( * ( ( volatile unsigned long *) 0x40038008 ) )
#define ADC0_RIS_R ( * ( ( volatile unsigned long *) 0x40038004 ) )
#define ADC0_ISC_R ( * ( ( volatile unsigned long *) 0x4003800C) )
#define ADC0_SAC_R ( * ( ( volatile unsigned long *) 0x40038030 ) )
#define ADC0_PSSI_R ( * ( ( volatile unsigned long *) 0x40038028 ) )
#define ADC0_SSCTL3_R ( * ( ( volatile unsigned long *) 0x400380A4 ) )
#define ADC0_SSFIFO3_R ( * ( ( volatile unsigned long *) 0x400380A8 ) )

unsigned char Lookup_7Seg_Disp [ 12 ] = {0xC0 , 0xF9 , 0xA4 , 0xB0 , 0x99 ,
    0x92 , 0x82 , 0xF8 , 0x80 , 0x90 , 0xC6};
unsigned char Temperature_Value [ 3 ] = {0 , 0 , 0xA} ;
unsigned char i , value=0;
unsigned int ADC_value = 0 , voltage = 0 ;
int maxVoltage=0;


void ADC_Init() {
    volatile unsigned long delay;
    SYSCTL_RCGCGPIO_R |= 0x01;   //Enable Clock for Port A
    SYSCTL_RCGCADC_R |= 0x1;     //Enable ADC0


    delay = SYSCTL_RCGCGPIO_R;   //Delay for clock to settle down

    GPIO_PORTB_DIR_R &= ~(0x10);//PB4 as input
    GPIO_PORTB_DEN_R &= ~(0x10);//PB4 as analog type
    GPIO_PORTB_AFSEL_R |= 0x10;
    GPIO_PORTB_PCTL_R |= 0x10;


    //Clear sampling rate
    ADC0_PC_R &= 0x00;
    //Set sampling rate to 125ksps
    ADC0_PC_R &= 0x01;
    //Set priority to SSFI3
    ADC0_SSPRI_R |= 0x3210;
    //Disable sample sequence 3 befor configuration
    ADC0_ACTSS_R &= ~0x8;
    //Enable TS0, IE0 and END0 bits
    ADC0_SSCTL3_R |= 0xE;
    //Enable 16x hardware oversampling
    ADC0_SAC_R |= 0x4;
    //Disable Interrupt by writing 0 to corresponding bit
    ADC0_IM_R &= ~(0x8);
    //Activate sample sequencer 
    ADC0_ACTSS_R |= 0x8;
}

void SystemInit() {

}

void ADC_Voltage(void) {
    ADC0_PSSI_R |= 0x8;
    while ((ADC0_RIS_R & 0x8)==0);
    ADC_value = (ADC0_SSFIFO3_R & 0xFFF);
    voltage = (ADC_value)*44;
    if(voltage>maxVoltage){
        maxVoltage=voltage;
    }
    ADC0_ISC_R |= 0x08;
}

void delay(unsigned long counter) {
    int i;
    for(i=0;i<counter;i++)
    {}
}

int main(void) {
    ADC_Init();
    delay(1000);
    ADC_Voltage();
    maxVoltage=maxVoltage*0.707;

}
//时钟启用的寄存器定义
#定义SYSCTL_RCGCGPIO_R(*(易失性无符号长*)0x400FE608))
#定义SYSCTL_RCGCADC_R(*(易失性无符号长*)0x400FE638))
#定义GPIO_端口B_AFSEL_R(*(易失性无符号长*)0x40058420))
#定义GPIO_端口B_PCTL_R(*(易失性无符号长*)0x4005952C))
//GPIO端口B的寄存器定义;;;;;AIN10=PB4
#定义GPIO端口数据(*(易失性无符号长*)0x400053FC))
#定义GPIO_端口B_目录R(*(易失性无符号长*)0x40005400))
#定义GPIO端口号(*(易失性无符号长*)0x4000551C))
//ADC0和样本定序器3的寄存器定义
#定义ADC0_PC_R(*(易失性无符号长*)0x40038FC4))
#定义ADC0_SSPRI_R(*(易失性无符号长*)0x40038020))
#定义ADC0_ACTSS_R(*(易失性无符号长*)0x40038000))
#定义ADC0_IM_R(*(易失性无符号长*)0x40038008))
#定义ADC0_RIS_R(*(易失性无符号长*)0x40038004))
#定义ADC0_ISC_R(*(易失性无符号长*)0x4003800C))
#定义ADC0_SAC_R(*(易失性无符号长*)0x40038030))
#定义ADC0_PSSI_R(*(易失性无符号长*)0x40038028))
#定义ADC0_SSCTL3_R(*(易失性无符号长*)0x400380A4))
#定义ADC0_SSFIFO3_R(*(易失性无符号长*)0x400380A8))
无符号字符查找\u 7Seg\u Disp[12]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92、0x82、0xF8、0x80、0x90、0xC6};
无符号字符温度_值[3]={0,0,0xA};
无符号字符i,值=0;
无符号整数ADC_值=0,电压=0;
int最大电压=0;
void ADC_Init(){
易失性无符号长延迟;
SYSCTL_RCGCGPIO|u R |=0x01;//为端口A启用时钟
SYSCTL_RCGCADC_R |=0x1;//启用ADC0
延迟=SYSCTL\u RCGCGPIO\u R;//时钟稳定的延迟
GPIO\u PORTB\u DIR\u R&=~(0x10);//PB4作为输入
GPIO_PORTB_DEN_R&=~(0x10);//PB4作为模拟类型
GPIO_PORTB_AFSEL|u R |=0x10;
GPIO_端口B_PCTL|u R |=0x10;
//净采样率
ADC0_PC_R&=0x00;
//将采样率设置为125ksps
ADC0_PC_R&=0x01;
//将优先级设置为SSFI3
ADC0_SSPRI|R |=0x3210;
//在配置之前禁用样本序列3
ADC0_actiss_R&=~0x8;
//启用TS0、IE0和END0位
ADC0_SSCTL3_R|=0xE;
//启用16倍硬件过采样
ADC0_SAC_R|=0x4;
//通过将0写入相应位来禁用中断
ADC0\u IM\u R&=~(0x8);
//激活样本序列器
ADC0_ACTSS_R |=0x8;
}
void SystemInit(){
}
无效ADC_电压(无效){
ADC0_PSSI_R |=0x8;
而((ADC0_RIS_R&0x8)==0);
ADC_值=(ADC0_SSFIFO3_R&0xFFF);
电压=(ADC_值)*44;
如果(电压>最大电压){
最大电压=电压;
}
ADC0_ISC|u R |=0x08;
}
无效延迟(无符号长计数器){
int i;

对于(i=0;i我不确定您是否已经解决了这个问题。我通常使用TI提供的driverlib,您可以在TivaWARE中找到,因此我不知道在我头顶上进行DRM的所有寄存器。再次检查您是否正确地对pin进行了muxing。另一个要查看的是样本定序器。ADC在样本定序器上,您必须使用同样,对于采样数、采样源等,您可以通过将序列器设置为从内部温度传感器而不是外部引脚读取数据来测试ADC配置,以至少调试代码的该部分。如果这样做有效,然后将其切换到外部引脚,则不再工作,那么你就知道问题出在针木星上了

您不使用TI提供的驱动程序库有什么令人信服的原因吗?使用它而不是执行DRM需要几分钟的时间进行设置。如果担心代码大小,tm4c的ROM上也有driverlib

即使出于某种原因无法使用driverlib,也可以查看driverlib源代码、《tivaware外围设备驱动程序库用户指南》和示例代码。您将看到设置此功能所需的driverlib调用,并可以跟踪到需要配置的寄存器