- #define MM_LED1_Off GPIO_SetBits(GPIOB, GPIO_Pin_11)
- #define MM_LED1_On GPIO_ResetBits(GPIOB, GPIO_Pin_11)
- #define MM_LED1_Toggle GPIO_WriteBit(GPIOB, GPIO_Pin_11, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11) ? Bit_RESET : Bit_SET)
- #define MM_LED2_Off GPIO_SetBits(GPIOB, GPIO_Pin_10)
- #define MM_LED2_On GPIO_ResetBits(GPIOB, GPIO_Pin_10)
- #define MM_LED2_Toggle GPIO_WriteBit(GPIOB, GPIO_Pin_10, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_10) ? Bit_RESET : Bit_SET);
- #define MM_LED3_Off GPIO_SetBits(GPIOC, GPIO_Pin_7)
- #define MM_LED3_On GPIO_ResetBits(GPIOC, GPIO_Pin_7)
- #define MM_LED3_Toggle GPIO_WriteBit(GPIOC, GPIO_Pin_7, GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7) ? Bit_RESET : Bit_SET);
- #define MM_LED4_Off GPIO_SetBits(GPIOC, GPIO_Pin_6)
- #define MM_LED4_On GPIO_ResetBits(GPIOC, GPIO_Pin_6)
- #define MM_LED4_Toggle GPIO_WriteBit(GPIOC, GPIO_Pin_6, GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6) ? Bit_RESET : Bit_SET);
- void MM_GPIO_LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 ;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOC, &GPIO_InitStruct);
-
- MM_LED1_Off;
- MM_LED2_Off;
- MM_LED3_Off;
- MM_LED4_Off;
- }
LED的初始状态为关闭的,需要通过按键去唤醒;
按键通过外部中断采集初始化(以按键1为例):
- void MM_GPIO_KEY_Init(void)
- {
- EXTI_InitTypeDef EXTI_InitStruct;
- GPIO_InitTypeDef GPIO_InitStruct;
- NVIC_InitTypeDef NVIC_InitStruct;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
- /* K1->PC4->EXTI_Line4 */
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_Init(GPIOC, &GPIO_InitStruct);
- SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource4);
- EXTI_StructInit(&EXTI_InitStruct);
- EXTI_InitStruct.EXTI_Line = EXTI_Line4;
- EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStruct.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStruct);
- NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStruct);
- }
我们可以看到按键1采用的是上拉下拉配置,外部中断上升沿出发,这个和它的外部连接方式有关,每个按键要根据自己的方式进行选择,然后在中断里面处理:
- void EXTI4_IRQHandler(void)
- {
- if (SET == EXTI_GetITStatus(EXTI_Line4))
- {
- MM_LED1_Toggle;
- EXTI_ClearITPendingBit(EXTI_Line4);
- }
- }
每一个GPIO对应的中断线是一定的,不过中断处理函数不一样,比如5-9在一个中断处理函数中进行。
到这里我们就完成了按键的中断采集和GPIO输出控制的基本函数,实现按下对应的按键,对应的LED翻转的操作,效果如下: