最新flashsetlatency位置推荐word版 15页Word格式.docx

上传人:b****6 文档编号:16182371 上传时间:2022-11-21 格式:DOCX 页数:12 大小:21.02KB
下载 相关 举报
最新flashsetlatency位置推荐word版 15页Word格式.docx_第1页
第1页 / 共12页
最新flashsetlatency位置推荐word版 15页Word格式.docx_第2页
第2页 / 共12页
最新flashsetlatency位置推荐word版 15页Word格式.docx_第3页
第3页 / 共12页
最新flashsetlatency位置推荐word版 15页Word格式.docx_第4页
第4页 / 共12页
最新flashsetlatency位置推荐word版 15页Word格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

最新flashsetlatency位置推荐word版 15页Word格式.docx

《最新flashsetlatency位置推荐word版 15页Word格式.docx》由会员分享,可在线阅读,更多相关《最新flashsetlatency位置推荐word版 15页Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

最新flashsetlatency位置推荐word版 15页Word格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1