我正在为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
答案 0 :(得分:0)
我对你所说的芯片并不熟悉。 但是对于写入闪存,通常使用以下算法:
你无法直接写入闪存......必须经历整个过程。这就是为什么Flash很慢的原因。
有些闪存支持8位写入,有些只支持16位或32位等。所以,你必须在写入时发送那么多位。
如果必须修改页面的一小部分,请在缓冲区中读取页面。修改缓冲区中的数据。擦除页面并写入整个缓冲区。 如果您正在修改