实验目的
验证IO的输入模式。
要点
从硬件原理图上卡,KEY_UP高电平有效,且没有下拉电阻,所有需要设置PA0内部下拉,同理,KEY0,KEY1,KEY2低电平有效,没有外接上拉电阻,所以需要设置PE2,PE3,PE4内部上拉电阻。
由于按键的特殊性,软件中增加“去抖动”处理
实现
驱动程序
#ifndef __KEY_H__
#define __KEY_H__
#include "sys.h"
#define KEY0 PEin(4)
#define KEY1 PEin(3)
#define KEY2 PEin(2)
#define WK_UP PAin(0)
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
void key_init(void);
u8 key_scan(u8);
#endif //__KEY_H__
#include "key.h"
#include "delay.h"
void key_init(void)
{
RCC->AHB1ENR |= 1<<0;
RCC->AHB1ENR |= 1<<4;
GPIO_Set(GPIOA, PIN0, GPIO_MODE_IN, 0, 0, GPIO_PUPD_PD);
GPIO_Set(GPIOE, PIN2|PIN3|PIN4, GPIO_MODE_IN, 0, 0, GPIO_PUPD_PU);
}
u8 key_scan(u8 mode)
{
static u8 key_up = 1;
if(mode) key_up = 1;
if(key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1))
{
delay_ms(10);
key_up = 0;
if(KEY0 == 0) return 1;
else if(KEY1 == 0) return 2;
else if(KEY2 == 0) return 3;
else if(WK_UP == 1) return 4;
}
else if(KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0)
{
key_up = 1;
}
return 0;
}
应用程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
static void sys_init(void);
int main(void)
{
u8 key;
sys_init();
while(1)
{
key = key_scan(0);
if(key)
{
switch(key)
{
case WKUP_PRES:
BEEP = !BEEP;
break;
case KEY2_PRES:
LED0 = !LED0;
break;
case KEY1_PRES:
LED1 = !LED1;
break;
case KEY0_PRES:
LED0 = !LED0;
LED1 = !LED1;
break;
default:
break;
}
}
else
{
delay_ms(10);
}
}
}
static void sys_init(void)
{
Stm32_Clock_Init(336, 8, 2, 7);
delay_init(168);
led_init();
beep_init();
key_init();
LED0 = 0;
}
参考
STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4 开发指南(寄存器版)
STM32F4xxx中文参考手册