|
发表于 2010-3-15 23:19:23
|
显示全部楼层
以UART模块为例,它的内部有两个寄存器,一个是状态寄存器,另一个是控制寄存器,状态寄存器指示UART的状态,包括使能,是否准备好等信号,而控制寄存器用于控制UART的一些输出以及指示信号,通过这些信号,外部的处理器可以把数据输入控制寄存器中,从而指示是否准备好数据的传输,同时读取状态寄存器,了解一些状态信息。
在nios中,有这样一段程序:
#define ALTERA_AVALON_UART_STATUS_PE_MSK (0x1)
#define ALTERA_AVALON_UART_STATUS_PE_OFST (0)
#define ALTERA_AVALON_UART_STATUS_FE_MSK (0x2)
#define ALTERA_AVALON_UART_STATUS_FE_OFST (1)
#define ALTERA_AVALON_UART_STATUS_BRK_MSK (0x4)
#define ALTERA_AVALON_UART_STATUS_BRK_OFST (2)
#define ALTERA_AVALON_UART_STATUS_ROE_MSK (0x8)
#define ALTERA_AVALON_UART_STATUS_ROE_OFST (3)
#define ALTERA_AVALON_UART_STATUS_TOE_MSK (0x10)
#define ALTERA_AVALON_UART_STATUS_TOE_OFST (4)
#define ALTERA_AVALON_UART_STATUS_TMT_MSK (0x20)
#define ALTERA_AVALON_UART_STATUS_TMT_OFST (5)
#define ALTERA_AVALON_UART_STATUS_TRDY_MSK (0x40)
#define ALTERA_AVALON_UART_STATUS_TRDY_OFST (6)
#define ALTERA_AVALON_UART_STATUS_RRDY_MSK (0x80)
#define ALTERA_AVALON_UART_STATUS_RRDY_OFST (7)
#define ALTERA_AVALON_UART_STATUS_E_MSK (0x100)
#define ALTERA_AVALON_UART_STATUS_E_OFST (8)
#define ALTERA_AVALON_UART_STATUS_DCTS_MSK (0x400)
#define ALTERA_AVALON_UART_STATUS_DCTS_OFST (10)
#define ALTERA_AVALON_UART_STATUS_CTS_MSK (0x800)
#define ALTERA_AVALON_UART_STATUS_CTS_OFST (11)
#define ALTERA_AVALON_UART_STATUS_EOP_MSK (0x1000)
#define ALTERA_AVALON_UART_STATUS_EOP_OFST (12)
#define ALTERA_AVALON_UART_CONTROL_REG 3
#define IOADDR_ALTERA_AVALON_UART_CONTROL(base) \
__IO_CALC_ADDRESS_NATIVE(base, ALTERA_AVALON_UART_CONTROL_REG)
#define IORD_ALTERA_AVALON_UART_CONTROL(base) \
IORD(base, ALTERA_AVALON_UART_CONTROL_REG)
#define IOWR_ALTERA_AVALON_UART_CONTROL(base, data) \
IOWR(base, ALTERA_AVALON_UART_CONTROL_REG, data)
#define ALTERA_AVALON_UART_CONTROL_PE_MSK (0x1)
#define ALTERA_AVALON_UART_CONTROL_PE_OFST (0)
#define ALTERA_AVALON_UART_CONTROL_FE_MSK (0x2)
#define ALTERA_AVALON_UART_CONTROL_FE_OFST (1)
#define ALTERA_AVALON_UART_CONTROL_BRK_MSK (0x4)
#define ALTERA_AVALON_UART_CONTROL_BRK_OFST (2)
#define ALTERA_AVALON_UART_CONTROL_ROE_MSK (0x8)
#define ALTERA_AVALON_UART_CONTROL_ROE_OFST (3)
#define ALTERA_AVALON_UART_CONTROL_TOE_MSK (0x10)
#define ALTERA_AVALON_UART_CONTROL_TOE_OFST (4)
#define ALTERA_AVALON_UART_CONTROL_TMT_MSK (0x20)
#define ALTERA_AVALON_UART_CONTROL_TMT_OFST (5)
#define ALTERA_AVALON_UART_CONTROL_TRDY_MSK (0x40)
#define ALTERA_AVALON_UART_CONTROL_TRDY_OFST (6)
#define ALTERA_AVALON_UART_CONTROL_RRDY_MSK (0x80)
#define ALTERA_AVALON_UART_CONTROL_RRDY_OFST (7)
#define ALTERA_AVALON_UART_CONTROL_E_MSK (0x100)
#define ALTERA_AVALON_UART_CONTROL_E_OFST (8)
#define ALTERA_AVALON_UART_CONTROL_DCTS_MSK (0x400)
#define ALTERA_AVALON_UART_CONTROL_DCTS_OFST (10)
#define ALTERA_AVALON_UART_CONTROL_RTS_MSK (0x800)
#define ALTERA_AVALON_UART_CONTROL_RTS_OFST (11)
#define ALTERA_AVALON_UART_CONTROL_EOP_MSK (0x1000)
#define ALTERA_AVALON_UART_CONTROL_EOP_OFST (12)
注意到MSK和OFST,BASE了吗?如果想让微处理器能够控制这些寄存器(STATUS 和 CONTROL),就必须把这些寄存器映射到相应的存储器中,base就是这些寄存器的基址,而OFST对应着偏移地址,MSK表示第几位对应着寄存器的第几位,这样微处理器可以通过往这些地址中写入或读出相应的数据 |
|