viayfy 发表于 2025-7-30 22:31

按键不会产生中断

本帖最后由 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);


probedog 发表于 2025-7-31 14:55

中断线配置错误?

powerantone 发表于 2025-7-31 14:55

NVIC优先级设置不当?

stormwind123 发表于 2025-7-31 14:56

硬件连接问题或软件冲突?

dffzh 发表于 2025-7-31 15:51

可以先测试与按键相连的GPIO引脚的输入波形,看按键按下后引脚电平是否会发生变化,以此先排除硬件问题。

viayfy 发表于 2025-7-31 19:53

stormwind123 发表于 2025-7-31 14:56
硬件连接问题或软件冲突?

初始化后键盘控制寄存器、键盘低频时钟等读出来都对的

丙丁先生 发表于 2025-8-1 22:19

感谢分享
页: [1]
查看完整版本: 按键不会产生中断