历史上的今天

今天是:2024年10月07日(星期一)

正在发生

2018年10月07日 | stm32 Flash读写[库函数]

发布者:JoyfulMelody 来源: 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都可使用)

推荐阅读

        5G时代即将来临,国际上许多运营商和通信厂商都已经陆续公布了自己的5G布局以及计划。而作为国内通信行业的佼佼者,华为在通信技术方面拥有深厚的技术积累,也已经开始在5G商用的道路上排兵布阵。不过还没等到华为大展拳脚,国外便传来了坏消息:美国、澳大利亚、俄罗斯等国均以“保障用户安全信息,保障网络安全为由”全面抵制华为,不会...
在AI换脸软件ZAO和旷视校园人脸识别的风波后,17万人脸数据被公开挂在网上商城出售的消息“接踵而至”,人脸突然成了“危险品”。无处不在的人脸识别,当采集人脸数据的渠道越来越广,很多人会疑惑,我们的人脸数据最终都流向了哪里?在刷脸解锁手机,付款,进出入高铁站、机场的时代,你的脸可能在研究人员的数据集中,也可能在暗网的黑产交易中,也可能...
综合编译自HPC与Techcrunch不知是否巧合,十一期间,Nvidia和Arm都前后举行了开发者大会,Nvidia CEO黄仁勋前脚刚参加完GTC的主题演讲后,又与Arm CEO Simon Segars在Arm开发者大会上尽情畅谈,包括AI、数据中心、并购以及其他等等。黄仁勋:Nvidia与Arm结合为了人工智能和超级计算的创新黄仁勋承诺将保留Arm在剑桥的总部,同时将投资5200万美元打造英...
机器人编程其实是一个很大的范围。 机器人编程涉及的学科很多,集成应用(机器人编程和生产工艺)、机器人研发、电气、、机械、、等等。 机器人编程要学的哪些? 1.工业机器人应用编程,就学对应厂家的,如ABB的RAD,,这个要平台动手实操。 2.机器人算法开发,就得学习/C++,或者; 3.机器人控制器开发,C/C++,RTX等,也有在 ROS下开发的,界面M...

史海拾趣

问答坊 | AI 解惑

如何选择ARM CPU的操作系统

从8位/16位单片机发展到以ARM CPU核为代表的32位嵌入式处理器,嵌入式操作系统将替代传统的由手工编制的监控程序或调度程序,成为重要的基础组件。更重要的是嵌入式操作系统对应用程序可以起到屏蔽的作用,使应用程序员面向操作系统级开发应用软件 ...…

查看全部问答∨

SmartBits600测试指导书

1 SmartBits600仪表使用... 5 1.1 仪表概述.. 5 1.2 Smartbits600 面板介绍.. 5 1.2.1 Smartbits600前视图.. 5 1.2.2 Smartibits600后视图.. 6 1.3 Smartbits600基本操作.. 6 1.3.1 SmartBits的IP地址配置方法.. 6 1.3 ...…

查看全部问答∨

旁路电容的选取和电路设计实例(一)

该系列文章讲述了电源部分去耦和旁路电容的设计原则。文中涉及了电容的选取,布局布线和仿真。本文为第一部分,讲述了电压调整器供电部分和旁路电容的交感,另外,还对电路总的阻抗,包括集成电路芯片、电容、PCB布线和电压调整器的阻抗进行了评估 ...…

查看全部问答∨

你的第一个电子制作,还记得么?

也是看了坛子里David_Lee的帖子: https://bbs.eeworld.com.cn/thread-95249-1-1.html 感慨颇多,当自己啥都半懂不懂的时候,就莽莽撞撞地做了第一个电子制作,也许,这个制作并不像想象中那么完美,也许,这个制作工作一天之后就被你扔到了物料堆 ...…

查看全部问答∨

有人用过icl7135这个芯片么?

#include"reg51.h" #include"absacc.h" #define ad_run   XBYTE[0x7fff] #define ad_read  XBYTE[0xbfff] #define uchar unsigned char uchar ad[5]; uchar A; uchar i; bit error; main() {     ...…

查看全部问答∨

LED专用恒流IC集汇2

TI 德州仪器  白光LED驱动器 TPS60250     具有 I2C 接口的用于 7 个 WLED 的1.2A 高功率高效充电泵TPS60251     具有 I2C 接口的用于 7 个 WLED 的1.2A 高功率高效充电泵TPS60252    ...…

查看全部问答∨

谁有这两个IC的资料

附件为IC的图片,该部分是使用在信号保护部分。   [ 本帖最后由 siy5774531 于 2010-12-22 14:16 编辑 ]…

查看全部问答∨

搞死了,ZE的FSMC接8位TFT屏,信号都有了,屏幕就是不显示。

  在SRAM_TEST的基础上修改的,FSMC_SRAM.C 与 LCD的基本函数如下,求救。。/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name &n ...…

查看全部问答∨

怎么在ccs中看某段代码的运行时间?

怎么在ccs中看某段代码的运行时间?我在网上找到一个ccs的教程说有个工具栏的时钟按钮可以用来查看代码执行时间,但是我一直没找到。 不知哪位高手知道怎么查看代码执行时间?…

查看全部问答∨

关于LCD程序AN3241的作用

RT,这个官方下载的LCD Drive程序的作用是什么?怎么我写进开发板后,LCD屏幕一直闪烁,是这个效果么?另外,我写入demo程序后,屏幕一直白屏。前两天还好好的,昨天突然就无法显示了,直接白屏,是硬件上出了问题吗?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved