[Cortex-M0技术交流] 【M0第二贴】GPIO及EINT0/1中断程序

[复制链接]
5244|3
 楼主| nixianmin 发表于 2011-9-25 08:25 | 显示全部楼层 |阅读模式
本帖最后由 nixianmin 于 2011-9-25 08:27 编辑

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

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

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

  21.   if(led&BIT3)
  22.     GPIOA->DOUT&=~BIT5;
  23. }
  24. //熄灭
  25. void LedClr(uint8_t led)
  26. {
  27.   if(led&BIT0)
  28.     GPIOA->DOUT|=BIT2;

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

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

  33.   if(led&BIT3)
  34.     GPIOA->DOUT|=BIT5;
  35. }

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

  45. uint32_t ReturnKey(void)
  46. {
  47.   uint32_t key=0;
  48.   key=GPIOB->PIN;

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

  51.   return 0;
  52. }



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

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

  17. M0Interrupt.c
  18. /****************************************************
  19. //EINT0和EINT1中断需要先调用
  20. //M0Base.c中的GPBEintInt()函数初始化
  21. *******************************************************/
  22. void EINT0CallBack(void)
  23. {   
  24.   uint8_t eint0_led=0x01;
  25.   for(;eint0_led<BIT4;eint0_led<<=1)
  26.   {
  27.           LedSet(eint0_led);   
  28.     DrvSYS_Delay(100000);
  29.     LedClr(eint0_led);
  30.   }
  31.   
  32. }

  33. void EINT1CallBack(void)
  34. {
  35.         uint8_t eint0_led=BIT3;
  36.   for(;eint0_led>0;eint0_led>>=1)
  37.   {
  38.           LedSet(eint0_led);
  39.     DrvSYS_Delay(100000);
  40.     LedClr(eint0_led);
  41.   }
  42. }



  昨天还想试试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而不是端口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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

粉丝
快速回复 在线客服 返回列表 返回顶部