
单片机STM32F407开发板DMF407电机开发板平台keil V5.31HSE 为8MHZHSI为16MHZ利用按键按下按键触发下降沿的外部中断松开按键触发上升沿的外部中断计算按键按下时长不同的时长显示不同的LED。主函数uint32_t g_ntime0; int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ led_init(); /* 初始化LED */ extix_init(); /* 初始化外部中断输入 */ LED0(0); /* 点亮LED0 */ while(1) { delay_ms(1); g_ntime; } }按键配置void key_init(void) { GPIO_InitTypeDef gpio_init_struct; /* GPIO配置参数存储变量 */ KEY0_GPIO_CLK_ENABLE(); /* KEY0时钟使能 */ KEY1_GPIO_CLK_ENABLE(); /* KEY1时钟使能 */ KEY2_GPIO_CLK_ENABLE(); /* KEY2时钟使能 */ gpio_init_struct.Pin KEY0_GPIO_PIN; /* KEY0引脚 */ gpio_init_struct.Mode GPIO_MODE_INPUT; /* 输入 */ gpio_init_struct.Pull GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed GPIO_SPEED_FREQ_HIGH; /* 高速 */ HAL_GPIO_Init(KEY0_GPIO_PORT, gpio_init_struct); /* KEY0引脚模式设置,上拉输入 */ gpio_init_struct.Pin KEY1_GPIO_PIN; /* KEY1引脚 */ gpio_init_struct.Mode GPIO_MODE_INPUT; /* 输入 */ gpio_init_struct.Pull GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed GPIO_SPEED_FREQ_HIGH; /* 高速 */ HAL_GPIO_Init(KEY1_GPIO_PORT, gpio_init_struct); /* KEY1引脚模式设置,上拉输入 */ gpio_init_struct.Pin KEY2_GPIO_PIN; /* KEY2引脚 */ gpio_init_struct.Mode GPIO_MODE_INPUT; /* 输入 */ gpio_init_struct.Pull GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed GPIO_SPEED_FREQ_HIGH; /* 高速 */ HAL_GPIO_Init(KEY2_GPIO_PORT, gpio_init_struct); /* KEY2引脚模式设置,上拉输入 */ }外部中断配置void extix_init(void) { GPIO_InitTypeDef gpio_init_struct; key_init(); gpio_init_struct.Pin KEY0_INT_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_IT_RISING_FALLING;//GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio_init_struct.Pull GPIO_PULLUP; HAL_GPIO_Init(KEY0_INT_GPIO_PORT, gpio_init_struct); /* KEY0配置为下降沿触发中断 */ gpio_init_struct.Pin KEY1_INT_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio_init_struct.Pull GPIO_PULLUP; HAL_GPIO_Init(KEY1_INT_GPIO_PORT, gpio_init_struct); /* KEY1配置为下降沿触发中断 */ gpio_init_struct.Pin KEY2_INT_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio_init_struct.Pull GPIO_PULLUP; HAL_GPIO_Init(KEY2_INT_GPIO_PORT, gpio_init_struct); /* KEY2配置为下降沿触发中断 */ HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2); /* 抢占0子优先级2 */ HAL_NVIC_EnableIRQ(KEY0_INT_IRQn); /* 使能中断线1 */ HAL_NVIC_SetPriority(KEY1_INT_IRQn, 1, 2); /* 抢占1子优先级2 */ HAL_NVIC_EnableIRQ(KEY1_INT_IRQn); /* 使能中断线15 */ HAL_NVIC_SetPriority(KEY2_INT_IRQn, 2, 2); /* 抢占2子优先级2 */ HAL_NVIC_EnableIRQ(KEY2_INT_IRQn); /* 使能中断线15 */ }外部中断处理void KEY0_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY0所在中断线 的中断标志位 */ __HAL_GPIO_EXTI_CLEAR_IT(KEY0_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调退出时再清一次中断避免按键抖动误触发 */ } void KEY1_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY1_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY1所在中断线 的中断标志位中断下半部在HAL_GPIO_EXTI_Callback执行 */ __HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调退出时再清一次中断避免按键抖动误触发 */ } void KEY2_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY2_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY2所在中断线 的中断标志位中断下半部在HAL_GPIO_EXTI_Callback执行 */ __HAL_GPIO_EXTI_CLEAR_IT(KEY2_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调退出时再清一次中断避免按键抖动误触发 */ } void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) ! RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); } } extern uint32_t g_ntime; uint32_t g_npresstime0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { delay_ms(10); /* 消抖 */ switch(GPIO_Pin) { case KEY0_INT_GPIO_PIN: if (KEY0 0) { // LED0_TOGGLE(); /* LED0 状态取反 */ g_ntime0; } else { g_npresstimeg_ntime; if(g_npresstime500) LED0_TOGGLE(); else if(g_npresstime1000) LED1_TOGGLE(); else { LED0_TOGGLE(); LED1_TOGGLE(); } } break; case KEY1_INT_GPIO_PIN: // if (KEY1 0) { LED1_TOGGLE(); /* LED1 状态取反 */ } break; case KEY2_INT_GPIO_PIN: if (KEY2 0) { LED0_TOGGLE(); /* LED0 状态取反 */ LED1_TOGGLE(); /* LED1 状态取反 */ } break; default : break; } }