《嵌入式系统及应用 (13).pdf》由会员分享,可在线阅读,更多相关《嵌入式系统及应用 (13).pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式系统及应用嵌入式系统及应用第十三讲 Flash在线编程【课本8.1】第第8章包含三个模块:章包含三个模块:Flash、ADC、DAC,分两讲分两讲,这一讲给出这一讲给出Flash在线编程的通用基础在线编程的通用基础知识知识、Flash构件的使用方法及构件的使用方法及Flash构件的构件的制作方制作方法法。下一讲阐述下一讲阐述ADC与与DAC模块模块。嵌入式系统及应用嵌入式系统及应用8.1 Flash在线编程在线编程8.1.1 8.1.1 Flash在线编程的通用基础知识在线编程的通用基础知识Flash存储器存储器特点特点:失电后不:失电后不丢失信息、电丢失信息、电可可擦除、可擦除、可在线
2、在线编程等。编程等。Flash存储器用途存储器用途:(:(1)存储程序与常数;(存储程序与常数;(2)在线编程,存储工作过程参数。)在线编程,存储工作过程参数。FlashFlash存储器的擦存储器的擦写的两种模式写的两种模式:(:(1 1)写入写入器编程模式器编程模式,即通过编程器将程序写,即通过编程器将程序写入入FlashFlash存储器存储器中,一般中,一般用于初始程序的写入用于初始程序的写入;(;(2 2)在线在线编程模式编程模式,即通过运行,即通过运行FlashFlash内部程序对内部程序对FlashFlash其他区域进行擦除与其他区域进行擦除与写入,用于写入,用于程序运行过程中,进行
3、部分程程序运行过程中,进行部分程序的更新或保存数据序的更新或保存数据。特别说明特别说明:由于:由于FlashFlash存储器的物理结构与存储器的物理结构与RAMRAM不同,目前不同,目前FlashFlash存储器的写入存储器的写入相对比较麻烦,但比相对比较麻烦,但比20002000年左右的时候已经方便许多,那时因没有解决擦写过程加高年左右的时候已经方便许多,那时因没有解决擦写过程加高压不稳定问题,需要把压不稳定问题,需要把FlashFlash擦写程序移入擦写程序移入RAMRAM中,才能正确运行。中,才能正确运行。第第2 2页页 共共1212页页嵌入式系统及应用嵌入式系统及应用FalshFals
4、h擦除与写入的含义擦除与写入的含义:对:对FlashFlash存储器的读写不同于对一般的存储器的读写不同于对一般的RAMRAM读读写,需要专门的编程过程。写,需要专门的编程过程。FlashFlash编程的基本操作有两种:擦除(编程的基本操作有两种:擦除(EraseErase)和写)和写入(入(ProgramProgram)。)。擦除操作的含义擦除操作的含义是将存储单元的内容由二进制的是将存储单元的内容由二进制的0 0变成变成1 1,而,而写入操作的含义写入操作的含义是将存储单元的某些位由二进制的是将存储单元的某些位由二进制的1 1变成变成0 0。FlashFlash在线编程的写在线编程的写入操
5、作是以字为单位进行的入操作是以字为单位进行的。FalshFalsh擦除与擦除与写入的基本要求:写入的基本要求:在在执行写入操作之前,要确保写入区在上一执行写入操作之前,要确保写入区在上一次擦除之后没有被写入过,即写入区是空白的。所以,在写入之前一般都要先执次擦除之后没有被写入过,即写入区是空白的。所以,在写入之前一般都要先执行擦除操作行擦除操作。FlashFlash在线编程的擦除操作包括整体擦除和以在线编程的擦除操作包括整体擦除和以mm个字为单位的擦个字为单位的擦除。这除。这mm个字在不同厂商或不同系列的个字在不同厂商或不同系列的MCUMCU中,其称呼不同,有的称为中,其称呼不同,有的称为“块
6、”,有的称为“页”,有的称为“块”,有的称为“页”,有的称为“扇区扇区”等等。它表示”等等。它表示在线擦除的最小度量在线擦除的最小度量单位单位,我们可以,我们可以统一使用扇区这个术语统一使用扇区这个术语。第第3 3页页 共共1212页页嵌入式系统及应用嵌入式系统及应用8.1.2 8.1.2 基于构件的基于构件的Flash在线编程方法在线编程方法1 1.FlashFlash构件构件APIAPI利用构件进行利用构件进行Flash在线编程在线编程,首先要了解所使用芯片的首先要了解所使用芯片的Flash存储器地址范围存储器地址范围,扇扇区大小区大小,扇区扇区数数,例如本例如本书样例芯片书样例芯片STM
7、32L431的的Flash地址范围是地址范围是:0 x0800_0000-0 x0803_FFFF,扇区大小为扇区大小为2KB,共共128扇区扇区。在线在线编程时编程时,擦除以擦除以扇区扇区为单位进行为单位进行,写入以写入以字字(4个字节个字节)为单位为单位,写入首地址写入首地址需需字对齐字对齐。第第4 4页页 共共1212页页嵌入式系统及应用嵌入式系统及应用FlashFlash构件的主要构件的主要APIAPI有有FlashFlash的的初始化初始化、擦除擦除、写入写入等等,注意擦除注意擦除操操作是以扇区为作是以扇区为基本单位基本单位。第第5 5页页 共共1212页页嵌入式系统及应用嵌入式系统
8、及应用2基于构件的基于构件的Flash在线编程举例在线编程举例(1)初始化初始化Flash模块模块:flash_init();(2)擦除一个扇区擦除一个扇区。执行写入操作之前执行写入操作之前,要确保写入区在上一次擦除之后没有被写要确保写入区在上一次擦除之后没有被写入过入过,在写入之前要根据情况确定是否先执行擦除操作在写入之前要根据情况确定是否先执行擦除操作,例擦除第例擦除第50扇区:扇区:flash_erase(50);(3)进行写入操作进行写入操作:例:例:/向向50扇区第扇区第0偏移地址开始写偏移地址开始写32个字节数据个字节数据flash_write(50,0,32,(uint8_t*)
9、Welcome to Soochow University!);(4)读出观察读出观察。按照逻辑地址读取时按照逻辑地址读取时,定义足够长度的数组变量定义足够长度的数组变量params,并传入并传入数组的首地址作为目的地址参数数组的首地址作为目的地址参数,传入扇区号传入扇区号、偏移地址作为源地址偏移地址作为源地址,传入读取的传入读取的字节长度:字节长度:flash_read_logic(params,50,0,32);/从从50扇区读取扇区读取32个字节到个字节到params中中第第6 6页页 共共1212页页嵌入式系统及应用嵌入式系统及应用第第7 7页页 共共1212页页嵌入式系统及应用嵌入式
10、系统及应用1 1.FlashFlash模块寄存器模块寄存器概述概述构件构件的制作过程的制作过程第一步是了解编程所涉及的寄存器第一步是了解编程所涉及的寄存器。Flash模块主要寄模块主要寄存器有:存器有:访问控制寄存器访问控制寄存器(ACR)、掉电密钥寄存器掉电密钥寄存器(PDKEYR)、状状态寄存器态寄存器(SR)、控制寄存器控制寄存器(CR)等等12个寄存器个寄存器,书中书中表表8-2给出了给出了Flash寄存器功能概述寄存器功能概述,详细说明见电子资源中的补充阅读材料详细说明见电子资源中的补充阅读材料。8.1.3 8.1.3 Flash构件的制作过程构件的制作过程第第8 8页页 共共121
11、2页页嵌入式系统及应用嵌入式系统及应用2.Flash构件接口函数原型分析构件接口函数原型分析构件的制作过程构件的制作过程第二步是接口函数原型分析第二步是接口函数原型分析。Flash在线编程主要有初在线编程主要有初始化始化、擦除擦除、写入写入、读取等基本操作读取等基本操作,可将它们封装成可将它们封装成7个功能函数:个功能函数:(1)初始化函数初始化函数 void flash_init()。在操作在操作Flash模块前模块前。需要对模块进行需要对模块进行初始化初始化,主要是清相关标志位和启用字操作主要是清相关标志位和启用字操作。(2)擦除函数擦除函数 uint8_t flash_erase(uin
12、t16_t sect)。由于在写入之前由于在写入之前Flash字节或者长字节必须处于擦除状态字节或者长字节必须处于擦除状态(不允许累积写入不允许累积写入,否则可能会得到意想否则可能会得到意想不到的值不到的值),因此因此,在写入操作前在写入操作前,一般先进行一般先进行Flash的擦除操作的擦除操作。擦除操作擦除操作有整体擦除和扇区擦除两种操作模式有整体擦除和扇区擦除两种操作模式,整体擦除用于写入器写入初始程序场整体擦除用于写入器写入初始程序场景景,Flash在线编程只能使用扇区擦除模式在线编程只能使用扇区擦除模式。flash_erase函数待擦除的扇区号函数待擦除的扇区号作为入口参数作为入口参数
13、,擦除是否成功作为返回值擦除是否成功作为返回值。第第9 9页页 共共1212页页嵌入式系统及应用嵌入式系统及应用(3)写入写入(按逻辑地址按逻辑地址)uint8_tflash_write(uint16_t sect,uint16_toffset,uint16_t N,uint8_t*buf)。写入函数与擦除函数类似写入函数与擦除函数类似,主要区别在于主要区别在于,擦除操作向目标地址中写擦除操作向目标地址中写0 xFF,而写入操作需要写入指定数据而写入操作需要写入指定数据。因此因此,写写入操作的入口参数包括目标扇区号入操作的入口参数包括目标扇区号、写入扇区内部偏移地址写入扇区内部偏移地址、写入字
14、节数目写入字节数目以及源数据首地址以及源数据首地址,写入后返回写入状态写入后返回写入状态(正常正常/异常异常)。(4)写 入写 入(按 物 理 地 址按 物 理 地 址)uint8_t flash_write_physical(uint32_taddr,uint16_t N,uint8_t buf)。参数包括目标的物理地址参数包括目标的物理地址,写入的字节数目写入的字节数目以及源数据缓冲区首地址以及源数据缓冲区首地址。写入后返回写入状态写入后返回写入状态(正常正常/异常异常)。继续分析:读取继续分析:读取(按逻辑地址按逻辑地址)、读取读取(按物理地址按物理地址)、判空函数判空函数等函等函数的形
15、参数的形参。这些这些函数原型放入函数原型放入Flash.h,源码源码放入放入Flash.c,制作好的制作好的构件测试完成构件测试完成后后,放入放入STM32L431构件库构件库,使用时复制该构件的两个文件到工程使用时复制该构件的两个文件到工程的的“03_MCUMCU_drivers”中中,做到做到“分门别类分门别类,各有归处各有归处”。第第1010页页 共共1212页页嵌入式系统及应用嵌入式系统及应用3 3FlashFlash构件部分函数源码构件部分函数源码void void flash_initflash_init(void)(void)/清除之前的编程导致的所有错误标志位清除之前的编程导致
16、的所有错误标志位FLASHFLASH-SR&=SR&=0 xFFFFFFUL0 xFFFFFFUL;/解锁解锁FlashFlash控制寄存器控制寄存器(CR)CR)if(if(FLASHFLASH-CR&CR&FLASH_CR_LOCKFLASH_CR_LOCK)!=)!=0U0U)FLASHFLASH-KEYRKEYR=(=(uint32_tuint32_t)FLASH_KEY1FLASH_KEY1;FLASHFLASH-KEYRKEYR=(=(uint32_tuint32_t)FLASH_KEY2FLASH_KEY2;/等待之前最后一个等待之前最后一个flashflash操作完成操作完成while(FLASHwhile(FLASH-SR&SR&FLASH_SR_BSYFLASH_SR_BSY)!=)!=0U0U););/清数据缓冲区清数据缓冲区FLASHFLASH-ACRACR&=&=FLASH_ACR_DCEN_MskFLASH_ACR_DCEN_Msk;/清闪存即时编程位清闪存即时编程位FLASHFLASH-CR&=CR&=FLASH_CR_PG_MskFLASH_CR_PG_Msk;第第1111页页 共共1212页页嵌入式系统及应用嵌入式系统及应用谢谢!谢谢!第第1212页页 共共1212页页