- 前言
LPC802 是基于 ARM Cortex M0+ 低成本的 32 位 MCU ,可在频率高达 15MHz 的 CPU 下运行。它支持 16KB 的闪存和 2KB 的静态内存。
LPC802 的外设包括一个 I2C 总线接口、两个 USART 、一个 SPI 接口、一个多速率计时器、自唤醒定时器、一个通用的 32 位计数器或定时器、一个 12 bit 的 ADC 、一个模拟比较器、 通过开关矩阵配置功能的 I/O 口以及多达 17 个通用 I/O 引脚。
本文基于 LPC802 讲解如何通过控制 GPIO 实现控灯的步骤,通俗易懂,供初学者参考。
文章中涉及的硬件是 NXP LPCXpresso802 EVM,如下图所示。
NXP LPC802 EVM
软件编辑环境(IDE)是 Keil 及程序源码 SDK ,SDK 可从 NXP 官网下载: https://mcuxpresso.nxp.com/en/select 。
- 通过 GPIO 实现控灯步骤
- 打开 LPC802 用户使用手册,先确定 LPC802 系列芯片型号及对应的 GPIO Pin , PIO0_0 表示 Port0_Pin0
图 1
2. 在原理图中,找出灯对应 I/O 的接口,确定硬件连接。
图 2
图 3
图 4
由原理图可知,需要用到的 I/O 有 PIO0_7~PIO0_9 、PIO0_12 、IO0_17
3. 打开 Keil ,找到 GPIO 对应的头文件 “iocon_my.h”,查看底层代码,如下图所示。
图 5
4. 鼠标单击到 “int GPIO_IOCON_CONTROL_DEMO(void)” ,并按 F12 键:
图 6
图 7
6. 按 F12 后,跳到如下程序,在 B 处继续按 F12 键,在 Browser 栏下找到 B——member ,并单击。
图 8
图 9
7. 打开 LPC802 用户使用手册,找到 GPIO 口对应的寄存器,并进行配置。
图 10
8. 在 c 中编写程序,对时钟进行配置。
BOARD_InitBootClocks(); //FRO 时钟配置
9. 找出控制 LED 的 PIN。
图 11
10. 在 main 函数中继续输入 While(1) 循环函数如下:
while(1)
{
SDK_DelayAtLeastUs(500000); //调用底层延迟函数
//Delay_DEMO(5000*100);
GPIO->B[0][17]=1; //port0 第17 pin,灯亮
SDK_DelayAtLeastUs(500000); //调用底层延迟函数
//Delay_DEMO(5000*100);
GPIO->B[0][17]=0; //port0 第17 pin,灯灭
}
将上述程序编译并下载到板子后,发现未能实现灯亮与灯灭交替变化的状态,那么接下来需要进行程序调试。
- 调试
- 打开调试窗口出现如下图的窗口。
图 12
图 13
2. 设置断点,断点设置好后(一次只能设置 4 个断点),按 F5 键进行调试。
图 14
如上图所示,运行到主循环。
3. 将之前运行过的 4 个断点注释掉,继续设置断点,并按 F5 键调试。
图 15
4. 调试结果如下图所示,发现当 int main() 函数都调试结束后, GPIO 的时钟并未使能,不难发现问题,即 GPIO 时钟并未打开。
图 16
因此,在 LPC802 使用手册中,我们需要找出如下图所示的外围时钟控制寄存器。
图 17
5. 找到该寄存器后,在 main() 函数中加入如下程序:
SYSCON->SYSAHBCLKCTRL0|=(1<<6);//打开时钟
6. 加入打开时钟程序后,并继续调试,可发现 GPIO 时钟使能,如图 18 所示。
图 18
程序加入后,继续编译和载入板子,但是发现灯依旧没有变化,继续调试,检查 GPIO 输入输出方向是否是正确的。
图 19
程序调试后,发现 DIR0 没有任何变化,一直处于输入状态,并不是我们所需要的输出状态。因此,需要编写程序,改变其方向。
图 20
因此,在 main() 函数中添加程序如下所示。
GPIO->DIR[0]|=(1<<17);//将 GPIO 方向改为输出方向
如图 21 所示:
图 21
以上经程序调试后,灯实现了交替亮灭,程式编写完成。依此类推,如下程序可实现多灯交替亮灭。
SYSCON->SYSAHBCLKCTRL0|=(1<<6);
GPIO->DIR[0]|=(1<<17);
GPIO->DIR[0]|=(1<<8);
GPIO->DIR[0]|=(1<<7);
GPIO->DIR[0]|=(1<<9);
GPIO->DIR[0]|=(1<<12);
while(1)
{
SDK_DelayAtLeastUs(200000); //调用底层延迟函数
GPIO->B[0][8]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][17]=1;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][9]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][17]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][9]=1;
DK_DelayAtLeastUs(200000);
GPIO->B[0][8]=1;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][12]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][8]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][12]=1;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][17]=1;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][7]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][17]=0;
SDK_DelayAtLeastUs(200000);
GPIO->B[0][7]=1;
}
图 22
- 总结
在编写程序过程中,需要配置时钟寄存器,最后还要设置为输出方式。当完成这些动作后,依旧无法通过控制 GPIO 实现控制灯的效果,那么可能出错的点是时钟没有被使能、寄存器配置错误或者 GPIO 的输入输出方向没有配置正确等。因此,需要特别注意以下几点:
- 在使用 GPIO 之前,要记得打开时钟。
- 在使用 GPIO 之前,要配置 GPIO 输入输出方向。
- 根据用户手册配置对应的寄存器。
- 参考资料
- 用户参考手册,4.pdf
- LPC802 datasheet,6.pdf
- LPC802 原理图,PDF
评论