ADUC831程序中加入 char flash_erase_page1 (unsigned char p) { EADRH=0; EADRL=p; ECON = ADI_EE_ERASE_PAGE; return (0); }后不正常,正确的擦除代码是什么
时间: 2024-11-06 22:13:17 浏览: 15
在ADUC831的程序中,`flash_erase_page1`函数似乎是用于通过地址p擦除Flash页面。这个函数涉及到几个关键步骤,如设置地址寄存器(EA**H和EA**L)、启用擦除模式(ECON=ADI_EE_ERASE_PAGE),然后返回操作结果。
如果函数执行不正常,可能有以下几个原因:
1. **地址访问错误**:确保`EADR`寄存器被正确地初始化为高8位(EADRH)和低8位(EADRL),它们应该组合成完整的Flash地址。
2. **擦除模式未生效**:检查`ECON`寄存器是否被成功设置为`ADI_EE_ERASE_PAGE`值。这通常需要先清除其他标志,并且在写入之前要确保处于适当的模式下。
3. **硬件限制**:某些闪存可能有特定的操作顺序、等待周期等要求,在实际编程时需遵守。
4. **错误处理缺失**:函数返回了0,但如果没有捕获擦除过程中可能出现的错误(例如Flash忙信号),则当擦除失败时可能会出现问题。
5. **调试和日志**:添加适当的日志或断点,查看程序执行过程,以便找出异常在哪里发生。
正确的擦除代码应该包括上述所有细节,同时考虑到任何特定设备的驱动程序规范。具体的修复可能取决于芯片文档和硬件配置。下面是修正后的可能版本:
```c
void flash_erase_page1(unsigned char p) {
// 检查并清理ECON寄存器
ECON &= ~ADI_EE_ALL_FLAGS;
// 设置地址
EADRH = 0; // Flash页地址范围通常是低位
EADRL = p;
// 开启闪存擦除模式
ECON |= ADI_EE_ERASE_PAGE;
// 等待直到擦除完成(如果需要)
while (!(ECON & ADI_EE_BUSY));
if ((ECON & ADI_EE_ERROR_FLAG) != 0) {
// 如果检测到错误,处理它
handle_error();
}
return (0); // 成功返回
}
// 相关问题:
1. ADUC831的官方文档中有关于闪存擦除的详细说明吗?
2. 如何在代码中捕获并处理擦除错误?
3. 是否需要在擦除前检查Flash是否锁定?
```
阅读全文