【赚周年币】技术帖Week1-Day3——LPC824 Breakout之三、LEDs_Toggle
#线上活动
3440 人阅读
|
0 人回复
|
2017-01-03
TA的每日心情 | 开心 9 秒前 |
|---|
签到天数: 4273 天 连续签到: 2 天 [LV.Master]伴坛终老
司徒
- 积分
- 49099
    

|
|
本帖最后由 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”文件中,但在这里为了尽可能少动原有库文件,所以暂不做更改。
依照惯例, 修改后工程文件打包附上,文件名与前面的官网库相同,但大小和内容不同。
|
评分
-
查看全部评分
|
|
|
|
|
|
|
|