NXP LPC802 上手之 GPIO 控制 LED

  • 前言

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 实现控灯步骤
  1. 打开 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

        5. 按下 F12 后,随即页面跳转到如下页面,在光标处继续按 F12 键。

                                                               
                                                                                                                                                                            图 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,灯灭

}

 

将上述程序编译并下载到板子后,发现未能实现灯亮与灯灭交替变化的状态,那么接下来需要进行程序调试。

  • 调试
  1. 打开调试窗口出现如下图的窗口。

                                                                               
                                                                                                                                                                      图 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 的输入输出方向没有配置正确等。因此,需要特别注意以下几点:

  1. 在使用 GPIO 之前,要记得打开时钟。
  2. 在使用 GPIO 之前,要配置 GPIO 输入输出方向。
  3. 根据用户手册配置对应的寄存器。



  • 参考资料
  1. 用户参考手册,4.pdf
  2. LPC802 datasheet,6.pdf
  3. LPC802 原理图,PDF

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论