如何在C中用宏写入8位数据?

时间:2017-03-21 17:06:43

标签: c microcontroller stm32

我为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); \
}

1 个答案:

答案 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对应于最重要的位;上面列出的其他引脚。