本帖最后由 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而不是端口
|