历史上的今天
返回首页

历史上的今天

今天是:2025年03月07日(星期五)

正在发生

2019年03月07日 | STM32之内部FLASH例程

2019-03-07 来源:eefocus


#include "stm32f10x.h"

#include

 

/* STM32 内部 FLASH 配置 */

#define STM32_FLASH_SIZE        512 /* 所选STM32的FLASH容量大小(单位为K)  */

 

#if STM32_FLASH_SIZE < 256

  #define STM_SECTOR_SIZE  1024    /* < 256为1K字节页,  >=256 为2K页 */

#else 

  #define STM_SECTOR_SIZE 2048

#endif

 

/* 应用程序区域 */

#define APP_REGION (0x8000000 + 0x80000 - STM_SECTOR_SIZE)

 

/* RCC时钟配置 */

void RCC_config()

ErrorStatus HSEStartUpStatus;

 

/* RCC寄存器设置为默认配置 */

RCC_DeInit();

/* 打开外部高速时钟 */

RCC_HSEConfig(RCC_HSE_ON);

/* 等待外部高速时钟稳定 */

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS) 

/* 设置HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* 设置PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div1);

/* 设置PCLK1 = HCLK / 2 */

RCC_PCLK1Config(RCC_HCLK_Div2);

/* 设置FLASH代码延时 */

FLASH_SetLatency(FLASH_Latency_2);

/* 使能预取址缓存 */

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* 设置PLL时钟源为HSE倍频9 72MHz */

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* 使能PLL */

RCC_PLLCmd(ENABLE);

/* 等待PLL稳定 */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

/* 设置PLL为系统时钟源 */

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* 等待系统时钟源切换到PLL */

while(RCC_GetSYSCLKSource() != 0x08);

}

}

 

/* 扇区缓冲区 */

static uint8_t flash_buf[STM_SECTOR_SIZE];

 

/* 读flash */

void read_flash(uint32_t addr, uint8_t *buf, uint16_t size)

{

uint16_t i;

 

for(i = 0; i < size; i++)

{

buf[i] = *(__IO uint8_t *)(addr + i);

}  

 

/* 写flash */

void write_flash(uint32_t addr, uint8_t *buf, uint16_t size)

{

uint32_t addr_base;

uint16_t len;

uint16_t i;


/* 检查地址合法性 */

if(addr < FLASH_BASE ||(addr >= (FLASH_BASE + 1024 * STM32_FLASH_SIZE)))

assert_param(0);

 

/* 将数据循环写入flash */

while(size)

{

/* 扇区基地址 */

addr_base = (addr / STM_SECTOR_SIZE) * STM_SECTOR_SIZE;

/* 读出整个扇区内容 */

read_flash(addr_base, flash_buf, STM_SECTOR_SIZE);

/* 需要写入的长度 */

len = ((addr + size) > (addr_base + STM_SECTOR_SIZE)) ? (addr_base + STM_SECTOR_SIZE - addr) : size;

/* 将需要改变的内容替换掉 */

memcpy(flash_buf + addr - addr_base, buf, len);


/* 解锁 */

FLASH_Unlock();

/* 擦除整片扇区 */

FLASH_ErasePage(addr_base);

/* 写使能 */

FLASH->CR &= FLASH_CR_OPTWRE; 

/* 重新将内容写入扇区 */

for(i = 0; i < STM_SECTOR_SIZE / 2; i++, addr_base += 2) /* 从头写到尾 */

FLASH_ProgramHalfWord(addr_base, *((uint16_t *)flash_buf + i));

/* 锁定 */

FLASH_Lock();

 

/* 将数据偏移len */

addr += len;

buf += len;

size -= len;

}

}

 

int main()

{

uint8_t buf[5] = {1, 2, 3, 4, 5};

uint8_t test[5];

 

/* 时钟配置 */

RCC_config();

 

write_flash(APP_REGION, buf, 5);

read_flash(APP_REGION, test, 5);


while(1)

{

 

}

}


推荐阅读

史海拾趣

ETC1公司的发展小趣事

成谷科技是一家专注于ETC技术在区域市场应用的企业。公司根据不同地区的交通特点和需求,量身定制ETC解决方案,并在当地市场进行深耕细作。通过深入了解当地市场和客户需求,成谷科技成功打造了一系列具有地方特色的ETC应用案例,赢得了当地政府和客户的广泛赞誉。

D+H Mechatronic AG公司的发展小趣事

在全球环保意识日益增强的背景下,D+H Mechatronic AG积极响应绿色制造的号召。公司投入大量资金和资源研发出了一系列节能环保的机械设备,这些设备在生产过程中能够显著降低能耗和排放。同时,公司还积极参与各种环保活动,倡导绿色生产理念。这些举措不仅使公司赢得了客户的信赖和支持,也为其在行业内树立了良好的环保形象。

Belden Wire & Cable公司的发展小趣事

在20世纪中期,随着电子技术的快速发展,电线电缆行业也面临着巨大的变革。Belden公司紧跟时代步伐,积极投入研发,推出了一系列具有创新性和前瞻性的产品。这些产品不仅满足了市场对高性能电线电缆的需求,还为公司赢得了众多行业奖项和荣誉。同时,Belden还建立了严格的质量控制体系,确保每一根电线电缆都符合最高的质量标准。

Alpha 3 Manufacturing公司的发展小趣事

在技术创新的基础上,Alpha 3 Manufacturing公司开始积极拓展市场。公司参加了多个国际电子展会,与全球客户建立了广泛的联系。同时,公司还加强了对市场的调研和分析,针对不同地区和客户的需求,推出了定制化的产品和服务。这些举措不仅提高了公司的市场份额,还进一步提升了公司的品牌知名度和影响力。

CEVA, Inc公司的发展小趣事

面对不断变化的市场环境和技术挑战,CEVA公司积极应对,抓住机遇。例如,在执行编码标准并降低许可证风险方面,CEVA的DevOps/实时开发团队面临着在更高效地执行编码标准的同时降低许可证相关风险的挑战。公司通过优化开发流程、提升自动化水平等方式,成功应对了这一挑战。同时,CEVA也通过增加站点布局、拓建电商能力、提升产品竞争力等手段,抓住市场机遇,迎接未来。

Eurosil Electronics Ltd公司的发展小趣事

随着全球对环保问题的日益关注,Eurosil也积极响应这一趋势。公司注重环保和可持续发展,在生产过程中采取了一系列环保措施,如减少废弃物排放、提高能源利用效率等。同时,Eurosil还积极研发环保型电子产品,为客户提供更加绿色、健康的产品选择。

问答坊 | AI 解惑

Fsk/OOK RF芯片:IA无线产品介绍

IAI 产品(芯片) 1. IA 4220 / 4221 / 4222 无线发射芯片 TSOP16 2. IA 4320/ 4322 无线接收芯片 TSOP16 3. IA 4420 / 4421 无线收发芯片 TSOP16 外围器件很少,只要两三颗小电容和一个10M Cystal, 对其精度无特殊要求,总成本低 (具备自动频 ...…

查看全部问答>

HTKBOOK

HTK的手册,用于HMM语音方面的。…

查看全部问答>

protel封装总结

在网上找到的protel的封装总结,并归纳了一下。希望能对大家有所帮助。…

查看全部问答>

“简简单单DSP”—SCI的学习及使用

转一个helloDSP上面的文档,我看了一下这个写的简单明了,符合咱们简简单单的风格,上传…

查看全部问答>

Wince 下UsbAudio 驱动有开发过吗?

Wince 下UsbAudio 驱动有开发过吗? 有什么列子?或资料,谢谢。…

查看全部问答>

==请问:通过GPRS或CDMA模块连接Internet,对SIM卡有特殊要求么 ==

CDMA联通服务热线,说要世界风SIM卡才可以。 那GPRS也需要特殊SIM kama…

查看全部问答>

STR710FZ2T6串口速率始终只有设定值的四分之一

#ifndef __71x_CONF_H#define __71x_CONF_H/* Comment the line below to put the library in release mode */#define RCCU_Main_Osc 0x16000000^^^^^^^^^^ ...…

查看全部问答>

历时整整35天,成功完成老板的任务,带一个中继,3000米通信,实际速率10kbps

历时整整35天,成功完成老板的任务,带一个中继,3000米通信,实际速率10kbps,空中波特率50kbps,总算可以休息一下,庆祝一下。春节后来公司上班没几天,老板让我做一个温度、湿度采集的系统,45天内完成样机制作,演示给客户看。由于客户是政府相 ...…

查看全部问答>

请教 关于看门狗

MSP430F4XX User\'s Guide上有这么一句: When using the WDT in the watchdog mode, the WDTIFG flag sources a reset vector interrupt. The WDTIFG can be used by the reset interrupt service routine to determine if the watc ...…

查看全部问答>

关于IAR的模拟仿真

大家好!我想请问一下!在IAR Embedded Workbench for MSP430 3.42当中,如果我要用软件模拟仿真,那单片机的晶振在那里设置呢!我是一个初学者,请大家指点!谢谢!…

查看全部问答>