c166 bootloader写入内部闪存

时间:2016-02-26 08:42:56

标签: c hex bootloader

我正在为c166芯片编写一个bootloader,确切地说是169FH。引导加载程序当前可以打开TCP / IP连接,因此PC可以将Intel hex文件发送到引导加载程序。此intel十六进制文件保存在RAM中。收到hex文件后,逐行读取,将字节设置为flash中的正确位置。存储引导加载程序的闪存位置与主程序可以保存的位置不同。

这是intel hex文件的前两行:

:0200000400C03A
:20100000CA11EE111212341258127A129A12BC12DE12001322134413601388138813881349

第一行是获取32位闪存地址的最高16位,在本例中为0x00C0 在第二行中是32位闪存地址的低16位,在这种情况下是0x1000。这将创建总地址0x00C01000,写入该地址的字节应为0xCA。

我正在尝试使用以下代码将字节写入该地址:

uint8_t u8Byte = (uint8_t )XHugeStringToDec((const __huge char *)&Ext_RamFlashSave.Byte[u32Idx], 9+(u8ByteIdx*2), 2);

uint8_t *u8Address =  (uint8_t*)((uint32_t)(u32ExtendedLinearAddress << 16) + (uint32_t)u16BaseAddress + (uint32_t)u8ByteIdx);

*u8Address = (u8Byte);

XHugeStringToDec()是一个从英特尔十六进制字符串中获取十六进制值的函数。我知道这是正确的。

Ext_RamFlashSave.Byte是存储intel hex文件的数组。

u32ExtendedLinearAddress变量为0x0C00,并且先前已设置。 u16BaseAddress为0x1000,也在代码中设置。

问题出在最后一行:

*u8Address = (u8Byte);

我已经确认u8Address确实是0x0C01000而u8Byte确实是0xCA。但是当我监视我的闪存地址时,我看不到写入的字节。 我可以想象它是某种写保护,但是我找不到如何解决这个问题,或者我是否需要一种不同的方式来写入Flash地址?

此处描述了如何构建intel-hex文件的更多信息: https://en.wikipedia.org/wiki/Intel_HEX

1 个答案:

答案 0 :(得分:0)

我对你所说的芯片并不熟悉。 但是对于写入闪存,通常使用以下算法:

  1. 解锁闪光灯。这通常是发送特定的数据序列。我现在使用的闪光灯有0xA0A0​​-&gt;延迟1毫秒 - > 0x0505。这将启用写入闪存
  2. 清除错误标志。 Flash有一些错误标志,如写入错误或读取错误。另外,检查Busy标志以确保Flash准备就绪
  3. 删除页面。是的...您必须在写入之前擦除页面。即使您想要更改一个位,也必须擦除整个页面。
  4. 写入数据(最后)但要确保内容是正确的。有时你的Controller是Little Endien而Flash是Big Endien。所以你必须匹配Flash&#39; s。
  5. 锁定Flash。这通常通过发送用于解锁的相同序列来完成。 (参考数据表)
  6. 你无法直接写入闪存......必须经历整个过程。这就是为什么Flash很慢的原因。

    有些闪存支持8位写入,有些只支持16位或32位等。所以,你必须在写入时发送那么多位。

    如果必须修改页面的一小部分,请在缓冲区中读取页面。修改缓冲区中的数据。擦除页面并写入整个缓冲区。 如果您正在修改