本帖最后由 onz 于 2017-10-12 00:56 编辑
好像跑题了。不过有兴趣探讨一下,欢迎指正:
没用过stm8s,但曾经浏览过其参考手册关于编程操作的内容,没记错的话,机制大概是:写入一个字节前,硬件自动判断你定义的写入初地址的字(u32*)(addr+n)(4个字节:(u8*)(addr+n)、(u8*)(addr+n+1)、(u8*)(addr+n+2)、(u8*)(addr+n+3))是否为0,是则直接写入该“字节”,否则硬件自动先擦除该“字”(4个字节),再写入该“字节”----两种情况都是要求此4个字节都已事先擦除为0,两种情况的结果都是----4个字节:(u8*)(addr+n) = *p、(u8*)(addr+n+1) = 0、(u8*)(addr+n+2) = 0、(u8*)(addr+n+3) = 0。
所以,stm8s的eeprom同样必须遵循先擦后写,最小擦除单位是一个字(4个字节),只不过有硬件自动完成,用户代码无需显性擦除而已。
FLASH_ProgramByte(addr+n, *p++); /* 功能:每次自检4个字节是否全被擦除为0,否则先自动擦除,然后写入1个字节 */
或
FLASH_ProgramByte(addr++, *p++); /* 功能:同上 */
关于上面提到的按键,是1个AD脚串带10个按键,当然并了C, 但问题不在消抖,软件滤波很稳定,不并C完全没问题。
|