基于Rocketchip+Sifive-blocks UART无法使用系统printf()函数的问题
Rocket Chip UART无法适配标准库printf/putchar的问题
我基于Rocket Chip仓库开发32位微控制器,为了兼容VCS 2014编译,移除了SimDTM/SimJTAG调试模块,转而从Sifive-Blocks仓库引入GPIO和UART模块,并在Rocketchip配置中添加了WithUART、WithGPIO,同时在ExampleRocketSubsystem中实现了HasPeripheryUART和HasPeripheryUARTModuleImp相关逻辑。
UART初始化代码
我编写了如下UART初始化函数:
void UartStdOutInit(void) { *uartaddr32(UART_DIV) = DIVISOR; *uartaddr32(UART_TXEN) = TRUE; // tx enabled, stop bit 1 bit *uartaddr32(UART_RXEN) = TRUE; //rx enabled return; }
对应的头文件定义
#ifndef _UART_CONF_H #define _UART_CONF_H #define TRUE 1 #define FALSE 0 #define ERROR -1 typedef unsigned int U32; //U32 is 32-bit length #define UART_ADDR 0x54000000 #define UART_TXFIFO 0x00 #define UART_RXFIFO 0x04 #define UART_TXEN 0x08 #define UART_TXMARK 0x0a #define UART_RXEN 0x0c #define UART_RXMARK 0x0e #define UART_IE 0x10 #define UART_IP 0x14 #define UART_DIV 0x18 #define UART_PARITY 0x1c #define UART_WIRE4 0x20 #define UART_EITHER8OR9 0x24 #define uartaddr32(offset) ((volatile U32 *)(UART_ADDR + offset)) #define DIVISOR 868 //10000000/115200 -1 /*Function declaration*/ void UartStdOutInit(void); #endif
问题现象
调用初始化函数后,使用标准库的printf()或putchar()向UART写入数据时,Txd线路无任何输出。但自己编写的如下直接操作TXFIFO的函数能正常触发Txd线路电平变化,数据可被UART_capture模块捕获:
void uartputchar(unsigned char c) { *uartaddr32(UART_TXFIFO) = c; }
这种自定义方式无法使用格式化字符串,给调试工作带来极大阻碍(硬编码实现格式化过程繁琐混乱)。我尝试查找相关资料,但大多是FPGA项目或基于IDE的内容,未能找到解决方案。
请问我的UART实现存在哪些遗漏或问题?
内容的提问来源于stack exchange,提问作者Jasminy
相关产品推荐
相关产品推荐

