STM flash数据读取

发布者:CrystalRose最新更新时间:2017-07-13 来源: eefocus关键字:STM  flash  数据读取 手机看文章 扫描二维码
随时随地手机看文章
  1. ////  

  2. /////////**************************.h文件*********************************///////////////////////////////////  

  3. #ifndef _FLASH_CTRL_H_  

  4. #define _FLASH_CTRL_H_  

  5. #ifdef STM32F10X_HD  

  6. #define FLASHADDRSTART 0x0807F800 //  

  7. #define FLASHADDREND 0x08080000 //  

  8. #elif STM32F10X_MD  

  9. #define FLASHADDRSTART 0x0801FC00 //  

  10. #define FLASHADDREND 0x0801FFFF //  

  11. #elif STM32F10X_LD  

  12. #define FLASHADDRSTART 0x08001000 //  

  13. #define FLASHADDREND 0x080013FF   //  

  14. #endif  

  15.  #ifdef  STM32F10X_HD //大容量产品,flash>=256K  

  16. #define FLASH_PAGE_SIZE    ((u16)0x800)//2K  

  17. #elif STM32F10X_MD //小容量产品, flash <256K  

  18. #define FLASH_PAGE_SIZE  ((u16)0x400)//1K  

  19. #else  

  20. #define FLASH_PAGE_SIZE  ((u16)0x400)//1K  

  21. #endif  

  22. #define UCHAR unsigned char  

  23. #define CHAR  char  

  24. #define ULONG unsigned long    

  25. #define UINT unsigned int  

  26. #define boolen UCHAR  

  27. #ifndef true  

  28. #define true 1  

  29. #endif  

  30. #ifndef false   

  31. #define false 0  

  32. #endif  

  33. #define BLOCK_SIZE 64  

  34. typedef struct _tagFLASHWORDBUFF  

  35. {  

  36.  ULONG ulItems[BLOCK_SIZE/4];  

  37. }    

  38. FLASHWORDBUFF;  

  39. typedef struct _tagFLASHHALFWORDBUFF  

  40. {  

  41.  UINT ulItems[BLOCK_SIZE/2];    

  42. }FLASHHALFWORDBUFF;  

  43. typedef struct _tagFLASHBYTEBUFF  

  44. {  

  45.  UCHAR ulitems[BLOCK_SIZE];  

  46. }  

  47. FLASHBYTEBUFF;  

  48. boolen writeFlash(UCHAR* str,UINT len);   

  49. UINT readByteFlash(UINT len);  

  50. UINT readHalfWordFlash(UINT len);  

  51. UINT readWordFlash(UINT len);  

  52. #endif  

  53. /////////////////////////********************.c文件***************************///////////////////////////////////////////////  

  54. /* Includes ------------------------------------------------------------------*/  

  55. #include "flashctrl.h"  

  56. #include "stm32f10x_flash.h"  

  57. /* Private variables ---------------------------------------------------------*/  

  58. vu32 NbrOfPage = 0x00;  

  59. u32 EraseCounter = 0x00, Address = 0x00;  

  60. volatile FLASH_Status FLASHStatus;  

  61. FLASHBYTEBUFF flashBytebuff;  

  62. FLASHHALFWORDBUFF flashHalfWrodbuff;  

  63. FLASHWORDBUFF flashWordbuff;  

  64. /* Public function------------------------------------------------------------*/  

  65. /****************************************************************************** 

  66. * Function Name: writeFlash  

  67. * Description  : Erease the range (FLASHADDREND - FLASHADDRSTART) of flash,and 

  68. *                Write the string to it. 

  69. * input        : the writed of string - str, the len of str 

  70. * output       : write or erease success return 1, otherwise return 0. 

  71. *******************************************************************************/  

  72. boolen writeFlash(UCHAR* str,UINT len)  

  73. {  

  74.  FLASH_Unlock();  

  75.  NbrOfPage = ( FLASHADDREND - FLASHADDRSTART ) / FLASH_PAGE_SIZE;  

  76.  FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);   

  77.  FLASHStatus = FLASH_COMPLETE;  

  78.  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)  

  79.  {  

  80.       FLASHStatus = FLASH_ErasePage(FLASHADDRSTART + (FLASH_PAGE_SIZE * EraseCounter));  

  81.   }  

  82.  if(FLASHStatus != FLASH_COMPLETE )//擦除不成功  

  83.  {  

  84.   return false;  

  85.  }  

  86.  Address = FLASHADDRSTART;  

  87.  while((Address < FLASHADDREND ) && (FLASHStatus == FLASH_COMPLETE))  

  88.  {  

  89.   //instr = (*str)|((*(str+1))<<8);  

  90.   if(len == 0) break;  

  91.   FLASHStatus = FLASH_ProgramWord(Address, *(u32*)str);//一次性写入四个字节=1个字  

  92.   Address = Address + 4;  

  93.   len-=4;  

  94.   str+=4;  

  95.   //str+=2;  

  96.   if(len < 4)  

  97.   {  

  98.    //由于是按字的写入方式,即一次性写入4个字节的数据,  

  99.    //所有后面剩余的(4-len%4)%4个字节的补零处理  

  100.    FLASHStatus = FLASH_ProgramWord(Address, *(u32*)str);  

  101.    break;  

  102.   }  

  103.  }  

  104.  FLASH_Lock();  

  105.  if(FLASHStatus != FLASH_COMPLETE)  

  106.  {  

  107.   return false;  

  108.  }  

  109.  else return true;  

  110. }  

  111. /****************************************************************************** 

  112. * Function Name: readByteFlash  

  113. * Description  : read specified length string from flash,the begin flash is : FLASHADDRSTART 

  114. *                A byte by byte to read. 

  115. * input        : the readed of string - str, the len of str 

  116. * output       : return the length of string take away 1 

  117. *******************************************************************************/  

  118. UINT readByteFlash(UINT len)//  

  119. {  

  120.  UINT i=0;  

  121.  Address = FLASHADDRSTART;  

  122.  for(i=0;i

  123.  {   

  124.   flashBytebuff.ulitems[i] = (*(__IO int8_t*) Address);  

  125.   Address+=1;  

  126.  }  

  127.  return i;  

  128. }  

  129. /****************************************************************************** 

  130. * Function Name: readHalfWordFlash  

  131. * Description  : read specified length string from flash,the begin flash is : FLASHADDRSTART 

  132. *                A Halfword by halfword to read. 

  133. * input        : the readed of string - str, the len of str 

  134. * output       : return the length of string take away 1 

  135. *******************************************************************************/  

  136. UINT readHalfWordFlash(UINT len)//  

  137. {  

  138.  UINT i=0;  

  139.  Address = FLASHADDRSTART;  

  140.  for(i=0;i

  141.  {   

  142.   flashHalfWrodbuff.ulItems[i] = (*(__IO uint16_t*) Address);  

  143.   Address+=2;  

  144.  }  

  145.  if(len/2 )  

  146.  {  

  147.   flashHalfWrodbuff.ulItems[i] = (*(__IO uint16_t*) Address);  

  148.  }  

  149.  return i;  

  150. }  

  151. /****************************************************************************** 

  152. * Function Name: readWordFlash  

  153. * Description  : read specified length string from flash,the begin flash is : FLASHADDRSTART 

  154. *                A word by word to read. 

  155. * input        : the readed of string - str, the len of str 

  156. * output       : return the length of string take away 1 

  157. *******************************************************************************/  

  158. UINT readWordFlash(UINT len)  

  159. {   

  160.  UINT i=0;  

  161.  Address = FLASHADDRSTART;  

  162.  for(i=0;i

  163.  {   

  164.   flashWordbuff.ulItems[i] = (*(__IO uint32_t*) Address);  

  165.   Address+=4;  

  166.     

  167.  }  

  168.  if(len/4)  

  169.  {  

  170.   flashWordbuff.ulItems[i] = (*(__IO uint32_t*) Address);  

  171.  }  

  172.  return i;  

  173. }  

  174. /***********************************the end of file*****************************************/


关键字:STM  flash  数据读取 引用地址:STM flash数据读取

上一篇:STM32 IO 问题
下一篇:STM32 USB那点事之6

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

STM32学习笔记(7):USART串口的使用
1.串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。 RX:接受数据串行输入。通过
[单片机]
STM32之ADC多通道连续例程
#include stm32f10x.h /* RCC时钟配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 设置HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_D
[单片机]
STM32F10X硬件8MHz改为24MHz软件配置修改方法
1、单片机为STM32F103最快运行速度72MHz,系统默认使用8MHz外部时钟晶振,如果硬件采用24MHz晶振,软件就需要修改时钟配置,修改方法如下,我们用的硬件为STM32F10X_MD,并不是STM32F10X_CL,在static void SetSysClockTo72(void)函数中: #ifdef STM32F10X_CL // Configure PLLs ------------------------------------------------------ // PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz // PREDIV1 c
[单片机]
<font color='red'>STM</font>32F10X硬件8MHz改为24MHz软件配置修改方法
STM32学习笔记 — 之GPIO端口篇
最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍: 每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)。 GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 寄存器
[单片机]
STM32H7教程】第46章 STM32H7的ADC应用之DMA方式多通道采样
第1阶段,上电启动阶段: 这部分在第14章进行了详细说明。 第2阶段,进入main函数: 第1步,硬件初始化,主要是MPU,Cache,HAL库,系统时钟,滴答定时器,LED,串口和ADC。 第2步,周期性的打印ADC采集的多通道数据。 46.7 实验例程说明(MDK) 配套例子: V7-024-ADC+DMA的多通道采集 实验目的: 学习ADC + DMA的多通道采集实现。 实验内容: 例子默认用的PLL时钟供ADC使用,大家可以通过bsp_adc.c文件开头宏定义切换到AHB时钟。 采用DMA方式进行多通道采样,采集了PC0, Vbat/4, VrefInt和温度。 每隔500ms
[单片机]
基于stm32f103ze+mpu9250通过官方DMP库串口输出角度
单片机源程序如下: #include stm32f10x.h #include stdio.h #include UART1.h #include systick.h // mpu9250 include files #include sys.h #include mpu9250.h #include mpuiic.h #include inv_mpu.h #include inv_mpu_dmp_motion_driver.h float Q0,Q1,Q2,Q3; // 欧拉角 u32 status2=0; void printf_init() //printf初始化 { GPIO_I
[单片机]
基于STM32的步进电机速度控制
项目需求 在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机的优点是可以不使用编码器,开环控制即可达到高精度的效果。 调整占空比或者调整周期 众所周知,PWM有两个重要参数,周期与占空比。 步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。 周期固定,调整占空比 上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产生的高电平的数量是一样的,即无论占空比为多少,PWM的频率都一致。因此也就无法调整步进
[单片机]
基于<font color='red'>STM</font>32的步进电机速度控制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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