||
在main函数中,通过:
bsp_Init(); /*
硬件初始化 */
↓
bsp_InitTimer(); /*
初始化系统滴答定时器 */
↓
SysTick_Config(SystemCoreClock
/ 1000);
对滴答定时器进行设置,设为1ms周期。
定时器中断函数中:
SysTick_Handler → SysTick_ISR() →
bsp_RunPer10ms() →
bsp_KeyScan() → bsp_DetectKey() → bsp_PutKey()→s_tKey.Buf和s_tKey.Write
对s_tKey进行操作。
外部中断,通过:
bsp_InitKeyEXTI()函数中的
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOI,
EXTI_PinSource8);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,
EXTI_PinSource13);
……
等语句,配置中断;
比如按下按键K1,则进入
void EXTI9_5_IRQHandler(void)函数中,
if(EXTI_GetITStatus(EXTI_Line8)
!= RESET)
{
EXTI->IMR&=~(1<<8); //关闭中断
EXTI_ClearITPendingBit(EXTI_Line8); //清除中断标志位
g_ucKey1IRQ = 8;//在这里设置外部中断标志,这个值在bsp_KeyScan()函数里确认按键号
}
回到主函数中:
ucKeyCode =bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
bsp_GetKey()函数中
uint8_t
bsp_GetKey(void)
{
uint8_t
ret;
if
(s_tKey.Read == s_tKey.Write)
{
return
KEY_NONE;
}
else
{
ret
= s_tKey.Buf[s_tKey.Read];
if
(++s_tKey.Read >= KEY_FIFO_SIZE)
{
s_tKey.Read
= 0;
}
return
ret;
}
}
读取键值。