打印

STM32Z中断问题

[复制链接]
1657|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cjystar|  楼主 | 2013-9-7 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     以下是我的中断程序,可是为什在我没有触发中断(PA2)程序一下载时候二极管就亮了,在以后我把其他的全部注释了,只有GPIO的初始化的部分也没有给端口送数据,程序以一进去等还是亮的(都没有了中断服务程序了)。新手,请大家指教。


#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"

int main()
{
   GPIO_InitTypeDef GPIO_InitStruct;
  EXTI_InitTypeDef EXTI_InitStruct;
  NVIC_InitTypeDef NVIC_InitStruct;
  delay_init(72);
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
   
   //GPIO_InitTypeDef GPIO_InitStruct;   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA,&GPIO_InitStruct);

   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
   

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
  EXTI_InitStruct.EXTI_Line=EXTI_Line2;
  EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
  EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  EXTI_Init(&EXTI_InitStruct);


  
  
  NVIC_InitStruct.NVIC_IRQChannel=EXTI2_IRQn;
   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0X02;
   NVIC_InitStruct.NVIC_IRQChannelSubPriority=0X02;
   NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
   NVIC_Init(&NVIC_InitStruct);

}


void EXTI2_IRQHandler(void)
{
       if(!PAin(2))
       {
    delay_ms(5);
    if(!PAin(2))
    PAout(8)=0;
    else
    PAout(8)=1;  
   }
   EXTI_ClearITPendingBit(EXTI_Line2);
}
沙发
350182617| | 2013-9-7 22:07 | 只看该作者
在初始化端口时写下输出的OD寄存器试试,在这句前写 GPIO_Init(GPIOA,&GPIO_InitStruct);
这样可以使端口输出状态是你希望的初始化值。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cjystar + 1
板凳
haibian826| | 2013-9-7 22:53 | 只看该作者
上电前,如果没有特地置高电平,在初始化后,IO口默认低电平。
如果刚好,LED灯是低电平点亮,那就亮了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
cjystar + 2 赞一个!
地板
cjystar|  楼主 | 2013-9-8 14:26 | 只看该作者
我在GPIO配置后  GPIO_Write(GPIOA, 0xffff);将其初始化为高电平,但是貌似还是进不去中断,帮忙看看我的中断是不是有什么问题?

使用特权

评论回复
5
cjystar|  楼主 | 2013-9-8 14:30 | 只看该作者
haibian826 发表于 2013-9-7 22:53
上电前,如果没有特地置高电平,在初始化后,IO口默认低电平。
如果刚好,LED灯是低电平点亮,那就亮了。 ...

我在GPIO配置后  GPIO_Write(GPIOA, 0xffff);将其初始化为高电平,但是貌似还是进不去中断,帮忙看看我的中断是不是有什么问题?

使用特权

评论回复
6
350182617| | 2013-9-9 20:24 | 只看该作者
GPIO配置后到你写端口高电平间就会产生低电平,二楼提到了,在GPIO_Init(GPIOA,&GPIO_InitStruct);
这句前加GPIOA->ODR = 0xffff,就可以把A端口输出初始化为高电平。
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
这个配置成上拉,你端口触发是下降沿。

使用特权

评论回复
7
cjystar|  楼主 | 2013-9-10 12:00 | 只看该作者
谢谢楼上的帮助,我有重新的把程序改了一下,但是通过实验始终是进不去中断,找了好久了,希望大家给予建议,谢谢
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"

int main()
{
           GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        SystemInit();
        delay_init(72);
         
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  //初始化 KEY0-->GPIOA.13,  上拉输入
          GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);


   GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8;
   GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;   
   GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;           
   GPIO_Init(GPIOA,&GPIO_InitStructure);
   GPIO_SetBits(GPIOA,GPIO_Pin_8);
  
//GPIOA.13 中断线以及中断初始化配置
   
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);
          EXTI_InitStructure.EXTI_Line=EXTI_Line13;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);
        EXTI_DeInit();

                         //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;           //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);
}       
void EXTI15_10_IRQHandler(void)
{
          delay_ms(10);    //消抖                         
    if(EXTI_GetITStatus(EXTI_Line13) != RESET)
        {
                 PAout(8)=0;        //LED低电平点亮
        }
        EXTI_ClearITPendingBit(EXTI_Line13);  //清除EXTI13线路挂起位
}

使用特权

评论回复
8
cjystar|  楼主 | 2013-9-10 21:13 | 只看该作者
各位大侠帮忙看看

使用特权

评论回复
9
cjystar|  楼主 | 2013-9-11 09:26 | 只看该作者
问题解决,忘记在主函数中加死while(1)循环了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

80

帖子

1

粉丝