gpt4 book ai didi

c - 这些作为函数参数的 uart 结构体是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 18:34:55 24 4
gpt4 key购买 nike

我有这段代码,我试图理解,但我被困住了,所以也许你们中的一位好人可以给我指出正确的方向。

一步一步地进行,我有初始化的这一部分......

volatile struct UART *pTXD1;
volatile struct UARTINIT *pPort1;

...结构...

struct UARTINIT
{
union SR_BYTE SR; /* Status register */
BYTE DR; /* Data register */
BYTE BRR1; /* Baud Rate reg 1 */
BYTE BRR2; /* Baud Rate reg 2 */
union CR1_BYTE CR1; /* Control register 1 */
union CR2_BYTE CR2; /* Control register 2 */
BYTE CR3; /* Control register 3 */
BYTE CR4; /* Control register 4 */
};

struct UART
{
BYTE *Buffer;
WORD max;
WORD read;
WORD write;
BYTE Baud;
BYTE stopp;
};

...函数调用...

Transmit_Uart(pTXD1, pPort1);

...函数

void Transmit_Uart(struct UART *Buff, struct UARTINIT *USART)
{
if ((*Buff).write != (*Buff).read)
{
if ((*USART).SR.bit.TC)
{
(*Buff).read = ((*Buff).read + 1) % (*Buff).max;
(*USART).DR = (*Buff).Buffer[(*Buff).read];
}
}
else
(*Buff).stopp = OFF;
return;
}

我的问题是我不明白结构中写入了哪些信息。该函数以 pTXD1 和 pPort1 作为参数调用,但这两个只是指向结构的指针,不是吗?

如果我的问题无法理解,我深表歉意,并且很乐意根据需要提供更多信息。

最佳答案

他们使用 struct UARTINIT 作为可视化 UART 硬件中内存映射硬件寄存器的方法。该结构必须与寄存器布局完全对应才能工作,因此无论谁编写代码都必须确保没有结构填充处于事件状态。 (通常在 8 位或 16 位 MCU 上不是问题,但在更大的内核上会出现问题。)

因此结构指针pPort1将指向芯片上潜在的多个UART硬件之一中的第一个寄存器。寄存器已经被“分配”——它们以内存映射硬件的形式存在。

UART 结构似乎只是一个用户定义的结构,用于存储各种设置以及将数据移入和移出 UART 硬件缓冲区。如果是这样,则必须将该结构分配到用户 RAM 中的某个位置。或者可能它也是一个寄存器内存映射,在这种情况下你有一些非常奇怪的硬件。

需要某种方式的文档来了解其使用方式。诸如 ((*Buff).read + 1) % (*Buff).max; 之类的代码看起来相当晦涩;我不知道为什么他们不简单地让驱动程序读取/写入原始数据字节。

关于c - 这些作为函数参数的 uart 结构体是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49026561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com