stm32 Flash读写[库函数]

发布者:JoyfulMelody最新更新时间:2018-10-07 来源: eefocus关键字:stm32  Flash读写  库函数 手机看文章 扫描二维码
随时随地手机看文章

通过对stm32内部的flash的读写可以实现对stm32的编程操作。

stm32 的内置可编程Flash在许多场合具有十分重要的意义。如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写;支持IAP特性使得开发人员可以在stm32运行程序的时候对其内部程序进行更新操作。对一些对数据安全有要求的场合,可编程FLASH可以结合stm32内部唯一的身份标识实现各种各样的防破解方案。并且stm32的FLASH在一些轻量级的防掉电存储方案中也有立足之地。

 

stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。

 

主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。

 

对Flash 的写入操作要 “先擦除后写入”的原则;


stm32的内置flash 编程操作都是以页为单位写入的,而写入的操作必须要以16位半字宽度数据位单位,允许跨页写,写入非16位数据时将导致stm32内部总线错误。


进行内置flash读写时,必须要打开内部Rc振荡器。

 

main.c:

001#include "stm32f10x.h"
002#include "stdio.h"
003
004#define  PRINTF_ON  1
005
006void RCC_Configuration(void);
007void GPIO_Configuration(void);
008void USART_Configuration(void);
009
010u32 count=0;
011
012u16 data[5]={0x0001,0x0002,0x0003,0x0004,0x0005};
013
014int main(void)
015{
016    RCC_Configuration();
017    GPIO_Configuration();
018    USART_Configuration();
019
020    RCC_HSICmd(ENABLE);
021
022    FLASH_Unlock();
023
024    FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
025
026    FLASH_ErasePage(0x8002000);
027
028    while(count < 5)
029    {
030        FLASH_ProgramHalfWord((0x8002000 +count*2),data[count]);  //flash  为一个字节存储,16位数据必须地址加2
031
032        count++;
033
034    }
035
036    FLASH_Lock();
037
038    count = 0;
039
040    printf("\r\n The Five Data Is : \r\n");
041
042    while(count < 5)
043    {
044
045        printf("\r %d \r",*(u8 *)(0x8002000 + count*2));      //读取方法
046
047        count++;
048
049
050    }
051
052    while(1);
053
054}
055
056void GPIO_Configuration(void)
057{
058    GPIO_InitTypeDef    GPIO_InitStructure;
059
060    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
061
062    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
063    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
064    GPIO_Init(GPIOA , &GPIO_InitStructure);
065
066    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
067    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          
068    GPIO_Init(GPIOA , &GPIO_InitStructure);
069}
070
071void RCC_Configuration(void)
072{
073    /* 定义枚举类型变量 HSEStartUpStatus */
074    ErrorStatus HSEStartUpStatus;
075
076    /* 复位系统时钟设置*/
077    RCC_DeInit();
078    /* 开启HSE*/
079    RCC_HSEConfig(RCC_HSE_ON);
080    /* 等待HSE起振并稳定*/
081    HSEStartUpStatus = RCC_WaitForHSEStartUp();
082    /* 判断HSE起是否振成功,是则进入if()内部 */
083    if(HSEStartUpStatus == SUCCESS)
084    {
085        /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
086        RCC_HCLKConfig(RCC_SYSCLK_Div1);
087        /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
088        RCC_PCLK2Config(RCC_HCLK_Div1);
089        /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
090        RCC_PCLK1Config(RCC_HCLK_Div2);
091        /* 设置FLASH延时周期数为2 */
092        FLASH_SetLatency(FLASH_Latency_2);
093        /* 使能FLASH预取缓存 */
094        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
095        /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
096        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
097        /* 使能PLL */
098        RCC_PLLCmd(ENABLE);
099        /* 等待PLL输出稳定 */
100        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
101        /* 选择SYSCLK时钟源为PLL */
102        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
103        /* 等待PLL成为SYSCLK时钟源 */
104        while(RCC_GetSYSCLKSource() != 0x08);
105    }
106    /* 打开APB2总线上的GPIOA时钟*/
107    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
108
109    //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
110
111    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
112    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG, ENABLE);
113
114}
115
116
117void USART_Configuration(void)
118{
119    USART_InitTypeDef USART_InitStructure;
120    USART_ClockInitTypeDef USART_ClockInitStructure;
121
122    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
123    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
124    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;                                                                                                                                                     
125    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
126    USART_ClockInit(USART1 , &USART_ClockInitStructure);
127
128    USART_InitStructure.USART_BaudRate = 9600;
129    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
130    USART_InitStructure.USART_StopBits = USART_StopBits_1;
131    USART_InitStructure.USART_Parity = USART_Parity_No;
132    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
133    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
134    USART_Init(USART1,&USART_InitStructure);
135
136    USART_Cmd(USART1,ENABLE);
137}
138
139#if  PRINTF_ON
140
141int fputc(int ch,FILE *f)
142{
143    USART_SendData(USART1,(u8) ch);
144    while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
145    return ch;
146}
147
148#endif


关键字:stm32  Flash读写  库函数 引用地址:stm32 Flash读写[库函数]

上一篇:STM32学习笔记(6):LCD的显示
下一篇:keil软件的安装和破解(STM32和C51都可使用)

推荐阅读最新更新时间:2024-03-16 16:15

STM32开发板学习日记-[5]TIM的PMW模式
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。 在TIMx_CCMRx寄存器中的OCxM位写入 110 (PWM模式1)或 111 (PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。 因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。 OCx的极性可以通过软件在TIMx_C
[单片机]
STM32生态系统工具和软件介绍
STM32能被这么多开发者认可,它的强大生态系统起了关键作用。本文围绕STM32生态各软件工具进行相关描述,其中包含一些技术细节。 一、STM32生态系统总预览STM32提供了全套开发工具,以及开发所需的软件包,下面看一张图,从全局来了解STM32生态系统工具和软件: 主要分为两大类:1.软件工具:即左边部分的STM32CubeMX、 CubeIDE、 CubeProgrammer、 CubeMontor等。 2.嵌入式软件包:STM32CubeMCU Packages 和 扩展软件包CubeExpansions. STM32Cube生态系统几个特点: 免费自由使用; 接口一致,方便移植 可裁剪、可扩展 易使用和理解 节约
[单片机]
<font color='red'>STM32</font>生态系统工具和软件介绍
STM32标准库、HAL库和LL库介绍
引言 我们在进行STM32开发的时候,使用寄存器进行开发的终究是少数,大多数人还是习惯用库函数进行开发。到目前为止,有标准外设库、HAL库、LL库 三种。本文将分别介绍以下三种库,便于大家区分。 介绍 标准库 标准库(Standard Peripheral Library)是STMicroelectronics提供的最基本的库。它提供了对STM32微控制器的底层寄存器和外设的直接访问。标准库的设计目标是提供高度灵活性和低层次的硬件控制,以满足对性能和资源的严格要求。使用标准库,开发人员可以直接操作寄存器来配置和控制微控制器的功能,但需要手动编写大量的底层代码。标准库适用于对性能要求较高的应用和对代码大小和效率有严格要求的项目。
[单片机]
<font color='red'>STM32</font>标准库、HAL库和LL库介绍
STM32的RCC配置流程
在STM32中有5个时钟源: ①、HSI是高速内部时钟,RC震荡器,频率为 8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HIS/2、HSE或HSE/2。倍频可选择为2~16倍,但其输出频率最大不得超过72MHz。 系统时钟SYSCLK,它是供STM32中绝大部分器件工作的时钟源,系统时钟可选择为PLL输出、HSI或者HSE。系统时钟的做大频率为72MHz,它通过AHB分
[单片机]
<font color='red'>STM32</font>的RCC配置流程
stm32快速学习1——环境的建立
安装keil for arm 下载stm32固件库3.4 解压,勿乱移动解压文件内的文件,因为项目内使用的都是相对路径。 进入 STM32F10x_StdPeriph_Lib_V3.4.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM 打开keil文件,修改一下这个项目模板 删除左侧的stm32_eval文件夹、doc文件夹、使用的是stm32f103RBT6(中等容量的芯片)然后MDK-ARM下的文件除了 startup_stm32f10x_md.s(根据芯片类型),其他都删除 startup_stm32f10x_md.s右键,选中include in target build 左侧最
[单片机]
STM32产生异相方波
这几天一直在做蓝桥杯嵌入式开发历年的题目 在第七届决赛的模拟题中 有一个要求PA6和PA7产生两个异相并且频率可调的方波 后来我研究了一下STM32的Output comare mode, 因为要调节频率 所以选择了toggle 模式 使方波产生异相在中断中设置就行 先上手册的图 那 这是张老图了 在来看一下 官方StdLib3.5的OCToggle模式下的中断函数 void TIM1_BRK_TIM9_IRQHandler(void) { /* TIM9_CH1 toggling with frequency = 366.2 Hz */ if (TIM_GetITStatus(TIM9, TIM_IT_
[单片机]
<font color='red'>STM32</font>产生异相方波
使用proteus仿真STM32单片机的注意事项
第1点: 我们用户编写的代码,必须放在 user code begin 和 end 之间;否则,当我们修改stm32cubemx 项目的 配置时,再次生成代码,就会删除之前的代码;正确做法如下图所示: 我们用户编写的代码,必须放在 user code begin 和 end 之间 第2点: 在proteus中,电源需要更改成3.3V,VDDA添加到电源VCC/GND中去;VSSA添加到GND中去;如下图所示: 电源需要改成3.3V 第3点: HAL_Delay(__IO uint32_t Delay)延时函数在stm32f1xx_hal.c里面,该函数能实现ms级别的延时;该函数体前面有一个关键字__weak,该关键字简
[单片机]
使用proteus仿真<font color='red'>STM32</font>单片机的注意事项
142条STM32遇到的坑,你知道几个?
1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2 1,意思是APB2接高速设备。 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed InternalR
[单片机]
142条<font color='red'>STM32</font>遇到的坑,你知道几个?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved