STM32F103C8T6初学笔记
ST官网链接:
ST MCU网站链接:
初识STM32
STM32是32位CPU,数据总线32位
STM32的地址总线32位(地址总线32位与数据总线32位无关)
STM32可以访问的地址容量是:4GB(2的32次方Byte)
STM32有4GB空间
存储器映像的意思即STM32设计时是如何使用这4GB的逻辑地址
STM32存储器映像
STM32的实际地址安排 | ||
---|---|---|
0x00000000 - 0x07FFFFFF | 128MB | 映射区 |
0x08000000 - 0x0801FFFF | 128KB | Flash |
0x1FFFF000 - 0x1FFFF800 | 2KB | System Memory |
0x1FFFF800 - 0x1FFFF9FF | 512B | Option Bytes |
STM32的位带操作
bitband:位带操作
别名存储器区,字(32位)
映射
位段存储区, 位
为什么要有位带操作?
因为STM32本身只支持8、16、32位的操作,而不支持位操作。
但是我们实际编程中有对1位单独操作的需求,所以我们需要对32位进行整体操作。
方法一:
读出整个32位,然后对其中一位做操作后再整体32位写回去。
效率低。
改进效率 ↓
方法二:
发明位带操作替代ARM不支持的位操作。
位带操作的思路:不直接单独操作这一位,而是把这一位映射到别的某个地方的32位,然后在别的地方操作32位就相当于是操作这里的这1位。
别名存储器区大小等于位段存储器区大小的32倍。
位带操作的核心问题:如何由位段存储器区地址,计算出别名存储器区的地址
方法:bit_word_addr = bit_band_base + (byte_offset × 32) + (bit_number × 4)
其中:
- bit_word_addr 是别名存储区中字的地址,它映射到某个目标位。
- bit_band_base 是别名区的起始地址。
- byte_offset 是包含目标位的字节在位段里的序号。
- bit_number 是目标位所在位置( 0-31)
举例说明如何映射别名区中SRAM地址为0x22000300的字节中的位2:
0x22006008 = 0x22000000 + (0x300*32) + (2*4).
STM32的启动模式
启动模式:研究STM32上电复位后从哪里开始执行程序的问题
三种启动模式:
(1)用户闪存存储器区是放置用户写的代码,程序员代码烧录时就被烧录到这里,正常工作状态把STM32设置为从这里启动。
(2)系统存储器区在非常规情况使用,实现ISP功能。
(3)内嵌SRAM区在非常规情况使用,实现调试器调试功能。
ISP:In-System Programming(系统烧录,系统编程)。PC机通过串口把bin/hex文件直接ISP到单片机内部Flash中。
IAP:In-Application Programming(应用编程,应用烧录,在线升级),IAP的核心是用户需要在自己的应用程序中去操作单片机内部flash的控制器的寄存器,实现对内部Flash的烧录功能。IAP时用户程序通过串口(USB、Ethernet)来接收PC发送过来的bin/hex文件,将之烧录到内部Flash中去完成IAP。完成后再次启动后就会从用户存储器区执行,更新就会起效果。一般实现IAP需要人为的将用户存储器区分为2部分:Bootloader+APP