编译器平台及例程说明
编译器平台说明
1. Toolchain : MDK- ARM Community Version: 5.30 .0 .0 ( Kile V5)
2. Encoding : Encode in UTF- 8 without signature
3. Device Specific Packs : Keil. STM32H7xx_DFP. 2.7 .0 . pack
4. Preprocessor Symbols Define : USE_HAL_DRIVER, STM32H743xx
USE_HAL_DRIVER : 允许使用HAL库驱动
STM32H743xx : STM32H743xx芯片
5. Chip Type : STM32H743VIT6, Flash: 2 MByte, ROM: 1 MByte
6. 在stm32h7xx_hal_conf. h文件中HSE_VALUE为外部高速振荡器,默认25 MHZ。此值必须与硬件保持一致。
例程说明
1. 独立按键扫描实现单击、长按、组合单击事件( 可重注册或取消按键事件)
一、宏定义说明
# define USER_KEY1_PIN USER_KEY1_Pin
# define USER_KEY2_PIN USER_KEY2_Pin
# define Read_Key1_State ( ) HAL_GPIO_ReadPin ( USER_KEY1_GPIO_Port, USER_KEY1_PIN)
# define Read_Key2_State ( ) HAL_GPIO_ReadPin ( USER_KEY2_GPIO_Port, USER_KEY2_PIN)
typedef void ( * KeyFunc) ( void ) ;
# define KEY_VALID_COUNT_MAX ( 220 )
# define KEY_NONE_ACTION ( 0x0003 )
# define KEY_COUNT_CLICK ( 10 )
# define KEY_COUNT_LONG_PRESS ( 80 )
# define LONG_PRESS ( key) ( ( key) | 0x8000 )
# define IS_KEY_LONG_PRESS ( key , code) ( ( ( code) & 0x8000 ) && ( ( key) == ( ( code) & 0x7FFF ) ) )
typedef enum
{
KEY_USER1_CLICK_EVENT = 0 ,
KEY_USER2_CLICK_EVENT = 1 ,
KEY_USER_CLICK_EVENT = 2 ,
KEY_USER1_LONG_PRESS_EVENT = 3 ,
KEY_USER2_LONG_PRESS_EVENT = 4 ,
KEY_EVENT_MAX
} KeyEvent;
# pragma pack ( 1 )
typedef struct UserKeyInput
{
u8 ubKeyValidCount;
KeyEvent eKeyEvent;
} UserKey_TypeDef;
# pragma pack ( )
二、变量的定义
volatile KeyFunc KEY_FUNC_TAB[ KEY_EVENT_MAX] = { 0 } ;
UserKey_TypeDef AppKey =
{
. ubKeyValidCount = 0 ,
. eKeyEvent = KEY_EVENT_MAX
} ;
const u16 KeyMapCode[ ] =
{
0x0001 ,
0x0002 ,
0x0003 ,
0x8001 ,
0x8002 ,
} ;
三、按键GPIO初始化及按键默认事件
static void vInit_KeyBoard_CallBack ( void )
{
vSetKey_Handler_Event ( KEY_USER1_CLICK_EVENT, vUserKey1_ClickEvent) ;
vSetKey_Handler_Event ( KEY_USER2_CLICK_EVENT, vUserKey2_ClickEvent) ;
vSetKey_Handler_Event ( KEY_USER_CLICK_EVENT, vUserKey12_ClickEvent) ;
vSetKey_Handler_Event ( KEY_USER1_LONG_PRESS_EVENT, vUserKey1_LongPressEvent) ;
vSetKey_Handler_Event ( KEY_USER2_LONG_PRESS_EVENT, vUserKey2_LongPressEvent) ;
}
void vInit_Key_Input ( void )
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 } ;
GPIO_InitStruct. Pin = USER_KEY1_Pin;
GPIO_InitStruct. Mode = GPIO_MODE_INPUT;
GPIO_InitStruct. Pull = GPIO_PULLUP;
GPIO_InitStruct. Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init ( USER_KEY1_GPIO_Port, & GPIO_InitStruct) ;
GPIO_InitStruct. Pin = USER_KEY2_Pin;
HAL_GPIO_Init ( USER_KEY2_GPIO_Port, & GPIO_InitStruct) ;
vInit_KeyBoard_CallBack ( ) ;
dprintf ( "4-STM32H743xx_CubeMx_KeyInput......\r\n" ) ;
}
四、读取按键值及键盘扫描
static u16 usRead_KeyBoard_Value ( void )
{
u16 kVal = 0 ;
kVal = Read_Key1_State ( ) ;
kVal |= ( Read_Key2_State ( ) << 1 ) ;
return kVal;
}
void vKeyBoard_Scan ( void )
{
static u16 oldVal = 0 ;
u16 curVal = 0 ;
curVal = usRead_KeyBoard_Value ( ) ^ KEY_NONE_ACTION;
if ( curVal)
{
if ( curVal == oldVal)
{
if ( KEY_VALID_COUNT_MAX > AppKey. ubKeyValidCount)
{
AppKey. ubKeyValidCount++ ;
}
}
else
{
oldVal = curVal;
AppKey. ubKeyValidCount = 0 ;
}
if ( KEY_COUNT_CLICK == AppKey. ubKeyValidCount)
{
if ( oldVal == KeyMapCode[ KEY_USER_CLICK_EVENT] )
{
AppKey. eKeyEvent = KEY_USER_CLICK_EVENT;
}
}
else if ( KEY_COUNT_LONG_PRESS == AppKey. ubKeyValidCount)
{
if ( IS_KEY_LONG_PRESS ( oldVal, KeyMapCode[ KEY_USER1_LONG_PRESS_EVENT] ) )
{
AppKey. eKeyEvent = KEY_USER1_LONG_PRESS_EVENT;
}
else if ( IS_KEY_LONG_PRESS ( oldVal, KeyMapCode[ KEY_USER2_LONG_PRESS_EVENT] ) )
{
AppKey. eKeyEvent = KEY_USER2_LONG_PRESS_EVENT;
}
}
}
else
{
if ( oldVal)
{
if ( ( AppKey. ubKeyValidCount >= KEY_COUNT_CLICK) && ( AppKey. ubKeyValidCount < KEY_COUNT_LONG_PRESS) )
{
if ( oldVal == KeyMapCode[ KEY_USER1_CLICK_EVENT] )
{
AppKey. eKeyEvent = KEY_USER1_CLICK_EVENT;
}
else if ( oldVal == KeyMapCode[ KEY_USER2_CLICK_EVENT] )
{
AppKey. eKeyEvent = KEY_USER2_CLICK_EVENT;
}
}
AppKey. ubKeyValidCount = 0 ;
oldVal = 0 ;
}
}
}
五、设置或取消按键事件
void vSetKey_Handler_Event ( KeyEvent evt, KeyFunc func)
{
if ( evt >= KEY_EVENT_MAX)
{
return ;
}
KEY_FUNC_TAB[ evt] = func;
}
void vCancelKey_Handler_Event ( KeyEvent evt)
{
if ( evt >= KEY_EVENT_MAX)
{
return ;
}
KEY_FUNC_TAB[ evt] = NULL ;
}
六、键盘处理
void vKeyBoard_HandlerService ( void )
{
u8 event = 0 ;
KeyFunc keyFunc = NULL ;
event = AppKey. eKeyEvent;
if ( event >= KEY_EVENT_MAX)
{
return ;
}
AppKey. eKeyEvent = KEY_EVENT_MAX;
keyFunc = KEY_FUNC_TAB[ event] ;
if ( keyFunc != NULL )
{
keyFunc ( ) ;
}
}
七、按键事件的测试
static void vUserKey1_ClickEvent ( void )
{
dprintf ( "vUserKey1_ClickEvent......\r\n" ) ;
}
static void vUserKey2_ClickEvent ( void )
{
dprintf ( "vUserKey2_ClickEvent......\r\n" ) ;
}
static void vUserKey1_LongPressEvent ( void )
{
dprintf ( "vUserKey1_LongPressEvent......\r\n" ) ;
}
static void vUserKey2_LongPressEvent ( void )
{
dprintf ( "vUserKey2_LongPressEvent......\r\n" ) ;
}
static void vUserKey12_ClickEvent ( void )
{
dprintf ( "vUserKey12_ClickEvent......\r\n" ) ;
}
八、键盘的定时扫描及处理事件
void SysTick_Handler ( void )
{
static u8 i = 0 ;
HAL_IncTick ( ) ;
if ( ( ++ i) >= 10 )
{
i = 0 ;
vKeyBoard_Scan ( ) ;
}
}
int main ( void )
{
static u8 i = 0 ;
vStartUp_System ( ) ;
vInit_System_BSP ( ) ;
vShow_PlatformDevice_Info ( ) ;
while ( 1 )
{
vKeyBoard_HandlerService ( ) ;
HAL_Delay ( 10 ) ;
if ( ( ++ i) > 50 )
{
i = 0 ;
USER_LED_CPL ( ) ;
}
}
}
九、运行测试
00 > Segger Rtt Init Ok. . .
00 > STM32H743VIT6 Start Running. . .
00 > 4 - STM32H743xx_CubeMx_KeyInput. . . . . .
00 > Debug Versions. . . . . .
00 > Compile Date : Mar 27 2022 22 : 01 : 03
00 >
00 > vUserKey1_ClickEvent. . . . . .
00 > vUserKey1_ClickEvent. . . . . .
00 > vUserKey2_ClickEvent. . . . . .
00 > vUserKey2_ClickEvent. . . . . .
00 > vUserKey1_LongPressEvent. . . . . .
00 > vUserKey1_LongPressEvent. . . . . .
00 > vUserKey2_LongPressEvent. . . . . .
00 > vUserKey2_LongPressEvent. . . . . .
00 > vUserKey12_ClickEvent. . . . . .
00 > vUserKey12_ClickEvent. . . . . .
00 > vUserKey12_ClickEvent. . . . . .
00 > vUserKey1_ClickEvent. . . . . .
00 > vUserKey2_ClickEvent. . . . . .