当前位置: 首页 > news >正文

后缀是.cc的网站华为荣耀手机商城官方网站

后缀是.cc的网站,华为荣耀手机商城官方网站,价格网官网,佛山外贸网站建设目录 1、寄存器基础知识 2、STM32F103系统架构 2.1 Cortex M3 内核芯片 2.2 STM32F103系统架构 3、存储器映射 4、寄存器映射 4.1 寄存器描述解读 4.2 寄存器映射举例 4.3 寄存器地址计算 4.4 stm32f103xe.h 寄存器映射 1、寄存器基础知识 概念#xff1a;寄存…目录 1、寄存器基础知识 2、STM32F103系统架构 2.1 Cortex M3 内核芯片 2.2 STM32F103系统架构 3、存储器映射 4、寄存器映射 4.1 寄存器描述解读 4.2 寄存器映射举例 4.3 寄存器地址计算  4.4 stm32f103xe.h 寄存器映射 1、寄存器基础知识 概念寄存器Register是单片机内部一种特殊的内存它可以实现对单片机各个功能的控制。简单的来说可以把寄存器当成一些控制开关控制包括内核及外设的各种状态。所以无论是51单片机还是 STM32都需要用寄存器来实现各种控制以完成不同的功能。 由于寄存器资源非常宝贵一般都是一个位或者几个位控制一个功能 对于 STM32 来说其寄存器是 32 位的一个 32 位的寄存器可能会有 32 个控制功能相当于 32 个开关由于 STM32 的复杂性它内部有几百个寄存器所以整体来说 STM32 的寄存器还是比较复杂的。不过千万不要被其吓到了实际上 STM32 是由于内部有很多外设所以导致寄存器很多实际上已经把它分好类每个外设也就那么几个或者几十个寄存器学起来就不难了。 从大方向来区分STM32 寄存器分为两类如下图  注意其中内核寄存器我们一般只需要关心中断控制寄存器和 SysTick 寄存器即可其他三大类我们一般很少直接接触。而外设寄存器则是学到哪个外设就了解哪个外设相关寄存器即可所以整体来说需要关心的寄存器并不是很多而且很多都是有共性的比如STM32F103ZET6 有 8 个定时器我们只需要学习了其中一个的相关寄存器其他 7 个基本都是一样。 经过上面一波了解之后再给大家举个简单的例子 我们知道寄存器的本质是一个特殊的内存对于STM32 来说以 GPIOB 的 ODR 寄存器为例其寄存器地址为0X40010C0C所以对其赋值可以写成 (*(unsigned int *))(0X40010C0C) 0XFFFF; 这样我们就完成了对 GPIOB-ODR 寄存器的赋值全部 0XFFFF表示 GPIOB 所有 IO 口16 个 IO 口都输出高电平。对于我们来说0X40010C0C就是一个寄存器的特殊地址。 虽然上面的代码实现了需要的功能但是从实用的角度来说这么写肯定是不好的可读性极差可维护性也很差所以一般会使用结构体来访问比如改写成这样 GPIOB-ODR 0XFFFF; 这样可读性就比之前的代码好多了可维护性也相对好一点。至于 GPIOB 结构体怎么来的在后续会给大家介绍。 2、STM32F103系统架构 STM32F103 是 ST 公司基于 ARM 授权 Cortex M3 内核而设计的一款芯片而 Cortex M 内核使用的是 ARM v7-M 架构是为了替代老旧的单片机而量身定做的一个内核具有低成本、低功耗、实时性好、中断响应快、处理效率高等特点。 2.1 Cortex M3 内核芯片 ARM公司提供内核如Cortex M3简称CM3下同授权完整的MCU还需要很多其他组件。芯片公司ST、NXP、TI、GD、华大等在得到CM3内核授权后就可以把CM3内核用在自己的硅片设计中添加存储器外设I/O以及其它功能块。不同厂家设计出的单片机会有不同的配置包括存储器容量、类型、外设等都各具特色因此才会有市面上各种不同应用的ARM芯片。Cortex M3内核和芯片的关系如下图 从上图可以看出ARM公司提供CM3内核和调试系统其他的东西外设IIC、SPI、UART、TIM等、存储器SRAM、FLASH等、I/O等由芯片制造商设计开发。这里ST公司就是STM32F103芯片的制造商。 2.2 STM32F103系统架构 STM32F103的系统主要由四个驱动单元可以主动发起通信图中黑色①区域和四个被动单元只能被驱动工作图中黑色②区域组成。如下图内部系统结构简图 总线矩阵为分界线该分界线的左边的称为主动单元右边的称为被动单元。四个主动单元分别为红色方框框住的红色字体①②③④四个被动单元分别为黄色方框框住的黄色字体①②③④其分类如下表  注意这里的驱动/被动单元都是指连接了总线矩阵的部分未连接总线矩阵的部分则不算作驱动/被驱动单元。 接下来我们讲一下这些单元。  1. I Code总线I-Bus 这是Cortex M3内核的指令总线连接闪存指令接口如FLASH用于获取指令。由于该总线功能单一并没有直接连接到总线矩阵因此被排除在驱动单元之外。 2. D Code 总线D-Bus 这是Cortex M3内核的数据总线连接闪存存储器数据接口如SRAM、FLASH等用于各种数据访问如常量、变量等。 3. 系统总线S-Bus 这是Cortex M3内核的系统总线连接所有外设如GPIO、SPI、IIC、TIM等用于控制各种外设工作如配置各种外设相关寄存器等。 4. DMA 总线 DMA是直接存储访问控制器可以实现数据的自动搬运整个过程不需要CPU处理。如可以实现DMA传输内存数据到DAC输出任意波形传输过程不需要CPU参与可以大大节省CPU支从而更高效的处理事务。STM32F103ZET6内部有2个DMA控制器可以实现内存到外设、外设到内存、内存到内存的数据传输。 5. 内部FLASH 内部FLASH即单片机的硬盘用于代码/数据存储CPU通过ICode总线经FLASH接口访问内部FLASHFLASH最高访问速度是24Mhz因此以72M速度访问时需要插入2个时钟周期延迟。 6. 内部SRAM 内部SRAM即单片机的内存用于数据存储直接挂载在总线矩阵上面CPU通过D Code总线实现0等待延时访问SRAM最快总线频率可达72Mhz从而保证高效高速的访问内存 。 7. FSMC FSMC即灵活的静态存储控制器实际上就是一个外部总线接口可以用来访问外部SRAM、NAND/NOR FLASH、LCD等。它也是直接挂在总线矩阵上面的以方便CPU快速访问外挂器件。 8. AHB/APB 桥 AHB总线连接总线矩阵同时通过2个APB桥连接APB1和APB2AHB总线速度最大为72MhzAPB2总线速度最大也是72Mhz但是APB1总线速度最大只能是36Mhz。这三个总线上面挂载了STM32内部绝大部分外设。 9. 总线矩阵 总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁仲裁利用轮换算法保证各个总线之间的有序访问从而确保工作正常。 3、存储器映射 STM32是一个32位单片机他可以很方便的访问4GB以内的存储空间2^32 4GB因此Cortex M3内核将下图中的所有结构包括FLASH、SRAM、外设及相关寄存器等全部组织在同一个4GB的线性地址空间内我们可以通过C语言来访问这些地址空间从而操作相关外设读/写。数据字节以小端格式小端模式存放在存储器中数据的高字节保存在内存的高地址中而数据的低字节保存在内存的低地址中。 存储器本身是没有地址信息的我们对存储器分配地址的过程就叫存储器映射。这个分配一般由芯片厂商做好了ST将所有的存储器及外设资源都映射在一个4GB的地址空间上8个块从而可以通过访问对应的地址访问具体的外设。ST将4GB空间分成8个块每个块512MB如上图所示从图中我们可以看出有很多保留区域Reserved这是因为一般的芯片制造厂家是不可能把4GB空间用完的同时为了方便后续型号升级会将一些空间预留Reserved。映射关系及8个存储块的功能如下表所示 这里我们重点挑前面3个存储块介绍。 第一个块是Block 0用于存储代码即FLASH空间 用户FLASH大小是512KB这是对于我们使用的STM32F103ZET6来说如果是其他型号可能FLASH会更小当然如果ST喜欢也是可以随时推出更大容量的STM32F103单片机的因为这里保留了一大块地址空间。还有STM32的出厂固化BootLoader非常精简整个BootLoder只占了2KB FLASH空间。 第二个块是Block 1用于存储数据即SRAM空间。 这 个 块 仅 使 用 了 64KB 大 小 仅 大 容 量 STM32F103 型 号 才 有 这 么 多 SRAM 比 如STM32F103ZET6等用于SRAM访问同时也有大量保留地址用于扩展。 第三个块是Block 2用于外设访问STM32内部大部分的外设都是放在这个块里面的该存储块里面包括了AHB、APB1和APB2三个总线相关的外设其中AHB和APB2是高速总线(72Mhz max)APB1是低速总线(36M max)。 同样可以看到各个总线之间都有预留地址空间方便后续扩展。关于STM32各个外设具体挂在哪个总线上面,大家可以参考前面的 STM32F103系统结构图 和 STM32F103存储器映射图进行查找对应。  4、寄存器映射 给存储器分配地址的过程叫存储器映射寄存器是一类特殊的存储器它的每个位都有特定的功能可以实现对外设/功能的控制给寄存器的地址命名的过程就叫寄存器映射。  举个简单的例子大家家里面的纸张就好比通用存储器用来记录数据是没问题的但是不会有具体的动作只能做记录而你家里面的电灯开关就好比寄存器了假设你家有8个灯就有8个开关相当于一个8位寄存器这些开关也可以记录状态同时还能让电灯点亮/关闭是会产生具体动作的。为了方便区分和使用我们会给每个开关命名比如厨房开关、大厅开关、卧室开关等给开关命名的过程就是寄存器映射。 当然STM32内部的寄存器有非常多远远不止8个开关这么简单但是原理是差不多的每个寄存器的每一个位一般都有特定的作用。 4.1 寄存器描述解读 GPIO的ODR寄存器为例。 ① 寄存器名字 每个寄存器都有一个对应的名字以简单表达其作用并方便记忆这里GPIOx_ODR表示寄存器英文名x可以从A~E说明有5个这样的寄存器每个端口有一个事实上最新的STM32F103型号可能还有FG等端口IO数量更多。②寄存器偏移量及复位值 地址偏移量表示相对该外设基地址的偏移比如GPIOB通过查询可知其外设基地址是0x4001 0C00。那么GPIOB_ODR寄存器的地址就是0x4001 0C0C。知道了外设基地址和地址偏移量我们就可以知道任何一个寄存器的实际地址。 复位值表示该寄存器在系统复位后的默认值可以用于分析外设的默认状态。这里全部是0。③寄存器位表 描述寄存器每一个位的作用共32bit这里表示ODR寄存器的第15位bit位名字为ODR15rw表示该寄存器可读写r可读取w可写入。④位功能描述 描述寄存器每个位的功能这里表示位0~15对应ODR0~ODR15每个位控制一个IO口的输出状态。其他寄存器描述参照以上方法解读接口。 4.2 寄存器映射举例 从前面的学习我们知道 GPIOB_ODR 寄存器的地址为0x4001 0C0C假设我们要控制 GPIOB的 16 个 IO 口都输出 1则可以写成 *(unsigned int *)(0x40010C0C) 0XFFFF; 这里我们先要将 0x4001 0C0C 强制转换成 unsigned int 类型指针然后用*对这个指针的值进行设置从而完成对 GPIOB_ODR 寄存器的写入。 这样写代码功能是没问题但是可读性和可维护性都很差使用起来极其不便因此我们将代码改为 #define GPIOB_ODR *(unsigned int *)(0x40010C0C) GPIOB_ODR 0XFFFF; 这样我们就定义了一个 GPIOB_ODR 的宏来替代数值操作很明显GPIOB_ODR 的可读性和可维护性比直接使用数值操作来的直观和方便。这个宏定义过程就可以称之为寄存器的映射。当然为了简单我们只举了一个简单实例实际上大量寄存器的映射使用结构体是最方便的方式。 4.3 寄存器地址计算  STM32F103大部分外设寄存器地址都是在存储块2上面的。具体某个寄存器地址由三个参数决定 1、总线基地址BUS_BASE_ADDR 2外设基于总线基地址的偏移量PERIPH_OFFSET 3寄存器相对外设基地址的偏移量REG_OFFSET。 可以表示为寄存器地址 BUS_BASE_ADDR(总线基地址) PERIPH_OFFSET(外设基于总线基地址的偏移量) REG_OFFSET(寄存器相对外设基地址的偏移量) 总线基地址BUS_BASE_ADDRSTM32F103内部有三个总线APB1、APB2和AHB对应的总线基地址下表中APB1的基地址也叫外设基地址表中的偏移量就是相对于外设基地址的偏移量。如下 偏移量是怎么偏移得到的那个值呢 总线APB1基地址相对于自身基地址偏移的偏移量为0 总线APB2基地址相对于总线APB1基地址偏移的偏移量为0x1 0000 总线AHB基地址相对于总线APB1基地址偏移的偏移量为0x1 8000 注意AHB的总线基地址是0X4001 8000从该基地址到0X4002 0000只挂了SDIO一个外设后续的AHB外设基地址都大于等于0X4002 0000。为了方便计算我们可以将AHB的总线基地址改成0X4002 0000而SDIO则单独定义一个基地址给他即可。 外设基于总线基地址的偏移量PERIPH_OFFSET不同外设偏移量不一样以GPIO为例GPIO外设基地址及相对总线偏移量如下表所示 上表的偏移量就是外设基于APB2总线基地址的偏移量PERIPH_OFFSET。 知道了外设基地址再查询找到具体某个寄存器相对外设基地址的偏移量就可以知道该寄存器的实际地址了以GPIOB的相关寄存器为例 GPIOB 寄存器相对外设基地址的偏移量如下表所示 上表的偏移量就是寄存器基于外设基地址的偏移量REG_OFFSET。 因此我们根据前面的公式很容易可以计算出GPIOB_ODR的地址 GPIOB_ODR地址 APB2总线基地址 GPIOB外设偏移量 寄存器偏移量 所以得到GPIOB_ODR 地址 0X4001 0000 0XC00 0X0C 0X4001 0C0C 举了这个例子之后相信头明白了其他寄存器的地址大家都应该可以熟练掌握并计算出来。 4.4 stm32f103xe.h 寄存器映射 STM32F103所有寄存器映射都在stm32f103xe.h里面完成包括各种基地址定义、结构体定义、外设寄存器映射、寄存器位定义占了绝大部分等整个文件有1W多行非常庞大。我们没有必要对该文件进行全面分析因为很多内容都是相似的我们只需要知道寄存器是如何被映射的就可以了至于寄存器位定义这些内容知道是怎么回事就可以了。 我们还是以GPIO为例进行说明看看stm32f103xe.h是如何对GPIO的寄存器进行映射的通过对GPIO寄存器映射了解stm32f103xe.h的映射规则。stm32f103xe.h文件主要包含五个部分内容如下 寄存器映射主要涉及到上表中加粗的两个组成部分外设寄存器结构体类型定义和寄存器映射总结起来包括3个步骤 1 外设寄存器结构体类型定义 2外设基地址定义 3寄存器映射通过将外设基地址强制转换为外设结构体类型指针即可 以GPIO为例其寄存器结构体类型定义如下 typedef struct {__IO uint32_t CRL; /* GPIO_CRL 寄存器相对外设基地址偏移量0X00 */__IO uint32_t CRH; /* GPIO_CRH 寄存器相对外设基地址偏移量0X04 */__IO uint32_t IDR; /* GPIO_IDR 寄存器相对外设基地址偏移量0X08 */__IO uint32_t ODR; /* GPIO_ODR 寄存器相对外设基地址偏移量0X0C */__IO uint32_t BSRR; /* GPIO_BSRR 寄存器相对外设基地址偏移量0X10 */__IO uint32_t BRR; /* GPIO_BRR 寄存器相对外设基地址偏移量0X14 */__IO uint32_t LCKR; /* GPIO_LCKR 寄存器相对外设基地址偏移量0X18 */ } GPIO_TypeDef; GPIO外设基地址定义如下 #define PERIPH_BASE 0x40000000UL /* 外设基地址 */#define APB1PERIPH_BASE PERIPH_BASE /* APB1 总线基地址 */ #define APB2PERIPH_BASE (PERIPH_BASE 0x00010000UL) /* APB2 总线基地址 */ #define AHBPERIPH_BASE (PERIPH_BASE 0x00020000UL) /* AHB 总线基地址 */#define GPIOA_BASE (APB2PERIPH_BASE 0x00000800UL) /* GPIOA 基地址 */ #define GPIOB_BASE (APB2PERIPH_BASE 0x00000C00UL) /* GPIOB 基地址 */ #define GPIOC_BASE (APB2PERIPH_BASE 0x00001000UL) /* GPIOC 基地址 */ #define GPIOD_BASE (APB2PERIPH_BASE 0x00001400UL) /* GPIOD 基地址 */ #define GPIOE_BASE (APB2PERIPH_BASE 0x00001800UL) /* GPIOE 基地址 */ #define GPIOF_BASE (APB2PERIPH_BASE 0x00001C00UL) /* GPIOF 基地址 */ #define GPIOG_BASE (APB2PERIPH_BASE 0x00002000UL) /* GPIOG 基地址 */ GPIO外设寄存器映射定义如下 #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) /* GPIOA 寄存器地址映射 */ #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE) /* GPIOB 寄存器地址映射 */ #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) /* GPIOC 寄存器地址映射 */ #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) /* GPIOD 寄存器地址映射 */ #define GPIOE ((GPIO_TypeDef *)GPIOE_BASE) /* GPIOE 寄存器地址映射 */ #define GPIOF ((GPIO_TypeDef *)GPIOF_BASE) /* GPIOF 寄存器地址映射 */ #define GPIOG ((GPIO_TypeDef *)GPIOG_BASE) /* GPIOG 寄存器地址映射 */ 以上三部分代码就完成了STM32F103内部GPIOA~GPIOG的寄存器映射其原理其实是比较简单的包括两个核心知识点1结构体地址自增2地址强制转换 结构体地址自增我们第一步就定义了GPIO_TypeDef结构体类型其成员包括CRL、CRH、IDR、ODR、BSRR、BRR和LCKR每个成员是uint32_t类型也就是4个字节这样假设CRL地址是0的话CRH就是0X04IDR就是0X08ODR就是0X0C以此类推。 地址强制转换以GPIOB为例GPIOB外设的基地址为GPIOB_BASE0X4001 0C00我们使用GPIO_TypeDef将该地址强制转换为GPIO结构体类型指针GPIOB这样GPIOB-CRL的地址就是GPIOB_BASE0X4001 0C00GPIOB-CRH的地址就是GPIOB_BASE 0X040X4001 0C04GPIOB-IDR的地址就是GPIOB_BASE 0X080X4001 0C08以此类推。 这样我们就使用结构体方式完成了对GPIO寄存器的映射其他外设的寄存器映射也都是这个方法这里就不一一介绍了。
http://www.pierceye.com/news/332234/

相关文章:

  • 网站建设公司哪家好找建设网站公司哪家好
  • 网站建设网上学a8直播免费版
  • 网上下载的免费网站模板怎么用灯箱网站开发
  • 四平市建设局网站贵州省民贸民品企业信息管理系统
  • 周口网站制作公司哪家好河南省信息服务平台官网
  • 然后建设自营网站湘潭市优化办
  • 大兴专业网站开发公司皮具网站建设策划书
  • 广告投放跟网站建设一样吗呼和浩特免费制作网站
  • 个人做网站的时代已经过去个人手机网站
  • 用vps做网站深圳广告公司招聘安装工人
  • 建设电影网站怎么上传电影如何建企业网站
  • 响应式网站制作公司org域名购买
  • 石家庄网站建设德信互联科技有限公司爬取漫画数据做网站
  • 国内免费iphone网站百度自然排名优化
  • 自己做网站主机做网站和推广
  • wordpress 淘宝嘉兴做网站优化
  • h5 网站开发流程asp个人网站建设
  • 网站建设 正邦企业邮箱怎么认证
  • 建设流网站项目成都住建局官网首页
  • 网站简历文字如何空行产品如何推广市场
  • 吕梁网站设计腾讯营销平台
  • 如何查看网站流量公众号申请网站
  • 阐述企业搭建网站的重要性免费做效果图的网站有哪些
  • 快速网站搭建南宁广告公司网站建设
  • 做数学题网站专业做网站建设 昆山
  • 建筑网站上海网页设计图片素材网
  • 延边网站开发depawo做汽车网站销售怎么入手
  • 商城网站开发技术南京好的网站制作公司
  • 嘉兴网站建设嘉兴网站推广网站网络营销方案
  • 镇江建工建设集团网站建设银行网站怎么基本转个人