为什么我要将 32 位地址转换为 16 位以存储 16 位数据

问题描述 投票:0回答:1

我正在研究 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;
}
c flash casting stm32
1个回答
0
投票

此操作将其转换为指向uint16_t

指针,然后取消引用它。这样做是为了 force 在生成的代码中使用 16 位写/读指令。

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
© www.soinside.com 2019 - 2024. All rights reserved.