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