查看: 290|回复: 0

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

[复制链接]

24

主题

0

好友

4482

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 1341 天

    连续签到: 51 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2017-1-3 00:55:44 |显示全部楼层
    本帖最后由 toofree 于 2017-1-17 23:41 编辑

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

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

            打开工程合集,设置当前活动工程为"Example_GPIO_Pattern_Match"。同样以此工程为模板,来实现LEDs_Toggle。
           傲游截图20170103001004.jpg


          在开始之前,我们先看看LPC824的GPIO部分配置框图,如下图:
           傲游截图20170103001356.jpg

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

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

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

          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",否则会宏定义报错。
             傲游截图20170103004231.jpg


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


          函数定义放最后
           傲游截图20170103004734.jpg


          主循环中测试部分
           傲游截图20170103004933.jpg

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

          


            

    已有 2 人评分 收起 理由
    EEboard爱板网 + 6 3周发帖养成记 奖励
    loveeeboard + 30

    总评分:  + 36   查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-7-27 06:46 , Processed in 0.107937 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部