hkzxc1991 发表于 2026-5-9 09:37:00

stc32g12k128读写问题

<pre><code>这个是官方例程的iap.c代码
#include &quot;stc.h&quot;
#include &quot;iap.h&quot;

void iap_init()
{
    IAP_CONTR = 0x80;
    IAP_TPS = FOSC / 1000000;
}

BOOL iap_check_addr(DWORD addr)
{
    addr &amp;= 0x1ffff;

    return ((addr &lt; 0x10000) ||
            (addr &gt;= (0x10000 + LDR_SIZE)));
}

BYTE iap_read_byte(DWORD addr)
{
    return *(BYTE ecode *)(addr | 0x00fe0000);
}

BOOL iap_write_byte(DWORD addr, BYTE dat)
{
    if (!iap_check_addr(addr))
      return 0;

    IAP_CMD = 2;
    IAP_ADDRE = BYTE2(addr) &amp; 0x01;
    IAP_ADDRH = BYTE1(addr);
    IAP_ADDRL = BYTE0(addr);
    IAP_DATA = dat;
    IAP_TRIG = 0x5a;
    IAP_TRIG = 0xa5;
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    return (iap_read_byte(addr) == dat);
}

void iap_erase_page(DWORD addr)
{
    if (!iap_check_addr(addr))
      return;

    IAP_CMD = 3;
    IAP_ADDRE = BYTE2(addr) &amp; 0x01;
    IAP_ADDRH = BYTE1(addr);
    IAP_ADDRL = BYTE0(addr);
    IAP_TRIG = 0x5a;
    IAP_TRIG = 0xa5;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
Q1如果要擦除FE:1000H到FE:FFFFH
      addr=0x1000;
      while (addr &lt; 0x10000)
      {
            iap_erase_page(addr);
            addr += 0x200;
      }
Q2如果要擦除FF:1000H到FF:FFFFH
      addr=0x11000;
      while (addr &lt; 0x20000)
      {
            iap_erase_page(addr);
            addr += 0x200;
      }
</code></pre>
<p>这样操作对吗</p>

乘风飞扬 发表于 2026-5-9 10:30:37

地址没错,FE:0000H~FE:FFFFH 区域的IAP操作地址是 0x000000~0x00FFFF
FF:0000H~FF:FFFFH 区域的IAP操作地址是 0x010000~0x01FFFF

hkzxc1991 发表于 2026-5-9 10:57:17

乘风飞扬 发表于 2026-5-9 10:30
地址没错,FE:0000H~FE:FFFFH 区域的IAP操作地址是 0x000000~0x00FFFF
FF:0000H~FF:FFFFH 区域的IAP操作地 ...

感谢大佬
页: [1]
查看完整版本: stc32g12k128读写问题