今天编写了一个简单的IO口中断程序,用了三个函数就可以了。
第一个GPIO_IntCmd(2, 1<<19 | 1<<10, 1);使能GPIO中断函数,参数一是第2组端口,参数二是第19个引脚我还用了一个10脚,^_^ ^_^好像有点贪心好,不过我觉得学习就是要贪心!然后参数三1为下降沿触发,0为上升沿触发,应为旺宝的这款开发板按键是接的低电平,所以是1。
第二个NVIC_SetPriority(GPIO_IRQn, 1);这个就是中断优先级设置。
第三个NVIC_EnableIRQ(GPIO_IRQn);这个就是使能GPIO中断。
好了现在就可以进中断了,爽吧!简直不敢相信!呵呵呵,有点小心奋!
进中断然后就是判断中断了GPIO_GetIntStatus(2, 19, 1)就是这个。
然后就是清中断了GPIO_ClearInt(2, 1<<19);就是这个。
在中断里我就控制LED灯亮灭。好了现在编译,不编不知道,一编吓一跳啊!- 0 Error(s), 11 Warning(s).尼玛11个警告,而且警告还是库里面的!靠,无法原谅!不好意思,我们都是文明人不能说脏话好,一下没管住自己的嘴,希望论坛的各位领导们谅解好,…^_^ ^_^。看了警告发现大部分都是同样的一个是枚举类型里混合了另一个类型,另一个是无意义的比较。
看了警告发现:
FunctionalState GPIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState)
{
if((portNum == 0) && (edgeState == 0))//Rising Edge
return (((LPC_GPIOINT->IO0IntStatR)>>pinNum)& 0x1);
else if ((portNum == 2) && (edgeState == 0))
return (((LPC_GPIOINT->IO2IntStatR)>>pinNum)& 0x1);
else if ((portNum == 0) && (edgeState == 1))//Falling Edge
return (((LPC_GPIOINT->IO0IntStatF)>>pinNum)& 0x1);
else if ((portNum == 2) && (edgeState == 1))
return (((LPC_GPIOINT->IO2IntStatF)>>pinNum)& 0x1);
else
//Error
while(1);
}
函数的返回类型是__I uint32_t的,而函数的类型是枚举类型FunctionalState。我把它强制转换了就OK了!
还有一类警告是无意义的比较!
void FIO_ByteSetDir(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t dir)
{
GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);
if(pFIO != NULL)
{
// Output direction
if (dir)
{
if ((byteNum >= 0) && (byteNum <= 3))
{
pFIO->FIODIR[byteNum] |= bitValue;
}
}
// Input direction
else
{
if ((byteNum >= 0) && (byteNum <= 3))
{
pFIO->FIODIR[byteNum] &= ~bitValue;
}
}
}
}
看了一下警告的地方if ((byteNum >= 0) && (byteNum <= 3))发现byteNum 变量是一个uint8_t的八位无符号整形变量去和0比较大于或等于,有点无语啊无符号整形变量最小的值就是0还比个毛啊!
不过有警告下到板子上也可以用的。我个人不太喜欢有警告,看着就不爽!
我不知道这样搞对不对希望“大婶”们指导下以后多多互相学习,天天互相向上!^_^ ^_^ ^_^!
|