OpenEdv-开源电子网

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

关于HAL库外部中断,求教!

[复制链接]

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
发表于 2017-6-8 00:26:45 | 显示全部楼层 |阅读模式
1金钱
请问,如果同时使用P7、P8口作为外部中断引脚,中断函数该怎么写?void PB7_Exit(void)
{
        GPIO_InitTypeDef GPIO_Initure;

     __HAL_RCC_GPIOB_CLK_ENABLE();                 
               
        GPIO_Initure.Pin=GPIO_PIN_7;               
    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;  
    GPIO_Initure.Pull=GPIO_PULLUP;                       
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);

    //
        HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,2);
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);         
}

void PH8_Exit(void)
{
        GPIO_InitTypeDef GPIO_Initure;

     __HAL_RCC_GPIOH_CLK_ENABLE();                  
               
        GPIO_Initure.Pin=GPIO_PIN_8;               
    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;
    GPIO_Initure.Pull=GPIO_PULLUP;       
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);

    //
        HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,3);
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);      
}

void EXTI9_5_IRQHandler(void)
{
        OS_ERR err;
        CPU_SR_ALLOC();
        OS_CRITICAL_ENTER();            
        HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);  //这句应该怎么写?是写成这样吗?HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7|GPIO_PIN_8)
        OS_CRITICAL_EXIT();                  
}


求教!!!!

最佳答案

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

回调函数里面写!不同的IO口可以用不同的函数!看F429的外部中断实验!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-6-8 00:26:46 | 显示全部楼层
回调函数里面写!不同的IO口可以用不同的函数!看F429的外部中断实验!
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3565
金钱
3565
注册时间
2016-1-8
在线时间
543 小时
发表于 2017-6-8 09:24:55 | 显示全部楼层
EXTI9_5_IRQHandle  我用的HAL库没有这个,都是用回调函数
回复

使用道具 举报

1

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2015-4-7
在线时间
94 小时
发表于 2017-6-8 16:02:12 | 显示全部楼层
HAL库的中断  包括串口接收  定时器中断等我都是在回调函数里写的
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2017-6-10 13:58:14 | 显示全部楼层
说的是这个例程?
#include "exti.h"
#include "delay.h"
#include "led.h"
#include "key.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F429开发板
//外部中断驱动代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2016/1/5
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        

//外部中断初始化
void EXTI_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
   
    __HAL_RCC_GPIOA_CLK_ENABLE();               //开启GPIOA时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();               //开启GPIOC时钟
    __HAL_RCC_GPIOH_CLK_ENABLE();               //开启GPIOH时钟
   
    GPIO_Initure.Pin=GPIO_PIN_0;                //PA0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING;      //上升沿触发
    GPIO_Initure.Pull=GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
   
    GPIO_Initure.Pin=GPIO_PIN_13;               //PC13
    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;     //下降沿触发
    GPIO_Initure.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);
   
    GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3;     //PH2,3
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);
   
    //中断线0-PA0
    HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);       //抢占优先级为2,子优先级为0
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);             //使能中断线0
   
    //中断线2-PH2
    HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);       //抢占优先级为2,子优先级为1
    HAL_NVIC_EnableIRQ(EXTI2_IRQn);             //使能中断线2
   
    //中断线3-PH3
    HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);       //抢占优先级为2,子优先级为2
    HAL_NVIC_EnableIRQ(EXTI3_IRQn);             //使能中断线2
   
    //中断线13-PC13
    HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3);   //抢占优先级为2,子优先级为3
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);         //使能中断线13  
}


//中断服务函数
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//调用中断处理公用函数
}

void EXTI2_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);//调用中断处理公用函数
}

void EXTI3_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);//调用中断处理公用函数
}

void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//调用中断处理公用函数
}

//中断服务程序中需要做的事情
//在HAL库中所有的外部中断服务函数都会调用此函数
//GPIO_Pin:中断引脚号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(100);      //消抖
    switch(GPIO_Pin)
    {
        case GPIO_PIN_0:
            if(WK_UP==1)
            {
                                LED1=!LED1;//控制LED0,LED1互斥点亮
                                LED0=!LED1;
            }
            break;
        case GPIO_PIN_2:
            if(KEY1==0)  //LED1翻转
            {
                LED1=!LED1;   
            }
            break;
        case GPIO_PIN_3:
            if(KEY0==0)  //同时控制LED0,LED1翻转
            {
                LED0=!LED0;
                                LED1=!LED1;
            }
            break;

        case GPIO_PIN_13:
            if(KEY2==0)  
            {
                                LED0=!LED0;//控制LED0翻转
            }
            break;
    }
}
这个例程是PA0、PC13、PH2、PH3,各有相应的中断回调函数。可是我用的是PA7、PA8,只有一个回调函数啊,void EXTI9_5_IRQHandler(void)
在这个函数中调用void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),指定相应的中断线。不明白的是这儿,怎么去指定?
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2017-6-10 14:07:04 | 显示全部楼层
同时指定两个中断线?
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2017-6-10 14:13:35 | 显示全部楼层
本帖最后由 K.O.Carnivist 于 2017-6-10 15:56 编辑
physh 发表于 2017-6-10 13:58
说的是这个例程?
#include "exti.h"
#include "delay.h"

EXTI9_5_IRQHandler 里面依次调用所有的:
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
……

我记得 ST 给的程序是这么写的。
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2017-6-10 14:55:14 | 显示全部楼层
回调函数啊  不用自己写
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-6-10 21:44:21 | 显示全部楼层
跟踪进去看源码了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2020-7-9 00:17:58 | 显示全部楼层
请问怎么解决的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 03:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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