stm32 的内置可编程Flash在许多场合具有十分重要的意义。如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写;支持IAP特性使得开发人员可以在stm32运行程序的时候对其内部程序进行更新操作。对一些对数据安全有要求的场合,可编程FLASH可以结合stm32内部唯一的身份标识实现各种各样的防破解方案。并且stm32的FLASH在一些轻量级的防掉电存储方案中也有立足之地。
 
一. stm32的FLASH分为
1.主存储块:用于保存具体的程序代码和用户数据,主存储块是以页为单位划分的,
      一页大小为1KB。范围为从地址0x08000000开始的128KB内。
2.信息块   :用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区
二.操作原则
对Flash 的写入操作要 “先擦除后写入”的原则;
 stm32的内置flash 编程操作都是以页为单位写入的,而写入的操作必须要以16位半字宽度数据位单位,允许跨页写,写入非16位数据时将导致stm32内部总线错误。
进行内置flash读写时,必须要打开内部Rc振荡器。

#include "stm32f10x.h"
#include "stdio.h"

#define  PRINTF_ON  1

void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);

u32 count=0;

u16 data[5]={0x0001,0x0002,0x0003,0x0004,0x0005};

int main(void)
{
   RCC_Configuration();
 GPIO_Configuration();
 USART_Configuration();

RCC_HSICmd(ENABLE);//Enables or disables the Internal High Speed oscillator (HSI).

FLASH_Unlock();  /* Unlocks the FLASH Program Erase Controller.*/

/*将flash三个标志位全清*/

FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_ErasePage(0x8002000);

while(count < 5)
 {
  FLASH_ProgramHalfWord((0x8002000 +count*2),data[count]);  //flash  为一个字节存储,16位数据必须地址加2

count++;
 
 }

FLASH_Lock();

count = 0;

printf("\r\n The Five Data Is : \r\n");

while(count < 5)
 {
  
  printf("\r %d \r",*(u8 *)(0x8002000 + count*2));   //读取方法

count++;

}

while(1);
 
}

void GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
   GPIO_Init(GPIOA , &GPIO_InitStructure); 
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
   GPIO_Init(GPIOA , &GPIO_InitStructure); 
}

void RCC_Configuration(void)
{
 /* 定义枚举类型变量 HSEStartUpStatus */
 ErrorStatus HSEStartUpStatus;

/* 复位系统时钟设置*/
   RCC_DeInit();
   /* 开启HSE*/
   RCC_HSEConfig(RCC_HSE_ON);
   /* 等待HSE起振并稳定*/
   HSEStartUpStatus = RCC_WaitForHSEStartUp();
 /* 判断HSE起是否振成功,是则进入if()内部 */
   if(HSEStartUpStatus == SUCCESS)
   {
     /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
     /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
     RCC_PCLK2Config(RCC_HCLK_Div1); 
     /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
     RCC_PCLK1Config(RCC_HCLK_Div2);
     /* 设置FLASH延时周期数为2 */
     FLASH_SetLatency(FLASH_Latency_2);
     /* 使能FLASH预取缓存 */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
     /* 使能PLL */ 
     RCC_PLLCmd(ENABLE);
     /* 等待PLL输出稳定 */
     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
     /* 选择SYSCLK时钟源为PLL */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     /* 等待PLL成为SYSCLK时钟源 */
     while(RCC_GetSYSCLKSource() != 0x08);
   } 
   /* 打开APB2总线上的GPIOA时钟*/
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);

//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Periph_WWDG, ENABLE);
  
}

void USART_Configuration(void)
{
 USART_InitTypeDef USART_InitStructure;
 USART_ClockInitTypeDef USART_ClockInitStructure;

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;                                                                                                                                                      
 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
 USART_ClockInit(USART1 , &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate = 9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
 USART_Init(USART1,&USART_InitStructure);

USART_Cmd(USART1,ENABLE);
}

#if  PRINTF_ON

int fputc(int ch,FILE *f)
{
 USART_SendData(USART1,(u8) ch);
 while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
 return ch;
}

#endif

stm32 Flash读写[库函数]的更多相关文章

  1. stm32——Flash读写

    stm32——Flash读写 一.Flash简介 通过对stm32内部的flash的读写可以实现对stm32的编程操作. stm32的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP( ...

  2. stm32 Flash读写独立函数[库函数]

    一. stm32的FLASH分为 1.主存储块:用于保存具体的程序代码和用户数据,主存储块是以页为单位划分的, 一页大小为1KB.范围为从地址0x08000000开始的128KB内. 2.信息块   ...

  3. STM32 对内部FLASH读写接口函数(转)

    源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...

  4. STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)

    数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...

  5. STM32 Flash 永久用户数据空间

    /********************************************************************************* * STM32 Flash 永久用 ...

  6. [nRF51822] 6、基于nRF51822平台的flash读写研究

    前言 本文重点介绍flash的数据存取特性.flash的内存划分.一个简单的存取图片的内存管理方式,以及对flash写前删的时间.删后读的时间.写后读的时间进行测量的一个小实验.目的在于更全面了解fl ...

  7. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

  8. 关于STM32 Flash的一些问题

    注:本人感觉是STM32 Flash本身的问题. 最近做STM32的远程升级,保存到Flash里面,用于记录更新状态的信息总是无故的清理掉 最终测试发现 STM32的 Flash 擦除操作 并不一定会 ...

  9. STM32—SPI读写FLASH

    目录 FLASH简介 W25Q64 W25Q64简介 FLASH控制指令 FLASH内部存储结构 代码讲解 读取芯片ID 发送写使能信号 等待FLASH不忙 擦除扇区 写入数据 读取数据 注 FLAS ...

随机推荐

  1. 【go】go语言socket通信样例

    server.go package main import ( "net" "fmt" "io" ) func main() { liste ...

  2. IIS的安装和配置

    一.首先是安装IIS.打开控制面板,找到“程序与功能” 二. “打开或关闭Windows功能”, 安装 “Internet 信息服务” 三. 安装完后回控制面板里面,找到“管理工具” 四. 双击“In ...

  3. Cookie的介绍及使用

    咱们不搞一开始就一大堆理论知识介绍,怕把人讲懵了...... 咱们换一个思维方式——"从现象看本质",先说说我们看到了什么,再从看到的现象中提出问题,最后深入寻找答案. 我们看到的 ...

  4. c# Socket通信基础

     一.IP地址操作类   1.IPAddress类 a.在该类中有一个 Parse()方法,可以把点分的十进制IP表示转化成IPAddress类,方法如下: IPAddress address = I ...

  5. 最小树形图(hdu4966多校联赛9)

    GGS-DDU Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total ...

  6. JavaMVC框架之SpringMVC

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  7. js获取元素的外链样式

    一般给元素设置行内样式,如<div id="div1" style="width:500px;"></div>.如要获取它的样式,即可d ...

  8. [Haskell]解决hslua unknown symbol `___s trtod'的问题

    用cabal编译libpandoc时遇到这样的错误: HShslua-0.3.12.o: unknown symbol `___s trtod' ghc.exe: unable to load pac ...

  9. Python的Flask框架应用调用Redis队列数据的方法

    转自:http://www.jb51.net/article/86021.htm 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器, ...

  10. nginx简介和配置gd

    转自:https://www.cnblogs.com/zhouxinfei/p/7862285.html nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也 ...