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

查看: 782|回复: 0

stm32 每条中断线只能有一个中断源

[复制链接]

7

主题

32

回帖

0

蝴蝶豆

中级会员

最后登录
2018-6-13
发表于 2015-1-9 18:18:58 | 显示全部楼层 |阅读模式
今天才发现stm32的外部中断,每条中断线只能有一个中断源啊!!!
我的PA4,PA5,PA6,PA7,PC4,PC5,PB0,PB1,PE7这几个引脚只能PA4,PA5,PA6,PA7,PB0,PB1用外部中断了,
大家有什么好的办法,能让其他的几个引脚也用上外部中断吗? 分时开启的办法就算了,不实用。

#ifndef _COUNTER_H_
#define _COUNTER_H_

#include"driver_about.h"

#define COUNTER1_PORT    GPIOE
#define COUNTER1_PIN     GPIO_Pin_7
#define COUNTER2_PORT    GPIOB
#define COUNTER2_PIN     GPIO_Pin_1
#define COUNTERCTRL_PORT GPIOE
#define COUNTERCTRL_PIN  GPIO_Pin_8

#define COUNTER1_GPIO_PortSource  GPIO_PortSourceGPIOE
#define COUNTER1_GPIO_PinSource   GPIO_PinSource7
#define COUNTER2_GPIO_PortSource  GPIO_PortSourceGPIOB
#define COUNTER2_GPIO_PinSource   GPIO_PinSource1

#define COUNTER1_EXTI_Line        EXTI_Line7
#define COUNTER2_EXTI_Line        EXTI_Line1

#define Counter1_IRQn       EXTI9_5_IRQn
#define Counter1_IRQHandler EXTI9_5_IRQHandler
#define Counter2_IRQn       EXTI1_IRQn
#define Counter2_IRQHandler EXTI1_IRQHandler

#define COUNTERCTRL_Open()     GPIO_ResetBits(COUNTERCTRL_PORT,COUNTERCTRL_PIN)
#define COUNTERCTRL_Close()          GPIO_SetBits(COUNTERCTRL_PORT,COUNTERCTRL_PIN)


void Counter_Init(void);
void Set_Coin1(u8 coin);
void Set_Coin2(u8 coin);
u8 Get_Coin1(void);
u8 Get_Coin2(void);
u8 Add_Coin1(u8 value);
u8 Add_Coin2(u8 value);

#endif
////////////////////////////////////////////////////////

#include"counter.h"

static u8 Coin1=0;
static u8 Coin2=0;

void Counter_GPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin =  COUNTER1_PIN;        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(COUNTER1_PORT, &GPIO_InitStructure);
        
          GPIO_InitStructure.GPIO_Pin =  COUNTER2_PIN;        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(COUNTER2_PORT, &GPIO_InitStructure);
        
          GPIO_InitStructure.GPIO_Pin =  COUNTERCTRL_PIN;        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(COUNTERCTRL_PORT, &GPIO_InitStructure);
        
          COUNTERCTRL_Open();
}


void Counter1_EXIT_Init(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;//定义外部中断初始化参数的结构体
  GPIO_EXTILineConfig(COUNTER1_GPIO_PortSource,COUNTER1_GPIO_PinSource);//选择中断管脚
  EXTI_ClearITPendingBit(COUNTER1_EXTI_Line);//清除外部中断挂起标志
  EXTI_InitStructure.EXTI_Line = COUNTER1_EXTI_Line;   //选择中断线路
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置中断触发方式为下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中断使能
  EXTI_Init(&EXTI_InitStructure);//初始化外部中断
}

void Counter1_NVIC_EXIT_Init(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC的结构体变量
  NVIC_InitStructure.NVIC_IRQChannel = Counter1_IRQn;//选择中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;//抢占式中断优先级设置
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =5;//响应式中断优先级设置
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
  NVIC_Init(&NVIC_InitStructure);
}


void Counter2_EXIT_Init(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;//定义外部中断初始化参数的结构体
  GPIO_EXTILineConfig(COUNTER2_GPIO_PortSource,COUNTER2_GPIO_PinSource);//选择中断管脚
  EXTI_ClearITPendingBit(COUNTER2_EXTI_Line);//清除外部中断挂起标志
  EXTI_InitStructure.EXTI_Line = COUNTER2_EXTI_Line;   //选择中断线路
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断请求,非事件请求
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置中断触发方式为下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中断使能
  EXTI_Init(&EXTI_InitStructure);//初始化外部中断
}

void Counter2_NVIC_EXIT_Init(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC的结构体变量
  NVIC_InitStructure.NVIC_IRQChannel = Counter2_IRQn;//选择中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;//抢占式中断优先级设置
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =4;//响应式中断优先级设置
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
  NVIC_Init(&NVIC_InitStructure);
}

void Counter_Init(void)
{
  Counter_GPIO();
        Counter1_EXIT_Init();
  Counter1_NVIC_EXIT_Init();
        Counter2_EXIT_Init();
  Counter2_NVIC_EXIT_Init();
}

void Set_Coin1(u8 coin)
{
  Coin1=coin;
}

u8 Get_Coin1(void)
{
  return Coin1;
}

u8 Add_Coin1(u8 value)
{
         Coin1+=value;
  return Coin1;
}

void Set_Coin2(u8 coin)
{
  Coin2=coin;
}

u8 Get_Coin2(void)
{
  return Coin2;
}

u8 Add_Coin2(u8 value)
{
        Coin2+=value;
  return Coin2;
}

void Counter1_IRQHandler(void)
{
        OS_ERR err;
        OSIntEnter();
  if(EXTI_GetITStatus(COUNTER1_EXTI_Line)!= RESET)
        {
    OSTaskQPost  (&CounterStkTCB,&Coin1,1,OS_OPT_POST_FIFO,&err);        
    EXTI_ClearITPendingBit(COUNTER1_EXTI_Line);
  }
  else
        {
          EXTI9_5_IRQHandler_Input();//输入产生的中断
        }
        //EXTI_ClearITPendingBit(COUNTER1_EXTI_Line);
  OSIntExit();
}

void Counter2_IRQHandler(void)
{
        OS_ERR err;
        OSIntEnter();
  if(EXTI_GetITStatus(COUNTER2_EXTI_Line)!= RESET)//后半部分判断中断来源
        {
    OSTaskQPost  (&CounterStkTCB,&Coin2,2,OS_OPT_POST_FIFO,&err);        
    EXTI_ClearITPendingBit(COUNTER2_EXTI_Line);
  }
  //EXTI_ClearITPendingBit(COUNTER2_EXTI_Line);        
  OSIntExit();
}




回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版