STM32F10x 通过 uint8 指针将 uint8 值写入 gpio 寄存器
STM32F10x writing uint8 value to gpio register over uint8 pointer
所以我必须将代码从 STM32F4xx 设备移植到 STM32F10x 设备。
一切顺利,我很快就取得了巨大进步。但后来它击中了我!
在软件中的某一点有以下定义
#define BYTE_GPIO (*((__IO uint8_t *)(GPIOE_BASE + 0x0C + 1)))
这显然定义了对 GPIOE ODR 寄存器高字节的访问。
虽然这在 STM32F4x 设备中工作正常(正如我所知),因为它们支持对该寄存器的字节访问,但它不适用于 stm32F10x 设备。这在RM中也有说明:
These bits can be read and written by software and can be accessed in Word mode only.
首先我忽略了这个说法,只是去尝试一下:代码编译正常,没有任何错误或警告,甚至写入 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);
所以我必须将代码从 STM32F4xx 设备移植到 STM32F10x 设备。 一切顺利,我很快就取得了巨大进步。但后来它击中了我! 在软件中的某一点有以下定义
#define BYTE_GPIO (*((__IO uint8_t *)(GPIOE_BASE + 0x0C + 1)))
这显然定义了对 GPIOE ODR 寄存器高字节的访问。 虽然这在 STM32F4x 设备中工作正常(正如我所知),因为它们支持对该寄存器的字节访问,但它不适用于 stm32F10x 设备。这在RM中也有说明:
These bits can be read and written by software and can be accessed in Word mode only.
首先我忽略了这个说法,只是去尝试一下:代码编译正常,没有任何错误或警告,甚至写入 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);