【朱老师课程总结 侵删】
第一部分、章节目录
第二部分、章节介绍
3.2.1.STM32的存储器和总线架构
本节主要讲述STM32的存储器映像,涉及到了内存与IO统一编址、地址总线和寻址空间的知识。继续讲解存储器映射表,后面写代码时会需要用到这张表的内容,请大家多注意细节。
3.2.2.STM32的位带操作详解
本节讲解STM32的位段原理,以及位段访问的优势、位段的计算方法。
3.2.3.STM32的启动模式
本节讲解STM32的三种启动模式,并且着重讲了ISP和IAP的概念和实现原理、区别等。
3.2.4.STM32的电源管理系统
本节讲解STM32的电源管理系统,主要是低功耗模式、睡眠模式等概念和实现方法。
3.2.5.复位与时钟概述
本节讲述STM32的复位设计和时钟部分的总体设计思路,关键在于时钟部分。
3.2.6.STM32的时钟控制RCC详解
本节开始讲解STM32的时钟框图、时钟通道、时钟设置及相应的寄存器位。
第三部分、随堂记录
注:STM32F1xx系列数据手册可以自行百度下载!
3.2.1.STM32的存储器和总线架构
3.2.1.1、系统架构
- 四个驱动单元:
Cortex™-M3内核DCode总线(D-bus),和系统总线(S-bus)
通用DMA1和通用DMA2 - 四个被动单元
内部SRAM
内部闪存存储器
FSMC
AHB到APB的桥(AHB2APBx),它连接所有的APB设备,这些都是通过一个多级的AHB总线构架相互连接的。 - ICode总线(I-bus):和flash的指令接口连接
- APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。
3.2.1.2、存储器映像
(1)STM32存储器的一些小知识
- STM32是32位CPU,数据总线是32位的。
- STM32的地址总线是32位的(其实地址总线是32位和数据总线32位没有关系)
- STM32可以访问的地址容量是:4GB(2^32Byte)
- 数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字
节,而最高地址字节是最高有效字节。 - STM32肯定用不完4GB的空间的,所以就有了:逻辑上的地址、实际的地址
- 可访问的存储器空间被分成8个主要块,每个块为512MB。
(2)存储器映像
- 上面这个图就是告诉我们STM32设计时是如何使用这4GB的逻辑地址的
- ARM是内存与IO统一编址的。介绍可参照:CPU访问外设有两种方式:IO与内存统一编址&IO与内存的独立编址
STM32的实际地址安排:
0x00000000 - 0x0007FFFF 512KB 映射区
0x08000000 - 0x0801FFFF 128KB Flash
0x1FFFF000 - 0x1FFFF7FF 2KB System Memory
0x1FFFF800 - 0x1FFFF9FF 512B Option bytes
0x20000000 - 0x2000FFFF 64KB SRAM
3.2.2.STM32的位带操作详解
(1)位带基本概念
- CM3 的存储器系统支持所谓的“位带”(bit‐band)操作。
- Cortex™-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位。也就是说将位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的
(2)为什么要有位带操作?
- 因为STM32本身只支持8、16、32位的操作,而不支持位操作。
- 但是我们实际编程中有对1位单独操作的需求。一般是这么做的:因为STM32不支持位操作,所以我们需要对32位进行整体操作。我们一般是读出整个的32位,然后对其中一位做操作后再整体32位写回去。这么做是可以的,但是效率低。
(3)如何改进效率?
- 答案肯定是想一个办法能够直接一次性修改那一位同时还不影响其他位。如果硬件不支持是没办法的,除非硬件给你支持位操作。51可以实现位操作,比如之前的TR0 = 1;
- 而ARM又不支持位操作,所以发明了位带操作来替代。位带操作的思路是不让你直接单独操作这一位,而是把这一位给你映射到别的某个地方的32位,然后你在别的地方操作那个32位就相当于是操作这里的这1位。在位段别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。
(4)位带区和位带别名区在哪?
(5)看图理解
- 别名存储器区大小等于位段存储器区大小的32倍。
- 位带操作的核心问题就是:如何由位段存储器区地址,计算出别名存储器区的地址
比如:对 SRAM 位带区的某个比特,记它所在字节地址为 A,位序号为 n(0<=n<=7),则该比特在别名区的地址为:
下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2:
- 0x22006008 = 0x22000000 + (0x300×32) + (2×4).
对0x22006008地址的写操作与对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。读0x22006008地址返回SRAM中地址0x20000300字节的位2的值(0x01 或 0x00)。
3.2.3.STM32的启动模式
3.2.3.1、三种启动模式
(1)启动模式:研究STM32上电复位后从什么地址去执行程序的问题
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:
- 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x00000000或0x0800 0000。
- 从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原有的地址(互联型产品原有地址为0x1FFF B000,其它产品原有地址为0x1FFF F000)访问它。
- 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。
(2)主闪存存储器(用户闪存存储器)是给我们设计来放置用户写的代码的,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,典型工作状态下就要把STM32设置为从这里启动。
(3)系统存储器在非常规情况下用,用来实现ISP功能的。
(4)内置SRAM,这种也是非常规的,用来实现调试器调试功能的。
3.2.3.2、ISP和IAP
(1)ISP就是in-system programming(在系统烧录,在系统编程)。系统存储器是芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。在bootloader中提供了UART1的接口,通过此接口可以将用户所需的程序代码下载到主Flash中,下载完毕后,此时程序代码已经存储在主Flash当中,这时切换启动模式(从主Flash启动),复位后所执行的就是刚刚下载到Flash中的代码了。学习51用的就是这种方式!
(2)IAP就是in-application programming(在应用编程,在应用烧录,在线升级),IAP的核心是用户需要在自己的应用程序中去操作单片机内部flash的控制器的寄存器,实现对内部flash的烧录功能。然后IAP的时候用户程序通过串口(usb、ethernet)来接收PC发送过来的bin/hex文件,然后将之烧录到内部flash中去完成IAP。完成后再次启动后就会从用户存储器区执行,更新就会起效果。一般实现IAP需要人为的将用户存储器区分为2部分:bootloader+app
我们去升级bootloader,bootloader去升级app,然后执行app区域的代码。
3.2.4.STM32的电源管理系统(PWR)
这一块主要是硬件工程师比较关注,做软件重点关注下后面的低功耗模式!就比如说以后可能做手机屏幕显示功能,就会接触到睡眠、待机、停止、唤醒功能!
(1)低功耗必须可以被唤醒,不然就没有意义了!
(2)STM32F1xx系列的低功耗模式有三种:
- 睡眠模式(SLEEP):
CPU停,外设运行,唤醒源为所有中断 - 停机模式(STOP):不是关机,是深度睡眠模式!
CPU停,时钟停,外设停,只有SRAM和寄存器还能保持原来的值,唤醒源是外部中断 - 待机模式(SUSPEND):
CPU停、外设停、时钟停、SRM和寄存器停(相当于整个都断电关机了),只有备份寄存器和待机电路还能工作,唤醒源:WKUP引脚的上升沿、 RTC闹钟、 NRST引脚上外部复位、 IWDG复位
(3)此外,在运行模式下,可以通过以下方式中的一种降低功耗:
- 降低系统时钟
在运行模式下,通过对预分频寄存器进行编程,可以降低任意一个系统时钟(SYSCLK、HCLK、PCLK1、PCLK2)的速度。 - 关闭APB和AHB总线上未被使用的外设时钟。
通 过 设 置 AHB 外 设 时 钟 使 能 寄 存 器 (RCC_AHBENR) 、 APB2 外 设 时 钟 使 能 寄 存 器(RCC_APB2ENR)和APB1外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。从而减少功耗
(4)低功耗模式下的自动唤醒
3.2.5.复位与时钟概述
3.2.5.1、STM32的复位设计(复位就是恢复到初始状态)
复位分为系统复位、上电复位和备份区域复位,复位后CPU都会被强制到复位向量中去执行程序。
(1)系统复位:
- 系统复位将复位所有寄存器至它们的复位状态。
- 当发生以下任一事件时,产生一个系统复位:
- NRST引脚上的低电平(外部复位)
- 窗口看门狗计数终止(WWDG复位)
- 独立看门狗计数终止(IWDG复位)
- 软件复位(SW复位)
- 低功耗管理复位
(2)上电复位
- 当以下事件中之一发生时,产生电源复位:
- 上电/掉电复位(POR/PDR复位)
- 从待机模式中返回 - 电源复位将复位除了备份区域外的所有寄存器。
(3)备份域复位
- 当以下事件中之一发生时,产生备份区域复位。
- 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)中的BDRST位产生。
- 在VDD 和VBAT 两者掉电的前提下,VDD 或VBAT 上电将引发备份区域复位。
3.2.5.2、STM32的时钟总体设计
(1)时钟源:
- 纯内部
芯片内部RC振荡器产生,起振较快,所以时钟在芯片刚上电的时候,默认使用内部时钟!
HSI、LSI - 内外部
外部有晶振,内部有震荡电路,在精度和稳定性上都有很大优势,这个需要我们进行软件设置!
HSE、LSE - 纯外部
外部有已经做好的时钟,一般用于多核系统
OSC_IN、OSC32_IN - 高速时钟(HSE和HSI)提供给芯片主体的主时钟。低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗(IWDG)使用,图中可以看出高速时钟也可以提供给RTC。学习DS1302的时候接触过!传送门
(2)PLL(锁相环电路)
- 功能就是倍频
- PLL的时钟叫作PLLCLK
- PLL时钟是由HSI/HSE提供的
(3)时钟通道与流向、分频
- 时钟通道就反映在时钟树里面
- 流向和分频需要软件设置,需要设置好走哪条路!
(4)完全独立的多个时钟
- 比如RTC的32.768kHz,可以有很多时钟来源!
时钟树
3.2.6.STM32的时钟控制RCC详解
3.2.6.1、总体配置
(1)4个独立时钟:HSx和LSx(H:High,L:Low;E:External,I:Internal)
(2)纯内部:
- HSI
- LSI
(3)内外部:
- HSE
- LSE
(4)纯外部:
- OSC_IN、OSC32_IN
直接接入时钟,跳过外部时钟!
3.2.6.2、PLL
(1)2个可选PLL源(PLLSRC控制)
- HSI振荡器时钟经2分频后作为PLL输入时钟
- HSE时钟作为PLL输入时钟
(2)倍频可软件设置(PLLMUL控制)
- PLLMUL是时钟配置寄存器的几个bit位
- 只有在PLL关闭的情况下才可被写入
- PLL的输出频率不能超过72MHz
3.2.6.3、分频
(1)分频有很多途径—预分频因子
- 直接分频
- ADC
- AHB
- APB1/APB2
- USB
- 连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。
- 连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。
(2)注意时钟节点名称:
- HSI、HSE、LSI、LSE、
- PLLCLK、SYSCLK、
- USBCLK、HCLK、FCLK、PCLK1、PCLK2、ADCCLK、RTCCLK、IWDGCLK
3.2.6.4、SysTick和MCO
(1)SysTick(系统嘀嗒定时器)
- 当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。在时钟树上咱们可以看到这个系统嘀嗒!
- SysTick其实就是个定时器,其作用就是用于时间片轮转,
(2)MCO(时钟输出)
微控制器允许输出时钟信号到外部MCO引脚。相应的GPIO端口寄存器必须被配置为相应功能(复用)。
以下四个时钟信号可被选作MCO时钟:
- SYSCLK
- HSI
- HSE
- 除2的PLL时钟
时钟的选择由时钟配置寄存器(RCC_CFGR)中的MCO[2:0]位控制。
3.2.6.5、时钟相关的寄存器
- 查memory map图得到RCC基地址:0x4002 1000
- 然后配合RCC 寄存器地址映像,查询寄存器偏移量得到寄存器地址。
- 复位值就是默认的配置
(1)RCC_CR(时钟控制寄存器) 0x40021000 重要
(2)RCC_CFGR(时钟配置寄存器) 0x40021004 重要
(3)RCC_CIR
(4)RCC_APB2RSTR 复位外设时钟的
(5)RCC_APB1RSTR 复位外设时钟的
(6)RCC_AHBENR 外设时钟开关 重要
(7)RCC_APB2ENR 外设时钟开关 重要
(8)RCC_APB1ENR 外设时钟开关 重要
(9)RCC_BDCR
(10)RCC_CSR
寄存器位一般有三种:状态位、开关位、设置值位
本节课结束!