Entradas e Saídas Digitais do DSP TMS320F2812

Este post faz parte da série DSP TMS320F2812

Nos artigos anteriores foram apresentados os principais módulos do DSP e seus registradores. Neste artigo serão apresentados os registradores GPIO do DSP e procedimento de configuração para atender a eventos de interrupção externa.

Entradas e Saídas Digitais

Todos os pinos do DSP são agrupados em portas, denominadas GPIO-A, B, D, E, F e G. Para acessar pinos de I/O no DSP o multiplexador de cada pino deve ser configurado. Isso é feito no registrador GPIOxMUX, que durante o reset é inicializado com o valor 0, determinando todos pinos com função de I/O. Nessa função, cada pino pode ser configurado como entrada ou saída digital a partir do registrador GPIOxDIR, em que o zero em determinado bit configura o respectivo pino como entrada digital e 1 como saída digital. O digrama de um pino é ilustrado na Figura 1.

Diagrama de um pino para configuração de Entradas e Saídas Digitais do DSP TMS320F2812
Figura 1: Diagrama de um pino do DSP TMS320F2812.

Saída digital

Uma vez configurado como saída digital o pino pode ser alterado pelos registradores GPIOxDAT, GPIOxCLEAR, GPIOxSET e GPIOxTOGGLE.

  • GPIOxDAT: O valor configurado nesse registrador define o nível lógico de cada pino.
  • GPIOxCLEAR: Os bits configurados em ‘1’ atribuem o nível lógico zero aos respectivos pinos.
  • GPIOxSET: Os bits configurados em ‘1’ atribuem o nível lógico um aos respectivos pinos.
  • GPIOxTOGGLE: Os bits configurados em ‘1’ invertem o nível lógico dos respectivos pinos.

Entrada digital

  • GPIOxDAT: O valor de leitura desse registrador indica o nível lógico de cada pino.
  • GPIOxEQUAL: Algumas portas (GPIO A, B, D e E) possuem um filtro denominado qualificador (Input Qualification). Tal registrador pode ser utilizado para determinar uma janela de tempo (quantas vezes uma entrada deve ser amostrada) para que uma entrada digital tenha seu valor definido.
Filtro qualificador.
Figura 2: Filtro qualificador.

O período de amostragem da entrada é igual ‘2n’ ciclos SYSCLKOUT, em que ‘n’ é o valor de GPIOxEQUAL. Assim, o valor do pino é determinado após 6 ciclos em que o sinal tem o mesmo valor. Isso pode ser utilizado para eliminar efeitos de spike ou pulsos que ocorrem antes do valor de entrada estabilizar. Um exemplo desse procedimento é ilustrado na Figura 3.

Exemplo de leitura de pino com o filtro ativado.
Figura 3: Exemplo de leitura de pino com o filtro ativado.

Registradores GPIO

O endereço dos registradores de multiplexação e direção são mostrados na Figura 4. Cabe ressaltar que esses registradores têm a operação de escrita protegida por hardware, sendo necessário executar a instrução EALLOW.

Registrador de controle GPIO.
Figura 4: Registrador de controle GPIO.

Já os registradores que manipulam diretamente os valores do GPIO não são protegidos. Tais registradores são mostrados na Figura 5.

Registrador de controle GPIO.
Figura 5: Registrador de controle GPIO.

No exemplo abaixo é mostrada a configuração dos pinos do GPIOA como saídas digitais. O programa permanece em loop escrevendo o valor da variável contador no registrador de dados do GPIOA.

Obs: Programa criado no CCSv7 (CCS Project – Empty ), usando o compilador TI v17.3.0.STS.

/*Registrador de controle do watchdog timer*/
#define WDCR (*(volatile unsigned int *)0x007029)

/*Registrador que define a direção dos pinos do GPIOA*/
#define GPADIR (*(volatile unsigned int *)0x0070C1)

/*Registrador de estados do GPIOA*/
#define GPADAT (*(volatile unsigned int *)0x0070E0)


void main(void)
{
    /*Contador usado como exemplo*/
    unsigned int cont=0;

    /*Habilita acesso aos registradores e ao vetor de interrupção do PIE*/
    asm(" EALLOW");

    /* Desativa o watchdog timer
     * WDDIS: bit 6: bit de enable
     * WDCHK: bit 5~3: necessário escrever o valor 5*/
    WDCR = (1 << 6) | (5 << 3);

    /*Configura o GPIOA como saída*/
    GPADIR = 0xFFFF;

    /*Ativa região protegida*/
    asm(" EDIS");

    while(1)
    {
        /*escreve o valor do contador no GPIOA*/
        GPADAT = cont++;

        /*delay*/
        long x=1000000;
        while(x--);
    }
}

Interrupções externas

As interrupções externas são habilitadas pelos registradores XINT1CR e XINT2CR. Os campos desses registradores são mostrados na Figura 6.

Registrador XINTxCR.
Figura 6: Registrador XINTxCR.

Essas fontes de interrupção correspondem aos canais 4 e 5 do sinal de interrupção INT1, conforme mostrado na Figura 7.

Fontes de interrupção do PIE.
Figura 7: Fontes de interrupção do PIE.

Dessa maneira, o registrador PIEIER1 (Figura 8) deve ser utilizado para habilitar o canal de interrupção.

Registrador PIEIERx.
Figura 8: Registrador PIEIERx.

Cabe lembrar que as interrupções do DSP são controladas pelo registrador IE e pelo bit global de interrupções. Assim, para habilitar a fonte INT1 e as interrupções globais, o seguinte trecho de código deve ser utilizado.

    /*Habilita fonte de interrupção INT1*/
    asm(" OR IER,#1");

    /*Habilita interrupções globais*/
    asm(" CLRC INTM");

No exemplo abaixo é demonstrada a configuração da fonte de interrupção externa XINT1. Para isso, o pino GPIOE0 (XINT1) foi configurado na função alternativa para gerar uma interrupção em eventos de borda de descida. Além disso, os vetores de interrupção foram posicionados no PIE, de modo que a interrupção XINT1 corresponda ao endereço 0xD46. Sempre que a interrupção ocorre o programa é desviado para a rotina INT1_ISR. Tal rotina escreve no registrador ACK, zerando o bit respectivo ao sinal de interrupção INT1. Assim, o próximo evento de interrupção pode ser atendido.

Obs: Programa criado no CCSv7 (CCS Project – Empty ), usando o compilador TI v17.3.0.STS.

/*Registrador de controle do watchdog timer*/
#define WDCR (*(volatile unsigned int *)0x007029)

/*Registrador que define a direção dos pinos do GPIOA*/
#define GPADIR (*(volatile unsigned int *)0x0070C1)

/*Registrador de estados do GPIOA*/
#define GPADAT (*(volatile unsigned int *)0x0070E0)

/*Registrador MUX do GPIOE*/
#define GPEMUX (*(volatile unsigned int *)0x0070D0)

/*Reigistrador do controlador de interrupções*/
#define PIECRTL (*(volatile unsigned int *)0x00000CE0)

/*Registrador de ACK das interrupções*/
#define PIEACK (*(volatile unsigned int *)0x00000CE1)

/*Registrador de controle da interrupção externa 1*/
#define XINT1CR (*(volatile unsigned int *)0x00007070)

/*Registrador de controle da fonte de interrupção INT1*/
#define PIEIER1 (*(volatile unsigned int *)0x00000CE2)

/*Endereço do vetor de interrupção XINT1 do PIE*/
#define INT1_ADDR (*(volatile unsigned long *)0x00000D46)

/*Rotina de interrupção*/
interrupt void INT1_ISR(void);

/*Contador usado como exemplo*/
volatile unsigned int cont=0;

void main(void)
{
    /*Habilita acesso aos registradores e ao vetor de interrupção do PIE*/
    asm(" EALLOW");

    /* Desativa o watchdog timer
     * WDDIS: bit 6: bit de enable
     * WDCHK: bit 5~3: necessário escrever o valor 5*/
    WDCR = (1 << 6) | (5 << 3);

    /*Configura os GPIOAL como saída*/
    GPADIR = 0x00FF;

    /*Configura GPIOE0 com função alternativa (XINT1)*/
    GPEMUX = 1;

    /*Preenche o vetor de interrupção XINT1 com o endereço da rotina que será utilizada*/
    INT1_ADDR = (unsigned long)INT1_ISR;

    /*Ativa região protegida*/
    asm(" EDIS");

    /*Configura XINT1 para gerar interrupção por borda de descida*/
    XINT1CR = 1;

    /*Seleciona canal de interrupção INT1.4*/
    PIEIER1 = (1 << 3);

    /*Define que os vetores de interrupção são definidos no bloco PIE*/
    PIECRTL = 1;

    /*Habilita fonte de interrupção INT1*/
    asm(" OR IER,#1");

    /*Habilita interrupções*/
    asm(" CLRC INTM");

    while(1)
    {
        /*escreve o valor do contador no GPIOA*/
        GPADAT = cont;

        /*delay*/
        long x=1000000;
        while(x--);
    }
}

interrupt void INT1_ISR(void)
{
    /*Determina que a interrupção INT1 foi atendida*/
    PIEACK = 1;
    cont++;
}

Referências

TMS320F2812 – 32-bit Digital Signal Controller with Flash

DSP TMS320F2812

Inicialização e Configuração do DSP TMS320F2812 Timers do DSP TMS320F2812
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Hardware » DSP » Entradas e Saídas Digitais do DSP TMS320F2812

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: