本帖最后由 viayfy 于 2025-7-30 22:37 编辑
使用PA0,PA1,PB8,PB9,PB10组成一个2*3的键盘矩阵,参考例程配置后,按键时无法产生中断,是怎么回事?初始化配置流程软件是;
void KEYSCAN_Configuration(uint8_t key_mask, uint8_t mode, uint8_t dts, uint8_t wts, bool int_en)
{
/* KEYSCAN CLK EN */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO, ENABLE);
RCC->LSCTRL |= RCC_LSCTRL_KEYSCANEN;
/* config GPIO */
GPIO_InitStruct(&GPIO_InitStructure);
if(key_mask == KEY_65)
{
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
}
else if(key_mask == KEY_44)
{
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
}
else
{
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 ;
}
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_OD;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF5;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = 0; //deinit
if(key_mask == KEY_65 ||key_mask == KEY_44)
{
GPIO_InitStructure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
}
else
{
GPIO_InitStructure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
}
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_OD;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF5;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
//GpioKeypadInit(GPIOA,GPIO_PIN_0 | GPIO_PIN_1);
//GpioKeypadInit(GPIOB,GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10);
/* config KEYSCAN */
KEYSCAN_InitStructure.Mask = key_mask;
KEYSCAN_InitStructure.Mode = mode;
KEYSCAN_InitStructure.Wts = wts;
KEYSCAN_InitStructure.Dts = dts;
KEYSCAN_InitStructure.Int_en = int_en;
KEYSCAN_Init(&KEYSCAN_InitStructure);
/* config intterrupt */
if(int_en)
{
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line = EXTI_LINE13;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitPeripheral(&EXTI_InitStructure);
NVIC_DisableIRQ(KEYSCAN_IRQn);
/* Enable the KEYSCAN Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = KEYSCAN_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
ModuleIrqRemoval(KEYSCAN_IRQn);
ModuleIrqRegister(KEYSCAN_IRQn,KEYSCAN_IRQHandler);
APP_DEBUG("Keypad INT init,%x\r\n",KEYSCAN->KEYCR);
}
/* Enable KEYSCAN */
KEYSCAN_Enable(ENABLE);
}
协议运行后,调用初始化函数: KEYSCAN_Configuration(KEY_44,MODE_PRESS_TRIG, DTS_10MS, WTS_0MS, INT_EN);
|