打印
[Cortex-M0技术交流]

【M0第二贴】GPIO及EINT0/1中断程序

[复制链接]
4433|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 nixianmin 于 2011-9-25 08:27 编辑

有几天没玩M0了,笔记也就没怎么写了,今天把GPIO操作写了,先补点先,不然不知道会被大家甩到哪了,大家的热情真高。
  关于我的程序结构,还是准备用.c和.h来将每个功能的函数分开,每次增加时就只要增加.c和.h文件,实现功能则在main函数里调用相应需要的函数就可了。下面这图中M0Base.c和M0Interrupt.c两个文件是用来存放SYS设置函数、LED设置函数和中断回调函数的文件。
  
  led和按键扫描相关函数:
/**************************************************
//M0上的LED控制函数
//PMD为0输入、1输出、2开漏、3准双向
************************************************/
void LedIoOpen(void)
{
GPIOA->PMD.PMD2=1;   //DrvGPIO_Open (E_GPA,2,E_IO_OUTPUT);
GPIOA->PMD.PMD3=1;   //DrvGPIO_Open (E_GPA,3,E_IO_OUTPUT);
GPIOA->PMD.PMD4=1;   //DrvGPIO_Open (E_GPA,4,E_IO_OUTPUT);
GPIOA->PMD.PMD5=1;   //DrvGPIO_Open (E_GPA,5,E_IO_OUTPUT);
}
//点亮
void LedSet(uint8_t led)
{
  if(led&BIT0)
    GPIOA->DOUT&=~BIT2;

  if(led&BIT1)
    GPIOA->DOUT&=~BIT3;

  if(led&BIT2)
    GPIOA->DOUT&=~BIT4;

  if(led&BIT3)
    GPIOA->DOUT&=~BIT5;
}
//熄灭
void LedClr(uint8_t led)
{
  if(led&BIT0)
    GPIOA->DOUT|=BIT2;

  if(led&BIT1)
    GPIOA->DOUT|=BIT3;

  if(led&BIT2)
    GPIOA->DOUT|=BIT4;

  if(led&BIT3)
    GPIOA->DOUT|=BIT5;
}

/*****************************************************
//M0上的按键控制
//PMD为0输入、1输出、2开漏、3准双向
*****************************************************/
void KeyIoOpen(void)
{
  GPIOB->PMD.PMD14=0;  //  DrvGPIO_Open (E_GPB,14,E_IO_INPUT);
  GPIOB->PMD.PMD15=0;  //   DrvGPIO_Open (E_GPB,15,E_IO_INPUT);
}

uint32_t ReturnKey(void)
{
  uint32_t key=0;
  key=GPIOB->PIN;

  if((key&(KEY1+KEY2))!=(KEY1+KEY2))
     return key&(KEY1+KEY2);

  return 0;
}



中断相关函数:
M0Base.c
/*********************************************************
//EINT0和EINT1中断初始化函数
//需要函数:M0Interrupt.c中的EINT0CallBack和EINT1CallBack函数
************************************************************/
void GPBEintInt(void)
{
        DrvGPIO_SetDebounceTime(10, E_DBCLKSRC_10K);    //端口消抖设置
  DrvGPIO_EnableDebounce(E_GPB, 14);
  DrvGPIO_EnableDebounce(E_GPB, 15);

  DrvGPIO_InitFunction(E_FUNC_EXTINT0); //将GPB14/15设置为中断功能
  DrvGPIO_InitFunction(E_FUNC_EXTINT1);
  DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0CallBack);//设置下降沿促发和回掉函数
  DrvGPIO_EnableEINT1(E_IO_FALLING, E_MODE_EDGE, EINT1CallBack);
       
}

M0Interrupt.c
/****************************************************
//EINT0和EINT1中断需要先调用
//M0Base.c中的GPBEintInt()函数初始化
*******************************************************/
void EINT0CallBack(void)
{   
  uint8_t eint0_led=0x01;
  for(;eint0_led<BIT4;eint0_led<<=1)
  {
          LedSet(eint0_led);   
    DrvSYS_Delay(100000);
    LedClr(eint0_led);
  }
  
}

void EINT1CallBack(void)
{
        uint8_t eint0_led=BIT3;
  for(;eint0_led>0;eint0_led>>=1)
  {
          LedSet(eint0_led);
    DrvSYS_Delay(100000);
    LedClr(eint0_led);
  }
}



  昨天还想试试GPB14.15能不能进行GPB端口中断,试了好久没成功,正郁闷,看到void DrvGPIO_SetIntCallback (GPIO_GPAB_CALLBACK pfGPABCallback,GPIO_GPCDE_CALLBACK pfGPCDECallback) Description:Install the interrupt callback function for GPA/GPB port and GPC/GPD/GPE port,    except GPB.14 and GPB.15 pins.说明GPB14/15不行:L ,貌似技术参考手册上没看到说不行吗,估计手册上说GPB14/15中断是指EINT0/1而不是端口

GPIO及EINT01.rar

713.2 KB

相关帖子

沙发
lixiaoxu2meng| | 2011-9-27 07:42 | 只看该作者
顶 楼主说的对 GPB14/15端口中断不行

使用特权

评论回复
板凳
老鱼探戈| | 2011-9-27 19:22 | 只看该作者
支持一下!
既然已经是外部中断就没必要再做GPIO中断了。

使用特权

评论回复
地板
nixianmin|  楼主 | 2011-9-27 23:14 | 只看该作者
3# 老鱼探戈 只是想试试,看看能不能端口中断:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电机控制,TI InstaSpin Foc交流群:335663930

40

主题

431

帖子

6

粉丝