在线时间88 小时
UID3325292
注册时间2016-11-2
NXP金币0
TA的每日心情 | 奋斗 2021-2-4 16:14 |
---|
签到天数: 139 天 连续签到: 1 天 [LV.7]常住居民III
高级会员

- 积分
- 881
- 最后登录
- 2021-2-4
|

楼主 |
发表于 2019-12-16 17:06:24
|
显示全部楼层
通过调试,使用位带操作实现了LED翻转的效果,即实现GPIO_PortToggle()函数的效果,映射NOT0到NOT5寄存器的地址,查阅LPC54628J512手册得到地址
下面是代码:
#ifndef SYS_H_
#define SYS_H_
#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))
#define NOT0 (0x2300U)
#define NOT1 (0x2304U)
#define NOT2 (0x2308U)
#define NOT3 (0x230CU)
#define NOT4 (0x2310U)
#define NOT5 (0x2314U)
//toggle
#define GPIO0_NOT_Addr (GPIO_BASE+NOT0)
#define GPIO1_NOT_Addr (GPIO_BASE+NOT1)
#define GPIO2_NOT_Addr (GPIO_BASE+NOT2)
#define GPIO3_NOT_Addr (GPIO_BASE+NOT3)
#define GPIO4_NOT_Addr (GPIO_BASE+NOT4)
#define GPIO5_NOT_Addr (GPIO_BASE+NOT5)
//toggle
#define P0toggle(n) BIT_ADDR(GPIO0_NOT_Addr,n) //toggle
#define P1toggle(n) BIT_ADDR(GPIO1_NOT_Addr,n) //toggle
#define P2toggle(n) BIT_ADDR(GPIO2_NOT_Addr,n) //toggle
#define P3toggle(n) BIT_ADDR(GPIO3_NOT_Addr,n) //toggle
#define P4toggle(n) BIT_ADDR(GPIO4_NOT_Addr,n) //toggle
#define P5toggle(n) BIT_ADDR(GPIO5_NOT_Addr,n) //toggle
#endif /* SYS_H_ */
定义好位带操作sys.h的头文件,在main函数添加:
#define LED1 P3toggle(14)
#define LED2 P3toggle(3)
#define LED3 P2toggle(2)
void delay(void)
{
volatile uint32_t i = 0;
for (i = 0; i < 5000000; ++i)
{
__asm("NOP"); /* delay */
}
}
int main(void) {
/* Init board hardware. */
BOARD_InitBootPins(); //已经初始化三个LED引脚了,分别是P3_14,P3_3,P2_2
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
/* Init FSL debug console. */
BOARD_InitDebugConsole();
while(1)
{
LED1 = !LED1;
LED2 = !LED2;
LED3 = !LED3;
delay();
}
}
通过上面代码可以实现用位带操作控制LED翻转,如果要实现可读可写操作(直接通过位带操作赋值或读取操作),通过查看手册需要实现寄存器B的地址映射,实际使用有P0--P5 GPIO port,
手册给出的是一个范围 B[0x0000:0x00B6],实际使用的形式是B[port][pin],例:LED1为P3_14-->>B[3][14]。类似一维数据转化为二维数组。但是每个独立的P0 ,P1,P2,P3,P4和P5的地址没有给出,这样地址映射无法写成NOTE寄存器映射控制LED翻转的方式。尝试猜测地址,假设P0,P1等都是依次往后排,一个字节代表一个引脚,LPC54628J512ET180总共有145个引脚,总共空间有182(0x00B6)字节,这样P0首地址偏移0x00字节,P1偏移32字节,P3引脚偏移64字节...等,测试结果是失败的,没有实现位带操作的效果,LED无反应。那这个问题是否就可以转化为怎样映射B寄存器的地址?求助!!!
|
-
-
|