1、CM3将复位视作异常,优先级最高的异常。stm32f1有三种复位:系统复位、电源复位、备份区复位。前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个 单元 存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然, 零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)三、fla
2、sh读写 没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失有时需要存储一些数据,在复位后仍然不会丢失,这可能就会用到片上flash,stm32的片上flash结构见。对flash的编程逻辑上是比较简单的,flash编程手册上写的很清楚,3.5固件库给出的例程为:FLASH_UnlockBank1();FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLA
3、G_WRPRTERR);FLASHStatus=FLASH_ErasePage(0x0803F800);/擦除整页 FLASHStatus=FLASH_ProgramHalfWord(0x0803F800, DATA);/写入数据,在指定地址编写半字,DATA:待写入的数据需要注意的是,在写之前必须要保证已经擦除,不然硬件不会执行编程指令。在写0时,不需要先擦除,擦除后存储单元的值为0XFF。据此可以判断:所谓的编程,就是与操作,0XFF与任何数与变成那个数,0与任何数与还是0。另外,擦除一页要21.9ms(对于2k大小的一页),比较慢。基础应用1FLASH时序延迟几个周期,等待总线同步操作。
4、推荐按照单片机系统运行频率,024MHz时,取Latency=0;2448MHz时,取Latency=1;4872MHz时,取Latency=2。所有程序中必须的用法:FLASH_SetLatency(FLASH_Latency_2);位置:RCC初始化子函数里面,时钟起振之后。基础应用2开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的 用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/使能或者失能预取指缓存阅读lib:调试所有外设初始化的函数。我的理解不理解,也不需要理解。只要知道所有外设在调试的时候,EWRA
5、M需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。基础应用3只有一个函数debug。所有程序中必须的。#ifdef DEBUGdebug();#endifmain函数开头,声明变量之后。阅读nvic:系统中断管理。我的理解管理系统内部的中断,负责打开和关闭中断。基础应用4中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。 void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure; /中断管理恢复默认参数#ifdef VECT_TAB_RAM /如果C/C+ CompilerPreprocesso
6、rDefined symbols中的定义了VECT_TAB_RAM(见程序库更改内容的表格)NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); /则在RAM调试 #else /如果没有定义VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);/则在Flash里调试 #endif /结束判断语句/以下为中断的开启过程,不是所有程序必须的。/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/设置NVIC优先级分组,方式。/注:一共16个优先级,分为抢占式和响
7、应式。两种优先级所占的数量由此代码确定,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_InitStructu
8、re.NVIC_IRQChannelSubPriority = 0; /响应优先级/NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /启动此通道的中断 /NVIC_Init(&NVIC_InitStructure); /中断初始化阅读rcc:单片机时钟管理。我的理解管理外部、内部和外设的时钟,设置、打开和关闭这些时钟。RCC在RCC部分学习过了,没有问题篇二:STM32F10x_Flash9.1 FLASH寄存器结构.1049 FLASH存储器(FLASH)Section 9.1 FLASH寄存器结构描述了固件函数库所使用的数据结构,Sectio
9、n 9.2 固件库函数介绍了函数库里的所有函数。9.1 FLASH寄存器结构FLASH寄存器结构,FLASH_TypeDef和OB_TypeDef,在文件中定义如下:typedef struct vu32 ACR; vu32 KEYR; vu32 OPTKEYR; vu32 SR;vu32 CR;vu32 AR; vu32 RESERVED; vu32 OBR; vu32 WRPR; FLASH_TypeDef; typedef struct vu16 RDP; vu16 USER;vu16 Data0;vu16 Data1;vu16 WRP0; vu16 WRP1;vu16 WRP2;vu1
10、6 WRP3; OB_TypeDef;Table 142.和 Table 143.例举了FLASH所有寄存器和选择字节(Option Byte OB)寄存器/* Flash registers base address */ #define FLASH_BASE (u32)0x4002201X) /* Flash Option Bytes base address */ #define OB_BASE (u32)0x1FFFF800) #ifndef DEBUG . #ifdef _FLASH #define FLASH (FLASH_TypeDef *) FLASH_BASE) #defin
11、e OB (OB_TypeDef *) OB_BASE) #endif /*_FLASH */ . #else /* DEBUG */ . #ifdef _FLASH EXT FLASH_TypeDef *FLASH; EXT OB_TypeDef *OB; #endif /*_FLASH */ . #endif 使用 Debug 模式时,初始化指针FLASH 和 OB 于文件:#ifdef _FLASH FLASH = (FLASH_TypeDef *) FLASH_BASE; OB = (OB_TypeDef *) OB_BASE; #endif /*_FLASH */为了访问 EXTI
12、寄存器,_FLASH必须在文件“sm32f10x_conf.h ”中定义如下:#define _FLASH在默认情况下,只有执行FLASH设置(延迟,预取指,半周期)的函数式允许执行的。如果想要执行 FLASH编写/擦除/保护函数,必须在文件中定义_FLASH_PROG如下:#define _FLASH_PROG9.2 FLASH库函数FLASH的库函数【见首页】9.2.1 函数FLASH_SetLatency查阅该参数可取的值/* Configure the Latency cycle: Set 2 Latency cycles */ FLASH_SetLatency(FLASH_Laten
13、cy_2);函数原型如下:void FLASH_SetLatency(u32 FLASH_Latency)/* Check the parameters */assert_param(IS_FLASH_LATENCY(FLASH_Latency);/* Sets the Latency value */FLASH-ACR &= ACR_LATENCY_Mask;/ 0x00000038,高位保留位必须保持为0ACR |= FLASH_Latency;9.2.2 函数FLASH_HalfCycleAccessCmd/* Enable the Half Cycle Flash access */
14、FLASH_HalfCycleAccessCmd(FLASH_HalfCycleAccess_Enable);void FLASH_HalfCycleAccessCmd(u32 FLASH_HalfCycleAccess)assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess);/* Enable or disable the Half cycle access */= ACR_HLFCYA_Mask;/Mask = 0xFFFFFFF7ACR |= FLASH_HalfCycleAccess; 9.2.3 函数FLA
15、SH_PrefetchBufferCmd/* Enable The Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);void FLASH_PrefetchBufferCmd(u32 FLASH_PrefetchBuffer)assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer);/* Enable or disable the Prefetch Buffer */= ACR_PRFTBE_Mask;/ Mask = 0xFFF
16、FFFEFACR |= FLASH_PrefetchBuffer;9.2.4 函数FLASH_Unlock/* Unlocks the Flash FLASH_Unlock();void FLASH_Unlock(void)/* Authorize the FPEC Access */KEYR = FLASH_KEY1;/ 0x45670123KEYR = FLASH_KEY2;/ 0xCDEF89AB/写入KEY1和KEY2后,可以解除闪存-不能设置F LASH-CR;FPEC模块不能使用 9.2.5 函数FLASH_Lock/* Locks the Flash */FLASH_Lock()
17、;void FLASH_Lock(void)/* Set the Lock Bit to lock the FPEC and the FCR */CR |= CR_LOCK_Set;/ #define CR_LOCK_Set (u32)0x00000080)/ 锁住FLASH的FPEC模块和FLASH_CR。9.2.6 函数FLASH_ErasePage/* Erases the Flash Page 0 */FLASH_Status status = FLASH_COMPLETE;status = FLASH_ErasePage(0x08000000); /0x0800000是Page0的地
18、址/*typedef enumFLASH_BUSY = 1,/=1;SR.bit0FLASH_ERROR_PG, /=2;SR.bit2FLASH_ERROR_WRP, /=3;SR.bit4FLASH_COMPLETE, /=4;SR.bit5FLASH_TIMEOUT /=5;无对应寄存器控制位FLASH_Status;*/FLASH_Status FLASH_ErasePage(u32 Page_Address)/ FLASH_COMPLETE = 4assert_param(IS_FLASH_ADDRESS(Page_Address);/ #define IS_FLASH_ADDRES
19、S(ADDRESS) (ADDRESS) = 0x08000000) & (ADDRESS) 0x0807FFFF);/大容量FLASH: 0x0807FFFF(256页);中等容量FLASH: 0x0801FFFF(128页);小容量FLASH:0x08007FFF(32页) /按最大容量判断,方便不同IC的可移植性。/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(EraseTimeout); / EraseTimeout = 0x00000FFF/【1】要擦除时,是否Flash
20、内有其他操作正在进行,并返回“Complete”状态(未必一定)。if(status = FLASH_COMPLETE)/* if the previous operation is completed, proceed to erase the page */CR|= CR_PER_Set;/【2】 0x00000002;Page Erase EnableAR = Page_Address; /【3】写入要擦除的页地址CR|= CR_STRT_Set;/ 【4】0x00000040,(擦除)操作开始!/【5】判断擦除是否完成!if(status != FLASH_BUSY)/* if the
21、 erase operation is completed, disable the PER Bit */CR &= CR_PER_Reset;/【6】0x00001FFD,擦除操作完成,要关闭“页擦除使能”/* Return the Erase Status */return status;/返回擦除完成状况。调用函数如下:/* FLASH_Status FLASH_WaitForLastOperation(u32 Timeout)/设置超时时间值Timeout = 0x0000 000F篇三:STM32-FLASHSTM32 flash操作对芯片内部flash进行操作的函数,包括读取,状态
22、,擦除,写入等等,可以允许程序去操作flash上的数据。基础应用1,FLASH时序延迟几个周期,等待总线同步操作。基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。3、 阅读lib:基础应用1,只有一个函数debug。 #ifdef DEBUG4、 阅读nvic:基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。 /则在RAM调试#else /如果没有定义VECT_TAB_RAM/则在Flash里调试#endif /结束判断语句 /抢占优先级/NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /启动此通道的中断/NVIC_Init(&5、 阅读rcc:基础应用1:时钟的初始化函数过程void RCC_Configuration(void) /时钟初始化函数ErrorStatus HSEStartUpStatus; /等待时钟的稳定RCC_DeInit(); /时钟管理重置RCC_HSEConfig(RCC_HSE_ON); /打开外部晶振HSEStartUpStatus = RCC_WaitForHSEStartUp(); /等待外部晶振就绪if (HSEStartUpStatus = SUCCESS)/flash读取缓冲,加速 /flash操作的延时RCC_HCLKC
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1