这里写目录标题

  • 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内核) 内存映射相关推荐

  1. linux内核内存映射实验报告,动手实践-Linux内存映射基础(上)

    Linux内核分析与应用 西安邮电大学(陈莉君) 在庞大的Linux内核源代码学习中,如何抓住主要线索和思路,如何让所学能够切实地应用起来,本课程主讲以自己20年来对Linux内核的研究和教学为基础, ...

  2. 非常不错的STM32 FMC的内存映射及SDRAM的DQM的控制理解

    https://blog.csdn.net/wisepragma/article/details/51622606

  3. 内存映射方法CreateFileMapping、MapViewOfFile、UnmapViewOfFile

    内存映射使用方法 1.先行打开物理文件 hFile = CreateFileCreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXIS ...

  4. ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)

    这里记录一下Linux内核做二级内存映射的过程,以中断向量表的映射过程为例. 在S3C6410架构下,Linux采用的是粗粒度小页内存管理方式,即内存段(section)的大小为1M,而页(page) ...

  5. 【Linux 内核 内存管理】优化内存屏障 ② ( 内存屏障 | 编译器屏障 | 处理器内存屏障 | 内存映射 I/O 写屏障 )

    文章目录 一.内存屏障 二.编译器屏障 三.处理器内存屏障 一.内存屏障 内存屏障 , 又称为 " 屏障指令 " , 用于保证 " 编译器 " 或 " ...

  6. (整理)用户空间_内核空间以及内存映射

    内核空间和用户空间   现代操作系统采用虚拟存储器,对于32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也 ...

  7. nio java 内核拷贝_大文件拷贝,试试NIO的内存映射

    最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有 ...

  8. 【Linux内核】内存映射原理

    [Linux内核]内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物 ...

  9. 【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 结构体完整源码 ...

最新文章

  1. 学python工资高吗-Python工资一般是多少 看完吓你一跳
  2. Silverlight学习(一) 创建Silverlight项目,构建一个简单的Silverlight Demo
  3. Spring容器实例bean中的几个关键PostProcessor
  4. 作为程序员之正则表达式
  5. 职业生涯设计的10点忠告
  6. 力扣589. N叉树的前序遍历 (JavaScript)
  7. java中实现全局变量的功能
  8. 深入理解jsonp跨域请求原理
  9. JAVA中堆和栈的区别
  10. python学习笔记之函数(方法)(四)
  11. 我在GNU/Linux下使用的桌面环境工具组合
  12. matlab微带带通滤波器,带通滤波器的ADS仿真设计
  13. stm32实现串口通信和LED灯点亮
  14. 车牌拍照系统上传服务器,车牌识别系统实现过程及摄像机要求
  15. 外贸软件常见图片类问题丨汇信
  16. reactjs 视频教程
  17. 最新的AS下载地址,更新及时
  18. Redis代理twemproxy安装,配置,使用
  19. c语言分蛋糕均匀正方形,分蛋糕(C - 二分查找)
  20. 大数据周会-本周学习内容总结013

热门文章

  1. uni-app使用 getUserInfo 报错 fail can only be invoked by user TAP gesture 解决方法
  2. 认知突围--读书笔记二
  3. C语言如何编程换算小时秒,小时分钟秒的换算(c语言把时间转换成秒)
  4. Jenkins ssh 远程启动 nohup
  5. docer kafka安装
  6. VM设置Ubuntu窗口自适应大小
  7. Android--设置显示大小导致APP crash
  8. 2019年嵌入式前景如何?现在学习是否太晚?
  9. 【踩坑记录】导航时出现原地旋转,然后无法执行导航
  10. 如何同步修改git项目名称和本地项目名称