题目
已知:GPIOB_BASE=0x4001 0C00;#define GPIOB_ODR (unsigned int*)(GPIOB_BASE+0x0C);可以实现 GPIOB 端口输出寄存器全部输出高电平语句是A. *(unsigned int*)(0x4001 0C0C) = 0xFF;B. B.* GPIOB_ODR = 0xFF;C. C.(unsigned int*)(0x4001 0C0C) = 0xFF;D. D. GPIOB_ODR = 0xFF;
已知:GPIOB_BASE=0x4001 0C00;#define GPIOB_ODR (unsigned int*)(GPIOB_BASE+0x0C);可以实现 GPIOB 端口输出寄存器全部输出高电平语句是
A. *(unsigned int*)(0x4001 0C0C) = 0xFF;
B. B.* GPIOB_ODR = 0xFF;
C. C.(unsigned int*)(0x4001 0C0C) = 0xFF;
D. D. GPIOB_ODR = 0xFF;
题目解答
答案
AB
A. *(unsigned int*)(0x4001 0C0C) = 0xFF;
B. B.* GPIOB_ODR = 0xFF;
A. *(unsigned int*)(0x4001 0C0C) = 0xFF;
B. B.* GPIOB_ODR = 0xFF;
解析
本题考查对嵌入式系统中寄存器操作的理解,解题的关键在于明确如何通过地址和指针来对寄存器进行赋值操作,以实现 GPIOB 端口输出寄存器全部输出高电平。
对题目中宏定义的分析
已知 GPIOB_BASE = 0x40010C00,这是 GPIOB 端口的基地址。#define GPIOB_ODR (unsigned int*)(GPIOB_BASE + 0x0C) 定义了一个宏 GPIOB_ODR,它是一个指向无符号整型的指针,指向 GPIOB 端口输出寄存器的地址,即 0x40010C00 + 0x0C = 0x40010C0C。
对各选项的分析
- 选项 A:
*(unsigned int*)(0x40010C0C) = 0xFF;- 首先,
(unsigned int*)(0x40010C0C)是将地址0x40010C0C强制转换为一个指向无符号整型的指针。 - 然后,
*操作符用于解引用该指针,即访问该指针所指向的内存地址。 - 最后,将
0xFF赋值给该内存地址,也就是将 GPIOB 端口输出寄存器的值设置为0xFF,可以实现全部输出高电平,所以该选项正确。
- 选项 B:
*GPIOB_ODR = 0xFF;- 由于
GPIOB_ODR是一个指向无符号整型的指针,指向地址0x40010C0C。 *操作符解引用该指针,访问其指向的内存地址。- 将
0xFF赋值给该内存地址,同样可以实现 GPIOB 端口输出寄存器全部输出高电平,所以该选项正确。
- 选项 C:
(unsigned int*)(0x40010C0C) = 0xFF;(unsigned int*)(0x40010C0C)只是一个指针,它本身是一个地址值,不能直接被赋值。这里试图将0xFF赋值给一个指针,这是不符合语法规则的,所以该选项错误。
- 选项 D:
GPIOB_ODR = 0xFF;GPIOB_ODR是一个指针,它存储的是地址0x40010C0C,不能直接将0xFF赋值给指针本身。这里是试图改变指针的值,而不是改变指针所指向的内存地址的值,所以该选项错误。