野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13328|回复: 3

中断无法正常使用

[复制链接]
发表于 2020-4-23 19:59:34 | 显示全部楼层 |阅读模式
本帖最后由 ADIC 于 2020-4-23 20:43 编辑

我写了一个中断程序,来实现C8T6核心板的按键检测使LED1和LED2反转,结果只能用KEY1控制LED1的反转,KEY2不起作用。用仿真器仿真的时候全速运行会直接进入KEY2的中断里,KEY2接的是GPIOC_Pin13。我在仿真里查看EXTI的PR寄存器时,只要EXTI_Config();函数运行完后PR13就为1,找了很久都不知道错在哪。

建议先看二楼和三楼,再看程序
主程序
int main(void)
{
        GPIO_KEY_LED_Config();
        EXTI_Config();
        while(1)
        {
        }
}

bsp_c8t6.h文件
#ifndef __BSP_C8T6__
#define __BSP_C8T6__

#include "stm32f10x.h"

#define  LED1_GPIO_PORT         GPIOA
#define  LED1_GPIO_PIN                PIO_Pin_1
#define  LED1_RCC_PORT          RCC_APB2Periph_GPIOA
#define  LED1_ON                     GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define  LED1_OFF                    GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define  LED1_TOGGLE                LED1_GPIO_PORT->ODR ^= LED1_GPIO_PIN

#define  LED2_GPIO_PORT         GPIOA
#define  LED2_GPIO_PIN                GPIO_Pin_2
#define  LED2_RCC_PORT           RCC_APB2Periph_GPIOA
#define  LED2_ON                     GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define  LED2_OFF                    GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define  LED2_TOGGLE                LED2_GPIO_PORT->ODR ^= LED2_GPIO_PIN

#define  LED3_GPIO_PORT          GPIOA
#define  LED3_GPIO_PIN                 GPIO_Pin_3
#define  LED3_RCC_PORT           RCC_APB2Periph_GPIOA
#define  LED3_ON                      GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define  LED3_OFF                     GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define  LED3_TOGGLE                 LED3_GPIO_PORT->ODR ^= LED3_GPIO_PIN

#define  KEY1_GPIO_PORT              GPIOA
#define  KEY1_GPIO_PIN                    GPIO_Pin_0
#define  KEY1_RCC_PORT               RCC_APB2Periph_GPIOA
#define  KEY1_IRQChannel             EXTI0_IRQn
#define  KEY1_EXTI_Line                    EXTI_Line0

#define  KEY2_GPIO_PORT              GPIOC
#define  KEY2_GPIO_PIN                    GPIO_Pin_13
#define  KEY2_RCC_PORT               RCC_APB2Periph_GPIOC
#define  KEY2_IRQChannel             EXTI15_10_IRQn
#define  KEY2_EXTI_Line                    EXTI_Line13


void GPIO_KEY_LED_Config(void);
void SysTick_Delay_ms(uint32_t ms);
void EXTI_Config(void);

#endif /*__BSP_C8T6__*/


bsp_c8t6.c文件
void GPIO_KEY_LED_Config(void)
{
        GPIO_InitTypeDef        GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(LED1_RCC_PORT | KEY2_RCC_PORT, ENABLE);
        //LED
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = LED1_GPIO_PIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStruct);
        GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
        
        GPIO_InitStruct.GPIO_Pin = LED2_GPIO_PIN;
        GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStruct);
        GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
        
        GPIO_InitStruct.GPIO_Pin = LED3_GPIO_PIN;
        GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStruct);
        GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
        
        //KEY1
        GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
        
        GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);
}




static void NVIC_Config(void)
{
        NVIC_InitTypeDef        NVIC_InitStruct;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        //key1
        NVIC_InitStruct.NVIC_IRQChannel = KEY1_IRQChannel;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
        
        //key2
        NVIC_InitStruct.NVIC_IRQChannel = KEY2_IRQChannel;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
}

void EXTI_Config(void)
{
        EXTI_InitTypeDef        EXTI_InitStruct;
        NVIC_Config();
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        EXTI_InitStruct.EXTI_Line = KEY1_EXTI_Line;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
        EXTI_InitStruct.EXTI_Line = KEY2_EXTI_Line;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);
        
        EXTI_ClearFlag(KEY1_EXTI_Line|KEY2_EXTI_Line);
}


回复

使用道具 举报

 楼主| 发表于 2020-4-23 20:33:17 | 显示全部楼层
我时真的无语,现在问题不是死在了中断里,而是在仿真里查看EXTI的PR寄存器时,只要EXTI_Config();函数运行完后PR13就为1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-23 20:42:44 | 显示全部楼层
1.png 很明确,我用仿真看PR寄存器的PR13就在图中这个函数里最后一条执行完后置1,我一模一样一模一样一模一样的配置我用在KEY1为啥PR1就不置1呢?????????????????????????
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 14:22:35 | 显示全部楼层
别沉啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-26 01:49 , Processed in 0.037737 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表