我为stm32编写TFT LCD驱动程序,我需要向LCD写入8位数据。我在mcufriend的库中找到了这个宏,但是我不确定它是如何工作的,我怎么能编辑它。有人可以写如何写这样的宏以及它是如何工作的吗?
来自mcufriend的图书馆的宏:
#define write_8(d) { \
GPIOA->regs->BSRR = 0x0700 << 16; \
GPIOB->regs->BSRR = 0x0438 << 16; \
GPIOC->regs->BSRR = 0x0080 << 16; \
GPIOA->regs->BSRR = (((d) & (1<<0)) << 9) \
| (((d) & (1<<2)) << 8) \
| (((d) & (1<<7)) << 1); \
GPIOB->regs->BSRR = (((d) & (1<<3)) << 0) \
| (((d) & (1<<4)) << 1) \
| (((d) & (1<<5)) >> 1) \
| (((d) & (1<<6)) << 4); \
GPIOC->regs->BSRR = (((d) & (1<<1)) << 6); \
}
答案 0 :(得分:3)
看起来像STM32duino语法:
PORT - &gt; regs-&gt; REGISTER = value
REGISTER 是BSRR,位设置复位寄存器。如果相应位置1,则为此分配的值会将 PORT 的0-15引脚置为高电平。 16-31位与BRR寄存器的0-15位相同;如果该位置1,则相应的引脚设置为低电平。如果某位为零,则相应引脚的状态不变。
让我们看看宏中的每个单独的作业。
GPIOA->regs->BSRR = 0x0700 << 16;
这将引脚GPIOA8,GPIOA9和GPIOA10置为低电平。 ((1<<8) | (1<<9) | (1<<10) == 0x0700
和高16位的BSRR将相应的位设置为低电平。)
GPIOB->regs->BSRR = 0x0438 << 16;
这会将引脚GPIOB3,GPIOB4,GPIOB5和GPIOB10设置为低电平。
GPIOC->regs->BSRR = 0x0080 << 16;
这会将引脚GPIOC7设置为低电平。
GPIOA->regs->BSRR =
(((d) & (1<<0)) << 9)
| (((d) & (1<<2)) << 8)
| (((d) & (1<<7)) << 1);
如果d
的位0置1,则引脚GPIOA9置为高电平。
如果d
的第2位置1,则引脚GPIOA10置为高电平。
如果d
的第7位置1,则引脚GPIOA8置为高电平。
GPIOB->regs->BSRR =
(((d) & (1<<3)) << 0)
| (((d) & (1<<4)) << 1)
| (((d) & (1<<5)) >> 1)
| (((d) & (1<<6)) << 4);
如果d
的第3位置1,则引脚GPIOB3设置为高电平。
如果d
的第4位置1,则引脚GPIOB5置为高电平。
如果d
的第5位置1,则引脚GPIOB4置为高电平。
如果d
的第6位置1,则引脚GPIOB10设置为高电平。
GPIOC->regs->BSRR =
(((d) & (1<<1)) << 6);
如果d
的第1位置1,则引脚GPIOC7设置为高电平。
前三行将引脚GPIOA8,GPIOA9,GPIOA10,GPIOB3,GPIOB4,GPIOB5,GPIOB10和GPIOC7设为低电平。
如果d
中的相应位置位,其余的行将引脚GPIOA9,GPIOC7,GPIOA10,GPIOB3,GPIOB5,GPIOB4,GPIOB10和GPIOA8置为高电平。
换句话说,如果d
中的相应位0-7置位,则宏将引脚A9,C7,A10,B3,B5,B4,B10,A8设置为高电平,如果清除则为低电平。< / p>
我猜测宏用于使用8位并行总线与外设(可能是显示器)通信,引脚A9对应于每个并行字节的最低有效位,而引脚A8对应于最重要的位;上面列出的其他引脚。