CAN RX&Amp;TX缓冲器/FIFO起始地址(F0SA/TBSA)的寄存器只考虑地址的低16位,但RAM地址可以从0x20000000到0x20040000(18位).
链接到datasheet.
因此,如果我将一个数组初始化为RX FIFO,如下所示:
uint8_t can1_rx_fifo0[CAN1_RX_FIFO_ELEMENTS * 16] __attribute__((__aligned__(4)));
个
编译器将其放在内存地址0x20005A70,这是没有问题的,因为我可以将0x5A70写入F0SA/TBSA,并且CAN将看到正确的缓冲区/FIFO地址.但是,如果该数组位于地址0x20015A70,我仍然只能将0x5A70写入F0SA/TBSA,而这是错误的地址.
我try 这样做,FIFO被放在我指定的适当地址,但随后该地址被覆盖/用于RAM中的其他内容.
#define CAN1_RX_FIFO (volatile struct can1_rx_fifo_struct*)(0x20000000)
static struct can1_rx_fifo_struct
{
uint8_t can1_rx_fifo[CAN1_RX_FIFO_ELEMENTS * 16];
};
我是不是误解了这是怎么回事?如果不是,我如何才能以最佳且安全的方式初始化数组,以便将其存储在0x20000000-0x2000FFFF之间的内存地址?