0

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

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

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

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

首先我忽略了这条语句,只是尝试了一下:代码编译良好,没有任何错误或警告,甚至对GPIOE高字节的写入也会执行良好,但很快我发现GPIOE的低字节受到了影响也对 BYTE_GPIO 进行任何写入。由于这显然不可用,我必须找到其他解决方案。但由于我不想更改很多应用程序层代码,我宁愿以某种方式修复这个定义。不幸的是,我不知道如何。所以我愿意接受。谢谢。

4

1 回答 1

0

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

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);
于 2020-06-11T10:02:31.407 回答