STM32F10x 通过 uint8 指针将 uint8 值写入 gpio 寄存器



所以我必须将代码从STM32F4xx设备移植到STM32F10x设备。 一切都很顺利,我很快就取得了巨大的进步。但后来它击中了我! 在软件中的某一点有以下定义

#define BYTE_GPIO (*((__IO uint8_t *)(GPIOE_BASE + 0x0C + 1)))

这显然定义了对 GPIOE ODR 寄存器上字节的访问。 虽然这在STM32F4x器件中工作正常(正如我被告知的那样(,因为它们支持对此寄存器的字节访问,但不适用于stm32F10x器件。这在 RM 中也有说明:

这些位可以由软件读取和写入,并且只能在Word模式下访问。

首先,我忽略了这个陈述,只是尝试了一下:代码编译良好,没有任何错误或警告,甚至写入 GPIOE 的上字节也会很好地执行,但很快我发现 GPIOE 的下字节也会受到任何写入BYTE_GPIO的影响。 由于这显然无法使用,因此我必须找到其他解决方案。 但是由于我不想更改很多应用层代码,因此我宁愿以某种方式修复此定义。不幸的是,我看不出如何。 所以我对想法持开放态度。 谢谢。

如果要修改字节,则需要指令序列。

inline __attribute__((always_inline)) void SetByte(volatile uint32_t *reg, int byte, uint8_t value)
{
uint32_t regval = *reg;
regval &= ~(0xff << (byte * 8));
regval |= value << (byte * 8);
*reg = regval;
}

和用法

SetByte(&GPIOE -> ODR, 1, val);

最新更新