This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Problems with single-ended example in TM4C1294Xl

Other Parts Discussed in Thread: TM4C1294NCPDT

Hi! I'm having a trouble with single-ended mode for adc example because the code stuck in the while loop that waits the end of the conversions .

Here is my code :

#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_memmap.h"
#include "driverlib/adc.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"

void InitConsole(void)
{

    //ativa o periférico GPIO na porta A[esse periférico será usado na comunicação UART]

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    // Configure the pin muxing for UART0 functions on port A0 and A1.
    //Configura os pinos A0 e A1 ṕara serem Rx e Tx no uart, respectivamente.

    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);

    //
    // Ativa o periférico UART0
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    //Ativa o clock do UART0 como sendo o
    //
    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);


    // Seta os pinos PA0 e PA1 como sendo da funcionalidade UART
    //
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Inicializa o uart para entrada e saida padrão
    //
    UARTStdioConfig(0, 9600, 16000000);
}


int main(void) {

	#if defined(TARGET_IS_TM4C129_RA0) ||                                         \
		defined(TARGET_IS_TM4C129_RA1) ||                                         \
		defined(TARGET_IS_TM4C129_RA2)
	    uint32_t ui32SysClock;
	#endif

	uint32_t pui32ADC0Value[1];

	#if defined(TARGET_IS_TM4C129_RA0) ||                                         \
		defined(TARGET_IS_TM4C129_RA1) ||                                         \
		defined(TARGET_IS_TM4C129_RA2)
	    ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
	                                       SYSCTL_OSC_MAIN |
										   SYSCTL_USE_PLL |
										   SYSCTL_CFG_VCO_480), 20000000);
	#else
	    SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
	                   SYSCTL_XTAL_16MHZ);
	#endif

	// the function SysCtlClockSet must to be replaced to SysCtlClockFreqSet
	// the function SysCtlClockGet mus to be replaced to SysCtlClockFreqSet

	//inicia-se o console
	InitConsole();

    UARTprintf("ADC ->\n");
    UARTprintf("  Modo: Single Ended\n");
    UARTprintf("  Amostras: One\n");
    UARTprintf("  Taxa de saida: 250ms\n");
    UARTprintf("  Pino de entrada: AIN0/PE3\n\n");

	//neste exemplo irei usar o sample sequencer 3, que possui a capacidade de fazer uma amostra
	//e possui FIFO de tamanho 1(ideal para a nossa aplicação)

	//ligando o periférico ADC0
	SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);


	//ligando o módulo GPIO que fará a leitura
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

	//selecionando o pin3 da porta GPIO E para fazer a leitura do ADC
	GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);


	//aqui configuramos um sample sequence que será executado em nosso AD
	//o primeiro parâmetro é o endereço base do AD0
	//o segundo parâmetro é o número da sample sequence utilizado, em nosso caso SS3 equivale a 3
	//o terceiro parâmetro é o trigger que iniciará a sample sequency, nesse caso optei pelo trigger do processador
	//o quarto parâmetro é a prioridade dessa sample sequence em relação as demais, como só há uma isso é indiferente
	ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);



	//vamos configurar o passo 0(único passo) na SS3
	//O primeiro parâmetro é o enderço base do AD0
	//o segundo parâmetro é o número da sample sequence utilizado, em nosso caso SS3 equivale a 3
	//O terceiro parâmetro é o passo a ser configurado, em nosso caso, o passo 0
	// o quarto parâmetro é a configuração do STEP, se dá por meio de OR binários
	//o primeiro membro ADC_CTL_CH0 estabelece que o canal é o canal de entrada 0
	//o segundo membro indica que deve ser iniciada a flag de interrupçaão quando essa amostra é concluida
	// o terceiro parâmetro AD_CTL_END indica que essa é a ultima amostra
	ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH0 | ADC_CTL_IE |						//input channel é a mesma coisa que pino de entrada
	                             ADC_CTL_END); 				//talvez essa função esteja travando a leitura


	//ativar a sample sequence
	ADCSequenceEnable(ADC0_BASE, 3);

//	ADCIntEnableEx(ADC0_BASE, 3);

	//limpar os flags de interrupção antes de começar a amostragem
	ADCIntClear(ADC0_BASE, 3);

	while(1){

		//ativa o gatilho para a sample sequence 3, uma amostra apenas
        ADCProcessorTrigger(ADC0_BASE, 3);

        //A ideia aqui é verificar o status da interrupção, enquanto não houver interrupção
        //a rotina ficará presa no loop(ainda estará sendo feita a conversão), quando houver interrupção
        //a função retornará true e depois sairá do loop devido ao ! na frente
        while(!ADCIntStatus(ADC0_BASE, 3, true)){   //the code is stucking here
        	//será executado enquanto o flag de fim de amostragem não for lançado
        }

        //le os dados obtidos na sample sequence 3 e os disponibiliza na variável pui32ADC0Value
        ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value);

        UARTprintf("Pino Analogico 0 = %4d\n", pui32ADC0Value[0]);

	}

	return 0;
}