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

2019-07-20 14:03发布

请问,如果同时使用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();                  
}


求教!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
taizonglai
1楼-- · 2019-07-20 16:24
回调函数里面写!不同的IO口可以用不同的函数!看F429的外部中断实验!
Sun_Fly
2楼-- · 2019-07-20 20:32
 精彩回答 2  元偷偷看……
point
3楼-- · 2019-07-20 23:24
HAL库的中断  包括串口接收  定时器中断等我都是在回调函数里写的
physh
4楼-- · 2019-07-21 01:42
说的是这个例程?
#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),指定相应的中断线。不明白的是这儿,怎么去指定?
physh
5楼-- · 2019-07-21 02:56
 精彩回答 2  元偷偷看……
K.O.Carnivist
6楼-- · 2019-07-21 04:00
本帖最后由 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 给的程序是这么写的。

一周热门 更多>