说是原创其实也没多少是自己的东西,主要就是合众达的SEEDVPM642的例程,再加上一些程序说明,有本书《TMS320DM642 DSP应用系统设计与开发》(人民邮电出版社)里面写的很全,还包括使用CPLD对地址空间的拓展。
注意:FLASH在写之前必须先擦除FLASH上的内容。
1.?????擦除FLASH
程序:
?
static Uint32 sector_end[SEEDDM642_FLASH_SECTORS] = {
????SEEDDM642_FLASH_BASE + 0x00ffff,
????SEEDDM642_FLASH_BASE + 0x01ffff,
????SEEDDM642_FLASH_BASE + 0x02ffff,
????SEEDDM642_FLASH_BASE + 0x03ffff,
????SEEDDM642_FLASH_BASE + 0x04ffff,
????SEEDDM642_FLASH_BASE + 0x05ffff,
????SEEDDM642_FLASH_BASE + 0x06ffff,
????SEEDDM642_FLASH_BASE + 0x07ffff?
};
void SEEDDM642_FLASH_erase(Uint32 start,Uint32 length)
{
????Int16 i;
????Uint8 *pdata;
????Uint32 sector_base,end;
???
???
????end = start + length - 1;
???
???
????sector_base = SEEDDM642_FLASH_BASE;??????
????for (i = 0; i < SEEDDM642_FLASH_SECTORS; i++)
????{
????????if ((start <= sector_base) && (sector_end[i] <= end))?
????????{
???????????
????????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xaa;
????????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x55;
????????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x80;
????????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xaa;
????????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x55;
???????????
???????????
????????????pdata = (Uint8 *)sector_base;
????????????*pdata = 0x30;
???????????
???????????
????????????while (1)
????????????{
????????????????if (*pdata & 0x80)
????????????????{
????????????????????break;
????????????????}
?????????????}??????
???????????
????????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xf0;???????????????????
????????}
???????
???????
????????sector_base = sector_end[i] + 1;
????}
}
?
程序说明:
1)???????首先是擦除FLASH必须是擦整个扇区,这也就是为什么需要判断该页是否要擦除:if ((start <= sector_base) && (sector_end[i] <= end))。
2)???????擦除FLASH时先向整个FLASH的首地址(SEEDDM642_FLASH_BASE)写入0xaa、0x55、0x80、0xaa、0x55。
3)???????在向被擦除的扇区的首地址(sector_base)写入0x30,在擦完后写入0xf0。
?
2.?????读FLASH
?
void SEEDDM642_FLASH_read(Uint32 src,Uint32 dst,Uint32 length)
{
????Uint8 *psrc,*pdst;
????Uint32 i;
???
???
????psrc = (Uint8 *)src;
????pdst = (Uint8 *)dst;
????for (i = 0; i < length; i++)
????{
????????*pdst++ = *psrc++;
????}
}
程序说明:
这段程序主要就是将FLASH中从src开始的length(字节)的内容读到dst开始的存储空间。
3.?????写FLASH
?
void SEEDDM642_FLASH_write(Uint32 src,*pdst;
????Uint32 i;
?
???
????psrc = (Uint8 *)src;
????pdst = (Uint8 *)dst;
????for (i = 0; i < length; i++)
????{
????????// Program one 8-bit word
????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xaa;
????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x55;
????????*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xa0;
????????*pdst = *psrc;
???????
????????// Wait for operation to complete
????????while(1)
????????{
????????????if (*pdst == *psrc)
????????????{
????????????????break;
????????????}
????????}??????
????????pdst++;
????????psrc++;
????}
???
???
????*((Uint16 *)SEEDDM642_FLASH_BASE) = 0xf0;???
}
程序说明:
写FLASH时先向整个FLASH的首地址(SEEDDM642_FLASH_BASE)写入0xaa、0x55、0xa0。