一、存储器映射

1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。

2、小端格式

3、映像(stm32f107,256KB产品)

可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:

介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。

地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图

option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。

再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图

选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。

二、复位

CM3将复位视作异常,优先级最高的异常。

stm32f1有三种复位:系统复位、电源复位、备份区复位。

前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)

零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。

上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)

三、flash读写

void flashwrite(u16 data)
{
 FLASH_Unlock();
 while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
 FLASH->CR|=0x00000001;    //set PG
 *((u16 *)0x0803F800)=data;
 while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
 lxj= *((u16 *)0x0803F800);

FLASH_Lock();
}

void flashread()
{
 FLASH_Unlock();
 while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
// FLASH->CR|=0x00000001;    //set PG
// *((u16 *)0x0803F800)=data;
// while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
 lxj= *((u16 *)0x0803F800);

FLASH_Lock();
}

没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。

flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失

转载于:https://www.cnblogs.com/lxjsailor/archive/2012/07/15/2793483.html

stm32f1的存储器与复位相关推荐

  1. stm32的存储器结构

    https://blog.csdn.net/qq_33114231/article/details/78658465 首页 博客 学院 下载 图文课 论坛 APP CSDNCSDN学院 问答 商城 V ...

  2. PLC系统中复位和格式化操作指令

    PLC编程技术广泛应用于机械.电子.汽车.食品.医药.服装等产品的生产过程之中.在实际工作我们经常用到PLC复位和格式化操作指令,下面我们一起来详细了解这两个指令. 一.复位CPU方法: 1.将操作模 ...

  3. 瑞萨单片机复位原因查找

    在日常开发过程中,我们经常遇到无故复位的问题.由于复位时随机的,这个时候如果能知道是什么原因复位,将非常有助于我们排查问题:以下是瑞萨R7F0C020M单片机的复位原因寄存器介绍,以及如何使用此寄存器 ...

  4. DEBUG指示灯详细说明

    如果能让电脑告诉我们故障发生在什么地方,哪岂不是省时省力可少走很多弯路?其实,只要我们能善用DEBUG诊断卡,一切都会变得相对轻松. 一.DEBUG诊断卡的工作原理 DEBUG卡是一种可检测电脑故障的 ...

  5. 西门子PLC 冷启动、暖启动、热启动的一种通俗解释

    不知道是不是翻译问题,在查阅官方文档的过程中,遇到了一些表述含义接近的名词,个人认为这是对同一个单词的几种不同翻译,因此在文章中,将这几种名词进行合并,只给出了最贴切的名词. 1 S7-CPU 操作模 ...

  6. 电脑主板测试卡代码说明大全

    代码对照表 00 . 已显示系统的配置:即将控制INI19引导装入. 01 处理器测试1,处理器状态核实,如果测试失败,循环是无限的. 处理器寄存器的测试即将开始,不可屏蔽中断即将停用. CPU寄存器 ...

  7. DIY制作示波器的超详细教程:(二)电路才是“硬”道理——硬件电路简述

    通过我的"蛊惑",想必大家都想自制一台示波器玩玩,那就继续跟着我走吧!所有的电子设备都离不开硬件,首先让我来对它的硬件结构进行一下简述: 总体电路如系统框图所示(图 1),前面已讲 ...

  8. 2022年嵌入式秋招题目及解答

    2022年嵌入式秋招题目及解答 1 ARM体系结构.总线.各种外设.微机原理 ARM的中断处理流程,以及每个阶段做什么事(中断触发到返回的具体行为): 中断上下文 中断嵌套如何实现(NVIC相关) 两 ...

  9. stm32的flash编程

    有时需要存储一些数据,在复位后仍然不会丢失,这可能就会用到片上flash,stm32的片上flash结构见另一篇博客stm32的存储器与复位. 对flash的编程逻辑上是比较简单的,<flash ...

最新文章

  1. python长整型字节数_Python将整数转换为16字节字节
  2. 获取成员函数地址及获取函数地址
  3. 飞畅科技告诉你什么是集成串口服务器POE交换机?
  4. linux===Ubuntu修改设备名称
  5. 无法删除所有指定的值_SQL-插入、更新、删除、创建
  6. 感觉前路任重而道远呀。
  7. celerra(八)--Celerra Replication(下)
  8. TCP模块的断开操作
  9. 【模拟】Workout for a Dumbbell
  10. jQuery实现留言板案例
  11. 鹏芯U盘(UDK2008)意外断电后修复 1
  12. vue3.0脚手架搭建(vscode)
  13. 安卓防止微信调整字体大小
  14. 你的第一桶金是如何赚到的?
  15. Java学习路线:day1 Java语言概述
  16. java实现微信小程序获取手机号(htts接口实现)
  17. git切换master项目,新建分支new branch
  18. 常用的四拍子,八拍子
  19. VMware之SNAT与DNAT
  20. IDEA rebuild project idea如何重新编译项目

热门文章

  1. 分享一个非常全的php正则验证车牌格式的函数
  2. java实现qq自动添加好友
  3. linux下命令集合
  4. 优秀博客 --敏感词汇过滤
  5. dataguard备库的数据文件的迁移
  6. 编译Nginx提示gzip module requires the zlib library
  7. leetcode990. 等式方程的可满足性
  8. 一个快速排序 和 直接插入排序 的简单 c程序
  9. elasticsearch中的优先级线程池
  10. redis专题:redis缓存穿透、缓存击穿、缓存雪崩等问题如何解决?