/*
* Objetivo:
* Este programa permite ao usuário digitar uma palavra pelo terminal.
* A palavra é copiada automaticamente via DMA do buffer `src` para `dst`.
* Antes de cada nova entrada, os buffers são limpos (zerados), evitando resíduos.
*/
#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "hardware/dma.h"
#define MAX_LEN 100 // Define o tamanho máximo para os buffers
char src[MAX_LEN]; // Buffer de origem (entrada do usuário)
char dst[MAX_LEN]; // Buffer de destino (cópia via DMA)
// Função para limpar (zerar) ambos os buffers de origem e destino.
void limpar_buffers() {
memset(src, 0, MAX_LEN); // Zera todo o buffer de origem
memset(dst, 0, MAX_LEN); // Zera todo o buffer de destino
}
int main() {
stdio_init_all(); // Inicializa comunicação serial
sleep_ms(2000); // Espera estabilização da conexão serial
printf("Experimento 2: DMA_MEMO\n");
// Configuração do canal DMA
// Reivindica um canal DMA não utilizado no controlador DMA
int dma_chan = dma_claim_unused_channel(true);
// Obtém a configuração padrão para o canal DMA reivindicado.
dma_channel_config config = dma_channel_get_default_config(dma_chan);
// Configura as propriedades da transferência DMA para Memória para Memória:
channel_config_set_read_increment(&config, true); // Origem sequencial
channel_config_set_write_increment(&config, true); // Destino sequencial
channel_config_set_transfer_data_size(&config, DMA_SIZE_8); // Transferência por byte
while(true) {
limpar_buffers(); // Limpeza antes de cada entrada
printf("\nDigite uma palavra (ou 'sair' para terminar): ");
fflush(stdout); // Garante exibição no prompt
// Captura da entrada
if(fgets(src, MAX_LEN, stdin)) {
// Remove newline e calcula tamanho
// Captura a linha digitada pelo usuário no buffer de origem 'src'.
size_t len = strlen(src);
if(len > 0 && src[len-1] == '\n') {
src[--len] = '\0'; // Elimina caracteres residuais
}
// Condição de saída
if(strcmp(src, "sair") == 0) break; // Sai do loop principal
// Transferência via DMA
// Transferência via DMA: Configura e inicia a cópia de src para dst.
// Esta é a parte onde o hardware DMA move os dados automaticamente.
dma_channel_configure(
dma_chan, // Canal DMA a ser usado.
&config, // A configuração M2M.
dst, // Endereço de ESCRITA (destino: buffer 'dst').
src, // Endereço de LEITURA (origem: buffer 'src').
len + 1, // Número de BYTES a transferir (incluindo o '\0')
true // Inicia transferência imediatamente
);
// Espera conclusão
dma_channel_wait_for_finish_blocking(dma_chan);
// Verificação dos resultados (Confirmação)
printf("Original: '%s'\nCopia: '%s'\n\n", src, dst);
}
}
// Finalização: Libera o canal DMA ao sair do loop.
dma_channel_unclaim(dma_chan);
printf("Programa encerrado!\n");
return 0;
}