我正在研究 STM32 闪存,我遇到了将 16 位数据写入 32 位地址的函数。为什么我要像
*(__IO uint16_t*)Address = Data;
这样扩展到 *(volatile uint16_t *)Address = Data;
这样的地址
static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data)
{
/* Check the parameters */
assert_param(IS_FLASH_ADDRESS(Address));
/* If the previous operation is completed, proceed to program the new data */
CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
FLASH->CR |= FLASH_PSIZE_HALF_WORD;
FLASH->CR |= FLASH_CR_PG;
*(__IO uint16_t*)Address = Data;
}
此操作将其转换为指向uint16_t
void write16(uint32_t addr, uint16_t val)
{
*(volatile uint16_t *)addr = val;
}
void write8(uint32_t addr, uint16_t val)
{
*(volatile uint8_t *)addr = val;
}
void write32(uint32_t addr, uint16_t val)
{
*(volatile uint32_t *)addr = val;
}
write16:
strh r1, [r0] @ movhi
bx lr
write8:
uxtb r1, r1
strb r1, [r0]
bx lr
write32:
str r1, [r0]
bx lr