社区导航

 

搜索
查看: 402|回复: 0

[资料分享] MSP430大量寄存器如何处理的问题

[复制链接]

5367

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-9-24 21:45 | 显示全部楼层 |阅读模式
MSP430寄存器太多了,把每一个都记住实在太难。所以,建议是,学习的时候,把重要的常用的寄存器记住。
          至于其它众多寄存器,大家只需要有一个印象,知道这些寄存器可以控制那些设置。到具体用的时候,再查找技术手册;
头文件msp430f5529.h
里面不仅定义了对各个寄存器的声明,还定义了很多很方便的东东。
比如你要进入低功耗模式1:LPM1;
比如你要把定时器A0的时钟选为SMCLK:
                     最原始的做法是TA0CTL=0x0200,但现在有更清晰的做法TA0CTL=TASSEL_2;//时钟源选择模式2
所以说要不断发掘不断积累!
中断寄存器的名字
                     大家都知道中断函数是怎么写的,模式为:
#pragma vector=中断向量地址(名)
__interrupt void 自定义中断函数名(void)
{… }
                     但是想要写出来,你首先得知道中断向量叫什么名字吧
到目前,我们已经遇到了看门狗中断WDT_VECTOR、引脚P2的外部中断PORT2_VECTOR、定时器A0(CCR1-CCR4和TAIFG)中断TIMER0_A1_VECTOR
还有大量的中断向量,我们目前还不知道名字该怎么办。
打开msp430f5529.h,拉到该文件底部,就展示了定义的各种中断向量名,还有解释。

MSP430的最大特色就是低功耗,这个是体现在各个方面的。在整体层次上,MSP430可以设置整个系统的工作模式以达到适应工作要求且降低功耗的目的。
为了降低功耗,处理器有几个考虑:
一个是降低工作电压(F5529为3.3V很低了吧,而且内部核心电压VCORE更低);
第二个就是把暂时不用的模块功能关闭掉(F5529各个模块都可以独立运行,如定时器、A/D转换、看门狗等都可以在CPU休眠的状态下独立工作。若需要主CPU工作,任何一个模块都可以通过中断唤醒CPU,从而使系统以最低功耗运行。
);
第三个方法就是降低工作时钟频率。,
(1) MSP430F5529支持最高工作频率为25MHZ,也就是说你通过
             锁相环倍频来提高系统运行速度是有一个限制的,
             最高只能到25MHZ(再高没意思了)。
                 (2)几个重要的内联函数
                               (内联函数定义在intrinsics.h中,但是这几个函数使用的时候
                 不需要事先声明该文件头)
                        __bic_SR_register();
                                      将CPU中SR寄存器中的某些位清零。即将括号内的位清零。
                                      例:__bic_SR_register(GIE);//将GIE位清零,即关闭总中断
                        ②__bis_SR_register();
                                      将CPU中SR寄存器中的某些位置1。即将括号内的位置1。
                         __interrupt
放在函数前面,标志中断函数。下面这段程序是看门狗
WDT的中断服务函数。WDT_VECTOR为看门狗的中断向量。举例:
#pragma vector=WDT_VECTOR
__interrupt void WatchDog(void)
{… }
               __monitor
放在函数前面,功能是声明当这一函数执行的时候自动关闭中断。应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。
               __bic_SR_register_on_exit();
功能:用于一个中断函数或者不可中断函数(标志为__monitor)返回时,将CPU内SR寄存器中的某些位清0.
__bis_SR_register_on_exit();
功能:用于一个中断函数或者不可中断函数(标志为__monitor)返回时,将CPU内SR寄存器中的某些位置1.
__no_init
放在全局变量前面,功能是使程序启动时不为变量赋初值
__disable_interrupt
                     关闭总中断
                     另外一个相同作用的表达为:    _DINT()
__enable_interrupt
                     开启总中断
                     另外一个相同作用的表达为:    _EINT()
__even_in_range(  ,  );
常被用在多源中断的查询中,如switch( __even_in_range(TAIV,10)
意思是:只有在TAIV的值是在0--10内的偶数时才会执行
switch函数内的语句。其作用是提高switch语句的效率
A.        _NOP()
空操作,等价于__no_operation指令
B. __get_SP_register(void)
功能:返回堆栈指针寄存器SP的值。
C.__get_SR_register_on_exit(void)
功能:用于一个中断函数或者不可中断函数
(标志为__monitor)返回时,返回状态寄存器SR的值。
               D. __bcd_add_short(unsigned short,unsigned short);
功能:两个16为BCD格式的数字相加,返回和。
               E.__bcd_add_long(unsigned long,unsigned long);
功能:两个32位BCD格式的数字相加,返回和。
F. __delay_cycles(x);
              系统自带的精确延时。x必须是常量或则是常量表达式,如果是变量则编译报错!延时的时间为x乘以MCLK的时钟周期

来源:EEWorld 微控制器 MCU板块,转载请附上链接


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-18 15:31 , Processed in 0.074830 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表