数据寄存器

I2C接口读取MPU9250磁力数值

余生长醉 提交于 2020-01-13 17:26:53
一开始拿到芯片手册云里雾里,根本没有找到关于磁力数据的寄存器,结果上网一查才知道,这芯片竟然是个胶水芯片。。。 MPU9250内部是MPU6050和AK8963两个芯片合并在一起的,感觉傻傻的。 内部的AK8963是负责三轴磁力传感器采样的芯片,它通过I2C总线与MPU9250连接在一起。 如上图所示,MPU9250还集成了一个I2C主机控制器。默认情况下MPU9250用它的I2C主机控制器与AK8963通信,把磁力值读到出放到指定的寄存器中,这需要设置一堆寄存器,真是麻烦得一逼!!! 幸好MPU9250还预留了I2C直通模式,这个模式相当于MPU9250和AK8963共同使用一条I2C总线,因为它们的通信地址不一样, MPU9250的地址:0xD0/0xD1 AK8963的地址:0x18/0x19 在写驱动程序的时候,可以把它们当作硬件上分离的两个芯片挂在同一条I2C总线上。 直通模式需要设置MPU9250的第55号寄存器的Bit1写1即可开启。 有了直通模式我们就可以直接与AK8963通信了,AK8963的寄存器不多。 下面讲讲几个关键寄存器操作: 0x00:这个寄存器是芯片ID=0x48,能读出这个ID证明通信OK了。 0x0A:设置工作模式,建议上电后先写入0x0F,读取出芯片校准系数;然后再写0x01,进行单次采样。 0x02:状态寄存器,BIT0为1表示采样完成

51单片机 特殊功能寄存器(SFR) SBUF使用方法

早过忘川 提交于 2020-01-12 13:39:08
51单片机 特殊功能寄存器(SFR) SBUF使用方法   串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。      单片机串口 # include <reg52.h> # include <absacc.h>    # define unit unsigned int    # define uchar unsigned char      uchar date ;   uchar recFlag ; //接收数据标识,0 未接收数据 1 接收数据       void init_serial ( ) ;    void send ( ) ;    void receive ( ) ;       main ( )    {    init_serial ( ) ;   IE = 0 ; //屏蔽中断    while ( 1 )    { receive ( ) ; send ( ) ; }    }       void init_serial ( ) //初始化串口    { TMOD = 0x20 ; /

【STM32H7教程】第42章 STM32H7的DMA基础知识和HAL库API

邮差的信 提交于 2020-01-10 11:24:17
完整教程下载地址: http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第42章 STM32H7的DMA基础知识和HAL库API 本章节为大家讲解DMA1(Direct memory access controller,直接存储器访问控制器)和DMA2,相比前面章节的BDMA,功能要强些,属于通用型DMA。 42.1 初学者重要提示 42.2 DMA基础知识 42.3 DMA的HAL库用法 42.4 源文件stm32h7xx_hal_dma.c 42.5 总结 42.1 初学者重要提示 DMA1和DMA2均支持8路通道。虽然是8路,但这8路不是并行工作的,而是由DMA的仲裁器决定当前处理那一路。 DMA最大传输次数65535次,每次传输单位可以是字节、半字和字。 DMA的循环模式不可用于存储器到存储器模式。 DMA1和DMA2带的FIFO是4个32bit的空间,即16字节。 使用DMA的FIFO和突发需要注意的问题较多,详情可看本章2.7小节。 STM32H7的参数手册DMA章节对存储器到存储器,外设到存储器,外设到存储器模式的传输过程进行了讲解,推荐大家看完本章节后读一下。 42.2 DMA基础知识 DMA的几个关键知识点放在开头说: 由于总线矩阵的存在,各个主控的道路四通八达,从而可以让DMA和CPU同时开工

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

折月煮酒 提交于 2020-01-10 08:57:02
引言   上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事。    数据传送指令   数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置。既然如此,那么数据传送指令就会包含一个源操作数和一个目的操作数,指令会将原操作数的值复制到目的操作数并覆盖。   数据传送指令一共可分为五种,分别是mov、movs、movz、push以及pop,下面LZ依次介绍一下这五个指令的作用。    mov指令   mov指令的作用是将源操作数S中的数据复制到目的操作数D中,mov指令有一个数据格式和两个操作数,因此一般的形式为[movx S D]。其中x为数据格式,S为源操作数,D为目的操作数。   这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。   可以看到,在指令执行之后,%edx寄存器当中的内容会被复制到%eax寄存器。需要一提的是,mov指令可以在后面加上任何数据格式,比如上面这一过程中,数据格式则为四个字节,也就是双字。因此不难推断出,我们还可以使用movb和movw去复制一个字节或者两个字节。 movs指令  

《30天自制操作系统》笔记(12)——多任务入门

送分小仙女□ 提交于 2020-01-10 06:56:22
《30天自制操作系统》笔记(12)——多任务入门 进度回顾 上一篇 介绍了设置显示器高分辨率的方法。本篇讲一下操作系统实现多任务的方法。 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好。 多任务就是让电脑 同时 运行多个程序(如一边写代码一边听音乐一边下载电影)。 电脑的CPU只有固定有限的那么一个或几个, 不可能 真的同时运行多个程序。所以就用近似的方式,让多个程序 轮换 着运行。当轮换速度够快(0.01秒),给人的 感觉 就是"同时"运行了。 多任务之不实用版 我们首先从最基本的想法开始,做一个不实用版的多任务作为例子。在学习这个例子的过程中引入真正的多任务必须的TSS、TR、far模式JMP的概念,为后续内容打基础。 当你向CPU发出任务切换的指令时,CPU会先把寄存器中的值全部 写入 内存某处;然后,从内存另一位置把所有寄存器的值 读取 出来。这就完成了一次任务切换。 任务切换消耗的时间就是读写内存消耗的时间,大概为 0.0001秒 。 任务状态段TSS 存取全部寄存器的值这件事,当然需要有一个数据结构,这就是 "任务状态段" (Task Status Segment)简称TSS。 1 struct TSS32 2 { 3 int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; 4 int eip,

x86常用汇编寄存器

时光怂恿深爱的人放手 提交于 2020-01-10 04:51:47
通用寄存器 32位 16位 高8位 低8位 EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL ESI SI EDI DI ESP SP EBP BP E:Extend,X:逻辑与算数 EAX (Extend Add):累加器,在乘法和除法指令中自动使用;Win32中,一般用在函数的返回值中。 EBX (Extend Base):基地址寄存器,DS(数据段)中的数据指针。 ECX (Extend Count):计数器,CPU自动使用ECX作为循环计数器,在自妇产和循环操作中常用,在循环指令(LOOP)或串操-作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。 EDX (Extend Data):数据寄存器。 以上的寄存器常用来保存各种需要计算的值。 EBP (Extend Base Pointer):基地址指针寄存器,SS(堆栈段)中数据指针。EZBP有高级语言用来引用参数和局部变量,通常称为堆栈基地址寄存器。 ESP (Extend Stack Pointer):堆栈指针寄存器,SS(堆栈段)中堆栈指针,ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器。 ESI (Extend Source Improve):源变址寄存器,字符串操作源指针。 EDI (Extend

深入理解计算机系统(3.5)---特殊的算术操作指令详解

南楼画角 提交于 2020-01-10 03:50:23
引言   上一章我们讨论了常见的算术与逻辑运算指令,其中比较有特点的是leal指令,本章我们再来看几个比较特殊的操作指令,这些指令可以让只有32位的寄存器存储64位的数据,是不是十分霸气侧漏呢。 初识   我们先来看看这些指令的大致介绍,如果各位看过上一章的话,会发现这里的指令有的会有些眼熟,但是它们的作用却截然不同。以下是书中的一张概图。   第一个指令有些眼熟吧,它就是我们上一章当中的imul乘法指令的双字形式。不过可以看出,这里的imull指令已经完全变了味道,它将结果存入两个寄存器。接下来,我们来仔细看看这些指令。 imull、mull指令   这两个指令一看就是双胞胎,它们一个负责有符号全64位乘法,一个负责无符号全64位乘法。细心的猿友会发现,imull这个指令好像是负责乘法的指令,而且在之前的乘法并没有区分有符号和无符号,现在怎么又成双胞胎指令了。   我们上一章当中出现的指令是imul指令,当它操作双字的时候,也就是imull指令。不过不同的是,它的一般形式是imull S D,这里有两个操作数,它将计算S和D的乘积并截断为双字,然后存储在D当中。由于在截断时,无符号以及有符号的二进制序列是一样的,因此此处的乘法指令并不区分有符号和无符号。   本次我们讨论的imull指令,则与上面的普通乘法指令稍有不同,它只有一个操作数,也就是说,它的一般形式为imull S

友善mini2440裸机开发原理+源码

一个人想着一个人 提交于 2020-01-10 03:36:13
友善mini2440裸机开发源码 源码+开发工具 开发工具:minitools、gcc-4.4.3、vim等 **我们需要先设置cpu工作模式+关闭看门狗+关闭中断后再执行我们自己的代码,因为本文是将代码下载到内存中运行,所以不具备跳转绝对地址的能力,也就不能处理中断。 1. led mini2440有4个可供用户编程的led,分别是nled_1、nled_2、nled_3、nled_4: 他们分别连向GPB5、6、7、8,由于这里的led接入了上拉电阻,我们的cpu引脚应输出0而使led发光,输出1led熄灭。 接下来,我们先查看s3c2440的用户手册,找到GPB组的寄存器组: 这里就是我们需要编程的寄存器。第一个是GPB组IO的控制寄存器,用于选择配置引脚工作模式,第二个是数据寄存器,如果引脚被配置为输入口或其他功能口,我们将从这个寄存器中读出对应的数据。如果作为输出口,我们就从这个寄存器中写入需要输出的数据。最后是上拉寄存器。s3c2440每个GPIO的引脚都内部配置了上拉功能,不需要的时候写1关闭即可。 代码链接: https://download.csdn.net/download/weixin_38716790/12085350 2. 串口 mini2440有3个可编程串口,分别是串口0、1、2,其中串口0已经接了RS232接口出来

深入理解计算机系统(3.4)---算数与逻辑运算指令详解

耗尽温柔 提交于 2020-01-10 01:49:14
引言   上一章我们已经着重讨论了数据传送(或者说复制)指令,相信各位猿友现在都已经对此有一些了解了。说真的,LZ在看第三章的过程中,不断的被汇编的魅力深深的震撼,这些看似简单的汇编指令,却可以将复杂的程序井然有序的执行完毕,实在是让人惊叹。时至今日, 这本看似枯燥无比却实则魅力十足的书,已经深深的将LZ吸引了。   希望各位猿友也有这样的感觉,这是一种非常好的感觉,接下来,各位就一起和LZ来认识认识新的指令吧。 算术与逻辑运算指令   算术与逻辑运算包括很多种,估计各位猿友也能很快的想出来,比如最常见的加减乘除、与或非、左移右移等等。这里可能还有一个各位猿友不太容易想到的,就是取地址运算符,不过这个运算指令却是LZ看过这一部分之后,觉得最精妙的一个指令。   接下来LZ将书中的一个表格贴上来,各位猿友可以先大致浏览下里面的指令。   这里面比较特别的指令就是leal(取地址指令),其余的指令都是比较常规的算术和逻辑运算,相比之下还比较好理解,因此LZ这里重点介绍leal指令,对于其余的指令LZ不会一一介绍,接下来我们就认识一下这个特别的leal指令吧。 leal指令   leal指令是非常神奇的一个指令,它可以取一个存储器操作数的地址,并且将其赋给目的操作数。如果用C语言当中来对应的话,它就相当于&运算。   比如对于leal 4(%edx,%edx,4),%eax这条指令来讲

处理器CPU运算位数

自作多情 提交于 2020-01-10 01:43:36
处理器CPU运算位数 CPU的位宽对CPU性能的影响绝不亚于主频。位宽是指微处理器一次执行指令的数据带宽。处理器的寻址位宽增长很快,业界已使用过4、8、16位寻址再到目前主流的32位,而64位寻址浮点运算已经逐步成为CPU的主流产品。 受虚拟和实际内存尺寸的限制,目前主流的32位CPU在性能执行模式方面存在一个严重的缺陷:当面临大量的数据流时,32位的寄存器(注:为了处理数据,暂时储存结果,或者做间接寻址等等动作,每个处理器都具备一些内建的内存,这些能够在不延迟的状态下存取的内存就称为“寄存器”,每个寄存器的大小都相同)和指令集不能及时进行相应的处理运算。 32位CPU一次只能处理32位,也就是4个字节的数据;而64位CPU一次就能处理64位即8个字节的数据。如果我们将总长128位的指令分别按照16位、32位、64位为单位进行编辑的话:旧的16位CPU(如Intel 80286 CPU)需要8个指令,32位的CPU需要4个指令,而64位CPU则只要两个指令。显然,在工作频率相同的情况下,64位CPU的处理速度比16位、32位的更快。 位宽原理示意图 可以比较一下图中的32位与64位CPU,64位的代码流的数量没有改变,其宽度随着指令代码的宽度而变化;而数据流的宽度则增加了一倍。虽然理论上在一个时钟周期内64位系统处理的数据量是32位系统的两倍,但理论和现实通常都是有差距的。