历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2019年07月26日 | STM32 flash读写源程序

2019-07-26 来源:eefocus

/**

  ******************************************************************************

  * File Name          : FLASH.c 

  * Description        : read and program the stm32's  flash from address   

  * Author             :  Yelsin

  * Version            : V1.0.0

  * Date               : 11-Jan-2015


  * COPYRIGHT(c) 2015.  All Right Reserved 

  ******************************************************************************

  */



/* Includes ------------------------------------------------------------------*/

#include "flash.h"

#include "main.h"



/* Private define ------------------------------------------------------------*/

#define FLASH_USER_START_ADDR   ADDR_FLASH_PAGE_60   /*  Start @ of user Flash area */

#define FLASH_USER_END_ADDR     ADDR_FLASH_PAGE_61 + FLASH_PAGE_SIZE   /* End @ of user Flash area */



#define DATA_32                 ((uint32_t)0x12345678)



/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

uint32_t Address = 0, PageError = 0;

__IO uint32_t data32 = 0 , MemoryProgramStatus = 0;



/*Variable used for Erase procedure*/

static FLASH_EraseInitTypeDef EraseInitStruct;



/* Private function prototypes -----------------------------------------------*/

//static void Error_Handler(void);



/* Private functions ---------------------------------------------------------*/

/*Read halfword-16 bit data from flash address */

uint16_t FLASH_ReadHalfWord(uint32_t address)

{

  return *(__IO uint16_t*)address;  

}



/*Read WORD-32 bit data from flash address */

uint32_t FLASH_ReadWord(uint32_t address)

{

  uint32_t temp1,temp2;

  temp1=*(__IO uint16_t*)address; 

  temp2=*(__IO uint16_t*)(address+2); 

  return (temp2<<16)+temp1;

}



/*Read Multi half-WORD 16 bit data from flash address */

void FLASH_ReadMoreData(uint32_t startAddress,uint16_t *readData,uint16_t countToRead)

{

  uint16_t dataIndex;

  for(dataIndex=0;dataIndex  {

    readData[dataIndex]=FLASH_ReadHalfWord(startAddress+dataIndex*2);

  }

}



/**

  * @brief  Factory Setting Recover Read Flash after power on

  * @param  start Addr 

  * @retval None

  */

void FactorySettingRecover(void) 

{

  uint8_t i;

  

  Address = FLASH_USER_START_ADDR;



  for (i=0; i  {    

  GLOBALVARS[i]= FLASH_ReadWord(Address );

  Address = Address + 4;  

  }



  if(GLOBALVARS[PARAM_MODIFIED] == 0x55)

  {

  fDVBType        = GLOBALVARS[DVBTYPE]  ;

  fRFBandwidth        = GLOBALVARS[BANDWITH] ; 

  }

}



/**

  * @brief   Flash write function

  * @param  start area address 

  * @retval None

  */

void FLASH_Write(uint32_t WriteAddr,uint32_t *Buffer,uint16_t NumberToWrite)  

{

  uint8_t i;



   /* Unlock the Flash to enable the flash control register access *************/

  HAL_FLASH_Unlock();



  /* Erase the user Flash area

    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/



  /* Fill EraseInit structure*/

  EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;

  EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;

  EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;



  if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)

  {

    /*

      Error occurred while page erase.

      to know the code error , call 'HAL_FLASH_GetError()'

    */

  }



  for (i=0; i  {

    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, WriteAddr, Buffer[i]) == HAL_OK)

    {

      WriteAddr = WriteAddr + 4;

    }

    else

    {

      /* Error occurred while writing data in Flash */

    }

  }



  /* Lock the Flash to disable the flash control register access (recommended

     to protect the FLASH memory against possible unwanted operation) *********/

  HAL_FLASH_Lock();



  /* Check if the programmed data is OK*/

 /* Address = FLASH_USER_START_ADDR;

  MemoryProgramStatus = 0x0;



  while (Address < FLASH_USER_END_ADDR)

  {

    data32 = *(__IO uint32_t *)Address;



    if (data32 != DATA_32)

    {

      MemoryProgramStatus++;

    }

    Address = Address + 4;

  }



  if (MemoryProgramStatus == 0)

  {

  }*/

}



/**

  * @brief  Save Factory Setting In Flash

  * @param  None

  * @retval None

  */

void SaveParameterInFlash(void)

  GLOBALVARS[DVBTYPE] = fDVBType;

  GLOBALVARS[PARAM_MODIFIED] = 0x55;

  

  Address = FLASH_USER_START_ADDR; 

  FLASH_Write(Address,GLOBALVARS,sizeof(GLOBALVARS)) ; 

}



/**

  * @brief  This function is executed in case of error occurrence.

  * @param  None

  * @retval None

  */

/*static void Error_Handler(void)

{

  { 

    printf("n flash Err.");

  }

}*/



#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %drn", file, line) */



  /* Infinite loop */

  //while (1)

  {

  }

}

#endif

/**

  * @}

  */


推荐阅读

史海拾趣

华大北斗(Allystar)公司的发展小趣事

在电子行业中,华大北斗(Allystar)公司以其卓越的技术实力和市场表现脱颖而出,其发展历程中充满了许多引人注目的故事。以下是关于华大北斗发展起来的五个相关故事:

一、华大北斗的南迁之旅

华大北斗的发展史上,一个重要的节点是2016年的南迁。当时,华大北斗主动选择深圳作为新的研发总部所在地,这是基于深圳电子制造业的雄厚基础和良好的创新环境。在短短几个月内,华大北斗完成了研发环境的选址与装修、研发团队的组建以及实验设备的部署,展现了其高效的执行力。这一举措得到了深圳市政府及各级领导的高度关注与认可,华大北斗也被列为深圳市重点引进的战略项目。

二、北斗芯片技术的突破

华大北斗在北斗芯片技术方面取得了重大突破。公司成功研发出支持北斗三号信号体制的多系统多频高精度SoC芯片,这一成果在芯片多频定位方面取得了重要进展。该芯片集成了射频、基带、处理器、存储器等单元,不仅大幅缩小了芯片尺寸,还优化了功耗,实现了单芯片双频北斗高精度定位一体化SoC解决方案。这一技术的突破为北斗应用的自主可控提供了关键支持,推动了北斗产业化、国际化、规模化应用的进程。

三、高精度芯片进入共享单车市场

随着共享经济的兴起,共享单车市场蓬勃发展。华大北斗凭借其高精度芯片技术,成功进入了共享单车市场。其高精度芯片为共享单车提供了精准的定位服务,有效提升了用户体验和车辆管理效率。这一成功应用不仅展示了华大北斗技术的市场竞争力,也为其在更多领域的应用提供了广阔的空间。

四、双频北斗手机的面市

基于华大北斗双频北斗芯片研发的全球首款双频北斗手机的面市,是华大北斗发展历程中的又一里程碑。这款手机的推出,标志着北斗导航技术在智能手机领域的成功应用,也展示了华大北斗在推动北斗产业化进程中的积极作用。双频北斗手机的出现,不仅提升了用户体验,也为北斗导航技术的普及和推广做出了贡献。

五、斩获香港环球创新奖

2023年,华大北斗荣获首届香港环球创新奖年度创新大奖,这是对其在北斗导航芯片领域技术创新和产业化应用的高度认可。这一奖项的获得,不仅提升了华大北斗的品牌形象和市场影响力,也为其在未来的发展中注入了强大的动力。华大北斗将继续坚持技术创新,针对行业应用的不同需求,用领先的技术研发和应用能力推动北斗产业的高质量规模化发展。

这些故事只是华大北斗发展历程中的一部分,但它们足以展现出华大北斗在电子行业中的技术实力和市场竞争力。华大北斗将继续秉持创新精神,不断推动北斗导航技术的发展和应用,为电子行业的进步做出更大的贡献。

DRS Technologies公司的发展小趣事

DRS Technologies公司成立于1968年,由Leonard Newman和David Gross两位工程师共同创立。当时,他们正在Loral Corporation研究反潜战的信号处理技术。然而,当Loral决定转向其他技术方向时,Newman和Gross决定继续他们的研究,并创立了DRS。他们的努力最终导致了AN/SQR-17无源潜艇探测系统的开发,这一系统至今仍在广泛使用。

CHONGQING PINGYANG ELECTRONICS CO.,LTD.公司的发展小趣事

2005年,重庆平洋电子有限公司迎来了一个重要的合作机会。经过严格的筛选和谈判,公司与海尔集团达成了先期采购协议,成为海尔集团在重庆市唯一一家免第三方认证的企业。这一合作不仅为公司带来了稳定的订单和收益,还进一步提升了公司的品牌影响力和市场竞争力。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

博众电气自创立之初,就明确了自己的市场定位和发展方向。作为一家致力于成为一站式电子物料供应企业的公司,博众电气从一开始就注重技术研发和产品质量。公司创始人凭借对电子行业的深刻理解和敏锐的市场洞察力,为博众电气奠定了坚实的基础。

在初创期,博众电气通过引进国内外先进的生产设备和检测设备,不断提升产品的性能和质量。同时,公司还注重与国内外知名同行的技术交流和协作,积极吸收和借鉴先进的生产和管理经验。这些举措使得博众电气在激烈的市场竞争中逐渐脱颖而出。

COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

CAMDENBOSS公司的发展小趣事

在快速发展的同时,CAMDENBOSS公司始终注重品质管理。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。此外,公司还积极引进先进的生产设备和技术,不断提升生产效率和产品质量。通过持续改进和优化,公司确保了产品品质的稳定性和可靠性。

问答坊 | AI 解惑

SDRAM问题

FPGA控制SDRAM读写,先写两个数据到SDRAM的两个存储单元,再读出第一次写进去的数据。 请问,SDRAM加电后的第一步是不是必须需要初始化,设置模式寄存器,然后才能进行读写操作???…

查看全部问答>

Vxworks WindNet PPPOE 组件

      各位兄弟们帮帮忙啊,我想问下,在Tornado2.2.1 下面有没有对应的WindNet PPPOE组件?版本多少呢,谁有没有啊??…

查看全部问答>

uboot问题

哪位大虾、小虾或者虾米解释一下u-boot信息 U-Boot code: 33C00000 -> 33C2F388  BSS: -> 33C68B14 谢谢!…

查看全部问答>

请教:关于vivi如何跳转到ram执行的问题?

我在看vivi中的head.S 当程序bl copy_myself 结束之后, 为何执行下列代码后,P @ jump to ram         ldr        r1, =on_the_ram         add        pc ...…

查看全部问答>

在UCOSII里,中断里能否改变任务优先级

在UCOSII里,中断里能否改变任务优先级…

查看全部问答>

如何计算430执行代码的时间?

用汇编语言写代码时,可以通过将汇编指令的指令周期相加得到一段代码执行的时间。那如果用C语言写的代码,譬如调用一个子函数,我们有什么方法可以确定它的执行时间吗?请高手赐教!…

查看全部问答>

谁来解决PCIe3.0和USB 3.0的测试难题?

    上周,泰克参展2011年英特尔信息技术峰会(IDF)大会,介绍并现场演示其完善的测试测量系列工具,帮助设计工程师能够按期向市场上推出下一代产品。    在今年的IDF上,英特尔重点推介了USB3和PCIE3这两大技术主 ...…

查看全部问答>

关于RS编码的伯利坎普表示

请教各位大神,在RS编码中,将码元从对偶基表示转换到伯利坎普表示,是在RS编码之前、之后还是都可以?能否详细解释一下…

查看全部问答>

出 基本全新 xilinx 的 FPGA 开发板,高端

本帖最后由 caveguy 于 2014-3-18 10:31 编辑 基本还是全新的,买来就上过一次电,平时工作太忙,没时间学习了,出给需要的朋友吧。 买来也就一个多月,不到俩月,器件都是很新的。买时 1580 不包邮买的,现在 1300元不包邮出掉吧, 需要的联系 ...…

查看全部问答>