OpenEdv-开源电子网

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

新手,刚学32几天 按键触发外部中断老是调不好 去了别的论坛没人肯教我

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-1-22
在线时间
0 小时
发表于 2012-1-22 16:17:55 | 显示全部楼层 |阅读模式

连续两天三点才睡了,就调这个程序,老是不行。中断线只能是2和3,而且还要指明是外部中断源2和外部中断源3  随意换一个中断线或者是中断源就不行了  不知道是怎么回事,好苦恼啊。



#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "misc.h"
#include "stm32f10x_gpio.h"
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;

    //使能外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部晶振稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    //如果外部晶振启动成功,则进行下一步操作
    if(HSEStartUpStatus==SUCCESS)
    {
        //设置HCLK(AHB时钟)=SYSCLK
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        //PCLK1(APB1) = HCLK/2
        RCC_PCLK1Config(RCC_HCLK_Div2);

        //PCLK2(APB2) = HCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);
       
 
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
        //启动PLL
        RCC_PLLCmd(ENABLE);
        //等待PLL稳定
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        //系统时钟SYSCLK来自PLL输出
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //切换时钟后等待系统时钟稳定
        while(RCC_GetSYSCLKSource()!=0x08); 
     }
   /* RCC system reset(for debug purpose) */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO , ENABLE); //给GPIOA和重映射提供时钟,注意:一定要设置RCC_APB2Periph_AFIO

}


/**********************************************************************
* 名    称:GPIO_Configuration()
* 功    能:配置输入输出
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:使用库函数,配置IO口
***********************************************************************/
 void GPIO_Configuration(void)
 {

  GPIO_InitTypeDef  GPIO_InitStructure;
  /*设置PE3.PE2为输入*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 |GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOE,&GPIO_InitStructure);

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7 | GPIO_Pin_6;   //LED
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_13 | GPIO_Pin_6;   //LED
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOD,&GPIO_InitStructure);
 }

/**********************************************************************
* 名    称:EXTI_Configuration()
* 功    能:
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
void EXTI_Configuration(void)
{
  EXTI_InitTypeDef  EXTI_InitStructure;


  /* Configure EXTI Line3 to generate an interrupt on falling edge */ 
  EXTI_InitStructure.EXTI_Line = EXTI_Line3;                   //外部中断通道3
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;        //使能
  EXTI_Init(&EXTI_InitStructure);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);  //将PE3连接到外部中断通道3

    EXTI_InitStructure.EXTI_Line = EXTI_Line2;                   //外部中断通道2
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;        //使能
  EXTI_Init(&EXTI_InitStructure);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);  //将PE2连接到外部中断通道2
}

/**************************************************
-
 
********************
* 名    称:NVIC_Configuration()
* 功    能:
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
 void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure; 

#ifdef  VECT_TAB_RAM 
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //抢占式优先级别设置为无抢占优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;    //指定中断源3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道3
  NVIC_Init(&NVIC_InitStructure);


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //抢占式优先级别设置为无抢占优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;    //指定中断源2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道2
  NVIC_Init(&NVIC_InitStructure);
}
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

/**********************************************************************
* 名    称:main()
* 功    能:主函数
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
int main (void)
{

 RCC_Configuration();  //配置时钟                     
 GPIO_Configuration(); //配置IO口
 NVIC_Configuration(); //中断配置
 EXTI_Configuration(); //外部中断配置
 while(1)
 {

  }
 }

 /**********************************************************************
* 名    称:EXTI3_IRQHandler()
* 功    能:外部中断通道3中断
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
***********************************************************************/
void EXTI3_IRQHandler (void)
 {
   if(EXTI_GetITStatus(EXTI_Line3)!= RESET)
    {
    
    GPIO_SetBits(GPIOD,GPIO_Pin_6); 
    Delay(2000000);
 GPIO_ResetBits(GPIOD,GPIO_Pin_6);

     EXTI_ClearFlag(EXTI_Line3);          //清除中断标志(必须)
     EXTI_ClearITPendingBit(EXTI_Line3);
     }
 }
 void EXTI2_IRQHandler (void)
 {
   if(EXTI_GetITStatus(EXTI_Line2)!= RESET)
    {
    
    GPIO_SetBits(GPIOD,GPIO_Pin_13); 
    Delay(2000000);
 GPIO_ResetBits(GPIOD,GPIO_Pin_13);

     EXTI_ClearFlag(EXTI_Line2);          //清除中断标志(必须)
     EXTI_ClearITPendingBit(EXTI_Line2);
     }
 }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-1-22
在线时间
0 小时
 楼主| 发表于 2012-1-22 16:21:59 | 显示全部楼层
我是一个不服输的人,不想放弃,不想卡在这里,但我已经没招了。求大神,求原子哥。小弟祝你们新年快乐,身体健康,财源广进
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-1-22
在线时间
0 小时
 楼主| 发表于 2012-1-22 16:35:59 | 显示全部楼层
大神们看,上面那个程序是可以的。我这么一改就不行了。太奇怪了就是换了中断线和按键而已,其他没改。

#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "misc.h"
#include "stm32f10x_gpio.h"
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;

    //使能外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部晶振稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    //如果外部晶振启动成功,则进行下一步操作
    if(HSEStartUpStatus==SUCCESS)
    {
        //设置HCLK(AHB时钟)=SYSCLK
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        //PCLK1(APB1) = HCLK/2
        RCC_PCLK1Config(RCC_HCLK_Div2);

        //PCLK2(APB2) = HCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);
        
 
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
        //启动PLL
        RCC_PLLCmd(ENABLE);
        //等待PLL稳定
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        //系统时钟SYSCLK来自PLL输出
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //切换时钟后等待系统时钟稳定
        while(RCC_GetSYSCLKSource()!=0x08);  
     }
   /* RCC system reset(for debug purpose) */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO , ENABLE); //给GPIOA和重映射提供时钟,注意:一定要设置RCC_APB2Periph_AFIO

}


/**********************************************************************
* 名    称:GPIO_Configuration()
* 功    能:配置输入输出
* 入口参数: 
* 出口参数:
-----------------------------------------------------------------------
* 说明:使用库函数,配置IO口
***********************************************************************/
 void GPIO_Configuration(void)
 {

  GPIO_InitTypeDef  GPIO_InitStructure;
  /*设置PE3.PE2为输入*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;    //按键
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOE,&GPIO_InitStructure);

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7 | GPIO_Pin_6;   //LED
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_13 | GPIO_Pin_6;   //LED
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOD,&GPIO_InitStructure);
 }

/**********************************************************************
* 名    称:EXTI_Configuration()
* 功    能:
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
void EXTI_Configuration(void)
{
  EXTI_InitTypeDef  EXTI_InitStructure;


  /* Configure EXTI Line3 to generate an interrupt on falling edge */  
  EXTI_InitStructure.EXTI_Line = EXTI_Line4;                   //外部中断通道3
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;        //使能
  EXTI_Init(&EXTI_InitStructure);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);  //将PE3连接到外部中断通道3

    EXTI_InitStructure.EXTI_Line = EXTI_Line5;                   //外部中断通道2
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;        //使能
  EXTI_Init(&EXTI_InitStructure);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);  //将PE2连接到外部中断通道2
}

/************************************************** 
-
 
********************
* 名    称:NVIC_Configuration()
* 功    能:
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
 void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;  

#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //抢占式优先级别设置为无抢占优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;    //指定中断源3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道3
  NVIC_Init(&NVIC_InitStructure);


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //抢占式优先级别设置为无抢占优先级
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;    //指定中断源2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道2
  NVIC_Init(&NVIC_InitStructure);

void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

/**********************************************************************
* 名    称:main()
* 功    能:主函数
* 入口参数: 
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
int main (void) 
{

 RCC_Configuration();  //配置时钟                      
 GPIO_Configuration(); //配置IO口
 NVIC_Configuration(); //中断配置
 EXTI_Configuration(); //外部中断配置
 while(1)
 {

  }
 }

 /**********************************************************************
* 名    称:EXTI3_IRQHandler()
* 功    能:外部中断通道3中断
* 入口参数: 
* 出口参数:
-----------------------------------------------------------------------
***********************************************************************/
void EXTI3_IRQHandler (void)
 {
   if(EXTI_GetITStatus(EXTI_Line4)!= RESET) 
    {
     
    GPIO_SetBits(GPIOD,GPIO_Pin_6);
    Delay(2000000);
GPIO_ResetBits(GPIOD,GPIO_Pin_6);

     EXTI_ClearFlag(EXTI_Line4);          //清除中断标志(必须)
     EXTI_ClearITPendingBit(EXTI_Line4);
     }
 }
 void EXTI2_IRQHandler (void)
 {
   if(EXTI_GetITStatus(EXTI_Line5)!= RESET) 
    {
     
    GPIO_SetBits(GPIOD,GPIO_Pin_13);
    Delay(2000000);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);

     EXTI_ClearFlag(EXTI_Line5);          //清除中断标志(必须)
     EXTI_ClearITPendingBit(EXTI_Line5);
     }
 }   
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-1-22 16:58:56 | 显示全部楼层
我不用库的哇…
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-1-22
在线时间
0 小时
 楼主| 发表于 2012-1-22 17:06:22 | 显示全部楼层
外部中断从0-4都试了一遍 只有2和3起作用  
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-1-22 18:25:46 | 显示全部楼层
那你要看看是不是和jtag冲突!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-1-22
在线时间
0 小时
 楼主| 发表于 2012-1-22 18:28:52 | 显示全部楼层
解决了。是自己对STM32中断的配置理解不透侧。习惯性把单片机的中断概念带到32来了。。
总结下,让新手不在犯我的错误。
如果我们配置的PE1,那么采用的外部中断也必须是EXTI1,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。外部针脚为PE2,外部中断也必须是EXTI2.第二,如果选择中断线Line2,则必须对应开设中断EXTI2,中断线和中断要一一对应。第三,EXT5-9   共用一个中断源,就是说当配置外部针脚为PE5时,对应开中断线Line5.但中断源就要选择EXTI9_5_IRQn。由于EXT5-9   共用一个中断源,5-9脚的中断源也是选择它。希望新手吸取我的教训。。老鸟勿喷啊。。。 
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-1-22
在线时间
0 小时
 楼主| 发表于 2012-1-22 18:31:05 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子大哥。。是我自己弱爆了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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