(Rocketchip + Sifive-blocks UART)无法使用系统printf()函数

9lowa7mx  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(69)

我目前正在使用Rocket Chip repo来生成一个32位宽度的微控制器。我删除了调试模块(SimDTM或SimJTAG),以便在VCS 2014上编译,因此为了调试目的,我需要添加GPIO和UART。我从Sifive-Blocks repo添加了GPIO和UART模块,然后相应地修改了Rocketchip的配置(将WithUARTWithGPIO添加到Configs,将HasPeripheryUARTHasPeripheryUARTModuleImp添加到ExampleRocketSubsystem等)。
然后,为了写入UART,我写了一个UartStdOutInit()函数,如下所示:

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


但是在调用Init函数之后,我无法使用printf()putchar()写入我的UART。如果我使用它们,Txd行上不会出现任何内容。我可以写我的UART的唯一方法是创建一个新的函数,如下所示:

void uartputchar(unsigned char c)
{
    *uartaddr32(UART_TXFIFO) = c;
}


并从一个新的print()函数调用它。然后我的Txd行将切换,并且数据可以由UART_capture模块捕获。但是这样我就不能使用格式字符串,这对我的调试过程来说是一个很大的障碍(仍然可以硬编码,但是会非常混乱和乏味)。我试图找到其他资源,但无法找到,因为他们中的大多数都在做FPGA项目或从IDE工作。谁能告诉我我的UART实现缺少了什么或有什么问题吗?非常感谢您!

dba5bblo

dba5bblo1#

我发现与print相关的函数不是在stdio.h中定义的,而是在syscalls.c中定义的--实际上在syscalls.c中有#undef来覆盖像putchar()这样的系统函数。因此,如果我用自己的uartputchar()替换syscalls.cputchar()的函数内容,printf()将处理所有格式等。已经在syscalls.c中定义了。

相关问题