你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F373无法响应部分外部中断

[复制链接]
yangwenchao2000 提问时间:2015-7-10 15:38 /
将PA8,PA15,PB5,PB6,PE8,PE9配置为外部中断,只有PA8,PA15,PE9管脚上产生的中断信号可以被响应,其他管脚上的中断信号响应不到。有使用FREE RTOS。

时钟配置:
void Clock_Init(void)
{
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM,ENABLE);
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FLITF,ENABLE);
        
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |     \
                                      RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD |     \
                                       RCC_AHBPeriph_GPIOE , ENABLE);
        
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB1Periph_SPI3, ENABLE);
        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
         
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
}


中断管脚配置:
void Ext_Int_Port_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;

   /* Configure PA8, PA15 as input Pull-UP */
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
        
   /* Configure PB5, PB6 as input Pull-UP */
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;        
   GPIO_Init(GPIOB,&GPIO_InitStructure);
        
    /* Configure PE8, PE9 as input Pull-UP */
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
   GPIO_Init(GPIOE,&GPIO_InitStructure);
}


中断线连接配置,中断模式、触发方式、使能配置
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    /*connect PA8,PA15 to EXTI*/         
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource8 | EXTI_PinSource15);
    /*connect PB5,PB6 to EXTI*/
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5 | EXTI_PinSource6);
    /*connect PE8,PE9 to EXTI*/
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource8 | EXTI_PinSource9);
        
    /*Config */
    EXTI_InitStructure.EXTI_Line    = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9 | EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
}


中断向量表配置:
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef   NVIC_InitStructure;

    /* Set the Vector Table base location at 0x08000000 */  
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x08000000);

    /* Configure the NVIC Preemption Priority Bits*/   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
        
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}



发现程序中配置PB5,PB6连接EXIT Line 5,line6,没有配置成功,因为在PA5、PA6上施加触发信号时程序能响应中断。说明SYSCFG_EXTICR2寄存器没有配置成功(依然为默认值000),所以在PA5、PA6上的中断信号能被响应。同样,如果仅配置PE8连接EXIT line8,而不配置PA8连接EXIT line8,只能响应到PA8上的中断,而不能响应PE8上的中断。
说明SYSCFG模块没正常工作。
但是如果SYSCFG模块没工作,PE9上的中断为什么能被响应?为什么PE9能配置成功,PE8、PB5、PB6就不能配置成功?


收藏 评论16 发布时间:2015-7-10 15:38

举报

16个回答
yangwenchao2000 回答时间:2015-7-13 16:41:51
本帖最后由 yangwenchao2000 于 2015-7-13 16:43 编辑
安 发表于 2015-7-13 14:00
执行完以后,寄存器的值.

原来是EXTI_PinSourcex相互之间不能“按位或”运算。
改成这样就行了:
           /*connect PA8  to EXTI*/          
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource8);
          /*connect PA15 to EXTI*/          
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource15);
          /*connect PB5  to EXTI*/
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5);
          /*connect PB6  to EXTI*/
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource6);
          /*connect PE8  to EXTI*/
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource8);
          /*connect PE9  to EXTI*/
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource9);

之前只检查了EXTI_Linex能不能“按位或”,而没有检查EXTI_PinSourcex,哎......


yangwenchao2000 回答时间:2015-7-10 17:50:12
安 发表于 2015-7-10 16:59
我在想一个问题如下,如果是这样配置,
那么LINE=00000101|00000110|00001000|00001001|00001111
结果是LIN ...

不会的。
STM32F37x标准库的头文件stm32f37x_exti.h中是这样定义的:
#define EXTI_Line5       ((uint32_t)0x00000020)  /*!< External interrupt line 5  */
#define EXTI_Line6       ((uint32_t)0x00000040)  /*!< External interrupt line 6  */
#define EXTI_Line8       ((uint32_t)0x00000100)  /*!< External interrupt line 8  */
#define EXTI_Line9       ((uint32_t)0x00000200)  /*!< External interrupt line 9  */
#define EXTI_Line15      ((uint32_t)0x00008000)  /*!< External interrupt line 15 */

另外,即使真的是只配置0x0F的中断,那么PA5,PA6,PA8,PE9上的中断又怎么能响应?我感觉是SYSCFG模块这里有问题。原先PE9上的中断信号也是响应不到的,当开启SYSCFG模块的时钟时,PE9上的中断信号才能被响应到。但是其他管脚(PB5,PB6,PE8)上的中断还是不能响应。
yangwenchao2000 回答时间:2015-7-13 10:34:40
安 发表于 2015-7-13 09:55
楼主可以把执行LINE配置以后的EXTI寄存器发一下吗?

/*Config */
    EXTI_InitStructure.EXTI_Line    = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9 | EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

上面这个不就是吗?
creep 回答时间:2015-7-10 15:49:31
PE8 和PA8连接的是同一个EXTI_Line吧。
yangwenchao2000 回答时间:2015-7-10 16:01:26
creep 发表于 2015-7-10 15:49
PE8 和PA8连接的是同一个EXTI_Line吧。

是的,没关系,可以分时复用。
废鱼 回答时间:2015-7-10 16:59:12
我在想一个问题如下,如果是这样配置,
那么LINE=00000101|00000110|00001000|00001001|00001111
结果是LINE=00001111=0x0F
也就是配置的0x0F的中断,其他的中断没有配置?

EXTI_InitStructure.EXTI_Line    = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9 | EXTI_Line15;
埃斯提爱慕 回答时间:2015-7-10 21:12:00
提示: 作者被禁止或删除 内容自动屏蔽
废鱼 回答时间:2015-7-11 09:19:58
我看的是3xx的库。等我去下载一个373的看一下。
废鱼 回答时间:2015-7-11 09:41:54
楼主可以把373的库上传一下吗?
yangwenchao2000 回答时间:2015-7-13 08:55:00
本帖最后由 yangwenchao2000 于 2015-7-13 08:59 编辑
安 发表于 2015-7-11 09:41
楼主可以把373的库上传一下吗?

附件是stm32f37x_dsp_stdperiph_lib中的LIBRARIES。整个库太大了,传不上来。

Libraries.rar

下载

8.07 MB, 下载次数: 14, 下载积分: ST金币 -1

yangwenchao2000 回答时间:2015-7-13 08:57:38
dsjsjf 发表于 2015-7-10 21:12
那几个口有没有被其他复用功用占用呢?

没有。
废鱼 回答时间:2015-7-13 09:55:43
楼主可以把执行LINE配置以后的EXTI寄存器发一下吗?
废鱼 回答时间:2015-7-13 14:00:35
执行完以后,寄存器的值.
yangwenchao2000 回答时间:2015-7-13 16:47:15
本帖最后由 yangwenchao2000 于 2015-7-13 16:48 编辑
creep 发表于 2015-7-10 15:49
PE8 和PA8连接的是同一个EXTI_Line吧。

PE8和PA8连接的是同一个EXIT_Line,没考虑到同一时刻只能有一个端口连接的EXIT_Line,尽管可以分时复用,但对于随机出现的外部中断来说没有意义。所以不能将PE8和PA8一并配置到Exit_Line上。
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版