问题引入:

用一句话回答以下问题:

  • 什么是寄存器?
  • 什么是寄存器映射?
  • 什么是存储器映射?

(本章重点在 1.1.3 和 1.1.4)

1.1 STM32芯片实物图

(图)

  1. 学会看丝印图

    • 芯片型号、内核提供商等其他信息
  2. 学会辨别正方向(芯片上的小圆点与PCB上的小圆点对应)
    • 以小圆点为基础,逆时针旋转,从1号引脚开始递增(图)
    • 如果芯片上没有小圆点,那么就把丝印图正对着自己,左上角的引脚为1号引脚,同样逆时针旋转递增。
    • 所有芯片的引脚排列都是逆时针的,无论是LQFP还是DIP封装的。

1.2 STM32芯片架构简图

(图)

芯片主要是由内核和外设组成。

内核(主控制器):

  • Cortex - M4内核(由Arm公司设计)用于控制外设。

外设(从控制器):

  • Flash、Sram、USART、GPIO、IIC、SPI等(由Soc公司设计)

总线:

  1. 内核与外设通过总线连接,其分为:I(指令)、S(系统)、D(数据)总线。

  2. 几个总线同时访问某个外设或者内核,产生竞争的时候,总线矩阵会使用调度算法进行仲裁。

  3. STM32F42xx的总线接口

(图)

  • 黄色为主控制器,红色为从控制器。
  • 指令总线主要访问Flash,程序可以从内置Flash、外置Flash和Sram中启动。
  • 总线交叉处有圆点,说明可以连接,例如:程序只能存储在Sram1中,不能存储在Sram2中。
  • 数据总线主要用于取常量。常量的存储区域和程序的存储区域是一样的。
  • 系统总线主要访问Sram和寄存器。

1.3 存储器映射

  1. 存储器本身是不具有地址信息的,地址信息是由用户或者厂商分配的,为存储器重新分配地址的过程即为存储器映射。

  2. Cortex - M4内核是32位的,可以寻址2的32次方,也就是4GB(0x0000 0000 - 0xFFFF FFFF)的内存空间,

  3. 这4GB的内存空间被分成了8个Block,每个Block都有特定的功能,每个Block大小为512MB。(教程里有每个Block的功能划分)

    • Block0用于设计Flash,429IGT6只用了1MB。

    • Block1用于设计Sram,用于存储变量,429IGT6用了256KB,被分成了三个部分:Sram1为112KB,Sram2为16KB,Sram3为64KB。

    • Block2用于设计片上外设。外设根据速度不同被分成四条总线进行控制:AHB1、AHB2、APB2、APB1。

      (图)

    • Block3是FMC的bank1 - bank2,用于扩展外部存储,一个bank为256MB,板上拓展了一个大小为8MB的Sram。

    • Block4是FMC的bank3 - bank4

      • 四个bank通过一个片选信号控制四片拓展芯片 。
    • Block5用于FMC

    • Block6用于FMC

    • Block7为Cortex - M4的内部外设,是由Arm公司设计的,如:NVIC等。

  4. 通过地址和偏移量间接访寄存器。

1.4 寄存器映射

问题引入:

  • 如何通过控制寄存器的方法,让GPIOH的16个引脚均输出高电平?

通过绝对地址访问内存单元:

//GPIO端口全部输出高电平
*(unsigned int *)(0x40021C14) = 0xFFFF;
  1. 0x40021C14是输出数据寄存器OCR的地址,如何找到?

    1. 在《STM32中文参考手册》2.3.1 嵌入式SRAM这节中,可以查到GPIOH外设的起始地址为0x4002 1c00。
    2. 在 7.4.6 GPIO端口输出数据寄存器这节中,可以查到偏移地址为0x14。
  2. (unsigned int *)的作用是什么?

    • 0x4002 1c14是我们人为理解的地址,但是直接写在程序中,只是一串十六进制常量,需要将其强制类型转换为指针类型,才能使用间接访问运算符访问该地址内存的数据。

通过寄存器别名方式访问内存单元:

#define GPIOH_ODR *(unsigned int *)(0x40021C13)
GPIOH_ODR = 0XFF;

什么是寄存器?

  • 给具有特定功能的内存单元取一个别名,这个别名就是寄存器,给已经分配好地址的特定内存单元取别名的过程叫做寄存器映射。

什么是存储器映射?

  • 给存储器分配地址的过程叫做存储器映射,再分配一个地址的过程叫做重映射。

STM32学习笔记 —— 1.1 什么是寄存器(概念分析)的更多相关文章

  1. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  2. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  3. STM32学习笔记-NVIC中断知识点

    STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...

  4. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  5. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  6. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  7. STM32学习笔记之一(初窥STM32)

    怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...

  8. STM32学习笔记(一)——点亮一个LED

    引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...

  9. STM32学习笔记(二) 基于STM32-GPIO的流水灯实现

    学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...

随机推荐

  1. Xamarin.Forms应用程序基础知识

    生命周期 在 Android 上,若主活动的 [Activity()] 属性缺少 ConfigurationChanges = ConfigChanges.ScreenSize | ConfigCha ...

  2. 系统权限划分Liunx版

    系统权限: 1. 当一个用户有两个系统的登录权限时,没有使用原来的那种系统id集合: 1,2,5形式,而是使用了这种形式 2. 杜绝重复

  3. 切比雪夫定理(Chebyshev's theorem)与经验法则(Empirical Rule)

    切比雪夫定理(Chebyshev's theorem):适用于任何数据集,而不论数据的分布情况如何. 与平均数的距离在z个标准差之内的数值所占的比例至少为(1-1/z2),其中z是大于1的任意实数. ...

  4. pytesseract.pytesseract.TesseractError: (1, 'Error opening data file /usr/local/share/tessdata/chi_sim.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata"

    pytesseract.pytesseract.TesseractError: (1, 'Error opening data file /usr/local/share/tessdata/chi_s ...

  5. 拼多多面试真题:如何用 Redis 统计独立用户访问量!

    阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...

  6. 批量kill掉包含某个关键字的进程

    需要把 linux 下符合某一项条件的所有进程 kill 掉,又不能用 killall 直接杀掉某一进程名称包含的所有运行中进程(我们可能只需要杀掉其中的某一类或运行指定参数命令的进程),这个时候我们 ...

  7. postgresql cstore_fdw安装与性能测试

    据介绍,cstore_fdw实现了 PostgreSQL 数据库的列式存储.列存储非常适合用于数据分析的场景,数据分析的场景下数据是批量加载的.这个扩展使用了Optimized Row Columna ...

  8. Python开源项目Top30

    原文地址:https://www.cnblogs.com/stoker/p/9101825.html No 1:Home-assistant (v0.6+) 基于Python 3的开源家庭自动化平台[ ...

  9. Java: Java终止线程的几种方式

    首先说明,使用stop方法终止的方式已经在很久之前就被废弃了,在加锁的情况下有可能会造成死锁,这里不做讨论. 1. 使用标志位终止线程 在run()方法执行完毕后,该线程就终止了.但是在某些特殊的情况 ...

  10. java http get/post请求

    一.http get/post请求 /** * @Description httpPost请求 */ public static String httpPost(String url, String ...