在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
最近有空就开始着手做基于LPC1768的远程烟雾监测系统。之前用寄存器调通了ESP8266,但是最近我还是把它改成使用库的版本。
毕竟在可读性上面会好一些。LPC1768已经很少看到NXP的宣传了,是不是这颗老料,已经被放弃了。就想现在汽车行业主推的S32,
以前的K60等,也不知在啥位置了。
废话不多说了,我最近在调板子的硬件,习惯了之前的STM32上位带操作GPIO,发现NXP上这样用的人,还真不多。我就把它移植了下。
LCP1768基于M3内核。我们看LPC1768手册,可以看到给出了信息的描述和对应的地址转换(我们这里以GPIO为例):
寄存器具体的位置:
对应转换关系级例子:
在<<CM3权威指南>>第五章(87页~92页)也有更具体的描述,我们也可以参照:
这里就不截图了,感兴趣,可以自己去看~
下面我们开始对GPIO外设匹配对应的位带寄存器:
对应的转换公式:
- //位带操作,实现51类似的GPIO控制功能
- //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
- //IO口操作宏定义
- #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
- #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
复制代码 那么GPIO哪个寄存器,直接对应输出的值,及输入的值呢?我们查看,发现它读取及设置输出均对PIN寄存器直接操作即可:
那么各个PORT的地址定义就有了:
- //寄存器 PIN 输出读写控制寄存器
- #define GPIO0_IDR_Addr (LPC_GPIO0_BASE+0x14) //0x2009C014
- #define GPIO1_IDR_Addr (LPC_GPIO1_BASE+0x14) //0x2009C034
- #define GPIO2_IDR_Addr (LPC_GPIO2_BASE+0x14) //0x2009C054
- #define GPIO3_IDR_Addr (LPC_GPIO3_BASE+0x14) //0x2009C074
- #define GPIO4_IDR_Addr (LPC_GPIO4_BASE+0x14) //0x2009C094
复制代码 对PORT的单个引脚读写操作函数:
- //IO口操作,只对单一的IO口!
- //确保n的值小于32!
- #define P0out(n) BIT_ADDR(GPIO0_IDR_Addr,n)
- #define P0in(n) BIT_ADDR(GPIO0_IDR_Addr,n) //输入
- #define P1out(n) BIT_ADDR(GPIO1_IDR_Addr,n)
- #define P1in(n) BIT_ADDR(GPIO1_IDR_Addr,n) //输入
- #define P2out(n) BIT_ADDR(GPIO2_IDR_Addr,n)
- #define P2in(n) BIT_ADDR(GPIO2_IDR_Addr,n) //输入
- #define P3out(n) BIT_ADDR(GPIO3_IDR_Addr,n)
- #define P3in(n) BIT_ADDR(GPIO3_IDR_Addr,n) //输入
- #define P4out(n) BIT_ADDR(GPIO4_IDR_Addr,n)
- #define P4in(n) BIT_ADDR(GPIO4_IDR_Addr,n) //输入
复制代码 下面我们就可以,位带操作直接输出单个IO口了,代码简化了许多。
如果我们要控制一个LED0,假设为P1.0引脚。先将它初始化好(时钟,方向,初始值) ,然后#define LED0 P1out(0)
然后在main里面,我们就可以直接幅值控制它了:
LED0=1,LED0=0,LED=!LED。这样是不是简单了写呢。
对于读也一样,假设我们读取一个按键值,假设为P1.1,先将它初始化好(时钟,方向,初始值) ,然后#define KEY0 P1in(1)
然后在main里面,我们就可以这样操作:
if(KEY0 ==0) LED0=!LED0;//按一下,翻转一次。
这样就完成了。以上代码已验证过,LPC1768的寄存器与STM32F103还是有些区别,STM32F103读写分别是2个寄存器。但LPC1768
就是一个。
好了,一个小小的分享就到这了。
|
|