freescale semiconductor 第10章Flash在线编程 V1.0 2009.2
第10章 Flash在线编程 V1.0 2009.2 1
本章目录 10.1 Flash存储器概述 10.2 ColdFire Flash存储器编程方法 10.3 ColdFire Flash擦写函数的测试工程 10.4 ColdFire Flash存储器的保护特性和安全性
本章目录 10.1 Flash存储器概述 10.2 ColdFire Flash存储器编程方法 10.3 ColdFire Flash擦写函数的测试工程 10.4 ColdFire Flash存储器的保护特性和安全性 2
10.1 Flash存储器概述 1.Flash存储器的特性 (1)固有不挥发性。 (2)易更新性。 (3)成本低、密度高、可靠性好。 2.Flash存储器编程的基本概念 Flash编程的基本操作有两种: >擦除(Erase) 将存储单元的内容由二进制的0变成1。 >写入(Program)。 将存储单元的内容由二进制的1变成0。擦除操作包括整体 擦除和页擦除。而写入操作是以字为单位进行的。在擦除 及写入过程中一般需要高于电源的电压
10.1 Flash存储器概述 1.Flash存储器的特性 (1)固有不挥发性。 (2)易更新性。 (3)成本低、密度高、可靠性好。 2.Flash存储器编程的基本概念 Flash编程的基本操作有两种: ➢擦除(Erase) 将存储单元的内容由二进制的0变成1。 ➢写入(Program)。 将存储单元的内容由二进制的1变成0。擦除操作包括整体 擦除和页擦除。而写入操作是以字为单位进行的。在擦除 及写入过程中一般需要高于电源的电压。 3
10.2 ColdFire Flash存储器编程方法 通用Flash总线 偶 奇 通用Flash总线接口 ↑ ↑ 偶数块 奇数块 阵列0阵列1 阵列2阵列3 工 工 Flash存储控制器 工 Flash命令控制器 内部Flash总线接口 工 内部Flash总线 ColdFire Flash模块框架图
10.2 ColdFire Flash存储器编程方法 通用 Flash 总线接口 奇数块 Flash 存储控制器 Flash 命令控制器 内部 Flash 总线接口 内部 Flash 总线 通用 Flash 总线 偶数块 偶 奇 阵列 0 阵列 1 阵列 2 阵列 3 ColdFire Flash 模块框架图 4
10.2 ColdFire Flash存储器编程方法 10.2.1 ColdFire Flash模块寄存器 1.FLASH基地址寄存器FLASHBAR(Flash Base Address Register FLASHBAR定义Flash的基地址、寄存器内容是否有效、权限访问。 2.CFM时钟分频寄存器CFMCLKD(CFM Clock Divider Register CFMCLKD寄存器主要用于对擦除与写入时间的控制。 3.CFM模块配置寄存器CFMMCR(CFM Module Configuration Register CFMMCR寄存器用于配置和控制内部总线接口操作。 4.CFM保护寄存器CFMPROT(CFM Protection Register 该32位的寄存器每一位控制着MCF52233的一个扇区,此寄存器只 有在LOCK位为零的时候才能够设置,相应位为1表示相应的扇区被保护, 不可以擦除写入;为0则表示相应的扇区未被保护
10.2.1 ColdFire Flash模块寄存器 1.FLASH基地址寄存器FLASHBAR(Flash Base Address Register) FLASHBAR定义Flash的基地址、寄存器内容是否有效、权限访问。 2.CFM时钟分频寄存器CFMCLKD(CFM Clock Divider Register) CFMCLKD寄存器主要用于对擦除与写入时间的控制。 3.CFM模块配置寄存器CFMMCR(CFM Module Configuration Register) CFMMCR寄存器用于配置和控制内部总线接口操作。 4.CFM保护寄存器CFMPROT(CFM Protection Register) 该32位的寄存器每一位控制着MCF52233的一个扇区,此寄存器只 有在LOCK位为零的时候才能够设置,相应位为1表示相应的扇区被保护, 不可以擦除写入;为0则表示相应的扇区未被保护。 10.2 ColdFire Flash存储器编程方法 5
10.2 ColdFire Flash存储器编程方法 10.2.1 ColdFire Flash模块寄存器 5.CFM安全寄存器CFMSEC(CFM Security Register) 该32位的寄存器用于存储Flash的保护字和保护状态。 6.CFM用户状态寄存器CFMUSTAT(CFM User Status Register CFMUSTAT寄存器定义了Flash命令控制器、Flash存储访问、保护及空白 检测等状态。 7.Flash命令寄存器CFMCMD(CFM Command Register) Flashi命令寄存器定义了Flash操作的相关命令,复位全为0。 6
10.2.1 ColdFire Flash模块寄存器 5.CFM安全寄存器CFMSEC(CFM Security Register) 该32位的寄存器用于存储Flash的保护字和保护状态。 6.CFM用户状态寄存器CFMUSTAT(CFM User Status Register) CFMUSTAT寄存器定义了Flash命令控制器、Flash存储访问、保护及空白 检测等状态。 7.Flash命令寄存器CFMCMD(CFM Command Register) Flash命令寄存器定义了Flash操作的相关命令,复位全为0。 10.2 ColdFire Flash存储器编程方法 6
10.2 ColdFire Flash存储器编程方法 10.2.2 ColdFire Flash存储器擦除与写入的步骤 1.擦除和写入流程的一些公共操作 (1)判断是否设置时钟分频,若未分频,则先分频。 (2)清除用户状态寄存器CFMUSTATI的保护错误标志位 PVIOL和访问错误标志位ACCERR,以免前一次的操作 结果干扰本次操作。 static void Flash_Init(uint32 busclk); /Flash擦/写初始化操作
10.2.2 ColdFire Flash存储器擦除与写入的步骤 1.擦除和写入流程的一些公共操作 (1)判断是否设置时钟分频,若未分频,则先分频。 (2)清除用户状态寄存器CFMUSTAT的保护错误标志位 PVIOL和访问错误标志位ACCERR,以免前一次的操作 结果干扰本次操作。 static void Flash_Init(uint32 busclk); //Flash擦/写初始化操作 10.2 ColdFire Flash存储器编程方法 7
10.2 ColdFire Flash存储器编程方法 10.2.2 ColdFire Flash存储器擦除与写入的步骤 2.Flash的擦除 (1)设置时钟分频,清相关错误标志位,这些操作已作为擦除 和写入流程开始部分的公共操作被封装成子程序Flash Init,擦 除时直接调用即可。 (2)定位要擦除的页。向要擦除的页中任意地址写一任意值。 (3)向命令寄存器CFMCMD.写页擦除命令0x40。 (4)向状态寄存器CFMUSTAT的命令缓冲区空中断标志位 CBEIF写1,以清零该位来启动命令执行。 (5)等待直到命令执行完成,状态寄存器CFMUSTATI的命令完 成中断标志位CCIF为1标志命令执行完成。 uint8 Flash_Page_Erase(uint8 page); /擦除指定的页 8
10.2.2 ColdFire Flash存储器擦除与写入的步骤 2.Flash的擦除 (1)设置时钟分频,清相关错误标志位,这些操作已作为擦除 和写入流程开始部分的公共操作被封装成子程序Flash_Init,擦 除时直接调用即可。 (2)定位要擦除的页。向要擦除的页中任意地址写一任意值。 (3)向命令寄存器CFMCMD写页擦除命令0x40。 (4)向状态寄存器CFMUSTAT的命令缓冲区空中断标志位 CBEIF写1,以清零该位来启动命令执行。 (5)等待直到命令执行完成,状态寄存器CFMUSTAT的命令完 成中断标志位CCIF为1标志命令执行完成。 uint8 Flash_Page_Erase(uint8 page); //擦除指定的页 10.2 ColdFire Flash存储器编程方法 8
10.2 ColdFire Flash存储器编程方法 10.2.2 ColdFire Flash存储器擦除与写入的步骤 3.Flash的写入 注意,应该向干净的区域(即没有被写过的区域)写入。 (1)设置时钟分频,清相关错误标志位,这些操作已作为擦除和写入 流程开始部分的公共操作被封装成子程序Flash_Init,直接调用即可。 (2)向指定地址写若干字数据。 首先,将源地址的一个字写入目标地址。 其次,向命令寄存器CFMCMD载入命令0x20。 第三,向状态寄存器CFMUSTATI的命令缓冲区空中断标志位CBEIF.写 1,以清零该位来启动命令执行。 第四,等待直到上一条命令执行完毕,即状态寄存器CFMUSTATI的 CBIF位为1,这时就可以接收下一条命令。 最后,如果尚未写完数据,递增源地址和目标地址,转(2)。 uint8 Flash_Page_Write(uint8 page,uint16 pstart,uint32 *addr_source,uint16 N); /从地址addr_source.写入N个字节到第page页的地址pstart*4处 9
10.2.2 ColdFire Flash存储器擦除与写入的步骤 3.Flash的写入 注意,应该向干净的区域(即没有被写过的区域)写入。 (1)设置时钟分频,清相关错误标志位,这些操作已作为擦除和写入 流程开始部分的公共操作被封装成子程序Flash_Init,直接调用即可。 (2)向指定地址写若干字数据。 首先,将源地址的一个字写入目标地址。 其次,向命令寄存器CFMCMD载入命令0x20。 第三,向状态寄存器CFMUSTAT的命令缓冲区空中断标志位CBEIF写 1,以清零该位来启动命令执行。 第四,等待直到上一条命令执行完毕,即状态寄存器CFMUSTAT的 CBEIF位为1,这时就可以接收下一条命令。 最后,如果尚未写完数据,递增源地址和目标地址,转(2)。 uint8 Flash_Page_Write(uint8 page,uint16 pstart,uint32 *addr_source,uint16 N); //从地址addr_source写入N个字节到第page页的地址pstart*4处 10.2 ColdFire Flash存储器编程方法 9
10.2 ColdFire Flash存储器编程方法 10.2.2 ColdFire Flash存储器擦除与写入的步骤 4.Flash命令出错的几种可能情况 在向Flash地址写入数据前没有进行CFMCLKD寄存器设置 CBEIF不为1时写Flash 写Flash块的数据长度不是32位 写完Flash偶数块后不是向奇数块写数据而是向Flash的其他块写入数据 向CFMCMD中写入规定的5种命令以外的命令字 向Flash任意地址写一个值后没有写CFMCMD寄存器 在执行完CFMCMD命令前,再次写CFMCMD 写CFMCMD后不将CFMUSTATI的CBEIF清零 进入STOP模式时有命令未处理完 向Flash保护区域进行擦除或写入 10
10.2.2 ColdFire Flash存储器擦除与写入的步骤 4.Flash命令出错的几种可能情况 在向Flash地址写入数据前没有进行CFMCLKD寄存器设置 CBEIF不为1时写Flash 写Flash块的数据长度不是32位 写完Flash偶数块后不是向奇数块写数据而是向Flash的其他块写入数据 向CFMCMD中写入规定的5种命令以外的命令字 向Flash任意地址写一个值后没有写CFMCMD寄存器 在执行完CFMCMD命令前,再次写CFMCMD 写CFMCMD后不将CFMUSTAT的CBEIF清零 进入STOP模式时有命令未处理完 向Flash保护区域进行擦除或写入 10.2 ColdFire Flash存储器编程方法 10