You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:38:05