// Incluir las librerías necesarias
#include "hardware/uart.h"
#include "hardware/irq.h"
// Definir los pines, la velocidad de transmisión y otros parámetros de UART
#define UART_ID uart0
#define BAUD_RATE 9600
#define DATA_BITS 8
#define STOP_BITS 1
#define PARITY UART_PARITY_NONE
#define UART_TX_PIN 0
#define UART_RX_PIN 1
// Definir una variable para contar los caracteres recibidos
static int chars_rxed = 0;
// Definir una función para manejar las interrupciones de UART
void on_uart_rx() {
// Leer el carácter recibido y aumentar el contador
uint8_t ch = uart_getc(UART_ID);
chars_rxed++;
// Enviar el carácter de vuelta con un cambio
// Por ejemplo, convertir las letras minúsculas en mayúsculas
if (ch >= 'a' && ch <= 'z') {
ch -= 32;
}
uart_putc(UART_ID, ch);
}
// Definir la función principal
int main() {
// Inicializar UART con los parámetros definidos
uart_init(UART_ID, BAUD_RATE);
// Configurar los pines de UART
gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
// Deshabilitar el control de flujo de hardware
uart_set_hw_flow(UART_ID, false, false);
// Configurar el formato de UART
uart_set_format(UART_ID, DATA_BITS, STOP_BITS, PARITY);
// Deshabilitar el buffer FIFO de UART
uart_set_fifo_enabled(UART_ID, false);
// Obtener el número de interrupción de UART
int UART_IRQ = UART_ID == uart0 ? UART0_IRQ : UART1_IRQ;
// Establecer la función de manejo de interrupciones
irq_set_exclusive_handler(UART_IRQ, on_uart_rx);
// Habilitar la interrupción de UART
irq_set_enabled(UART_IRQ, true);
// Habilitar la recepción de datos por UART
uart_set_irq_enables(UART_ID, true, false);
// Enviar un mensaje de bienvenida por UART
uart_puts(UART_ID, "\nHello, UART!\n");
// Entrar en un bucle infinito
while (1) {
// No hacer nada, solo esperar a que lleguen los datos por UART
tight_loop_contents();
}
}