MSP430内部闪存写入是否正常

时间:2017-08-07 08:02:12

标签: msp430

我正在研究MSP430并处理内部闪存。 我对MSP430 flash写入lib有疑问。 在我看来,通过这种实现,在某些情况下可能不会写入最后一个字节。 这是功能实现。

void FlashCtl_write8(uint8_t *data_ptr,uint8_t *flash_ptr,uint16_t count){
//Clear Lock bit
HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;

//Enable byte/word write mode
HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + WRT;

while(count > 0)
{
    //test busy
    while(HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY)
    {
        ;
    }

    //Write to Flash
    *flash_ptr++ = *data_ptr++;
    count--;
}

//Clear WRT bit
HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;

//Set LOCK bit
HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;

}

如果按照以下方式实现该功能,这是一个更好的解决方案:

void FlashCtl_write8(uint8_t *data_ptr,uint8_t *flash_ptr,uint16_t count){
//Clear Lock bit
HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;

//Enable byte/word write mode
HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + WRT;

//test busy
while(HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY)
{
  ;
}
while(count > 0)
{
    //Write to Flash
    *flash_ptr++ = *data_ptr++;
    while(HWREG8(FLASH_BASE + OFS_FCTL3) & BUSY)
    {
      ;
    }
    count--;
}

//Clear WRT bit
HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;

//Set LOCK bit
HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;

}

2 个答案:

答案 0 :(得分:1)

用户指南的第7.3.3.1节说:

  

可以从闪存或RAM中启动字节或字写操作。从闪存内部启动时,所有时序都由闪存控制器控制,并且在写入完成时保持CPU。写入完成后,CPU将使用以下指令恢复代码执行   写。

该代码有效,因为实际上不需要检查BUSY位。

答案 1 :(得分:0)

正如CL所提到的,只要你从flash运行代码,就不需要busywaiting。

另一方面,如果你要从RAM中执行该代码 - 例如,要动态地重写二进制程序代码本身 - 你需要完全锁定。

以下代码将执行相同的工作。它也略微针对速度进行了优化 - 无需减少循环体中的另一个变量。

void FlashCtl_write8(uint8_t *data_ptr, uint8_t *flash_ptr, uint16_t count)
{
    const uint8_t *end = data_ptr + count;

    // Clear Lock bit
    HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY;

    // Enable byte/word write mode
    HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY + WRT;

    while(data_ptr < end)
    {
        // Write to flash
        *flash_ptr++ = *data_ptr++;
    }

    // Clear WRT bit
    HWREG16(FLASH_BASE + OFS_FCTL1) = FWKEY;

    // Set LOCK bit
    HWREG16(FLASH_BASE + OFS_FCTL3) = FWKEY + LOCK;
}