摘要
本文档是笔者学习野火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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)