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