我正在研究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;
}
答案 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;
}