/*! * @brief PORT初始化 * @param PTxn 端口 * @param cfg 端口属性配置,如触发选项和上拉下拉选项 * @since v5.0 * @note 与port_init_NoALT不同的是,此函数需要配置 MUX 复用功能, 否则 MUX = ALT0 * Sample usage: port_init (PTA8, IRQ_RISING | PF | ALT1 | PULLUP ); //初始化 PTA8 管脚,上升沿触发中断,带无源滤波器,复用功能为GPIO ,上拉电阻 */ void port_init(PTXn_e ptxn, uint32 cfg ) { SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << PTX(ptxn)); //开启PORTx端口 PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1<<PTn(ptxn)); // 清空标志位 PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) = cfg; // 复用功能 , 确定触发模式 ,开启上拉或下拉电阻 }
/*! * @brief PORT初始化 * @param PTxn 端口 * @param cfg 端口属性配置,如触发选项和上拉下拉选项 * @since v5.0 * @note 与port_init不同的是,此函数不需要配置 MUX 复用功能(即使配置了也不生效), MUX 保留 为原先寄存器配置的值 * Sample usage: port_init_NoALT (PTA8, IRQ_RISING | PF | PULLUP ); //初始化 PTA8 管脚,上升沿触发中断,带无源滤波器,保留原先复用功能,上拉电阻 */ void port_init_NoALT(PTXn_e ptxn, uint32 cfg) { SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << PTX(ptxn)); //开启PORTx端口 PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1<<PTn(ptxn)); // 清空标志位 //清空cfg里的MUX,加载寄存器里的MUX cfg &= ~PORT_PCR_MUX_MASK; //清了MUX 字段(即不需要配置ALT,保持原来的ALT) cfg |= (PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) & PORT_PCR_MUX_MASK); //读取寄存器里配置的 MUX PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) = cfg; // 复用功能 , 确定触发模式 ,开启上拉或下拉电阻 }
/************************************************************************* * 蓝宙电子科技有限公司 * * 函数名称:gpio_Interrupt_init * 功能说明:初始化gpio * 参数说明:PTxn 端口号(PORTA,PORTD) * IO 引脚方向,0=输入,1=输出,输入输出状态定义____________(修改:这个函数中只有定义为输入模式有效,否则不改变相关状态) * mode 中断模式 * 函数返回:无 * 修改时间:2012-9-15 已测试 * 备 注: *************************************************************************/ void gpio_Interrupt_init(PTxn ptxn, GPIO_CFG cfg, GPIO_INP mode) { ASSERT( (PTn(ptxn) < 32u) ); //使用断言检查输入、电平 是否为1bit //选择功能脚 PORTx_PCRx ,每个端口都有个寄存器 PORTx_PCRx PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn)) = (0 | PORT_PCR_MUX(1) | cfg | PORT_PCR_IRQC(mode) ); //选择功能脚 PORTx_PCRx ,每个端口都有中断模型 // PORT_DFER_REG(PORTX_BASE(ptxn)) = PORT_DFER_DFE( 1<<PTn(ptxn)); //端口方向控制输入还是输出 if( ( (cfg & 0x01) == GPI) || (cfg == GPI_UP) || (cfg == GPI_UP_PF) || (cfg == GPI_DOWN) || (cfg == GPI_DOWN_PF) ) // 最低位为0则输入 || 输入上拉模式 || 输入上拉,带无源滤波器 { GPIO_PDDR_REG(GPIOX_BASE(ptxn)) &= ~(1 << PTn(ptxn)); //设置端口方向为输入 } if(PTX(ptxn)==0) enable_irq(PortA_irq_no); else if(PTX(ptxn)==3) enable_irq(PortD_irq_no); }
/************************************************************************* * 蓝宙电子工作室 * * 函数名称:gpio_init * 功能说明:初始化gpio * 参数说明:port:端口号(gpio.h中宏定义,分别为PORTA~PORTE=0~4) * dir:引脚方向(0=输入,1=输出) * state:引脚初始状态(0=低电平,1=高电平) * 函数返回:无 * 修改时间:2014-9-18 已测试 * 备 注: *************************************************************************/ void gpio_init(PTxn ptxn, uint8_t dir, uint8_t state) { //根据带入参数pin,指定该引脚功能为GPIO功能(即令引脚控制寄存器的MUX=0b001) PORT_PCR_REG(PORTX_BASE(ptxn), PTn(ptxn))= PORT_PCR_MUX(1); //根据带入参数dir,决定引脚为输出还是输入 if (1 == dir) //希望为输出 { GPIO_PDDR_REG(GPIOX_BASE(ptxn)) |= (1 << PTn(ptxn)); //设置端口方向为输出 gpio_set(ptxn , state); //调用gpio_set函数,设定引脚初始状态 } else //希望为输入 GPIO_PDDR_REG(GPIOX_BASE(ptxn)) &= ~(1 << PTn(ptxn)); //设置端口方向为输入 }