STM32(CM3内核) 内存映射
这里写目录标题
- STM32(CM3内核) 内存映射
- 一.CM3内核简介
- 二.CM3内核地址映射
- 三.搭建代码,实现映射
STM32(CM3内核) 内存映射
一.CM3内核简介
《CM3权威指南》摘抄一段简介
STM32是一个拥有32位总线的MCU,它每次可以访问32 bit 的数据,由于内核是地址总线是32 bit 的,所以CPU可以向外部访问2^32 = 4GB 的地址,每个地址都可以有32 bit的数据,通过指令总线和数据总线传输指令或者数据。
看到这里,你可能有点蒙,文字我都懂,组合起来怎么不理解,没关系,当年我也和你一样,其实有一方面是你阅读的书籍太少。
我给你推荐几本神书,传递我毕生功力。让你对计算机体系结构有大概的了解:《计算机组成原理》,《汇编语言》,《微机原理与接口技术》,《操作系统》,在你接触完这几本书之后,相信你对处理器或者控制器会有不一样的理解。
接下来我给你画个图
CPU通过指令总线取指,然后译码器译码,最后再执行指令,这当然只是简单的描述,具体细节还得由你去看看《微机原理与接口技术》。看到这里,我不知道你有没有一个想法,在STM32中,程序存储器在哪里,起始地址是多少,内存有多大。
数据存储器在哪里,起始地址是多少,内存有多大。
处理器只有内存和CPU及内核寄存器就能工作了吗?
别急,等我一一道来。
二.CM3内核地址映射
实际上,如果MCU只有内存和CPU是可以工作的,但是这样没有意义,要有IO(外设),我们才能实现很多东西。
接下来我们看一下CM3如何规定地址映射
再来看一个更详细的
前面说过,CM3可以访问4GB的地址空间,刚好这块内存就是4GB,为什么我要说刚好?而不是一定?CM3可以访问4GB,所以内存就得4GB?有点意思了,所以我要给你讲两个公司:
ARM公司:ARM 应该不陌生把,CM3内核便是由他设计的,内核是什么?包不包括内存?是不包括的,内核就是CPU以及一些片上寄存器和片上外设,ARM只设计内核,不生产处理器,同时也规定了地址必须怎么映射,比如0x0800 0000~0x0808 0000是flash内存映射,你能把这段映射到GPIO吗?这是不行的,因为如果ARM 不把内存映射规定好,那每个芯片厂商用CM3内核来设计处理器就会让开发者很头疼,1000家处理器就有1000种映射,那你还愿意学单片机?
ST公司:STM32F103便是ST设计的,采用CM3内核,将外设以及内存集成到片上,内存映射也遵循了CM3。
所以我们可以理清一下内核,内存,IO(外设)的关系,从存储器映射可以知道,内核通过指令总线和数据总线对内存进行访问,通过地址读写数据实现对GPIO等外设操作。
三.搭建代码,实现映射
说了这么多,我们实际上手操作,代码对照着存储器映射来。
这个例子是让GPIOB pin0 输出高低电平来控制灯的状态。
下面展示一些 内联代码片
。
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)typedef unsigned int uint32_t;
typedef unsigned short uint16_t;typedef struct
{uint32_t CRL;uint32_t CRH;uint32_t IDR;uint32_t ODR;uint32_t BSRR;uint32_t BRR;uint32_t LCKR;
}GPIO_TypeDef;typedef struct
{uint32_t CR;uint32_t CFGR;uint32_t CIR;uint32_t APB2RSTR;uint32_t APB1RSTR;uint32_t AHBENR;uint32_t APB2ENR;uint32_t APB1ENR;uint32_t BDCR;uint32_t CSR;
}RCC_TypeDef;#define GPIOB ((GPIO_TypeDef*)GPIOB_BASE)
#define RCC ((RCC_TypeDef*)RCC_BASE)
#define GPIOB ((GPIO_TypeDef*)GPIOB_BASE) 这句可以算出 GPIO 指向的结构体地址 是0x4001 0C00 是不是跟映射表PORT B起始地址是一样的?
GPIO_TypeDef 结构体成员地址就是从GPIOB 起始地址开始算的,每个结构体顺序也遵从GPIO的寄存器的偏移地址,所以可以通过结构体实现对GPIO的控制。
int main (void)
{//使能APB2的GPIOB时钟RCC->APB2ENR |= ( (1) << 3 );// 配置IO口为输出GPIOB->CRL &= ~( (0x0f) << (4*0) );GPIOB->CRL |= ( (1) << (4*0) );// 控制 ODR 寄存器GPIOB->ODR &= ~(1<<0);GPIOB->ODR |= (1<<0);while(1);
}
主函数是让GPIOB输出高电平,其实也就是直接控制地址内存,实现外设的操作。
STM32(CM3内核) 内存映射相关推荐
- linux内核内存映射实验报告,动手实践-Linux内存映射基础(上)
Linux内核分析与应用 西安邮电大学(陈莉君) 在庞大的Linux内核源代码学习中,如何抓住主要线索和思路,如何让所学能够切实地应用起来,本课程主讲以自己20年来对Linux内核的研究和教学为基础, ...
- 非常不错的STM32 FMC的内存映射及SDRAM的DQM的控制理解
https://blog.csdn.net/wisepragma/article/details/51622606
- 内存映射方法CreateFileMapping、MapViewOfFile、UnmapViewOfFile
内存映射使用方法 1.先行打开物理文件 hFile = CreateFileCreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXIS ...
- ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)
这里记录一下Linux内核做二级内存映射的过程,以中断向量表的映射过程为例. 在S3C6410架构下,Linux采用的是粗粒度小页内存管理方式,即内存段(section)的大小为1M,而页(page) ...
- 【Linux 内核 内存管理】优化内存屏障 ② ( 内存屏障 | 编译器屏障 | 处理器内存屏障 | 内存映射 I/O 写屏障 )
文章目录 一.内存屏障 二.编译器屏障 三.处理器内存屏障 一.内存屏障 内存屏障 , 又称为 " 屏障指令 " , 用于保证 " 编译器 " 或 " ...
- (整理)用户空间_内核空间以及内存映射
内核空间和用户空间 现代操作系统采用虚拟存储器,对于32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也 ...
- nio java 内核拷贝_大文件拷贝,试试NIO的内存映射
最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有 ...
- 【Linux内核】内存映射原理
[Linux内核]内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物 ...
- 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )
文章目录 一.vm_area_struct 结构体成员分析 1.shared 成员 2.anon_vma_chain 成员 3.anon_vma 成员 二.vm_area_struct 结构体完整源码 ...
最新文章
- 学python工资高吗-Python工资一般是多少 看完吓你一跳
- Silverlight学习(一) 创建Silverlight项目,构建一个简单的Silverlight Demo
- Spring容器实例bean中的几个关键PostProcessor
- 作为程序员之正则表达式
- 职业生涯设计的10点忠告
- 力扣589. N叉树的前序遍历 (JavaScript)
- java中实现全局变量的功能
- 深入理解jsonp跨域请求原理
- JAVA中堆和栈的区别
- python学习笔记之函数(方法)(四)
- 我在GNU/Linux下使用的桌面环境工具组合
- matlab微带带通滤波器,带通滤波器的ADS仿真设计
- stm32实现串口通信和LED灯点亮
- 车牌拍照系统上传服务器,车牌识别系统实现过程及摄像机要求
- 外贸软件常见图片类问题丨汇信
- reactjs 视频教程
- 最新的AS下载地址,更新及时
- Redis代理twemproxy安装,配置,使用
- c语言分蛋糕均匀正方形,分蛋糕(C - 二分查找)
- 大数据周会-本周学习内容总结013