2017-08-07 34 views
0

我正在使用MSP430和处理内部闪存。 我对MSP430闪存写入库有疑问。 在我看来,在这个实现中,在某些情况下可能不会写最后一个字节。 这是函数实现。MSP430内部闪存写入工作正常

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; 

}

回答

1

用户指南第7.3.3.1说:

字节或字写入操作可以b e从闪存或RAM中启动。从闪存中启动时,所有时序由闪存控制器控制,并在写入完成时保持CPU。写入完成后,CPU将使用 写入后的指令继续执行代码。

该代码可用,因为实际上并不需要检查BUSY位。

+0

哦,是的,我明白这一点。感谢您的帮助 –

0

正如CL所提到的,只要你从闪存中运行代码,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; 
} 
+0

是的,优化的一个好点。谢谢 –