MSP430内部闪存写入工作正常
问题描述:
我正在使用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;
}
答
用户指南第7.3.3.1说:
字节或字写入操作可以b e从闪存或RAM中启动。从闪存中启动时,所有时序由闪存控制器控制,并在写入完成时保持CPU。写入完成后,CPU将使用 写入后的指令继续执行代码。
该代码可用,因为实际上并不需要检查BUSY位。
答
正如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
是的,优化的一个好点。谢谢 –
哦,是的,我明白这一点。感谢您的帮助 –