⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mx1_gpio.h

📁 车载信息系统开发源码
💻 H
字号:
/* 
 * mx1_gpio.h
 * Define the register sets of General Purpose I/O Ports
 * Date	: 2004/02/13
 * By	: Zhang Jing
 */

#ifndef	MX1_GPIO_H
#define	MX1_GPIO_H

#include	"mx1.h"


#ifdef	MX1_GPIO_FLAG
	#define	MX1_GPIO_EXT
#else
	#define	MX1_GPIO_EXT	extern
#endif

typedef	struct struct_mx1_gpio{
	mx1_reg		DDIR;
	mx1_reg		OCR1;
	mx1_reg		OCR2;
	mx1_reg		ICONFA1;
	mx1_reg		ICONFA2;
	mx1_reg		ICONFB1;
	mx1_reg		ICONFB2;
	mx1_reg		DR;
	mx1_reg		GIUS;
	mx1_reg		SSR;
	mx1_reg		ICR1;
	mx1_reg		ICR2;
	mx1_reg		IMR;
	mx1_reg		ISR;
	mx1_reg		GPR;
	mx1_reg		SWR;
	mx1_reg		PUEN;
} T_MX1_GPIO;

// Base address of four io ports
#define	MX1_GPIO_PA		((T_MX1_GPIO*)0xf021C000)
#define	MX1_GPIO_PB		((T_MX1_GPIO*)0xf021C100)
#define	MX1_GPIO_PC		((T_MX1_GPIO*)0xf021C200)
#define	MX1_GPIO_PD		((T_MX1_GPIO*)0xf021C300)

/* Not all port pins are usable, the usable pins are set in the definition
  * Now there are 110 pins are usable
  */
#define	MX1_GPIO_PA_USABLE	0xffffffff
#define	MX1_GPIO_PB_USABLE	0xffffff00
#define	MX1_GPIO_PC_USABLE	0xfffbfff8
#define	MX1_GPIO_PD_USABLE	0xffffffc0

#define	DDIR_SET( port, value )			do{ port->DDIR = (value); }while(0)
#define	DDIR_OUT( port, pin )		do{ port->DDIR |= 0x1<<(pin); }while(0)
#define	DDIR_IN( port, pin )		do{ port->DDIR &= ~(0x1<<(pin)); }while(0)
/**********************************************
 * Operations to the GPIO Output Configuration Registers
 **********************************************/
#define	OCR_SET( port, value1, value2 )		do{ port->OCR1 = (value1); port->OCR2 = (value2); }while(0)
#define	OCR_SEL_A( port, pin )			do{ 	if( (pin)<16 )	port->OCR1 &= ~((0x3)<<(2*(pin))); else if( (pin)<32&&(pin)>=16 ) port->OCR2 &= ~((0x3)<<(2*(pin)-32));  }while(0)


#define	OCR_SEL_B( port, pin )			do{	if( (pin)<16 ){	port->OCR1 &= ~((0x3)<<(2*(pin))); port->OCR1 |= (0x1)<<(2*(pin)); } else if( (pin)<32&&(pin)>=16 ){	 port->OCR2 &= ~((0x3)<<(2*(pin)-32));  port->OCR2 |= (0x1)<<(2*(pin)-32); }}while(0)


#define	OCR_SEL_C( port, pin )			do{	if( (pin)<16 ){ port->OCR1 &= ~((0x3)<<(2*(pin))); port->OCR1 |= (0x2)<<(2*(pin)); } else if( (pin)<32&&(pin)>=16 ){ port->OCR2 &= ~((0x3)<<(2*(pin)-32)); port->OCR2 |= (0x2)<<(2*(pin)-32); } }while(0)


#define	OCR_SEL_DR( port, pin )			do{	if( (pin)<16 ) 	port->OCR1 |= (0x3)<<(2*(pin)); else if( (pin)<32&&(pin)>=16 ) 	port->OCR2 |= (0x3)<<(2*(pin)-32);  }while(0)
/***************************************
 * Operations to Input Configuration Registers A
 ***************************************/
#define	ICONFA_SET( port, value1, value2 )	do{ port->ICONFA1 = (value1); port->ICONFA2 = (value2); }while(0)


#define	ICONFA_SEL_IN( port, pin )		do{ if( (pin)<16 ) port->ICONFA1 &= ~((0x3)<<(2*(pin))); else if( (pin)<32&&(pin)>=16 ) port->ICONFA2 &= ~((0x3)<<(2*(pin)-32)); }while(0)

#define	ICONFA_SEL_ISR( port, pin )		do{ if( (pin)<16 ){ port->ICONFA1 &= ~((0x3)<<(2*(pin))); port->ICONFA1 |= (0x1)<<(2*(pin)); } 	else if( (pin)<32&&(pin)>=16 ){	 port->ICONFA2 &= ~((0x3)<<(2*(pin)-32));  port->ICONFA2 |= (0x1)<<(2*(pin)-32); } }while(0)

#define	ICONFA_SEL_0( port, pin )		do{ if( (pin)<16 ){ port->ICONFA1 &= ~((0x3)<<(2*(pin))); port->ICONFA1 |= (0x2)<<(2*(pin)); } 	else if( (pin)<32&&(pin)>=16 ){	 port->ICONFA2 &= ~((0x3)<<(2*(pin)-32));  port->ICONFA2 |= (0x2)<<(2*(pin)-32); } }while(0)


#define	ICONFA_SEL_1( port, pin )		do{ if( (pin)<16 ) port->ICONFA1 |= (0x3)<<(2*(pin)); else if( (pin)<32&&(pin)>=16 ) port->ICONFA2 |= (0x3)<<(2*(pin)-32); }while(0)
/***************************************
 * Operations to Input Configuration Registers B
 ***************************************/
#define	ICONFB_SET( port, value1, value2 )	do{ port->ICONFB1 = (value1); port->ICONFB2 = (value2); }while(0)
#define	ICONFB_SEL_IN( port, pin )		do{ if( (pin)<16 ) port->ICONFB1 &= ~((0x3)<<(2*(pin))); else if( (pin)<32&&(pin)>=16 ) port->ICONFB2 &= ~((0x3)<<(2*(pin)-32));  }while(0)

#define	ICONFB_SEL_ISR( port, pin )		do{ if( (pin)<16 ){ port->ICONFB1 &= ~((0x3)<<(2*(pin))); port->ICONFB1 |= (0x1)<<(2*(pin)); } 	else if( (pin)<32&&(pin)>=16 ){	port->ICONFB2 &= ~((0x3)<<(2*(pin)-32)); port->ICONFB2 |= (0x1)<<(2*(pin)-32); } }while(0)

#define	ICONFB_SEL_0( port, pin )		do{ if( (pin)<16 ){ port->ICONFB1 &= ~((0x3)<<(2*(pin))); port->ICONFB1 |= (0x2)<<(2*(pin)); } 	else if( (pin)<32&&(pin)>=16 ){ port->ICONFB2 &= ~((0x3)<<(2*(pin)-32)); port->ICONFB2 |= (0x2)<<(2*(pin)-32); }}while(0)

#define	ICONFB_SEL_1( port, pin )		do{ if( (pin)<16 ) port->ICONFB1 |= (0x3)<<(2*(pin)); else if( (pin)<32&&(pin)>=16 ) port->ICONFB2 |= (0x3)<<(2*(pin)-32); }while(0)
/*****************************
 * Operations to GPIO Data Register
 *****************************/
#define	DR_SET( port, value )			do{ port->DR = (value); }while(0)
#define	DR_LOW( port, pin )			do{ port->DR &= ~ (1<<(pin)); }while(0)
#define	DR_HIGH( port, pin )			do{ port->DR |= 1<<(pin); }while(0)
/*******************************
 * Operations to GPIO In Use Register
 *******************************/
#define	GIUS_SET( port, value )			do{ port->GIUS = (value); }while(0)
#define	GIUS_FOR_MUX( port, pin )		do{ port->GIUS &= ~(1<<(pin)); }while(0)
#define	GIUS_FOR_IO( port, pin )			do{ port->GIUS |= 1<<(pin); }while(0)
/*************************************
 * Operations to GPIO Sample Status Register
 *************************************/
#define	SSR_GET( port )				( port->SSR )
#define	SSR_READ( port, pin )			( ((port->SSR)>>(pin))&0x1 )
/***************************************
 * Operations to Interrupt Configuration Registers
 ***************************************/
#define	ICR_SET( port, value1, value2 )	do{ port->ICR1 = (value1); port->ICR2 = (value2); }while(0)
#define	ICR_POS_EDGE( port, pin )		do{ if( (pin)<16 ) port->ICR1 &= ~((0x3)<<(2*(pin))); else if( (pin)<32&&(pin)>=16 ) port->ICR2 &= ~((0x3)<<(2*(pin)-32)); }while(0)

#define	ICR_NEG_EDGE( port, pin )		do{ if( (pin)<16 ){ port->ICR1 &= ~((0x3)<<(2*(pin))); port->ICR1 |= (0x1)<<(2*(pin)); } else if( (pin)<32&&(pin)>=16 ){ port->ICR2 &= ~((0x3)<<(2*(pin)-32)); 	port->ICR2 |= (0x1)<<(2*(pin)-32); }}while(0)

#define	ICR_POS_LEVEL( port, pin )		do{ if( (pin)<16 ){ port->ICR1 &= ~((0x3)<<(2*(pin)));	port->ICR1 |= (0x2)<<(2*(pin)); }else if( (pin)<32&&(pin)>=16 ){ port->ICR2 &= ~((0x3)<<(2*(pin)-32)); 	port->ICR2 |= (0x2)<<(2*(pin)-32); }}while(0)
#define	ICR_NEG_LEVEL( port, pin )		do{ if( (pin)<16 ) port->ICR1 |= (0x3)<<(2*(pin)); else if( (pin)<32&&(pin)>=16 ) port->ICR2 |= (0x3)<<(2*(pin)-32);  }while(0)

/*************************************
 * Operations to GPIO Interrupt Mask Register
 *************************************/
#define	IMR_SET( port, value )			do{ port->IMR = (value); }while( 0 )
#define	IMR_MASK( port, pin )			do{ port->IMR &= ~(1<<(pin)); }while(0)
#define	IMR_UMASK( port, pin )			do{ port->IMR |= 1<<(pin); }while(0)
/***************************************
 * Operations to GPIO Interrupt Status Register
 ***************************************/
#define	ISR_SET( port, value )			do{ port->ISR = (value); }while(0)
#define	ISR_INT_OCCUR( port, pin )		(((port->ISR)>>(pin))&0x1)
#define	ISR_INT_CLEAR( port, pin )		do{ port->ISR = 1<<(pin); }while(0)
/***************************************
 * Operations to GPIO General Purpose Register
 ***************************************/
#define	GPR_SET( port, value )			do{ port->GPR = (value); }while(0)
#define	GPR_SEL_PRI( port, pin )			do{ port->GPR &= ~(1<<(pin)); }while(0)
#define	GPR_SEL_ALT( port, pin )			do{ port->GPR |= 1<<(pin); }while(0)
/**************************************
 * Operations to GPIO Software Reset Register
 **************************************/
#define	SWR_RESET( port )			do{ port->SWR = 0x1; }while(0)
/**************************************
 * Operations to GPIO Pull_Up Enable Register
 **************************************/
#define	PUEN_SET( port, value )			do{ port->PUEN = (value); }while(0)
#define	PUEN_ENABLE( port, pin )			do{ port->PUEN |= 1<<(pin); }while(0)
#define	PUEN_DISABLE( port, pin )		do{ port->PUEN &= ~(1<<(pin)); }while(0)

/*---------------------------------------------*/
//Define the parameters passed to gpio common functions
// Data direction constant
#define	DIR_IN			(1<<0)
#define	DIR_OUT		(1<<1)

// pins function
#define	FUNC_IO		(1<<0)
#define	FUNC_PRI		(1<<1)	
#define	FUNC_ALT		(1<<2)
// input or output source
#define	SRC_IN_ANY		(0<<0)
#define	SRC_IN_GPIO		(1<<0)
#define	SRC_IN_INTSTA		(1<<1)
#define	SRC_IN_0		(1<<2)
#define	SRC_IN_1		(1<<3)

#define	SRC_OUT_ANY		(0<<0)
#define	SRC_OUT_A		(1<<0)
#define	SRC_OUT_B		(1<<1)
#define	SRC_OUT_C		(1<<2)
#define	SRC_OUT_DR		(1<<3)

/*
 * Function prototype
 */
MX1_GPIO_EXT void MX1_GPIO_Init( T_MX1_GPIO *port );
MX1_GPIO_EXT int MX1_GPIO_Conf(T_MX1_GPIO * port, unsigned char pin, unsigned char func, unsigned char dir, unsigned char src);


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -