回答

收藏

【赚周年币】技术帖Week1-Day3——LPC824 Breakout之三、LEDs_Toggle

#线上活动 #线上活动 3440 人阅读 | 0 人回复 | 2017-01-03

本帖最后由 toofree 于 2017-1-17 23:41 编辑

        LPC824 Breakout之三、LEDs_Toggle函数。
        之前使用STM32库函数时,习惯了LED闪灯用LEDs_Toggle函数来控制LED输出状态的翻转。在使用LPC824时,发现库函数中尽然没有这个,非常之不方便。

        以上一贴上传修改过的工程做主工程模板。参见贴子最末尾的附件。
        [技术] 【赚周年币】技术帖Week1-Day2——LPC824 Breakout之二、软件延时
        https://www.cirmall.com/bbs/thread-59439-1-1.html
        

        打开工程合集,设置当前活动工程为"Example_GPIO_Pattern_Match"。同样以此工程为模板,来实现LEDs_Toggle。
      


      在开始之前,我们先看看LPC824的GPIO部分配置框图,如下图:
      

      从GPIO框图中可以知道,DO在输出的同时,输入寄存器可以实时读取DO输出到外部管脚的当前状态。有了这个那么就好办了,要实现LEDs_Toggle,只需要读取LED对应的DI寄存器,然后取反输出即可。

      下面我们用三种方式来实现LEDs_Toggle函数。

      方式一、首先是最简单的,当然是直接调用GPIO库函数来操作。打开“lpc8xx_gpio.h”文件看看什么情况。
      我们发现有这么4条GPIO操作函数,见下图:
      

      portNum参数用0即可,因为LPC824只有PORT0;bitPosi就是 1<<15形式的,第几个IO就1左移几;bitVal是在输出值0或1;dir方向控制,1 out, 0 input。具体参数的意义可以参考 “peripherals_lib”工程下的“lpc8xx_gpio.c”文件,和LPC824数据手册。
      
      依此思路写出的LEDs_Toggle函数如下:
void LEDs_Toggle(uint32_t bits)
{
        uint32_t bit_data;
        bit_data = GPIOGetPinValue(0, bits);
        if (bit_data == 0)
        {
                GPIOSetBitValue(0,bits,1);
        }
        else
        {
                GPIOSetBitValue(0,bits,0);
        }
}
       使用方法是直接  LEDs_Toggle(BLUE); 即可。

       方式二、仿照“lpc8xx_gpio.c”文件中,GPIOSetBitValue()等函数。
       LEDs_Toggle函数如下:
void LEDs_Toggle1(uint32_t bitPosi){
        uint32_t regVal = 0;        


  if( bitPosi < 0x20 )
  {        
                if ( LPC_GPIO_PORT->PIN0 & (0x1<<bitPosi) )
                {
                        regVal = 1;
                }
  }
        else if( bitPosi == 0xFF )
  {
                regVal = LPC_GPIO_PORT->PIN0;
  }
        
        if (regVal == 0)
        {
                LPC_GPIO_PORT->SET0  = 1<<bitPosi;           // Write '1's to bits corresponding to requested LEDs
        }
        else
        {
                LPC_GPIO_PORT->CLR0  = 1<<bitPosi;           // Write '1's to bits corresponding to requested LEDs
        }
}
         使用方法是,LEDs_Toggle1(blue_led_port); 其缺点是,与使用方法与LEDs_Off()、LEDs_On()不统一。因此才有第三种方法,改为与LEDs_Off()、LEDs_On()调用形式统一的函数。

        方式三、实质上就是将方式二,改成方式一的调用形式,也是我们希望的最佳方式。
       LEDs_Toggle函数如下:
void LEDs_Toggle(uint32_t bits)
{
        uint32_t regVal = 0;        


        if ( LPC_GPIO_PORT->PIN0 & (bits) )
        {
                regVal = 1;
        }
        
        if (regVal == 0)
        {
                LPC_GPIO_PORT->SET0  = bits;           // Write '1's to bits corresponding to requested LEDs
        }
        else
        {
                LPC_GPIO_PORT->CLR0  = bits;           // Write '1's to bits corresponding to requested LEDs
        }
}
        调用方法当然是, LEDs_Toggle(BLUE);
        方式二、三,需要添加一个头文件,#include "lpc8xx_swm.h",否则会宏定义报错。
        


        为了方便区分以上三种方式,我们将函数名分别改为:LEDs_Toggle0()、LEDs_Toggle1()、LEDs_Toggle0()。用宏定义也选择编译。
       函数申明都添上,放最前面
      


      函数定义放最后
      


      主循环中测试部分
      

      下载测试程序,三个LED灯闪起来了。
      到此LEDs_Toggle函数功能实现,也可以添加到lpc8xx_gpio.c”文件中,但在这里为了尽可能少动原有库文件,所以暂不做更改。
      
      依照惯例, 修改后工程文件打包附上,文件名与前面的官网库相同,但大小和内容不同。
      
LPC824_Example_Code_Bundle_Keil_r1.0.rar (1.06 MB, 下载次数: 15)


      


        

关注下面的标签,发现更多相似文章

评分

参与人数 2 +36 收起 理由
EEboard爱板网 + 6 3周发帖养成记 奖励
loveeeboard + 30

查看全部评分

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条