单片机的操作本质【以STM32系列为例】

单片机的操作本质

  • 摘要
    • 寄存器的本质
    • 单片机的操作本质
    • 操作寄存器的方法

摘要

本文档是笔者学习野火F103视频【课时5】至【课时7】的总结。
视频链接:https://study.163.com/course/introduction/1006510016.htm

寄存器的本质

STM32系列单片机即:32位的单片机,具有4GB的地址空间;ARM 公司将这4GB的内存空间分成8个小块,每块为512M

内存单位转换

序号 用途 地址范围
Block 0 Code 0x0000 0000 ~ 0x1FFF FFFF(512MB)
Block 1 SRAM 0x2000 0000 ~ 0x3FFF FFFF(512MB)
Block 2 片上外设 0x4000 0000 ~ 0x5FFF FFFF(512MB)
Block 3 FSMC 的 bank1 ~ bank2 0x6000 0000 ~ 0x7FFF FFFF(512MB)
Block 4 FSMC 的 bank3 ~ bank4 0x8000 0000 ~ 0x9FFF FFFF(512MB)
Block 5 FSMC 寄存器 0xA000 0000 ~ 0xCFFF FFFF(512MB)
Block 6 预留 0xD000 0000 ~ 0xDFFF FFFF(512MB)
Block 7 Cortex-M3 内部外设 0xE000 0000 ~ 0xFFFF FFFF(512MB)

表格内容来自《零死角玩转STM32》

芯片生产厂商(SOC)如:ST、TI、Freescale 等公司则在 ARM 公司的基础上将每块的地址空间再次细分作为各种片上外设的存储空间。

根据各片上外设功能的不同,又将各外设对应的存储空间细分为一个个32位的存储空间并赋予一个名称。
我们常说的 寄存器 就是这个 名称 所对应的 存储空间

单片机的操作本质

对单片机操作实质是对寄存器的操作,也就是改变相应存储空间的数据。

操作寄存器的方法

每一个寄存器都具有其唯一的地址,利用寄存器的起始地址,通过C语言的指针操作可以实现对寄存器的访问。
实例:
片内外设 GPIOA 的地址范围: 【0x4001 0800】 - 【0x4001 0BFF】
与 GPIOB 相关的寄存器如下表:

寄存器名称 寄存器起始地址
端口配置低寄存器【GPIOA_CRL 】 0x4001 0800
端口配置高寄存器【GPIOA_CRH】 0x4001 0804
端口输入数据寄存器【GPIOA_IDR】 0x4001 0808
端口输出数据寄存器【GPIOA_ODR】 0x4001 080C
端口位设置/清除寄存器【GPIOA_BSRR】 0x4001 0810
端口位清除寄存器【GPIOA_BRR】 0x4001 0814
端口配置锁定寄存器【GPIOA_LCKR】 0x4001 0818

对端口输出数据寄存器【GPIOA_ODR】进行操作:

//先将寄存器的起始地址转换为指针:
(unsigned int*)(0x4001 080C)
//再通过指针进行访问:
*(unsigned int*)(0x4001 080C) = 0xFFFF;

//为了方便使用,一般通过 宏定义 的方式将指针命名为其他名称:
#define GPIOA_ODR    (unsigned int*)(0x4001 0C0C)
*GPIOA_ODR = 0xFFFF//或者,将整个指针操作进行宏定义:
#define GPIOA_ODR   *(unsigned int*)(0x4001 0C0C)
GPIOA_ODR = 0xFFFF

你可能感兴趣的:(STM32F1)