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; }