依据2008年9月英文第4版翻译。本译文仅供参考,如有翻译错误,请以英文原稿为准信息块分为两个部分:系统存储器是用于存放在系统存储器自举模式下的启动程序,这个区域只保留给ST使用启动程序使用USART1串行接口实现对闪存存储器的编程;ST在生产线上对这个区域编程并锁定以防止用户擦写。关于使用这个启动程序的详细信息,请参阅AN2606·选择字节对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。闪存存储器有两种保护方式防止非法的访问(读、写、擦除):·页写入保护·读出保护详情请参考0节。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。进行闪存编程操作时(写或擦除),必须打开内部的RC振荡器(HSI)闪存存储器可以用ICP或IAP方式编程。注:在低功耗模式下,所有闪存存储器的操作都被中止。详情请阅STM32F10xXX参考手册STSTM32F10xxx闪存编程页6/22
依据2008年9月英文第4版翻译。本译文仅供参考,如有翻译错误,请以英文原稿为准 STM32F10xxx闪存编程 页6/22 信息块分为两个部分: z 系统存储器是用于存放在系统存储器自举模式下的启动程序,这个区域只保留给ST使用, 启动程序使用USART1串行接口实现对闪存存储器的编程;ST在生产线上对这个区域编程 并锁定以防止用户擦写。关于使用这个启动程序的详细信息,请参阅AN2606。 z 选择字节 对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压 由内部产生。 闪存存储器有两种保护方式防止非法的访问(读、写、擦除): z 页写入保护 z 读出保护 详情请参考0节。 在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地 进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。 进行闪存编程操作时(写或擦除),必须打开内部的RC振荡器(HSI)。 闪存存储器可以用ICP或IAP方式编程。 注: 在低功耗模式下,所有闪存存储器的操作都被中止。详情请阅STM32F10xxx参考手册
依据2008年9月英文第4版翻译。本译文仅供参考,如有翻译错误,请以英文原稿为准2读/编写STM32F10xXX内置闪存2.1简介本节介绍如何读和对STM32F10xXX的内置闪存编程。2.2读操作内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。读接口在闪存端包含一个读控制器,还包含一个AHB接口与CPU衔接。这个接口的主要工作是产生读闪存的控制信号并预取CPU要求的指令块,预取指令块仅用于在I-Code总线上的取指操作,数据常量是通过D-Code总线访问的。这两条总线的访问目标是相同的闪存模块,访问DCode将比预取指令优先级高。2.2.1取指令Cortex-M3在I-Code总线上取指令,在D-Code总线上取数据。预取指令块可以有效地提高对I-Code总线访问的效率。预取缓冲器预取缓冲器包含两个数据块,每个数据块有8个字节;预取指令(数据)块直接映像到闪存中,因为数据块的大小与闪存的宽度相同,所以读取预取指令块可以在一个读周期完成。设置预取缓冲器可以使CPU更快地执行,CPU读取一个字的同时下一个字已经在预取缓冲器中等候,即当代码跳转的边界为8字节的倍数时,闪存的加速比例为2。预取控制器预取控制器根据预取缓冲器中可用的空间决定是否访问闪存,预取缓冲器中有至少一块的空余空间时,预取控制器则启动一次读操作。清除闪存访问控制寄存器中的一个控制位能够关闭预取缓冲器。芯片复位后预取缓冲器处于开启状态。注意:当AHB时钟的预分频系数不为1"时,必须打开预取缓冲器(FLASH_ACR[4]=1)。如果在系统中没有高频率的时钟,即HCLK频率较低时,闪存的访问只需半个HCLK周期(半周期的闪存访问只能在时钟频率低于8MHz时进行,使用HSI或HSE并且关闭PLL时可得到这样的频率:在闪存访问控制寄存器中有一个控制位可以选择这种工作方式。注意:当使用了预取缓冲器和AHB时钟的预分频系数不为1'时,不能使用半周期访问方式。访问时间调节器为了维持读内存的控制信号,预取控制器的时钟周期与闪存访问时间的比例由闪内存访问控制器控制;这个值给出了能够正确地读取数据时,闪存控制信号所需的时钟周期数目:芯片复位后,该值为O,闪存访问仅为一个时钟周期。D-Code接口2.2.2D-Code接口包含CPU端简单的AHB接口和对闪存访问控制器的仲裁器提出访问请求的逻辑电路。D-Code的访问优先于预取指令的访问。这个接口使用预取缓冲器的访问时间调节器模块。2.2.3闪存访问控制器这个模块就是在I-Code上的指令预取请求和D-Code接口上读请求的仲裁器。D-Code接口的请求优先于I-Code的请求。S页7/22STM32F10xXx闪存编程
依据2008年9月英文第4版翻译。本译文仅供参考,如有翻译错误,请以英文原稿为准 STM32F10xxx闪存编程 页7/22 2 读/编写STM32F10xxx内置闪存 2.1 简介 本节介绍如何读和对STM32F10xxx的内置闪存编程。 2.2 读操作 内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容 并得到相应的数据。 读接口在闪存端包含一个读控制器,还包含一个AHB接口与CPU衔接。这个接口的主要工作是 产生读闪存的控制信号并预取CPU要求的指令块,预取指令块仅用于在I-Code总线上的取指操 作,数据常量是通过D-Code总线访问的。这两条总线的访问目标是相同的闪存模块,访问DCode将比预取指令优先级高。 2.2.1 取指令 Cortex-M3在I-Code总线上取指令,在D-Code总线上取数据。预取指令块可以有效地提高对ICode总线访问的效率。 预取缓冲器 预取缓冲器包含两个数据块,每个数据块有8个字节;预取指令(数据)块直接映像到闪存中,因 为数据块的大小与闪存的宽度相同,所以读取预取指令块可以在一个读周期完成。 设置预取缓冲器可以使CPU更快地执行,CPU读取一个字的同时下一个字已经在预取缓冲器中 等候,即当代码跳转的边界为8字节的倍数时,闪存的加速比例为2。 预取控制器 预取控制器根据预取缓冲器中可用的空间决定是否访问闪存,预取缓冲器中有至少一块的空余 空间时,预取控制器则启动一次读操作。 清除闪存访问控制寄存器中的一个控制位能够关闭预取缓冲器。芯片复位后预取缓冲器处于开 启状态。 注意: 当AHB时钟的预分频系数不为’1’时,必须打开预取缓冲器(FLASH_ACR[4]=1)。 如果在系统中没有高频率的时钟,即HCLK频率较低时,闪存的访问只需半个HCLK周期(半周 期的闪存访问只能在时钟频率低于8MHz时进行,使用HSI或HSE并且关闭PLL时可得到这样的 频率);在闪存访问控制寄存器中有一个控制位可以选择这种工作方式。 注意: 当使用了预取缓冲器和AHB时钟的预分频系数不为’1’时,不能使用半周期访问方式。 访问时间调节器 为了维持读闪存的控制信号,预取控制器的时钟周期与闪存访问时间的比例由闪存访问控制器 控制;这个值给出了能够正确地读取数据时,闪存控制信号所需的时钟周期数目;芯片复位 后,该值为’0’,闪存访问仅为一个时钟周期。 2.2.2 D-Code接口 D-Code接口包含CPU端简单的AHB接口和对闪存访问控制器的仲裁器提出访问请求的逻辑电 路。D-Code的访问优先于预取指令的访问。这个接口使用预取缓冲器的访问时间调节器模块。 2.2.3 闪存访问控制器 这个模块就是在I-Code上的指令预取请求和D-Code接口上读请求的仲裁器。 D-Code接口的请求优先于I-Code的请求
依据2008年9月英文第4版翻译。本译文仅供参考,如有翻译错误,请以英文原稿为准2.3闪存编程和擦除控制器(FPEC)FPEC模块处理闪存的编程和擦除操作,它包括7个32位的寄存器:·FPEC键寄存器(FLASH_KEYR选择字节键寄存器(FLASH_OPTKEYR)·?闪存控制寄存器(FLASH_CR)e闪存状态寄存器(FLASH_SR).闪存地址寄存器(FLASH_AR).选择字节寄存器(FLASH_OBR).写保护寄存器(FLASH_WRPR)只要CPU不访问闪存,闪存操作不会延缓CPU的执行。键值2.3.1共有三个键值:·RDPRT键=0x000000A5KEY1=0x45670123。KEY2=0xCDEF89AB2.3.2解除闪存锁复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到FLASHKEYR寄存器可以打开FPEC模块,这个特定的序列是在FLASHKEYR写入两个键值(KEY1和KEY2,见2.3.1节):错误的操作序列都会在下次复位前锁死FPEC模块和FLASH_CR寄存器。写入错误的键序列还会产生总线错误;总线错误发生在第一次写入的不是KEY1,或第一次写入的是KEY1但第二次写入的不是KEY2时:FPEC模块和FLASHCR寄存器可以由程序设置FLASHCR寄存器中的LOCK位锁住,这时可以通过在FLASHKEYR中写入正确的键值对FPEC解锁。2.3.3主闪存编程对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为'1"时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为1),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。SISTM32F10xxx闪存编程页8/22
依据2008年9月英文第4版翻译。本译文仅供参考,如有翻译错误,请以英文原稿为准 STM32F10xxx闪存编程 页8/22 2.3 闪存编程和擦除控制器(FPEC) FPEC模块处理闪存的编程和擦除操作,它包括7个32位的寄存器: z FPEC键寄存器(FLASH_KEYR) z 选择字节键寄存器(FLASH_OPTKEYR) z 闪存控制寄存器(FLASH_CR) z 闪存状态寄存器(FLASH_SR) z 闪存地址寄存器(FLASH_AR) z 选择字节寄存器(FLASH_OBR) z 写保护寄存器(FLASH_WRPR) 只要CPU不访问闪存,闪存操作不会延缓CPU的执行。 2.3.1 键值 共有三个键值: z RDPRT键 = 0x000000A5 z KEY1 = 0x45670123 z KEY2 = 0xCDEF89AB 2.3.2 解除闪存锁 复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到 FLASH_KEYR寄存器可以打开FPEC模块,这个特定的序列是在FLASH_KEYR写入两个键值 (KEY1和KEY2,见2.3.1节);错误的操作序列都会在下次复位前锁死FPEC模块和FLASH_CR 寄存器。 写入错误的键序列还会产生总线错误;总线错误发生在第一次写入的不是KEY1,或第一次写入 的是KEY1但第二次写入的不是KEY2时;FPEC模块和FLASH_CR寄存器可以由程序设置 FLASH_CR寄存器中的LOCK位锁住,这时可以通过在FLASH_KEYR中写入正确的键值对 FPEC解锁。 2.3.3 主闪存编程 对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为’1’时,在一个闪存地址写入 一个半字将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中 (BSY位为’1’),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束