我目前正在使用Rocket Chip repo来生成一个32位宽度的微控制器。我删除了调试模块(SimDTM或SimJTAG),以便在VCS 2014上编译,因此为了调试目的,我需要添加GPIO和UART。我从Sifive-Blocks repo添加了GPIO和UART模块,然后相应地修改了Rocketchip的配置(将WithUART
和WithGPIO
添加到Configs,将HasPeripheryUART
和HasPeripheryUARTModuleImp
添加到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实现缺少了什么或有什么问题吗?非常感谢您!
1条答案
按热度按时间dba5bblo1#
我发现与
print
相关的函数不是在stdio.h
中定义的,而是在syscalls.c
中定义的--实际上在syscalls.c
中有#undef
来覆盖像putchar()
这样的系统函数。因此,如果我用自己的uartputchar()
替换syscalls.c
中putchar()
的函数内容,printf()
将处理所有格式等。已经在syscalls.c
中定义了。