最新flashsetlatency位置推荐word版 15页Word格式.docx
《最新flashsetlatency位置推荐word版 15页Word格式.docx》由会员分享,可在线阅读,更多相关《最新flashsetlatency位置推荐word版 15页Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
![最新flashsetlatency位置推荐word版 15页Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/20/fe031cd7-343d-4f43-9a4f-dadbae07cb99/fe031cd7-343d-4f43-9a4f-dadbae07cb991.gif)
CM3将复位视作异常,优先级最高的异常。
stm32f1有三种复位:
系统复位、电源复位、备份区复位。
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:
程序指针指向0x00000004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x00000000获取堆栈顶的地址。
不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。
而备份区复位则不然,零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。
(权威指南7.3向量表)
三、flash读写没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。
flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。
而且flash确实烧写好了,掉电后数据不会消失
有时需要存储一些数据,在复位后仍然不会丢失,这可能就会用到片上flash,stm32的片上flash结构见。
对flash的编程逻辑上是比较简单的,《flash编程手册》上写的很清楚,3.5固件库给出的例程为:
FLASH_UnlockBank1();
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASHStatus=FLASH_ErasePage(0x0803F800);
//擦除整页FLASHStatus=FLASH_ProgramHalfWord(0x0803F800,DATA);
//写入数据,在指定地址编写半字,DATA:
待写入的数据
需要注意的是,在写之前必须要保证已经擦除,不然硬件不会执行编程指令。
在写0时,不需要先擦除,擦除后存储单元的值为0XFF。
据此可以判断:
所谓的编程,就是与操作,0XFF与任何数与变成那个数,0与任何数与还是0。
另外,擦除一页要21.9ms(对于2k大小的一页),比较慢。
基础应用1
FLASH时序延迟几个周期,等待总线同步操作。
推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;
24—48MHz时,取Latency=1;
48~72MHz时,取Latency=2。
所有程序中必须的
用法:
FLASH_SetLatency(FLASH_Latency_2);
位置:
RCC初始化子函数里面,时钟起振之后。
基础应用2
开启FLASH预读缓冲功能,加速FLASH的读取。
所有程序中必须的用法:
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//使能或者失能预取指缓存
阅读lib:
调试所有外设初始化的函数。
我的理解——不理解,也不需要理解。
只要知道所有外设在调试的时候,EWRAM需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。
基础应用3
只有一个函数debug。
所有程序中必须的。
#ifdefDEBUG
debug();
#endif
main函数开头,声明变量之后。
阅读nvic:
系统中断管理。
我的理解——管理系统内部的中断,负责打开和关闭中断。
基础应用4
中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
//中断管理恢复默认参数
#ifdefVECT_TAB_RAM//如果C/C++Compiler\Preprocessor\Definedsymbols中的定义了VECT_TAB_RAM(见程序库更改内容的表格)
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
//则在RAM调试#else//如果没有定义VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
//则在Flash里调试#endif//结束判断语句
//以下为中断的开启过程,不是所有程序必须的。
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//设置NVIC优先级分组,方式。
//注:
一共16个优先级,分为抢占式和响应式。
两种优先级所占的数量由此代码确定,NVIC_PriorityGroup_x可以是0、1、2、3、4,分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。
规定两种优先级的数量后,所有的中断级别必须在其中选择,抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。
//NVIC_InitStructure.NVIC_IRQChannel=中断通道名;
//开中断,中断名称见函数库
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
//抢占优先级//NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
//响应优先级
//NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//启动此通道的中断//NVIC_Init(&
NVIC_InitStructure);
//中断初始化
}
阅读rcc:
单片机时钟管理。
我的理解——管理外部、内部和外设的时钟,设置、打开和关闭这些时钟。
RCC在RCC部分学习过了,没有问题
篇二:
STM32F10x_Flash
9.1FLASH寄存器结构..............................................................104
9FLASH存储器(FLASH)
Section9.1FLASH寄存器结构描述了固件函数库所使用的数据结构,Section9.2固件库函数介绍了函数库里的所有函数。
9.1FLASH寄存器结构
FLASH寄存器结构,FLASH_TypeDef和OB_TypeDef,在文件中定义如下:
typedefstruct{vu32ACR;
vu32KEYR;
vu32OPTKEYR;
vu32SR;
vu32CR;
vu32AR;
vu32RESERVED;
vu32OBR;
vu32WRPR;
}FLASH_TypeDef;
typedefstruct{vu16RDP;
vu16USER;
vu16Data0;
vu16Data1;
vu16WRP0;
vu16WRP1;
vu16WRP2;
vu16WRP3;
}OB_TypeDef;
Table142.和Table143.例举了FLASH所有寄存器和选择字节(OptionByteOB)寄存器
/*Flashregistersbaseaddress*/#defineFLASH_BASE((u32)0x4002201X)/*FlashOptionBytesbaseaddress*/#defineOB_BASE((u32)0x1FFFF800)#ifndefDEBUG...#ifdef_FLASH#defineFLASH((FLASH_TypeDef*)FLASH_BASE)#defineOB((OB_TypeDef*)OB_BASE)#endif/*_FLASH*/...#else/*DEBUG*/...#ifdef_FLASHEXTFLASH_TypeDef*FLASH;
EXTOB_TypeDef*OB;
#endif/*_FLASH*/...#endif
使用Debug模式时,初始化指针FLASH和OB于文件:
#ifdef_FLASHFLASH=(FLASH_TypeDef*)FLASH_BASE;
OB=(OB_TypeDef*)OB_BASE;
#endif/*_FLASH*/
为了访问EXTI寄存器,_FLASH必须在文件“sm32f10x_conf.h”中定义如下:
#define_FLASH
在默认情况下,只有执行FLASH设置(延迟,预取指,半周期)的函数式允许执行的。
如果想要执行FLASH编写/擦除/保护函数,必须在文件中定义_FLASH_PROG如下:
#define_FLASH_PROG
9.2FLASH库函数
FLASH的库函数【见首页】
9.2.1函数FLASH_SetLatency
查阅该参数可取的值
/*ConfiguretheLatencycycle:
Set2Latencycycles*/FLASH_SetLatency(FLASH_Latency_2);
函数原型如下:
voidFLASH_SetLatency(u32FLASH_Latency)
/*Checktheparameters*/
assert_param(IS_FLASH_LATENCY(FLASH_Latency));
/*SetstheLatencyvalue*/
FLASH->
ACR&
=ACR_LATENCY_Mask;
//0x00000038,高位保留位必须保持为0
ACR|=FLASH_Latency;
9.2.2函数
FLASH_HalfCycleAccessCmd
/*EnabletheHalfCycleFlashaccess*/FLASH_HalfCycleAccessCmd(FLASH_HalfCycleAccess_Enable);
voidFLASH_HalfCycleAccessCmd(u32FLASH_HalfCycleAccess)
assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess));
/*EnableordisabletheHalfcycleaccess*/
=ACR_HLFCYA_Mask;
//Mask=0xFFFFFFF7
ACR|=FLASH_HalfCycleAccess;
}
9.2.3函数FLASH_PrefetchBufferCmd
/*EnableThePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
voidFLASH_PrefetchBufferCmd(u32FLASH_PrefetchBuffer)
assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer));
/*EnableordisablethePrefetchBuffer*/
=ACR_PRFTBE_Mask;
//Mask=0xFFFFFFEF
ACR|=FLASH_PrefetchBuffer;
9.2.4函数FLASH_Unlock
/*UnlockstheFlashFLASH_Unlock();
voidFLASH_Unlock(void)
/*AuthorizetheFPECAccess*/
KEYR=FLASH_KEY1;
//0x45670123
KEYR=FLASH_KEY2;
//0xCDEF89AB
}//写入KEY1和KEY2后,可以解除闪存----不能设置F
LASH->
CR;
FPEC模块不能使用
9.2.5函数FLASH_Lock
/*LockstheFlash*/
FLASH_Lock();
voidFLASH_Lock(void)
/*SettheLockBittolocktheFPECandtheFCR*/
CR|=CR_LOCK_Set;
//#defineCR_LOCK_Set((u32)0x00000080)
}//锁住FLASH的FPEC模块和FLASH_CR。
9.2.6函数FLASH_ErasePage
/*ErasestheFlashPage0*/
FLASH_Statusstatus=FLASH_COMPLETE;
status=FLASH_ErasePage(0x08000000);
//0x0800000是Page0的地址
/*
typedefenum
FLASH_BUSY=1,//=1;
SR.bit0
FLASH_ERROR_PG,//=2;
SR.bit2
FLASH_ERROR_WRP,//=3;
SR.bit4
FLASH_COMPLETE,//=4;
SR.bit5
FLASH_TIMEOUT//=5;
无对应寄存器控制位
}FLASH_Status;
*/
FLASH_StatusFLASH_ErasePage(u32Page_Address)
//FLASH_COMPLETE=4
assert_param(IS_FLASH_ADDRESS(Page_Address));
//#defineIS_FLASH_ADDRESS(ADDRESS)(((ADDRESS)>
=0x08000000)&
&
((ADDRESS)<
0x0807FFFF));
//大容量FLASH:
0x0807FFFF(256页);
中等容量FLASH:
0x0801FFFF(128页);
小容量FLASH:
0x08007FFF(32页)//按最大容量判断,方便不同IC的可移植性。
/*Waitforlastoperationtobecompleted*/
status=FLASH_WaitForLastOperation(EraseTimeout);
//EraseTimeout=0x00000FFF
//【1】要擦除时,是否Flash内有其他操作正在进行,并返回“Complete”状态(未必一定)。
if(status==FLASH_COMPLETE)
/*ifthepreviousoperationiscompleted,proceedtoerasethepage*/
CR|=CR_PER_Set;
//【2】0x00000002;
PageEraseEnable
AR=Page_Address;
//【3】写入要擦除的页地址
CR|=CR_STRT_Set;
//【4】0x00000040,(擦除)操作开始!
//【5】判断擦除是否完成!
if(status!
=FLASH_BUSY)
/*iftheeraseoperationiscompleted,disablethePERBit*/
CR&
=CR_PER_Reset;
//【6】0x00001FFD,擦除操作完成,要关闭“页擦除使能”
}/*ReturntheEraseStatus*/
returnstatus;
//返回擦除完成状况。
调用函数如下:
/*FLASH_StatusFLASH_WaitForLastOperation(u32Timeout)//设置超时时间值Timeout=0x0000000F
篇三:
STM32-FLASH
STM32flash操作
对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。
基础应用1,FLASH时序延迟几个周期,等待总线同步操作。
基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。
3、阅读lib:
基础应用1,只有一个函数debug。
#ifdefDEBUG
4、阅读nvic:
基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。
//则在RAM调试
#else//如果没有定义VECT_TAB_RAM
//则在Flash里调试
#endif//结束判断语句
//抢占优先级
//NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
//启动此通道的中断
//NVIC_Init(&
5、阅读rcc:
基础应用1:
时钟的初始化函数过程——
voidRCC_Configuration(void)//时钟初始化函数
ErrorStatusHSEStartUpStatus;
//等待时钟的稳定
RCC_DeInit();
//时钟管理重置
RCC_HSEConfig(RCC_HSE_ON);
//打开外部晶振
HSEStartUpStatus=RCC_WaitForHSEStartUp();
//等待外部晶振就绪
if(HSEStartUpStatus==SUCCESS)
//flash读取缓冲,加速
//flash操作的延时
RCC_HCLKC