1、硬件连接
可以看出,PA0通过R7下拉到GND,按键按下时, PA0的电压为3.3V,没有按下时,PA0的电压为0V,因此可以通过判断上升沿,判断按键是否按下。
2、中断函数
查看startup_at32f425.s文件,发现外部IO中断只有3个中断函数,分别是: EXINT1_0_IRQHandler EXINT3_2_IRQHandler EXINT15_4_IRQHandler 从这里也可以看出, PX0-PX1,对应一个中断函数, PX2-PX3,对应一个中断函数, PX4-PX15,对应一个中断函数, 需要在中断函数中判断,具体是哪个中断源, 这一点与SXX32和GX32是不一样的。
3、代码实现 - static uint8_t KeyState=0;
- void KeyInit(void)
- {
- gpio_init_type gpio_init_structure;
-
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
-
- gpio_default_para_init(&gpio_init_structure);
- /* configure the led gpio */
- gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_structure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_structure.gpio_mode = GPIO_MODE_INPUT;
- gpio_init_structure.gpio_pins = GPIO_PINS_0;
- gpio_init_structure.gpio_pull = GPIO_PULL_DOWN;
- gpio_init(GPIOA, &gpio_init_structure);
-
- exint_init_type exint_init_structure;
-
- exint_default_para_init(&exint_init_structure);
-
- exint_init_structure.line_enable= TRUE;
- exint_init_structure.line_mode=EXINT_LINE_INTERRUPUT;
- exint_init_structure.line_polarity=EXINT_TRIGGER_RISING_EDGE;
- exint_init_structure.line_select=EXINT_LINE_0;
-
- exint_init(&exint_init_structure);
-
- nvic_irq_enable(EXINT1_0_IRQn,4,0);
- }
- void KeyPolling(void)
- {
- if(KeyState)
- {
- KeyState=0;
- printf("key press\r\n");
- }
- }
- void EXINT1_0_IRQHandler(void)
- {
- if(RESET!=exint_flag_get(EXINT_LINE_0))
- {
- exint_flag_clear(EXINT_LINE_0);
- KeyState=1;
- }
- }
4、现象
|