中级会员
- 积分
- 434
- 威望
- 228
- 贡献
- 128
- 兑换币
- 138
- 注册时间
- 2012-11-22
- 在线时间
- 39 小时
- 毕业学校
- wuyidax
|
typedef enum PORTx
{ PORTA, PORTB, PORTC, PORTD, PORTE}PORTx;
volatile struct GPIO_MemMap *GPIOx[5]={PTA_BASE_PTR,PTB_BASE_PTR,PTC_BASE_PTR,PTD_BASE_PTR,PTE_BASE_PTR}; //定义五个指针数组保存 GPIOx 的地址
volatile struct PORT_MemMap *PORTX[5]={PORTA_BASE_PTR,PORTB_BASE_PTR,PORTC_BASE_PTR,PORTD_BASE_PTR,PORTE_BASE_PTR};
//这个数组存放了端口的基地址,其中PORTB_BASE_PTR等在头文件里映射到物理地址
void gpio_init (PORTx portx, u8 n,GPIO_CFG cfg,u8 data)
{
ASSERT( (n < 32u) && (data < 2u) ); //使用断言检查输入、电平 是否为1bit
//选择功能脚 PORTx_PCRx ,每个端口都有个寄存器 PORTx_PCRx
PORT_PCR_REG(PORTX[portx],n)=(0|PORT_PCR_MUX(1)|cfg); //这一句不懂,portx的值 是PORTA到PORTE,这几个只是定义在上面的结构体里,没有跟实际的地址联系起来(难道在其他地方定义了??)。按照值传递,PORTX[portx]为PORTX[PORTA],怎么跟volatile struct PORT_MemMap *PORTX[5]={PORTA_BASE_PTR,PORTB_BASE_PTR,PORTC_BASE_PTR,PORTD_BASE_PTR,PORTE_BASE_PTR};对应起来,这是我的疑惑之处
//端口方向控制输入还是输出
if( ( (cfg&0x01) == GPI) || (cfg == GPI_UP) || (cfg == GPI_UP_PF) )
// 最低位为0则输入 || 输入上拉模式 || 输入上拉,带无源滤波器
{
GPIO_PDDR_REG(GPIOx[portx]) &= ~(1<<n); //设置端口方向为输入
}
else
{
GPIO_PDDR_REG(GPIOx[portx]) |= (1<<n); //设置端口方向为输出
if(data == 1)//output
{
GPIO_SET(portx,n,1); //对端口输出控制,输出为1
}
else
{
GPIO_SET(portx,n,0); //对端口输出控制,输出为0
}
}
}
还望各位大神指导指导,小弟学术不精,还望海涵
|
|