一、STM32的存储器映像
1 文中的缩写
2 系统构架(原理图)
3. 存储器映像
(1)STM32是32位CPU,数据总线是32位的
(2)STM232的地址总线是32位的。(其实地址总线是32位不是由数据总线是32位决定的)
(3)STM32可以访问的地址容量是:4GB(2的32次方Byte)
(4)STM32肯定用不完4GB的空间,所以就有了:逻辑上地址,实际的地址
(5)存储器的映像就是告诉我们STM32设计时是如何使用这4GB的逻辑地址。
ARM是内存与IO统一编址
4.STM32实际地址安排
0x0000 0000 - 0x07ff ffff 128MB 映射区【解决不同启动方式】
0x0800 0000 -0x0801 ffff 128KB Flash
0x1fff f000 - 0x1fff f800 2KB System memory
0x 1fff f8000 -0x1fff f9ff 512B option bytes
二、STM32的位带详解(bitband)
1.基本概念
bitband,有时候翻译位位带操作
位带操作(地址的映射,一对一)
别名存储器区(逻辑地址) 字(32位)
映射
位段存储区 位
别名存储器区大小=位段存储器区大小的32倍
2.别名存储器区和位段存储区的映射
为什么要有位带操作??因为STM32本身只能支持8,16,32位的操作,不能支持位操作(不能支持一位)。
但是实际编程中有对1位单独操作的需求。一般我是这么做的:因为STM32不支持位操作,所以我们对32进行整体操作。我们一般读取整个32位,然后对其中一位做操作,在整体32位写回去。这么做是可以的,但是效率低。
如何改进效率??想一个方法,只修改其中一位还不影响其他位。如果硬件不支持是没办法的,除非硬件给你支持位操作。
3.位段操作的原理
而ARM又不支持位操作,所以发明了位带操作来替代。位带操作的思路是不让你直接单独操作这一位,而是把这一位给你映射到别的某一个地方的32位,然后你在别的地方操作那个32位相当于操作这里的这1位。
位带操作的核心问题:如何由位段存储器区地址,计算出别名存储器区的地址。
4.位段操作计算公式
三、STM32启动模式
1. 嵌入式闪存
2.三种启动模式
(1)启动模式,是研究STM32上电复位后从哪里区执行程序的问题
可以通过 BOOT[1:0]引脚选择三种不同启动模式。
(2)用户闪存存储器区:是给我们设计来放置用户写的代码的,我们程序员写的代码烧录时就被烧录到这里了,正常各种状态下就要把STM32设置为从这里启动的。
(3)系统存储器区:在非常规情况下用,用来实现ISP功能
(4)内嵌SRAM区:这种也是非常规的,用来实现调试器调试功能的。
我们常用的是用户闪存和系统存储区
3.ISP和IAP
单片机三种烧录方式ISP、IAP和ICP有什么不同?-电子工程专辑
ISP:程序自动【系统存储器区】
ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程
ISP就是in-system programming(在系统烧录,在系统编程)。以前要烧录bin文件到flash(单片机内部的flash中)是需要借助专用的烧录器的。比较麻烦。后面我们就需要一种不用烧录器也不用把单片机从板子上卸下来烧录方法,这种方法就是ISP。一般ISP都是通过串口把bin/hex文件直接isp到单片机内部flash中。如果想要使用ISP则要从系统存储器区开始启动STM32.
IAP:手写操作代码【用户闪存存储器区】
而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。
IAP:in-application programming(在应用编程,在应用烧录,在线升级)。
IAP的核心是用户需要在自己的应用程序中去操作单片机内部flash的控制器的寄存器,实现对内部flash的烧录功能。
然后IAP的时候用户的程序通过串口(usb,rtheernet)来接收PC发送过来的bin/hex文件,然后将其烧录到内部flash中去完成IAP。完成后再次启动后就会从用户存储器区执行,更新就会起效果。
一般实现IAP需要人为的将用户存储器区分为部分:bootloader+app【实际进行功能更新的程序】
四、STM32电源管理系统(PWR)
1.框图
外部传输电压3.3V,但是实际内部电压是1.8V
2.上电复位(POR)和掉电复位(PDR)
3 低功耗模式
睡眠模式,停机STOP模式,待机模式----->功耗越来越低,但是开机需要的时间越来越长。
降低功耗实际上是断开时钟。【时钟是关键】
为了省电:当该GPIO使用到才开启其时钟
1.睡眠模式(SLEEP)
CPU停,但是内部外设运行
唤醒源:任何中断
1.进入睡眠模式
2.退出睡眠模式
2.停止模式(STOP)
CPU停,时钟停(内部外设也停),只有SRAM(内存)和寄存器还能报错原来的值
唤醒源:外部中断(只能是外部中断)
外部中断 VS 内部中断
内部中断:定时器,USB
外部中断:按钮
3.待机模式(SUSPEND)
CPU停,外设停,时钟停,SRM和寄存器停(相当于整个都断电关机了),只有备份寄存器和待机电路还能工作。
唤醒源:WKUP引脚上升沿,RTC闹钟,NRST引脚上外部复位,IWDG复位
五、复位与时钟
1.复位
STM32F10xxx 支持三种复位形式,分别为系统复位、上电复位和备份区域复位(待机模式下)。
1.系统复位
复位后CPU都会被强制到复位向量中去执行程序。
RCC——CSR:当发生了某一个复位,则对应的bit位上的电平会发生变化
2.电源复位
2.时钟
1.时钟源:
时钟来源
不同时钟源带来不同的特点
分为三种:
1)纯内部:全部内嵌到单片机中【缺点:很不精确】
2)内外部:时钟产生的振动电路在内部,晶振在外部【晶振不能产生时钟】
3)纯外部:外部直接产生时钟
2.PLL(锁相环电路)
特点:可以进行倍频
频率是逐级递减
3.时钟通道与流向,分频
时钟的流向不是固定的
4.完全独立的多个时钟
多个时钟可能不是来自一个地方,所以使用的时钟电路会不同
六、STM32的时钟框图
1.总体配置
我们一般使用纯内部和内外部
一般上电的时候是使用内部的时钟周期【速度快】,但是一段时间切换为外部【较为精准】
1.2套独立时钟:
因为我们的晶体震荡电路和外部晶振不同
(1)HSxxx
(2)LSxxx:
2.纯内部:HSI(内部高速时钟源),SLI
RC:时钟源(可以产生时钟震荡)
HSI:high sourse intern
3.内外部:HSE(外部高速时钟源),LSE
HSE:high sourse extern
4.纯外部:OSC——IN,OSC32——IN
如果外部有一个高速/低速时钟要输入,则按照输入的来控制RTC
如果没有则直接使用标志的
5.时钟树
STM32学习8 理解STM32的时钟树_51CTO博客_stm32时钟树
时钟节点名称
1)HSI,LSI:内部高速/低速时钟源
2)HSE,LSE:外部高速/低速时钟源
3)PLLCLK:输出时钟
4)SYSCLK:输入到CPU时钟
5)USBCLK:USB模块时钟
6)HCLK:AHB时钟
7)FCLK:空闲时钟8)PCLK1,PCLK2:APB1,APB2总线时钟
9)ADCCLK:ADC时钟
10)RTCCLK:RTC时钟
11)IWDGCLK:看门狗
6.systick和MCO
(1)systick
SYSCLK:CPU工作的频率
systick:系统滴答时钟【时间片】
RCC【STM32中管理时钟的总名称】通过AHB时钟8分频后提供给Cortex系统定时器的外部时钟。通过对SysTick控制与状态寄存器的设置,可以选择上诉时钟或者Cortex AHB时钟作为SysTick时钟。
(2)MCO:输出位
八、时钟寄存器
我们在使用时钟的时候,记得打开时钟。
STM32默认时钟都是关闭的。
0.查看RTC的基地址
基地址,查memory map图得到,然后配合偏移量得到寄存器地址
一个寄存器占4字节(32bit),所以相邻的寄存器相差4字节
1.RCC_CR:时钟倍频(时钟控制寄存器)
因为RCC起始地址为:0x4002 1000
所以CR的首地址【偏移量为0】应该是0x4002 1000
2.RCC_CFGR:时钟配置寄存器
CFGR:首地址为:0x4002 1000+0x04=0x4003 1004
3.RCC_CIR:时钟中断寄存器
CIR:首地址为:0x4002 1000+0x08=0x4003 1008
4.RCC_APB2RSTR/RCC_APB1RSTR:APB2 /APB1 外设复位寄存器
复位的是时钟
5.RCC_AHBENR/ RCC_APB2ENR/ RCC_APB1ENR:AHB外设时钟使能寄存器
6.RCC_CSR:控制/状态寄存器
判断从哪里来进入复位的。
7.寄存器分类
寄存器位一般有三种:状态位,开关位,设置值位
1)状态位:只用读取,获取状态【一般是硬件设置的】
2)开关位:一般写“1”表示打开【使能】,写“0”表示关闭
3)设置值位:把某一个值设置进去表示要写入什么