LPC1500体验—从零开始(I/O操作-点亮LED)
[复制链接]
本来以为有库函数和例程玩LPC1500的板子可以事半功倍的,可是折腾了那么久还是没什么进展,主要的原因是不管是直接面对
寄存器还是直接调用库函数对于我这个初学者来说难度不是一般的大,哪怕手上有历程,可是不懂怎么用这是个问题。
看来偷懒是不行的了,重新拾起初学51的那份劲头,从 I/O 操作开始......
int main(void)
{
uint32_t ulLast_falling_edge_counter = 0;
SystemCoreClockUpdate();
GPIOInit(); //使能GPIO 始终 ,关闭复位
GPIOSetDir(0, 3, 1); //设置 GPIO0_3 为输出
GPIOSetBitValue(0,3,1); //关闭LED ,(设置GPIO0_3 引脚为高电平)
GPIOSetDir(0, 17, 0); //设置 GPIO0_17 为输出
// cfgIO(PAD_P1_19, PULL_DOWN);
GPIOSetPinInterrupt(EXTERNAL_INT_NUM,0,17,EDGE_TRIGGER,FALLING);
while(1)
{
if(ulLast_falling_edge_counter != pin_int_falling_edge_counter[EXTERNAL_INT_NUM]) //有按键动作时,LED1 状态翻转
{
ulLast_falling_edge_counter = pin_int_falling_edge_counter[EXTERNAL_INT_NUM];
LPC_GPIO->NOT[0] = (1<<3); //LED1 电平翻转
}
}
}
GPIOSetDir(0, 3, 1); 函数的声明是
void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir );
portNum: 端口号 bitPosi: 引脚号 dir: (1:输出,0:输入)
这个函数设置某个引脚的 输入/输出 功能
GPIOSetBitValue(0,3,1); 的函数声明是
void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal );
portNum: 端口号 bitPosi: 引脚号 dir: (1:高电平,0:低电平)
这个函数设置某个引脚的 电平
上面两个函数已经可以实现点亮LED 了,然后我加入按键控制LED亮灭,下面的这个函数
可以用来读取某个引脚的电平状态,不设置端口成 输入/输出 的时候,用这个函数是可以读取 端口的状态的,
设置之后就不得了(具体原因待高人解答)
GPIOGetPinValue( 0, 17 );
uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi )
portNum: 端口号 bitPosi: 引脚号
至于void GPIOSetPinInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,uint32_t sense, uint32_t event );
这个函数的话
刚开始我不是很理解,不过声明的注释说 初始化所有GPIO 的时钟和复位外设
channelNum: 中断号 portNum: 端口号 bitPosi: 引脚号 sense:电平或边沿触发 event: 触发方式: 上升沿或高/下降沿或低
这时我大概知道了这是在开中断,可我纳闷的是按他这声明的意思是我可以设置任意某个端口为外部中断口!!!!!!!!!!那不是说这货
全身上下都是外部中断源。
为证明这个有点离谱的想法还特意用自己做的按键去别的口试了遍,没想到真行!!!!!!!!!!!!11
一开始我都傻了,全身上下都是外部中断源!!!!!!!!!!!!!!!!
后来想到单片机的的某些功能是可以在引脚之间切换的,又 联想数据手册上说的什么 开关矩阵 ,然后然后然后我似乎知道了些什么.........
|