分类: LINUX
2011-01-05 11:50:14
AT91SAM7S256IO的编程与LPC的IO口编程有很大的类似,但是,在其头文件中都将IO封装成结构体,虽然看起来不是很容易,却利于编程。具体定义参见AT91SAM7S256.h。
其中,IO的寄存器的定义如下:
typedef struct _AT91S_PIO {
AT91_REG PIO_PER; // PIO Enable Register ,IO使能寄存器
AT91_REG PIO_PDR; // PIO Disable Register ,IO禁用寄存器
AT91_REG PIO_PSR; // PIO Status Register ,IO状态寄存器
AT91_REG Reserved0[1]; //
AT91_REG PIO_OER; // Output Enable Register ,IO输出使能寄存器
AT91_REG PIO_ODR; // Output Disable Registerr ,IO禁止输出寄存器
AT91_REG PIO_OSR; // Output Status Register ,IO输出状态寄存器
AT91_REG Reserved1[1]; //
AT91_REG PIO_IFER; // Input Filter Enable Register ,IO输入滤波器使能寄存器
AT91_REG PIO_IFDR; // Input Filter Disable Register ,IO输入滤波器禁止寄存器
AT91_REG PIO_IFSR; // Input Filter Status Register ,IO输入滤波器状态寄存器
AT91_REG Reserved2[1]; //
AT91_REG PIO_SODR; // Set Output Data Register ,输出数据置位寄存器
AT91_REG PIO_CODR; // Clear Output Data Register ,输出数据清零寄存器
AT91_REG PIO_ODSR; // Output Data Status Register ,输出数据状态寄存器
AT91_REG PIO_PDSR; // Pin Data Status Register
AT91_REG PIO_IER; // Interrupt Enable Register,中断使能寄存器
AT91_REG PIO_IDR; // Interrupt Disable Register,中断禁止寄存器
AT91_REG PIO_IMR; // Interrupt Mask Register,中断屏蔽寄存器
AT91_REG PIO_ISR; // Interrupt Status Register,中断状态寄存器
AT91_REG PIO_MDER; // Multi-driver Enable Register 多驱动状态,使能,禁用寄存器
AT91_REG PIO_MDDR; // Multi-driver Disable Register
AT91_REG PIO_MDSR; // Multi-driver Status Register
AT91_REG Reserved3[1]; //
AT91_REG PIO_PPUDR; // Pull-up Disable Register上拉使能,禁用,状态寄存器
AT91_REG PIO_PPUER; // Pull-up Enable Register
AT91_REG PIO_PPUSR; // Pull-up Status Register
AT91_REG Reserved4[1]; //
AT91_REG PIO_ASR; // Select A Register AB选择状态寄存器
AT91_REG PIO_BSR; // Select B Register
AT91_REG PIO_ABSR; // AB Select Status Register
AT91_REG Reserved5[9]; //
AT91_REG PIO_OWER; // Output Write Enable Register
AT91_REG PIO_OWDR; // Output Write Disable Register
AT91_REG PIO_OWSR; // Output Write Status Register
} AT91S_PIO, *AT91PS_PIO;
该IO口程序中主要程序解释如下:
AT91PS_PIO m_pPio = AT91C_BASE_PIOA; // 定义PIOA端口
其中,AT91PS_PIO为软件API定义IO控制器,而AT91C_BASE_PIOA是PIO控制器A在系统控制器映射中的起始地址。
外围的初始化中(system.C),首先,允许PIO时钟( p_pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; // 允许PIO时钟)。
然后,对于需要输出数据的PIO采用的是先修改PIO_PER(IO使能寄存器),然后,PIO_OER(PIO输出使能寄存器),然后,把其输出置位使用PIO_SODR (输出数据置位寄存器),清零使用的是PIO_CODR (输出数据清零寄存器),将其中为1对应的IO口进行对应的操作。第一个程序中,使PA1口输出方波,即使PIO_SODR中PA1为1,然后延时后,使PIO_CODR中的PA1为1。