STM32学习

1、前言

毕业第二年,第一年在忙碌和迷茫中度过,至今依旧技术渣渣一枚,想慢慢静下来沉淀自己,也认识到工资只是做事,自我学习才是提升,特此开贴作为自己的学习笔记,也希望能通过写贴的方式让自身更好得了解知识点。水平有限,帖子可能会以学习资料摘抄为主,只作为个人学习总结所用,如果内容侵权大佬们勿怪,无任何恶意!

2、STM32介绍

2.1 STM32分类

STM32 就是指 ST 意法半导体公司开发的32 位微控制器。从内核上分有 Cortex-M0、M3、M4和 M7 这几种,每个内核又大概分为主流、高性能和低功耗。
现一般开发采用F1系列即可满足需求,因为F4系列在F1系列上增加了支持SDRAM功能,可直接进行LCD控制及摄像头等开发,且F4主频可达到180M,相较于F1的72MHZ,可达到更高性能。若需要开发LCD屏显示或需求高性能运算等,一般采用F4系列。现个人学习基于野火F103开发板,用的是STM32F103VET6型号芯片,基于M3内核。

芯片型号命名规则见下图所示:
STM32命名规则

2.2 STM32芯片内部

 STM32 芯片架构简图
我们看到的 STM32 芯片是已经封装好的成品,如上图所示,芯片主要由内核和片上外设组成,就如同电脑上的 CPU 与主板、内存、显卡、硬盘的关系,内核之外的部件被称为核外外设或片上外设,如 GPIO、USART(串口)、I2C、SPI 等都叫做片上外设。

内核和外设之间通过各种总线连接,其中驱动单元有4个,被动单元也有4个,可以把驱动单元理解成是CPU 部分,被动单元都理解成外设。具体如下图所示:
STM32F10xx 系统框图(不包括互联型)
驱动单元(4总线):
1)ICode总线:ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是存放在 FLASH 中的一条条指令,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,它是专门用来取指的。
2)DCode总线:DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。在编程过程中常量或变量等数据被存储在FLASH或者SRAM中,DCode总线可进行在对应存储介质中进行取数。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
3)System总线:系统总线,主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。
4)DMA总线:DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在SRAM,可以在内部的FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。

被动单元:
1)内部的闪存存储器:内部的闪存存储器即 FLASH,我们编写好的程序就放在这个地方。内核通过 ICode 总线来取里面的指令。
2)内部的SRAM:内部的 SRAM,即我们通常说的 RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过 DCode 总线来访问它。
3)FSMC:FSMC 的英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器。通过 FSMC ,我们可以扩展内存,如外部的SRAM,NANDFLASH 和 NORFLASH。但有一点我们要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。
4)AHB到APB的桥:从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、I2C、SPI 这些外设就挂载在这两条总线上,要学会编程这些外设去驱动外部的各种设备。

2.3 存储区域解析

被控单元的 FLASH,RAM,FSMC 和 AHB 到 APB 的桥(即片上外设),这些功能部件共同排列在一个 4GB 的地址空间内。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们(通过 C 语言对它们进行数据的读和写)。
在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见表格 。每个块的大小都有512MB。
存储器功能分类
在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。Block0 用来设计成内部 FLASH,Block1 用来设计成内部 RAM,Block2 用来设计成片上的外设,下面我们简单的介绍下这三个 Block 里面的具体区域的功能划分。

1)存储器 Block0 内部区域功能划分
Block0 主要用于设计片内的 FLASH ,Block 内部区域的功能划分具体如下图。
存储器Block0内部区域功能划分
2)储存器 Block1 内部区域功能划分
Block1 用 于 设 计 片 内 的 SRAM 。Block 内部区域的功能划分具体如下图。
存储器Block1内部区域功能划分
3)储存器 Block2 内部区域功能划分
Block2 用于设计片内的外设,根据外设的总线速度不同,Block 被分成了 APB 和 AHB两部分,其中 APB 又被分为 APB1 和 APB2,具体如下图 。
存储器Block2内部区域功能划分

2.4 寄存器解析

存储器本身没有地址,给存储器分配地址的过程叫存储器映射。

在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共 32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2 和 AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始,也叫外设基地址。
总线基地址
“相对外设基地址偏移”即该总线地址与“片上外设”基地址 0x4000 0000的差值。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值