OpenEdv-开源电子网

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

STM32L151 的外部中断如何配置,请给示例

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-1-9
在线时间
0 小时
发表于 2015-1-9 22:48:57 | 显示全部楼层 |阅读模式
5金钱
谁有STM32L151的外部中断示例,谢谢!

最佳答案

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

我使用的是外部中断11,而且使用库函数。程序如下: void EXTI_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; /****************************Enable the GPIOA Clock***************************************/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /**************************GPIO Configuration*********************************************/ /**************************GPIO ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2015-1-9 22:48:58 | 显示全部楼层
我使用的是外部中断11,而且使用库函数。程序如下:



void EXTI_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/****************************Enable the GPIOA Clock***************************************/
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/**************************GPIO Configuration*********************************************/
/**************************GPIOA Configuration: Pin7,11***********************************/
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_40MHz;
    GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_IN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

EXTI_DeInit();
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void EXTI15_10_IRQHandler(void)
{
TIM_SetCompare4(TIM2,0);
GPIO_ResetBits(GPIOB, GPIO_Pin_2);
PROTECT_Reg |= 0x0001;
EXTI_ClearITPendingBit(EXTI_Line11);
}
需要那些库函数我就不罗嗦了,希望对你有帮助!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-1-9 23:42:07 | 显示全部楼层
没,帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

490

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1229
金钱
1229
注册时间
2012-8-4
在线时间
248 小时
发表于 2015-1-10 11:03:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
到处都看到坛主啊
nrf51822蓝牙4.0手环开发板: 淘宝小店
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-22
在线时间
5 小时
发表于 2016-4-28 09:07:49 | 显示全部楼层
footprint 发表于 2016-4-26 11:43
我使用的是外部中断11,而且使用库函数。程序如下:


#include "exti.h"

/*
* oˉêyÃû£oNVIC_Configuration
* Ãèêö  £oÅäÖÃǶì×Ïòá¿ÖD¶Ï¿ØÖÆÆ÷NVIC
* êäèë  £oÎT
* êä3ö  £oÎT
* μ÷óà £oÄú2¿μ÷óÃ
*/
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* ÅäÖ&#195[A|B|C|D|E]0ÎaÖD¶ÏÔ′ */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*
* oˉêyÃû£oEXTI_PB0_Config
* Ãèêö  £oÅäÖà PB0 ÎaÏßÖD¶Ï¿ú£¬2¢éèÖÃÖD¶ÏóÅÏè¼¶
* êäèë  £oÎT
* êä3ö  £oÎT
* μ÷óà £oía2¿μ÷óÃ
*/
void EXTI_PB0_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

        /* config the extiline(PB0) clock and AFIO clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,ENABLE);

        /* config the NVIC(PB0) */
        NVIC_Configuration();

        /* EXTI line gpio config(PB0) */       
        GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;      
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//éèÖÃ3ééÏà-êäèë
  GPIO_Init(GPIOB, &GPIO_InitStructure);

        /* EXTI line(PB0) mode config */
        EXTI_DeInit();
//         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //ϽμÑØÖD¶Ï
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET) //è·±£êÇ·ñ2úéúáËEXTI LineÖD¶Ï
        {
                // LED1 è¡·′               
                                   GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12))));
                EXTI_ClearITPendingBit(EXTI_Line0);     //Çå3yÖD¶Ï±ê־λ
        }  
}



请问这段函数,有什么问题吗?为什么我触发PB0 不能触发中断呢2
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-22
在线时间
5 小时
发表于 2016-4-28 09:09:33 | 显示全部楼层
footprint 发表于 2016-4-26 11:43
我使用的是外部中断11,而且使用库函数。程序如下:


#include "exti.h"


static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void EXTI_PB0_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,ENABLE);

       
        NVIC_Configuration();

               
        GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;      
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

        /* EXTI line(PB0) mode config */
        EXTI_DeInit();
//         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {
                               
                                   GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12))));
                EXTI_ClearITPendingBit(EXTI_Line0);     
}
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-4-28 15:29:38 | 显示全部楼层

第一,NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);这样设置却把IC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;合适吗?解决这个问题你看第一张图!
第二,你不能触发,有两种解决方法:
1,寄存器直接配置,看第二张图。如果看的明白你就配置。看不明白用第二种方法;
2,库函数方法,看第三张图最后一句。头文件是“stm32l1xx_syscfg.h”先加库函数文件再加头文件。看见最后一句话我想你应该知道怎么写了吧。
如果你还真解决不了,你再问我吧,把程序贴好,我给你修改!

第一张

第一张

第二张

第二张

第三张

第三张
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-22
在线时间
5 小时
发表于 2016-5-1 13:30:39 | 显示全部楼层
footprint 发表于 2016-4-28 15:29
第一,NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);这样设置却把IC_InitStructure.NVIC_IRQChannelP ...

哥,你帮我看看吧行不
#include "exti.h"
#include "key.h"

void EXTI_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_40MHz;
    GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_IN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}


void EXTI_PB0_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

EXTI_DeInit();
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource0);       
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) != RESET) //è·±£êÇ·ñ2úéúáËEXTI LineÖD¶Ï
  {
                        if( Key_Scan(GPIOB,GPIO_Pin_0) == KEY_ON  )
        {
       
                           GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12))));                        /*¿ØÖÆ·äÃùÆ÷·′×a*/
  
        }
               
//           // LED1 è¡·′               
//                 GPIO_WriteBit(GPIOB, GPIO_Pin_12,
//                              (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_12))));
    EXTI_ClearITPendingBit(EXTI_Line0);     //Çå3yÖD¶Ï±ê־λ
  }  
}
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-5-3 08:22:48 | 显示全部楼层
小天下521 发表于 2016-5-1 13:30
哥,你帮我看看吧行不
#include "exti.h"
#include "key.h"

中断应该能够触发,如果测试可以进入中断与否,可以在中断里面控制一个LED灯。你测试成功了就好了,我看也不能测试你的板子。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-22
在线时间
5 小时
发表于 2016-5-4 09:36:53 | 显示全部楼层
footprint 发表于 2016-5-3 08:22
中断应该能够触发,如果测试可以进入中断与否,可以在中断里面控制一个LED灯。你测试成功了就好了,我看 ...

但是,触发不成功。我把源代码穿上来,你在帮我看看行不?哥

stm32l151-usart1.zip

4.81 MB, 下载次数: 1402

源代码

回复

使用道具 举报

11

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-8-19
在线时间
30 小时
发表于 2016-8-19 14:22:41 | 显示全部楼层
stm32l151c8t6例程

GPIO与TIM.rar

10.81 MB, 下载次数: 2234

回复

使用道具 举报

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-1-3
在线时间
11 小时
发表于 2016-9-28 16:11:16 | 显示全部楼层
楼主的问题解决了没有?我现在也在用STM32L151做一个项目用到外部中断。硬件上设计的PB0作为外部中断,但是调试的时候发现,PB0无论怎么弄都不进中断。我刚开始以为是配置有问题,于是我用PA0作为外部中断,用基本相同的配置,结果PA0可以正常的进中断。然后又试了PA5,PA6,PA12等,都可以正常进中断;但是当用PB14,PB12的时候,发现可以进中断,但是会一直进,搞的系统无法正常跑。
我现在想知道GPIOB是不是不能做外部中断?
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-9-30 12:35:27 | 显示全部楼层
byg7199 发表于 2016-9-28 16:11
楼主的问题解决了没有?我现在也在用STM32L151做一个项目用到外部中断。硬件上设计的PB0作为外部中断,但是 ...

外部中断,应该是每个IO都可以的!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-5-13
在线时间
21 小时
发表于 2020-3-5 21:41:53 | 显示全部楼层
小天下521 发表于 2016-5-4 09:36
但是,触发不成功。我把源代码穿上来,你在帮我看看行不?哥

解决了吗,我很好奇怎么解决,我不太理解
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-8-23
在线时间
8 小时
发表于 2020-4-20 13:18:49 | 显示全部楼层
我用pa11页无法唤醒外部中断,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 21:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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