为了配置UART tx,需要在内存映射的tx控制寄存器位[18:16]上写入水印(0到7)。
我的RISC-V汇编函数首先读取当前的控制寄存器值,与掩码进行按位AND以清除位[18:16],然后与移位后的输入值进行按位OR并写回。
以下是代码:
uart_set_txwmark:
slli a0, 15; /* shift input value by 15 */
li t0, UART1_BASE;
lw t1, UART_TXCTRL_OFFSET(t0); /* Read present value */
.equiv UART_MASK_WMARK, 0x0xFFF8FFFF /* [18:16] zero mask */
li t2, UART_MASK_WMARK;
and t1, t1, t2; /* clear/zero bits 18:16 */
or t1, t1, a0; /* OR with input value */
sw t1, UART_TXCTRL_OFFSET(t0); /* Write back */
我很好奇是否有其他更好的方法在RISC-V中设置内存映射寄存器中的几位。