GPIO 中断和唤醒功能
通过设置Px_IEN 和 Px_IMD寄存器,每个GPIO引脚都可以设置为中断源。有5种类型的中断条件可以选择:低电平触发、高电平触发、下降沿触发、上升沿触发、上升和下降沿都触发。对于边沿触发,用户可以使能输入信号去抖动功能来避免由干扰导致的不期望的中断发生。de-bounce 时钟源和采样周期可以由DBNCECON 寄存器设定。
- 四种模式:
- GPIO_PMD_INPUT 输入模式
- GPIO_PMD_OUTPUT 输出模式(推挽输出,有电流驱动能力)
- GPIO_PMD_OPEN_DRAIN 开漏输出模式
- GPIO_PMD_QUASI 准双向模式
- 中断:
- GPIO_INT_RISING 上升沿触发
- GPIO_INT_FALLING 下降沿触发
- GPIO_INT_BOTH_EDGE 上升下降沿触发
- GPIO_INT_HIGH 高电平触发
- GPIO_INT_LOW 低电平触发
- 函数描述:用于设置指定的GPIO操作模式
- 参数: port 端口P0, P1, P2, P3 or P4.
- 参数: u32PinMask 具体引脚BIT0 ~ BIT7.
- 参数: u32Mode 四种模式
- void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode)
- 函数描述:使能GPIO中断
- 参数: port P0, P1, P2, P3 or P4.
- 参数: u32Pin 引脚号码0 ~ 7
- 参数: u32IntAttribs 中断触发
- void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs)
- 函数描述:失能GPIO中断
- 参数: port P0, P1, P2, P3 or P4.
- 参数: u32Pin 引脚号码0 ~ 7
- void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin)
- 函数描述:获取GPIO中断标志
- GPIO_GET_INT_FLAG(port, u32PinMask)
- 函数描述:清除GPIO中断标志
- GPIO_CLR_INT_FLAG(port, u32PinMask)
- 函数描述:失能中断消抖功能
- GPIO_DISABLE_DEBOUNCE(port, u32PinMask)
- 函数描述:使能中断消抖功能
- GPIO_ENABLE_DEBOUNCE(port, u32PinMask)
- 函数描述:设置消抖采样采样周期、时间
- GPIO_SET_DEBOUNCE_TIME(u32ClkSrc, u32ClkSel)
- //初始化
- Void GPIO_Init()
- {
- /* P10 配置为输出,P24 配置为输入模式 */
- GPIO_SetMode(P1, 0, GPIO_PMD_OUTPUT);
- GPIO_SetMode(P2, 4, GPIO_PMD_INPUT);
- /* P10 配置为输出*/
- GPIO_SetMode(P1, 0, GPIO_PMD_OUTPUT);
-
- /*从P10输出0*/
- P10 = 0;
- /*如果P11为低电平,P12输出高电平*/
- if(P11 == 0)
- P12 = 1;
-
- /* 将 P25 配置为输入模式并使能上升沿中断 */
- GPIO_SetMode(P2, 5, GPIO_PMD_INPUT);
- GPIO_EnableInt(P2, 5, GPIO_INT_RISING);
- NVIC_EnableIRQ(GPIO_P2P3P4_IRQn);
-
- /* 将 P12 配置为输入模式,打开内部上拉,并使能下降沿中断 */
- GPIO_SetMode(P1, 2, GPIO_PMD_INPUT);
-
- GPIO_EnableInt(P1, 2, GPIO_INT_FALLING);
- NVIC_EnableIRQ(GPIO_P0P1_IRQn);
- }
-
- //中断服务函数
- void GPIOP2P3P4_IRQHandler()
- {
- if(GPIO_GET_INT_FLAG(P2, BIT0))
- {
- GPIO_CLR_INT_FLAG(BIT0);
-
- }
- else//清除其他端口不必要的中断
- {
- P2->ISRC = P2->ISRC;
- P3->ISRC = P3->ISRC;
- P4->ISRC = P4->ISRC;
- }
- }
|