Olá pessoal,

Neste artigo eu descrevo o módulo de DMA disponível em todos os modelos RL78/G13. O DMA (Direct Memory Access ou acesso direto à memória) é um módulo que permite que um periférico acesse diretamente a memória RAM do microcontrolador, transferindo dados da RAM para o periférico ou vice-versa.

A utilidade do DMA é indiscutível, mas é conveniente exemplificar como este periférico pode auxiliar numa aplicação.

As aplicações envolvendo microcontroladores frequentemente possuem a necessidade de movimentar dados: sejam caracteres recebidos ou a serem enviados pela porta serial, sejam amostras obtidas pelo conversor A/D, etc. Tradicionalmente utilizam-se interrupções para sinalizar a CPU que existe a necessidade de se realizar uma movimentação de dados como as descritas. Assim, ao receber um novo caractere, por exemplo, a UART gera uma interrupção. A CPU reconhece a interrupção e desvia o fluxo do programa para a ISR que irá efetuar a leitura do dado recebido e o seu armazenamento, por exemplo, num buffer.

Esta abordagem, bastante comum, apresenta um grande inconveniente: ela consome um tempo precioso da CPU e o utiliza pra uma tarefa que, digamos, é pouco nobre. É aí que entra o módulo de acesso direto à memória (DMA), pois ele permite automatizar este tipo de operação, realizando a transferência de dados entre periférico e memória sem a necessidade de intervenção da CPU!

Nos RL78, o módulo de DMA apresenta-se com 2 ou 4 canais independentes. Cada canal pode ser configurado para realizar transferências de 8 ou 16 bits entre periféricos e RAM (a direção pode ser selecionada), com blocos de até 1024 transferências.

Um canal de DMA pode ser disparado por um dos seguintes periféricos: conversor A/D, canais da TAU, SAU (UART) ou SAU (CSI). Uma característica interessante é que uma transferência DMA pode ser disparada por um periférico, mas a operação de transferência do DMA pode envolver outro periférico e não necessariamente aquele que provocou o disparo. Um exemplo típico desta situação é a utilização de um canal da TAU para realizar leituras periódicas de uma porta de E/S e o seu armazenamento (através do DMA) na RAM.

O exemplo a seguir demonstra como utilizar um canal de DMA para automatizar a transmissão de dados com a UART.

Um buffer de 32 bytes é utilizado para o armazenamento dos dados a serem transmitidos. A função tx_UART2() é utilizada para escrever uma string no buffer e configurar o  DMA para realizar a transferência dos dados através da UART2.

Toda a transferência é realizada automaticamente pelo DMA, ou seja, após cada caractere ser transmitido o flag de transmissão da UART2 (STIF2) é setado, provocando o disparo do DMA que transfere um novo caractere do buffer para o registrador TXD2.

Este processo segue até que todos os caracteres tenham sido transmitidos (registrador DBC0 chegue a zero e bit DST seja apagado no registrador DRC0).

Adicionalmente a aplicação também responde aos caracteres recebidos pela UART2, invertendo o estado do led D2 da placa RPB a cada caractere recebido e enviando a string “Teste!” ao receber o caractere ‘t’ e “RL78!” ao receber o caractere ‘r’.

O código foi escrito para a placa de promoção do RL78/G13  (YRPBRL78G13) e utiliza a porta COM virtual disponibilizada pela mesma. Para utilizar esta porta virtual, basta configurar, após o download do código, os jumpers J6 a J9 na posição 2-3.

DMA nos RL78
Classificado como:                        

3 ideias sobre “DMA nos RL78

  • 10 de setembro de 2013 em 11:29 pm
    Permalink

    Olá Fábio. Estou seguindo aqui o livro e já no primeiro exemplo travei.
    O IAR não esta recnhecendo o #include “myRL78.h” e nem a última palavra das linhas com “__root __far” que vem logo abaixo. Pode me dar essa força?

    • 11 de setembro de 2013 em 8:56 am
      Permalink

      Olá Rafael,

      Você baixou o código daqui do blog? O arquivo myRL78.h é de minha autoria e deve ser baixado juntamente com os demais arquivos do livro, conforme está mencionado na página 40. Qualquer problema estou as ordens.

      Fábio

Deixe uma resposta