tag 标签: 寄存器

相关帖子
相关博文
  • 热度 10
    2023-9-5 14:19
    1044 次阅读|
    0 个评论
    eMMC内部有7个寄存器:OCR、CID、CSD、EXT_CSD、RCA、DSR和QSR。这些寄存器只能通过对应的命令访问。OCR、CID、CSD和QSR带有规定的设备信息,RCA和DSR存储实际的配置参数。EXT_CSD两者都有。 OCR:Operation Conditions Register , 32bits,存储了设备的VDD电压和访问模式,bit31是状态位,表示设备上电完成。 CID:Device IDenitifcation Register,128bits,包括在identification期间,设备的识别信息。 CSD:Device Specific Data,128bits,提供访问设备内容的信息。 EXT_CSD:Extended CSD,512bytes,其中320bytes是设备属性,不可修改,192bytes定义了设备现有配置,是常用的寄存器。 RCA:Relative Device Address,16bits,存储在identificantion器件,设备被host赋予的地址。 DSR:Driver Stage Register,可用来提示总线性能; QSR:Queue Status Register,32bits,记录了队列中任务在特定时间点的状态。
  • 热度 4
    2023-7-17 13:50
    649 次阅读|
    0 个评论
    梳理一下STM32单片机的内部总线
    STM32 单片机内部有很多总线,各个总线负责的功能不同。 今天以 STM32 单片机为例,梳理一下 ARM Cortex-M3 架构 MCU 的总线内容。 聊一聊 在介绍各个总线之前,先看一下系统框图( STM32F1xxx 类型单片机) Cortex-M3 处理器总线接口是基于 AHB-Lite 和 APB 协议的。 STM32 单片机内部有以下几种总线接口: I-Code 总线 D-Code 总线 系统总线 DMA 总线 总线矩阵 AHB/APB 桥 下边分别进行讲解 ( 1 ) I-Code 总线 指令总线。 I-Code 总线是一条基于 AHB-Lite 总线协议的 32 位总线。 该总线将 Cortex ™ -M3 内核的指令总线与闪存指令接口相连接。指令预取在此总线上完成。 负责在存储器地址 0x0000_0000 – 0x1FFF_FFFF 之 间的取指操作。取指以字的长度执行,即使是对于 16 位指令也如此。因此 CPU 内核可以一次取出两条 16 位 Thumb 指令。 ( 2 ) D-Code 总线 数据总线。是一条基于 AHB-Lite 总线协议的 32 位总线。 该总线将 Cortex ™ -M3 内核的 DCode 总线与闪存存储器的数据接口相连接,加载数据常量和调试访问。 负责在存储器地址 0x0000_0000 – 0x1FFF_FFFF 之间的数据访问操作 。连接到 D-Code 总线上的任何设备都只需支持 AHB-Lite 的对齐访问,不支持非对齐访问。 ( 3 )系统总线 此总线连接 Cortex ™ -M3 内核的系统总线 ( 外设总线 ) 到总线矩阵,总线矩阵协调着内核和 DMA 间的访问。 负责在 0x2000_0000 – 0xDFFF_FFFF 和 0xE010_0000 – 0xFFFF_FFFF 之间的所有数据传送,取指和数据访问都算上。和 D-Code 总线一样,所有的数据传送都是对齐。 ( 4 ) DMA 总线 此总线将 DMA 的 AHB 主控接口与总线矩阵相联,总线矩阵协调着 CPU 的 DCode 和 DMA 到 SRAM 、闪存和外设的访问。 ( 5 )总线矩阵 总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利用轮换算法。 总线矩阵包含 4 个驱动部件( CPU 的 DCode 、系统总线、 DMA1 总线 和 DMA2 总线 ) 和 4 个被动部件 ( 闪存存储器接口 (FLITF) 、 SRAM 、 FSMC 和 AHB2APB 桥)。 AHB 外设通过总线矩阵与系统总线相连,允许 DMA 访问。 ( 6 ) AHB/APB 桥 (APB) 两个 AHB/APB 桥在 AHB 和 2 个 APB 总线间提供同步连接。 APB1 操作速度限于 36MHz , APB2 操作于全速 ( 最高 72MHz) 。 当对 APB 寄存器进行 8 位或者 16 位访问时,该访问会被自动转换成 32 位的访问:桥会自动将 8 位或者 32 位的数据扩展以配合 32 位的向量。 接下来说一说从 Flash 中读取指令和数据的流程。 闪存的指令和数据访问是通过 AHB 总线完成的。预取模块是用于通过 ICode 总线读取指令的。仲裁是作用在闪存接口,并且 DCode 总线上的数据访问优先。 预取缓冲区有 2 个,每个缓冲区大小位 64 位。在每一次复位以后被自动打开,由于每个缓冲区的大小 (64 位 ) 与闪存的带宽相同,因此只通过需一次读闪存的操作即可更新整个缓冲区的内容。 由于预取缓冲区的存在, CPU 可以工作在更高的主频。 CPU 每次取指最多为 32 位的字,取一条指令时,下一条指令已经在缓冲区中等待。这样提高了 CPU 获取指令的效率和执行指令的速度。 这也就是说,对于 STM32 单片机来说,会读取 Flash 中的指令到缓存。不是直接在 Flash 中执行。 关注公众号“优特美尔商城”,获取更多电子元器件知识、电路讲解、型号资料、电子资讯,欢迎留言讨论。
  • 热度 22
    2013-9-4 14:57
    1623 次阅读|
    3 个评论
             指针实际上只是一个寄存器,只保存指向内存的地址非实际需要的数值。一般使用它都是需要有一个实际保存内容的变量,一般是用结构体,使用指针主要是方便操作,如下Key 键值读取,直接操作寄存器地址,同时运用宏定义,简化使用。         msOS 通过扫描方式实现了矩阵键盘值读取同时也实现了长按与短按键功能,通过注册函数KeySystemTickService 来收集与检测按键信息供其他函数使用。         按键实现机理,从原理图来分析,原理图设计已经做了特如处理,按键处接了vdd3.3V 和 电阻 1K,默认状况是接按键 的5个IO口都是低电平,若是有按键按下,其中相应的IO口为输入高电平。         扫描函数(ScandPin)中通过改变了行按键 输出值, (ScandPin01 = 0;ScandPin00 = 1),通过判断列的IO口状况,输出自己定义的按键值。            长按与短按及去抖动实现原理:是在 KeySystemTickService 函数中进行计数 ScandCounter 及 JitterCounter,此函数被SysTick_Handler 函数调用,sysTick 为系统CPU 节拍时钟,即所谓心跳函数。每隔100个tick 进行运行一次KeySystemTickService 函数。 一个Tick 时间由如下函数得到  SysTick_Config(SystemCoreClock / 10000);长按短按判断依据是在每执行一次KeySystemTickService 函数时候,若是有按键之后读到的值为invalid,JitterCounter--,去抖动,若是无松开则ScandCounter++,判断第二次值是否一样,若是不一样丢掉按键信息即是去抖原理,一样按键值,ScandCounter++ 继续增加,当超过设定的最长按键时间(ScandCounter = LongInterval)之后抛出按键消息。     精彩绝妙的宏定义及指针使用,直接操作寄存器。 //IO口操作,只对单一的IO口!确保n的值小于16! #define BIT_BAND(addr, bitnum) ((addr 0xF0000000)+0x2000000+((addr 0xFFFFF)5)+(bitnum2)) #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BIT_BAND(addr, bitnum)) #define PaIn(n)    BIT_ADDR(GPIOA_IDR_ADDR,n) #define PaOut(n)   BIT_ADDR(GPIOA_ODR_ADDR,n) #define PbIn(n)    BIT_ADDR(GPIOB_IDR_ADDR,n) #define PbOut(n)   BIT_ADDR(GPIOB_ODR_ADDR,n) #define ScandPin00 PbOut(4) #define ScandPin01 PbOut(5) #define ScandPin10 PcIn(10) #define ScandPin11 PcIn(11) #define ScandPin12 PcIn(12) #define ScandPin13 PbIn(3) #define ShortInterval   3  /*短按按键间隔*/ #define LongInterval    40  /*长按按键间隔*/ #define JitterInterval  10  /*防误动按键间隔*/ 详细操作函数如下:(函数名字很直观表达函数内容) static byte RemapKey(byte scandValue) //重新定义短按键键值 {     switch(scandValue)     {         case 0xEF:             return(0);         case 0xDF:             return(1);        。。。         default:             return(invalid);     } } static byte RemapLongKey(byte scandValue) //重新定义长按键键值 {     switch(scandValue)     {         case 0xEF:             return(0x30);         case 0xDF:         。。。         default:             return(invalid);     }  }   static byte ScandPin(void) // 扫描方式检测按键 {     byte scandValue;       scandValue = invalid;     if(ScandPin13 == 0)         scandValue = 0x7F;     if(ScandPin12 == 0)         scandValue = 0xBF;     if(ScandPin11 == 0)         scandValue = 0xDF;     if(ScandPin10 == 0)         scandValue = 0xEF;     ScandPin00 = 0;     ScandPin01 = 1;       DelayUs(1);     if(ScandPin13 == 0)         scandValue = 0xF7;     if(ScandPin12 == 0)         scandValue = 0xFB;     if(ScandPin11 == 0)         scandValue = 0xFD;     if(ScandPin10 == 0)         scandValue = 0xFE;     ScandPin01 = 0;     ScandPin00 = 1;     return(scandValue); } void KeySystemTickService(void) // 注册机制,检测是否有按键,发送KeyMessageType 类型的PostMessageQueue 消息。 {     byte scandValue;     scandValue = ScandPin();    ....                 if (ScandCounter == LongInterval)         {             PostMessageToLogicTask(KeyMessageType, RemapLongKey(ScandValueSave));                    }         else if (ScandCounter ShortInterval)         {             PostMessageToLogicTask(KeyMessageType, RemapKey(ScandValueSave));         }         ScandCounter = 0;         ScandValueSave = invalid;         JitterCounter = JitterInterval;  }     ..... } void SysTick_Handler(void) {     static unsigned char Counter = 0;     。。。。     switch(Counter)     {      。。。。。。         case 15:             SystemTick100RegisterPointBlock ();             break;                      case 97:             RtcSystemTickService();             break;         case 99:             KeySystemTickService();             break;         default:             break;     }     AdcSystemTickService(); // System.Device.Io.SetBeep(true);  CheckstationSystemTickService(); }   硬件图如下: 欢迎各位与我一起学习ARM 技术,我的E-MIAL:timeisours@163.com,web:www.51buddy.com,QQ:158377757
  • 热度 17
    2012-5-22 09:21
    1256 次阅读|
    0 个评论
      单片机简介可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上.   1.单片机的组成   单片机要自动完成计算,它应该具有哪些最重要的部分呢?           我们以打算盘为例计算一道算术题。例:36+163×156-166÷34。现在要进行运算,首先需要一把算盘,其次是纸和笔。我们把要计算的问题记录下来,然后第一步先算163×156,把它与36相加的结果记在纸上,然后计算166÷34,再把它从上一次结果中减去,就得到最后的结果.   现在,我们用单片机来完成上述过程,显然,它首先要有代替算盘进行运算的部件,这就是“运算器”;其次,要有能起到纸和笔作用的器件,即能记忆原始题目、原始数据和中间结果,还要记住使单片机能自动进行运算而编制的各种命令。这类器件就称为“存贮器”。此外,还需要有能代替人作用的控制器,它能根据事先给定的命令发出各种控制信号,使整个计算过程能一步步地进行。但是光有这三部分还不够,原始的数据与命令要输入,计算的结果要输出,都需要按先后顺序进行,有时还需等待。如上例中,当在计算163×156时,数字36就不能同时进入运算器。因此就需要在单片机上设置按控制器的命令进行动作的“门”,当运算器需要时,就让新数据进入。或者,当运算器得到最后结果时,再将此结果输出,而中间结果不能随便“溜出”单片机。这种对输入、输出数据进行一定管理的“门”电路在单片机中称为“口”(Port)。在单片机中,基本上有三类信息在流动,一类是数据,即各种原始数据(如上例中的36、163等)、中间结果(如166÷34所得的商4、余数30等)、程序(命令的集合)等。这样要由外部设备通过“口”进入单片机,再存放在存贮器中,在运算处理过程中,数据从存贮器读入运算器进行运算,运算的中间结果要存入存贮器中,或最后由运算器经“出入口”输出。用户要单片机执行的各种命令(程序)也以数据的形式由存贮器送入控制器,由控制器解读(译码)后变为各种控制信号,以便执行如加、减、乘、除等功能的各种命令。所以,这一类信息就称为控制命令,即由控制器去控制运算器一步步地进行运算和处理,又控制存贮器的读(取出数据)和写(存入数据)等。第三类信息是地址信息,其作用是告诉运算器和控制器在何处去取命令取数据,将结果存放到什么地方,通过哪个口输入和输出信息等。       存贮器又分为只读存贮器和读写存贮器两种,前者存放调试好的固定程序和常数,后者存放一些随时有可能变动的数据。顾名思义,只读存贮器一旦将数据存入,就只能读出,不能更改(EPROM、E2PROM等类型的ROM可通过一定的方法来更改、写入数据——编者注)。而读写存贮器可随时存入或读出数据。     实际上,人们往往把运算器和控制器合并称为中央处理单元——CPU。单片机除了进行运算外,还要完成控制功能。所以离不开计数和定时。因此,在单片机中就设置有定时器兼计数器,其基本结构与本连载之(二)中的举例类似。到这里为止,我们已经知道了单片机的基本组成,即单片机是由中央处理器(即CPU中的运算器和控制器)、只读存贮器(通常表示为ROM)、读写存贮器(又称随机存贮器通常表示为RAM)、输入/输出口(又分为并行口和串行口,表示为I/O口)等等组成。实际上单片机里面还有一个时钟电路,使单片机在进行运算和控制时,都能有节奏地进行。另外,还有所谓的“中断系统”,这个系统有“传达室”的作用,当单片机控制对象的参数到达某个需要加以干预的状态时,就可经此“传达室”通报给CPU,使CPU根据外部事态的轻重缓急来采取适当的应付措施。     现在,我们已经知道了单片机的组成,余下的问题是如何将它们的各部分连接成相互关联的整体呢?实际上,单片机内部有一条将它们连接起来的“纽带”,即所谓的“内部总线”。此总线有如大城市的“干道”,而CPU、ROM、RAM、I/O口、中断系统等就分布在此“总线”的两旁,并和它连通。从而,一切指令、数据都可经内部总线传送,有如大城市内各种物品的传送都经过干道进行。     2.MCS-51的CPU和存储器     (1)CPU结构        单片机8051的CPU由运算器和控制器组成。       一、运算器       运算器以完成二进制的算术/逻辑运算部件ALU为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。累加器ACC是一个八位寄存器,它是CPU中工作最频繁的寄存器。在进行算术、逻辑运算时,累加器ACC往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。寄存器B主要用于乘法和除法操作。标志寄存器PSW也是一个八位寄存器,用来存放运算结果的一些特征,如有无进位、借位等。其每位的具体含意如下所示。PSW CY AC FO RS1 RS0 OV - P对用户来讲,最关心的是以下四位。        1进位标志CY。它表示了运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。        2辅助进位标志AC。又称半进位标志,它反映了两个八位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为1状态,否则为0。        3溢出标志位OV。MCS-51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为0。        4奇偶标志P。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则,P=1。        二、控制器       控制器是CPU的神经中枢,它包括定时控制逻辑电路、指令寄存器、译码器、地址指针DPTR及程序计数器PC、堆栈指针SP等。这里程序计数器PC是由16位寄存器构成的计数器。要单片机执行一个程序,就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此,必须有一个电路能找出指令所在的单元地址,该电路就是程序计数器PC。当单片机开始执行程序时,给PC装入第一条指令所在地址,它每取出一条指令(如为多字节指令,则每取出一个指令字节),PC的内容就自动加1,以指向下一条指令的地址,使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令,或遇到中断时(后面将介绍),PC才转到所需要的地方去。8051 CPU碢C指定的地址,从ROM相应单元中取出指令字节放在指令寄存器中寄存,然后,指令寄存器中的指令代码被译码器译成各种形式的控制信号,这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合,形成按一定时间节拍变化的电平和时钟,即所谓控制信息,在CPU内部协调寄存器之间的数据传输、运算等操作。         三、存储器                存储器是单片机的又一个重要组成部分,其中每个存储单元对应一个地址,256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00H~FFH)。存储器中每个存储单元可存放一个八位二进制信息,通常用两位16进制数来表示,这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。          1、程序存储器          程序是控制计算机动作的一系列命令,单片机只认识由“0”和“1”代码构成的机器指令。如前述用助记符编写的命令MOV A,#20H,换成机器认识的代码74H、20H:(写成二进制就是01110100B和00100000B)。在单片机处理问题之前必须事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中,该存储器称为程序存储器。程序存储器可以放在片内或片外,亦可片内片外同时设置。由于PC程序计数器为16位,使得程序存储器可用16位二进制地址,因此,内外存储器的地址最大可从0000H到FFFFH。8051内部有4k字节的ROM,就占用了由0000H~0FFFH的最低4k个字节,这时片外扩充的程序存储器地址编号应由1000H开始,如果将8051当做8031使用,不想利用片内4kROM,全用片外存储器,则地址编号仍可由0000H开始。不过,这时应使8051的第{31}脚(即EA脚)保持低电平。当EA为高电平时,用户在0000H至0FFFH范围内使用内部ROM,大于0FFFH后,单片机CPU自动访问外部程序存储器。          2、数据存储器       单片机的数据存储器由读写存储器RAM组成。其最大容量可扩展到64k,用于存储实时输入的数据。8051内部有256个单元的内部数据存储器,其中00H~7FH为内部随机存储器RAM,80H~FFH为专用寄存器区。实际使用时应首先充分利用内部存储器,从使用角度讲,搞清内部数据存储器的结构和地址分配是十分重要的。因为将来在学习指令系统和程序设计时会经常用到它们。8051内部数据存储器地址由00H至FFH共有256个字节的地址空间,该空间被分为两部分,其中内部数据RAM的地址为00H~7FH(即0~127)。而用做特殊功能寄存器的地址为80H~FFH。在此256个字节中,还开辟有一个所谓“位地址”区,该区域内不但可按字节寻址,还可按“位(bit)”寻址。对于那些需要进行位操作的数据,可以存放到这个区域。从00H到1FH安排了四组工作寄存器,每组占用8个RAM字节,记为R0~R7。究竟选用那一组寄存器,由前述标志寄存器中的RS1和RS0来选用。在这两位上放入不同的二进制数,即可选用不同的寄存器组,如附表1所示。     三、特殊功能寄存器       特殊功能寄存器(SFR)的地址范围为80H~FFH。在MCS-51中,除程序计数器PC和四个工作寄存器区外,其余21个特殊功能寄存器都在这SFR块中。其中5个是双字节寄存器,它们共占用了26个字节。各特殊功能寄存器的符号和地址见附表2。其中带*号的可位寻址。特殊功能寄存器反映了8051的状态,实际上是8051的状态字及控制字寄存器。用于CPU PSW便是典型一例。这些特殊功能寄存器大体上分为两类,一类与芯片的引脚有关,另一类作片内功能的控制用。与芯片引脚有关的特殊功能寄存器是P0~P3,它们实际上是4个八位锁存器(每个I/O口一个),每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。MCS-51共有P0~P3四个这样的并行口,可提供32根I/O线,每根线都是双向的,并且大都有第二功能。其余用于芯片控制的寄存器中,累加器A、标志寄存器PSW、数据指针DPTR等的功能前已提及,而另一些寄存器的功能在后面有关部分再作进一步介绍。
相关资源