easyflash在嵌开发中的使用(一)单片机内存和总线概述

怎样方便的将一些重要的参数存放在flash中让他可以在断电之后仍然可以保存呢?

单片机RAM和ROM基础概念

想要知道这个问题,我们就需要知道单片机中一些数据和程序的一些基本原理。众所周知,单片机的存储分为ram,和rom也就是flash。

ram的全程是随机存储器,顾名思义,ram中的数据是不可以掉电恢复的,也就是ram中的数据只在一次单片机上电掉电的过程中存在。在下一次上电掉电的过程中ram中的数据都从空白开始的。那ram中存放的是什么数据呢。ram中就是存放的内容就是全局变量,局部变量,以及堆栈。

你也许会好奇,那ram中的这些东西是从哪里来的呢,在keil中编写的C语言程序和初始化的变量是怎么变成一个个指令让单片机去读取的呢。这个时候就是rom去发挥作用的时候。

在keil上面编好了软件,使用keil进行编译,编译产生了一个hex文件。然后通过烧录方式吧这个hex文件烧录进单片机中去,或者是使用st-link,或者是修改单片机的BOOT引脚,让系统进入BOOTLOADER,通过串口1进行烧录。在这个时候就是将我们编译的文件hex把他烧录到rom中去。在现在的单片机中rom一般就是指flash。也就是说flash就是rom的一种形式,rom的作用就是用于存储你所编好的程序。

在这个过程中你应该发现了flash和ram最关键的区别,那就是flash中的数据是断电不会消失的。毕竟如果flash中的数据也会断电消失,岂不是每一次断电都需要烧录一次程序。

而rom和flash的区别是什么呢。同样的rom和flash都是用于存储程序的。因为在早期的计算机中rom是只读不写的。也就是说早期的rom中写程序时一次性程序。随着技术的发展,逐渐的发展了可读可写的程序存储器,因此根据功能划分也将flash视为可擦写的rom。

因此,如果我们想要在在单片机程序中制作一个不会随着掉电而变化的一个变量,我们就要吧这个变量存放在flash中。而不是只是单纯的在程序中定义这个变量并且给他赋值,因为现在我们知道只是定义这个全局变量是随着程序的运行,才在ram中开辟了一块固定的地址,用于存放这个全局变量。而ram的特性就是会在掉电后丢失,并且在下一次上电后重新将这个变量初始化为他的初始化的值。

这个时候,我们就得到了我们,最底层也是最基础的实现方法,那就是向单片机的flash中写数据。这个时候问题来了。怎么写,谁去写,写在哪里?接下来我们就这三个问题展开说明。

单片机的地址

我们首先解释写在哪里的问题,由此我们将引出一个至关重要的概念——地址以及地址映射。

  • 外设地址

 大家都知道一块单片机主要由以下几个部分组成。如下图参考。

  1. cpu也就是cortex-m内核;
  2. 实现各种硬件功能的外设(比如GPIO、USART、SPI等硬件外设);
  3. ram以及flash。

我们都知道,想要使用单片机的外设,就必须向相应的外设的寄存器中写入相应的值。因为单片机的外设就是由这些寄存器中的值控制的。这些外设是真实存在的,寄存器同样是真实存在的,而寄存器中是用来存放数值的,有的是8位,有的是16位。这有没有让我们想起一个相似的概念呢?没错就是指针。而指针同样的是指向某一个变量的地址。由此,我们就自然而然的引出了外设地址的概念。所谓外设地址,就是在某一个特定的位置,存放寄存器的位置。

除了单片机的外设地址之外,还有单片机内核地址,ram地址,flash地址。以及在此之下更加细分的地址。那么这些地址是什么呢,或者说这些寄存器外设的地址是根据什么来定的呢?

接下来我们就介绍单片机中外设,ram,rom他们的地址的分配。也就是单片机的地址映射。

  • 单片机的三总线结构

别急,在讲述单片机的地址映射之前,我们还需要有一些基本的单片机地址总线的认知。如图所示。单片机外设,存储器ram,rom,cpu都是挂载在这三根总线上的,分别是数据总线,地址总线,控制总线。接下来,我们就简单的了解一下单片机的三总线结构。

  • cpu:cpu也就是stm32系列的cortex内核作为整个单片机系统的大脑,负责程序逻辑的处理和指令的下发。(单片机cpu内部其实也是一些寄存器。cortex内核进行程序运行的过程也是通过硬件寄存器进行数据的存取和逻辑的处理的过程)

  • 数据总线:数据总线故名思意,就是传输数据的总线,数据总线的传输方向是双向的,也就是说,cpu既可以往外设寄存器、内存中发送数据,也可以从外设寄存器,内存接收数据。而单片机的位数,只是决定cpu每次读取或者写入数据的位数。比如32位,就是可以一次传输32位二进制数据,也就是两位16进制数据。有一点很关键,那就数据总线上传输的数据,并不是指我们常说的变量,而是广义上的数据,包括了指令代码和各种信息。
  • 控制总线:也就是cpu向外设、内存发送指令,外设内存向cpu发送请求的总线。同样控制总线也是双向的。但是在单次传输却是单向的。
  • 地址总线:地址总线就是cpu决定将指令,数据发向什么什么地方的总线。我们常用的地址总线一般是32根。也就是说他的地址范围是从0x00000000 00000000 00000000 00000000-11111111 11111111 11111111 11111111。一共是2^32次方个地址。一个地址可以存放一个字节的数据,这样一共可以存放4GB的数据。这当然是不现实的。这只是单片机理论上的寻址空间,不代表在这些4GB的地址中都可以存放数据。下文为了方便,我们将他转换成16进制,也就是我们常见的0x00000000-0xFFFFFFFF。

了解了这些基本的概念之后,我们就可以想象出单片机cpu执行一条指令,读取或者写入一次数据的大致过程了。

假设单片机在执行我们编写的程序,这个程序运行的过程中,需要将一个GPIO的电平转换。那这个时候,就是向GPIO寄存器中对应的位写入0或者1。

cpu就会在三条总线上发送信息:

  1. 将数据总线设为1;
  2. 将控制总线设为读或者写;
  3. 降地址总线设为该寄存器的地址。

该GPIO外设根据三条总线响应:

  1. GPIO外设控制器接收到地址总线上的值,并且识别到该地址是落在自己的地址区间内;
  2. GPIO外设控制器识别控制总线的指令;
  3. GPIO外设控制器根据识别到的指令对接收到的数据做出读写的操作,将数据写入寄存器内。

而这些外设寄存器,ram、flash的地址是在哪里呢?单片机地址上都分配了什么东西呢,这就是我们接下来要介绍的概念。单片机内存分配以及地址映射。由于篇幅过长,我们将在下一次的文章中进行讲解。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值