stm32F042 (二) 按键触发中断

已经实现GPIO口输出高低电平控制LED,这里实现按键触发中断来改变LED闪亮的频率,因为PB3连着LED,所以PB3的输出模式没有改变,随意选一个GPIO口PA7接按键产生中断。因为nucleo开发板是裸板,所以按键、上拉电阻是另找在面包上连接起来再连到开发板上,连接方法在下图表明。

GPIO设置

在 stm32f0xx_it.c添加如下代码

/* USER CODE BEGIN 0 */
uint16_t KEY_DOWN = 0;
uint16_t ms_Delay = 300;
/* USER CODE END 0 */

void EXTI4_15_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_15_IRQn 0 */

if(ms_Delay == 300)
ms_Delay = 1000;
else
ms_Delay = 300;

/* USER CODE END EXTI4_15_IRQn 0 */

 

在main.c里添加如下代码

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern uint16_t KEY_DOWN ;
//uint16_t KEY_UP = 1;
extern uint16_t ms_Delay ;
/* USER CODE END PV */

稍微改动一下while(1)中代码:

while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
HAL_Delay(ms_Delay);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_Delay(ms_Delay);
}
/* USER CODE END 3 */

}

另一种方案是直接改动main.c的代码,无需改动其他代码

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t KEY_DOWN = 0;
//uint16_t KEY_UP = 1;
uint16_t ms_Delay = 300;
/* USER CODE END PV */

 

 

/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
HAL_Delay(ms_Delay);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_Delay(ms_Delay);
}
/* USER CODE END 3 */

添加以下函数


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{

// if(HAL_GPIO_ReadPin(PA7_GPIO_Port,PA7_Pin)==KEY_DOWN)
// {
// HAL_Delay(20);/* 延时一小段时间,消除抖动 */
// if(HAL_GPIO_ReadPin(PA7_GPIO_Port,PA7_Pin)==KEY_DOWN)
// {
if(ms_Delay == 300)
ms_Delay = 1000;
else
ms_Delay = 300;
// }
// __HAL_GPIO_EXTI_CLEAR_IT(PA7_Pin);
// }
}

 

 以上能够实现改动LED闪动频率,其实更完美的方案对按键进行消抖,但在这里的中断消抖不成功,还待后续学习调试

posted @ 2016-09-19 20:10  风丛林  阅读(2584)  评论(0编辑  收藏  举报