if(FMC_READY == fmc_state){ FMC_CTL0 |= FMC_CTL0_PER; FMC_ADDR0 = page_address; FMC_CTL0 |= FMC_CTL0_START; /* wait for the FMC ready */ fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); /* reset the PER bit */ FMC_CTL0 &= ~FMC_CTL0_PER; }
时间: 2024-04-28 11:20:01 浏览: 107
这段代码是在进行Flash写操作。如果FMC已经准备好(FMC_READY == fmc_state),则将FMC_CTL0寄存器的FMC_CTL0_PER位置为1,表示打开Flash编程使能。接着设置FMC_ADDR0寄存器的值为要编程的页地址。然后将FMC_CTL0寄存器的FMC_CTL0_START位置为1,开始Flash编程操作。此时需要等待FMC编程完成,即等待FMC_READY状态。如果等待超时,fmc_state将被设置为错误状态。如果FMC编程完成,则将FMC_CTL0寄存器的FMC_CTL0_PER位置为0,表示关闭Flash编程使能。
相关问题
fmc_state_enum fmc_word_program(uint32_t address, uint32_t data) { fmc_state_enum fmc_state = FMC_READY; if(FMC_BANK0_SIZE < FMC_SIZE){ if(FMC_BANK0_END_ADDRESS > address){ fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); if(FMC_READY == fmc_state){ /* set the PG bit to start program */ FMC_CTL0 |= FMC_CTL0_PG; REG32(address) = data; /* wait for the FMC ready */ fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); /* reset the PG bit */ FMC_CTL0 &= ~FMC_CTL0_PG; } }else{ fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); if(FMC_READY == fmc_state){ /* set the PG bit to start program */ FMC_CTL1 |= FMC_CTL1_PG; REG32(address) = data; /* wait for the FMC ready */ fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); /* reset the PG bit */ FMC_CTL1 &= ~FMC_CTL1_PG; } } }else{ fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); if(FMC_READY == fmc_state){ /* set the PG bit to start program */ FMC_CTL0 |= FMC_CTL0_PG; REG32(address) = data; /* wait for the FMC ready */ fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); /* reset the PG bit */ FMC_CTL0 &= ~FMC_CTL0_PG; } } /* return the FMC state */ return fmc_state; }
这段代码看起来是一个烧录器或者编程器的代码,用于将数据写入地址中。函数名是fmc_word_program,输入参数是要写入的地址和数据。代码中首先判断FMC_BANK0_SIZE是否小于FMC_SIZE,如果是,则说明只有一个FMC BANK可以使用,否则有两个可以使用。然后根据地址所在的FMC BANK,调用相应的fmc_bank_ready_wait函数等待FMC就绪。如果FMC就绪,则设置PG位开始编程,将数据写入地址中,等待FMC再次就绪后,清除PG位。最后返回FMC状态。
fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR);
`fmc_flag_clear` 是一个函数,用于清除指定的 Flash 写入/擦除操作的标志位。在给出的示例代码中,`FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR` 是一个按位或运算符 `|` 组合的标志位,用于表示需要清除的标志位。
具体来说,以下是一些常见的 Flash 操作标志位及其含义:
- `FMC_FLAG_END`:表示 Flash 擦除/写入操作结束的标志位。
- `FMC_FLAG_OPERR`:表示 Flash 操作错误的标志位。
- `FMC_FLAG_WPERR`:表示 Flash 写保护错误的标志位。
- `FMC_FLAG_PGMERR`:表示 Flash 编程错误的标志位。
- `FMC_FLAG_PGSERR`:表示 Flash 扇区擦除错误的标志位。
通过将这些标志位按位或运算符 `|` 组合起来,可以一次性清除多个标志位。
示例代码中的 `fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_OPERR | FMC_FLAG_WPERR | FMC_FLAG_PGMERR | FMC_FLAG_PGSERR)` 表示清除了 `FMC_FLAG_END`、`FMC_FLAG_OPERR`、`FMC_FLAG_WPERR`、`FMC_FLAG_PGMERR` 和 `FMC_FLAG_PGSERR` 这些标志位。
请注意,根据具体的硬件和编程环境,上述标志位的定义可能会有所不同。在实际使用时,请参考相关的芯片手册或文档来确定正确的标志位定义和使用方法。
阅读全文