发送 helloWord
#!/bin/bashset-euo pipefailUART_BASE=0x43c10000# UART 寄存器偏移RBR=0x00# 接收缓冲区THR=0x00# 发送保持寄存器IER=0x04# 中断使能FCR=0x08# FIFO 控制LCR=0x0C# Line ControlLSR=0x14# Line StatusSCR=0x1C# Scratch# --- 配置波特率 115200 ---DIVISOR=54# 100MHz / (16*115200) ≈ 54# 进入可设置波特率模式 (LCR bit7 = 1)lcr=$(devmem$((UART_BASE+LCR))32)devmem$((UART_BASE+LCR))32$((lcr|0x80))# 设置 DLL/DLMDLL=$((DIVISOR&0xFF))DLM=$(((DIVISOR>>8)&0xFF))devmem$((UART_BASE+0x00))32$DLLdevmem$((UART_BASE+0x04))32$DLM# 恢复 LCR (bit7=0)devmem$((UART_BASE+LCR))32$((lcr&~0x80))# --- 初始化 FIFO ---devmem$((UART_BASE+FCR))320x07# FIFO Enable + RX/TX Reset# --- 测试 SCR 寄存器 ---devmem$((UART_BASE+SCR))320x55val=$(devmem$((UART_BASE+SCR))32)echo"SCR test value: 0x$(printf'%02x'$val)"# --- 发送 helloWord ---msg="helloWord"for((i=0;i<${#msg};i++));dochar=${msg:$i:1}# 等待 THR 空闲 (LSR bit5)whiletrue;dolsr=$(devmem$((UART_BASE+LSR))32)if(((lsr&0x20)!=0));thenbreakfidone# 写 THRdevmem$((UART_BASE+THR))32"$(printf'0x%x'"'$char")"doneecho"Done sending 'helloWord' at 115200 baud!"回环测试
#!/bin/bashset-euo pipefailUART_BASE=0x43c10000# UART 寄存器偏移RBR=0x00# 接收缓冲区 (读)THR=0x00# 发送保持寄存器 (写)IER=0x04# 中断使能FCR=0x08# FIFO 控制LCR=0x0C# Line ControlLSR=0x14# Line StatusSCR=0x1C# Scratch# --- 配置波特率 115200 ---DIVISOR=54# 100MHz / (16*115200) ≈ 54# 进入可设置波特率模式 (LCR bit7 = 1)lcr=$(devmem$((UART_BASE+LCR))32)devmem$((UART_BASE+LCR))32$((lcr|0x80))# 设置 DLL/DLMDLL=$((DIVISOR&0xFF))DLM=$(((DIVISOR>>8)&0xFF))devmem$((UART_BASE+0x00))32$DLLdevmem$((UART_BASE+0x04))32$DLM# 恢复 LCR (bit7=0)devmem$((UART_BASE+LCR))32$((lcr&~0x80))# --- 初始化 FIFO ---devmem$((UART_BASE+FCR))320x07# FIFO Enable + RX/TX Reset# --- 测试 SCR 寄存器 ---devmem$((UART_BASE+SCR))320x55val=$(devmem$((UART_BASE+SCR))32)echo"SCR test value: 0x$(printf'%02x'$val)"echo"Starting UART loopback (echo) test. Press Ctrl+C to exit."# --- 无限回环 ---whiletrue;do# 等待 RX 有数据 (LSR bit0)lsr=$(devmem$((UART_BASE+LSR))32)if(((lsr&0x01)!=0));then# 读取接收到的字符data=$(devmem$((UART_BASE+RBR))32)data=$((data&0xFF))# 打印收到的字符printf"%s""$(printf'\\x%02x'$data)"# 等待 THR 空闲 (LSR bit5)whiletrue;dolsr_thr=$(devmem$((UART_BASE+LSR))32)if(((lsr_thr&0x20)!=0));thenbreakfidone# 写回 THR,实现回显devmem$((UART_BASE+THR))32"$data"fidone