2017-08-07 69 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

是的,優化的一個好點。謝謝 –