0

我正在尝试将值直接写入 stm8 微控制器上的 eeprom 空间。我不想编写一个程序来执行此操作,然后将其闪存到芯片上。但我想直接写给它。执行此操作的命令在 unix 中是这样的:

./stm8flash -c stlinkv2 -p stm8l151f2 -s eeprom -w myfile.bin

我搜索的高低问题是我如何制作它myfile.bin以及它会是什么样子,这只是我编写的 C 代码,它将值分配给我选择的寄存器,然后使用一些可以输出到的编译器.bin 文件?我在程序中完成了 eeprom 读/写,但从未直接写入 eeprom 空间。我想存储的唯一信息是有关产品的信息,可以查找的使用信息。我猜最大 50 字节的数据。

4

2 回答 2

0

最简单的方法是首先像这样读取文件:

./stm8flash -c stlinkv2 -p stm8l151f2 -s eeprom -r myfile.bin

然后一旦完成,我使用@thebusybee 使用十六进制编辑器的想法,我打开了读取文件(GHex 是我使用的编辑器)。使用编辑器进行更改并使用以下方法编写文件:

./stm8flash -c stlinkv2 -p stm8l151f2 -s eeprom -w myfile.bin

这似乎运作良好,但第二次读取后数据不完全匹配,嗯可能是一个不同的问题。

于 2020-04-09T22:06:23.283 回答
0

我相信你只有在解锁并验证DATA区域是否没有写保护后才能正确写入EEPROM区域。

默认情况下,EEPROM 是写保护的,需要特定的序列才能解锁:必须将两个硬件密钥写入 FLASH_DUKR 寄存器。我第一次尝试对 EEPROM 进行编程时,它不起作用。原因是我忽略了参考手册中的以下声明:“在开始编程之前,应用程序必须验证 DATA 区域没有写保护”。我把它解释为“你不应该写入写保护区域”,而真正的意思是“解锁 EEPROM 需要一些时间”。

https://lujji.github.io/blog/bare-metal-programming-stm8-part2/

不幸的是,也许你真的需要一个程序来填充 EEPROM:

//[...]     
#define FLASH_IAPSR *(unsigned char*)0x505F
#define FLASH_DUKR *(unsigned char*)0x5064
#define _MEM_(mem_addr) (*(volatile unsigned char*)(mem_addr))
    
//[...]

void main(){
   //[...]       
   info1 = 127;
   info2 = 32767;
        
   FLASH_DUKR = 0xAE;
   FLASH_DUKR = 0x56;
   while (!(FLASH_IAPSR & (1 << 3)));

   _MEM_(0x4000) = info1;
   while (!(FLASH_IAPSR & (1 << 2)));
   _MEM_(0x4001) = (unsigned char) (info2 & 0xFF);
   while (!(FLASH_IAPSR & (1 << 2)));
   _MEM_(0x4002) = (unsigned char) ((info2 >> 8) & 0xFF);
   while (!(FLASH_IAPSR & (1 << 2)));
        
   FLASH_IAPSR &= ~(1 << 3);
   //[...]
}
于 2020-07-19T18:03:33.237 回答