OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4405|回复: 1

使用STM32F405,使用PA15和另外几个引脚的外部中断,其他几个外部中断是好的,PA15无法进入中断,求助。

[复制链接]

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-2-4
在线时间
48 小时
发表于 2021-10-12 15:16:55 | 显示全部楼层 |阅读模式
30金钱
/********************************************************************************
函数名称:void LED_Init(void)
函数功能:实现驱动芯片使用的GPIO初始化
输入参数:none
输出参数:none
硬件分配:
          引脚号         引脚名称        系统功能       信号方向
                                         40               PC9          AZ_RESETA        输出
                                         34               PB13         AZ_RESETB        输出
                                         33               PB12         AZ_RESETC        输出
                                         
                                         35               PB14         AZ_FAULT         输入      
                                         36               PB15         AZ_OTW           输入
                                         
                                         52               PC11         EL_RESETA        输出
                                         45               PA12         EL_RESETB        输出
                                         44               PA11         EL_RESETC        输出

                 50               PA15         EL_FAULT         输入
                                         51               PC10         EL_OTW           输入                                          
*********************************************************************************/
void Motor_GPIO_Init(void)
        {
                GPIO_InitTypeDef  GPIO_InitStructure;
                NVIC_InitTypeDef  NVIC_InitStructure;
          EXTI_InitTypeDef  EXTI_InitStructure;
               
    //使能各GPIO时钟信号               
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);             //使能GPIOA时钟
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);             //使能GPIOB时钟
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);             //使能GPIOC时钟
//                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);             //使能GPIOC时钟
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);            //使能SYSCFG时钟
//                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
                               
                //初始化电机驱动的复位引脚
                GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11|GPIO_Pin_12;
                GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;                    //普通输出模式
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                    //推挽输出
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                //100MHz
                GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;                   //下拉,默认不打开驱动
                GPIO_Init(GPIOA, &GPIO_InitStructure);                            //初始化
       
                GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13|GPIO_Pin_12;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

                GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_11;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

          //复位所有电机驱动,等待使能指令
    AZ_RESETA=0;
    AZ_RESETB=0;
    AZ_RESETC=0;
    EL_RESETA=0;
    EL_RESETB=0;
    EL_RESETC=0;
               
    //初始化电机指示信息使用的IO口                   
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                        
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                      //普通输入模式
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                //100M
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                      //上拉,无效
                GPIO_Init(GPIOA, &GPIO_InitStructure);                            //初始化GPIOA15
               
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;            
                GPIO_Init(GPIOB, &GPIO_InitStructure);                            //初始化GPIOB14,GPIOB15

                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                        
                GPIO_Init(GPIOC, &GPIO_InitStructure);                            //初始化GPIOC10


               
    EXTI_DeInit();
               
    //将各输入与中断源连接
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource15);    //PA15连接到中断线15
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);    //PB14连接到中断线14
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource15);    //PB15连接到中断线15
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource10);    //PC10连接到中断线10

    //配置外部中断中断特性
                EXTI_InitStructure.EXTI_Line=EXTI_Line10|EXTI_Line14|EXTI_Line15; //设置中断源
                EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;                 //中断事件
                EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;      //下降沿触发
                EXTI_InitStructure.EXTI_LineCmd=ENABLE;                           //中断线使能
                EXTI_Init(&EXTI_InitStructure);                                   //配置

    //配置中断中断源
                NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;              //外部中断EXTI15_10_IRQn
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;      //抢占优先级0
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;             //子优先级0,设置最高优先级
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //使能外部中断通道
                NVIC_Init(&NVIC_InitStructure);                                   //配置               
        }
       
/*****************************************************************************
函数名称:void EXTI15_10_IRQHandler(void)
函数功能:外部触发中断的
输入参数:none
输出参数:none
硬件分配:none
******************************************************************************/
void EXTI15_10_IRQHandler(void)
        {
                if(EXTI_GetFlagStatus(EXTI_Line10))                                //俯仰驱动过温
                  {
                    EXTI_ClearFlag(EXTI_Line10);                                         //清除外部中断
        Servo_Check&=0xfd;                               
                        }
                else if(EXTI_GetFlagStatus(EXTI_Line14))                           //方位驱动错误
                  {
                    EXTI_ClearFlag(EXTI_Line14);                                         //清除外部中断
        Servo_Check&=0xfb;                               
                        }
                else if(EXTI_GetFlagStatus(EXTI_Line15))                           //俯仰驱动错误、方位驱动过温
                  {
                    EXTI_ClearFlag(EXTI_Line15);                                         //清除外部中断
                                if(AZ_OTW==0)
          Servo_Check&=0xfe;                                           //方位驱动过温
        if(EL_FAULT==0)
          Servo_Check&=0xf7;                                           //俯仰驱动错误                                       
                        }
                else ;
        }

最佳答案

查看完整内容[请看2#楼]

已经解决,自己想法错了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-2-4
在线时间
48 小时
 楼主| 发表于 2021-10-12 15:16:56 | 显示全部楼层
已经解决,自己想法错了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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