模块的概念捕获寄存器是什么概念

转载自http://blog.csdn.net/edonlii/article/details/8685713
Linux下有个工具msr_tool可以用来读写MSR里面的值,这里面的值不要乱写,容易蓝屏!
Model Specific Register (MSR) as the name implies is model specific and may change from processor model number (n) to processor model number (n+1).
二 读写方法
MSR 是CPU 的一组64 位寄存器,可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作,前提要在ECX 中写入MSR 的地址。对于RDMSR 指令,将会返回相应的MSR 中64bit 信息到(EDX:EAX)寄存器中;对于WRMSR 指令,把要写入的信息存入(EDX:EAX)中,执行写指令后,即可将相应的信息存入ECX 指定的MSR 中。MSR 的指令必须执行在level 0 或实模式下。
RDMSR& & & & 0F 32& & & & 不影响标志位& & & & 把ECX指定的模型专用寄存器内容送EDX:EAX& & & & RDMSR
WRMSR& & & & 0F 30& & & & 不影响标志位& & & & 把EDX:EAX的内容写入ECX指定的模型专用寄存器& & & & WRMSR
MSR 总体来是为了设置CPU 的工作环境和标示CPU 的工作状态,包括温度控制,性能监控等,具体来说,分为以下几项:
1. Thermal
2. Frequency
3. C State
4. Microcode
7. Key Features Of CPU
8. Voltage
9. Cache Control
11. DCA(Direct Cache Access)
12. Machine Check
13. 硬件联机控制
14.other 
Model Specific Register (MSR)
MSR指令的格式为:
MSR{条件} 程序状态寄存器(CPSR或SPSR)_&域&,操作数
MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。&域&用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
位[31:24]为条件标志位域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8]为扩展位域,用x表示;
位[7:0]为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
指令示例:
MSR CPSR,R0 ;传送R0的内容到CPSR
MSR SPSR,R0 ;传送R0的内容到SPSR
MSR CPSR_c,R0 ;传送R0的内容到CPSR,但仅仅修改CPSR中的控制位域
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:140489次
积分:2431
积分:2431
排名:第12624名
原创:86篇
转载:105篇
评论:31条
(1)(5)(1)(10)(2)(2)(2)(2)(11)(6)(1)(3)(9)(6)(12)(6)(9)(10)(4)(8)(5)(2)(5)(4)(4)(5)(8)(6)(3)(1)(1)(9)(1)(6)(1)(8)(11)(1)(3)导读:有输入捕捉、输出比较,这里主要记一下输入捕捉和输出比较,输入捕捉这个功能很有用,他不仅可以捕捉外界事件的发生(这个功能和51中的外部中断差不多),还可以捕捉外界事件发生的时间,捕捉外界时间这个功能可以运用到驱动超声波测距中去,IOC0~IOC7是输入捕捉\输出比较的外部针脚,则将相应的通道配置为输入捕捉了,当输入捕捉检测到有上升沿或下降沿时,这样就可以通过查询TCx来确定事件发生的时间了,如果
买了本《嵌入式系统――使用HCS12微控制器的设计与应用》这本书,看了觉得帮助不大。因为里面有些东西讲得不够详细,并且这本书不是针对XS128来写的。网上也有一些网友写的资料,那都只是针对某一方面的。我觉得最好的资料还是英文版的说明文档,里面好多东西都讲得很详细,虽然看起来有点费劲,但那里值得的。
接下来就自己的学习经历。
TIM中的功能比较多,有输入捕捉、输出比较,还有脉冲累加器。这里主要记一下输入捕捉和输出比较。输入捕捉这个功能很有用,他不仅可以捕捉外界事件的发生(这个功能和51中的外部中断差不多),还可以捕捉外界事件发生的时间。捕捉外界时间这个功能可以运用到驱动超声波测距中去。
IOC0~IOC7是输入捕捉\输出比较的外部针脚。当IOSx=0时(IOSx=1时为输出比较),则将相应的通道配置为输入捕捉了。当输入捕捉检测到有上升沿或下降沿时,就会把那时寄存器的值锁存到TCx中,这样就可以通过查询TCx来确定事件发生的时间了。如果输入捕捉控制寄存器TIE(CxI=1)中允许输入捕捉中断,则捕捉到事件时,系统会产生一次中断。 接下来依次说明一下相关的寄存器设置:
TEN是定时器允许位。TEN=1时,允许定时器工作,TEN=0时,禁止定时器工作。其余不常用,设为0即可。
TOI是定时器溢出中断允许位。这个在输入捕捉中没用到,设为0即可。
TCRE是定时器计数寄存器复位允许位。用在输出比较中,允许输出比较寄存器7的事件来复位定时器计数寄存器。这里设为0即可。
PR2~PR0是定时器分频因子选择位。不同的组合可以设定不同的定时器时钟:
TIOS是输入捕捉和输出比较选择寄存器,在这里设定IOC0~IOC7是用于输入捕捉还是用于输出比较。
里面的8位对应着IOC0~IOC7八个通道,相应位位1,则设为输出比较。相应位设为0,则为输入捕捉。
TCTL3和TCTL4是用来设定输入捕捉极性的寄存器,在这里可以设为上升沿、下降沿、上升沿或下降沿触发输入捕捉。
其中EDGxB和EDGxA一起来设相应通道输入捕捉极性,对应的功能如下:
(0 0)为禁止输入捕捉。
(0 1)为上升沿捕捉
(1 0)为下降沿捕捉
(1 1)为上升沿或下降沿捕捉
TIE是输入捕捉或输出比较中断允许位。
这里的每一位是和TIOS上的位一一对应的。相应置1时,则捕捉到事件时,则系统会产生中断。相应位设为0时,则不能。
TFLG1是输入捕捉或输出比较中断标位寄存器。
当发生输入捕捉或输出比较事件时,相应位置1。向该位写1,可以清空该标志位。
通道寄存器TC0~TC7用于锁存发生捕捉事件时自由运行的计数器的计数值。通过查询TC0~TC7相应的位,可以确定捕捉事件发生的时刻。
与输入捕捉相关的寄存器还有:
ICOVW:输入控制修改寄存器
ICSYS:输入控制系统控制寄存器
DLYCT:延迟计数控制寄存器(可以自动处理窄脉冲干扰)
这些不常,可以不管
接下来按照上面的寄存器设置好相应的功能,程序就出来了:
void ECT0_INIT()
//输入捕捉通道0初始化函数
TSCR2=0X06;
//关闭溢出中断且64分频
TIOS_IOS0=0;
//定通道0为输入捕捉,1为输出比较
TCTL4=0X01;
//上升沿捕捉
0x02为下降沿捕捉
TIE_C0I=1;
//通道0中断使能
TSCR1=0X80;
//开启总定时器中断
TFLG1_C0F=1;
//标志位清零
中断程序:
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//分配内存空间
void interrupt 8 timer_onput()
//输入捕捉通道0的中断向量为8
TFLG1_C0F=1;
//标志位清零
//关总中断
// PORTB=~PORTB;
PORTB&=~(1&&7);
delay_us(1);
PORTB|=(1&&7);
//开总中断
输出比较看似不能,却磨折了我两天,其中大多都是些小细节问题在纠缠。现在终于想明白其中一些道理。不过有些寄存器还是没有理解,如强制输出比较寄存器CFORC,测试了好久,都未能得到想要的结果,希望路过的高手能指点一下。
接下来继续记一下学习输出比较的点点滴滴吧。
XS128的定时器模块中的输入捕捉和输出比较共用同一组管脚。可以通过设置TIOS寄存器来选择。我觉得输出比较的原理和PWM波的产生原理差不多,都是通过计数器的数值和某一寄存器里的值比较产生输出的高低电平变化。在输出比较中,当计数器的值与某一输出比较通道的TCx(TC0~TC7)的值相等时,该通道上引脚会输出高电平、低电平,或是对引脚上的电平进行翻转。这时标志位CxF会置位,如果开通中断的话(TIE中的CxI=1),系统还会产生一个中断。
输出比较用到的寄存器好多都是和输入捕捉的一样,现在按照输出比较的程序需要再过一遍。
定时器系统控制寄存器TSCR1:设置定时器正常工作
定时器系统控制寄存器TSCR2:设置定时器溢出中断允许,和定时器时钟分频设置
定时器计数寄存器TCNT:这是个16位寄存器,在一般情况下是不可以写的。输入捕捉时,就是这个寄存器的值存入TCx中,输出比较时,也是这个寄存器的值与TCx的
包含总结汇报、外语学习、文档下载、人文社科、考试资料、教学研究以及MC9S12XS128之时间模块TIM输入捕捉等内容。本文共3页
相关内容搜索结构体定义寄存器方法(很流行哦) - 博客频道 - CSDN.NET
V__KING__的专栏
分类:cC++
ARM寄存器数量之多,叹为观止!幸运的是,它都是以模块分布,再依托C语言的模块化编程,用户就没有必要记忆那么多的寄存器名称了!
拿LPC1114来说,单片机内部模块有“模数转换器ADC模块”,“看门狗WDG模块”,“中断模块NVIC”,“串口UART模块”等等。
每个模块都有一些寄存器。
在51单片机中,用串口发送数据,会这样写:SBUF=0x88,如何正确的把0x88写到名称为SBUF的寄存器中,在51的寄存器地址定义文件&reg51.h&里面,SCON的地址这样定义:sfr SCON = 0x98。
同样,LPC1114里面也需要定义地址,由于LPC1114用纯C语言编写程序,所以不能用“伪C语言”sfr来定义地址了。
涉及到地址,肯定会用到指针,因为指针可以指向地址。
拿看门狗模块来举例,结构体定义如下:
typedef struct
& & RW_en MOD;& && && && &&&/*看门狗模式寄存器,&&地址偏移: 0x000 (R/W) */
& & RW_en TC;& && && && && &/*看门狗常量寄存器,&&地址偏移: 0x004 (R/W) */
& & W_en&&FEED;& && && && & /*看门狗喂狗寄存器,&&地址偏移: 0x008 (W)& &*/
& & R_en&&TV;& && && && && &/*看门狗当前值寄存器,地址偏移: 0x00C (R/ ) */
}WDT_TypeDef
结构体定义了看门狗里面一共有四个寄存器
基址定义如下:
#define WDT_BASE& && && & (APB0_BASE + 0x04000)
#define APB0_BASE& && && &(0xUL)
#define WDT& && && &((WDT_TypeDef& & *) WDT_BASE& &)
在官网用户手册中指出:看门狗模块的四个寄存器地址分别为0xxxx4000400C,如何正确的把寄存器地址放到这个地方,上面的语句就是实现方法。
看懂上面的语句,并不是十分困难,因为都是些C语言的基础知识。(所以说,不管任何行业,高手并不是掌握了高深的技能,而是掌握了扎实的基础!)
#define 在C语言中表示 :用define后面的词代替这个词后面的语句。
写程序赋值的时候,我们会这样写:
WDT-&TC = 80000;
那么WDT就是:(WDT_TypeDef *)&(0xUL&+
0x04000)&即把上面的结构体地址定义为0x,那么里面的4个寄存器地址就分别是:
TV=0X4000400C
地址为什么会递增4?
请看前面的RW_en,R_en,W_en,分别是:
#define R_en& &volatile uint32
#define W_en& &volatile uint32
#define RW_en volatile uint32
uint32即四个字节,所以地址会增加4。
“-&”运算符用于指向结构体变量指针,当然也可以用“.”,如果用“.”,对于结构体指针,要这样用:
(*WDT).TC = 80000;
用&-&&和&.&都可以,书写正确就可以,都可以正常使用!
为了书写方便,我们一般用“-&”,而不用“.”
排名:千里之外
(6)(17)(5)(7)(4)(6)(31)(2)(5)(1)(2)【图文】捕获比较通道_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
捕获比较通道
上传于|0|0|暂无简介
大小:140.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢寄存器的配置_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
寄存器的配置
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 模块的概念 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信