【原创】DSP_FLASH操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* Establish source and destination */
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)
*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x80;
*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xaa;
*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x55;
/* Start erase at sector address */
{
if ((start <= sector_base) && (sector_end[i] <= end))/*判断该页是否要擦除*/
{
/* Start sector erase sequence */
*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xaa;
*((Uint8 *)SEEDDM642_FLASH_BASE) = 0x55;
}
/* Advance to next sector */
sector_base = sector_end[i] + 1;
}
}
程序说明:
1)首先是擦除FLASH必须是擦整个扇区,这也就是为什么需要判断该页是否要擦除:if ((start <= sector_base) && (sector_end[i] <= end))。
pdata = (Uint8 *)sector_base;
*pdata = 0x30;
/* Wait for erase to complete */
while (1)
{
if (*pdata & 0x80)
{
break;
}
}
/* Put back in read mode */
*((Uint8 *)SEEDDM642_FLASH_BASE) = 0xf0;
SEEDDM642_FLASH_BASE + 0x07ffff /* Sector 7 */
};
void SEEDDM642_FLASH_erase(Uint32 start, Uint32 length)
{
Int16 i;
Uint8 *pdata;
Uint32 sector_base, end;
/* Calculate extents of range to erase */
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)
FLASH的读写
说是原创其实也没多少是自己的东西,主要就是合众达的SEEDVPM642的例程,再加上一些程序说明,有本书《TMS320 DM642应用系统设计与开发》里面写的很全,还包括使用CPLD对地址空间的拓展。
注意:FLASH在写之前必须先擦除FLASH上的内 Constant table containing end address of each sector */
SEEDDM642_FLASH_BASE + 0x03ffff, /* Sector 3 */
SEEDDM642_FLASH_BASE + 0x04ffff, /* Sector 4 */
SEEDDM642_FLASH_BASE + 0x05ffff, /* Sector 5 */
SEEDDM642_FLASH_BASE + 0x06ffff, /* Sector 6 */
{
Uint8 *psrc, *pdst;
Uint32 i;
/* Establish source and destination */
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, Uint32 dst, Uint32 length)
{
Uint8 *psrc, *pdst;
Uint32 i;
end = start + length - 1;
/* Walk through each sector, erase any sectors within range */
sector_base = SEEDDM642_FLASH_BASE;/*FLASH的基地址*/
for (i = 0; i < SEEDDM642_FLASH_SECTORS; i++)
static Uint32 sector_end[SEEDDM642_FLASH_SECTORS] = {
SEEDDM642_FLASH_BASE + 0x00ffff, /* Sector 0 */
SEEDDM642_FLASH_BASE + 0x01ffff, /* Sector 1 */
SEEDDM642_FLASH_BASE + 0x02ffff, /* Sector 2 */
{
break;
}
}
pdst++;
psrc++;
}
/* Put back in read mode */
*((Uint16 *)SEEDDM642_FLASH_BASE) = 0xf0;
}
程序说明:
写FLASH时先向整个FLASH的首地址(SEEDDM642_FLASH_BASE)写入0xaa、0x55、0xa0。
相关文档
最新文档