xuanke 发表于 2012-6-8 21:17:09

发一下去年我大一时候学习430时候的心得,全手打。

本帖最后由 xuanke 于 2012-6-8 21:30 编辑

现在想想当年自己还是很新手,虽然现在也是。新手来引导下新手吧。大神放我一马。

MSP430学习记录 宣科自己的记录,纯手打
以后也许会更新,现在不怎么用430了、

1。各个端口寄存器
P2IN是输入寄存器不能写入只能读取
P2OUT是输出寄存器
P2DIR是输入输出控制寄存器 PUC后复位(清零,默认输入)1输出
P1P2的八条引脚都能引起中断 P1IEP2IE 0禁止,1允许,而端口P3P4P5P6没有中断能力,就只能IO
PnSEL是功能选择寄存器 0=I/O端口,1=外围模块功能
PnIES是选择下降沿中断还是上升沿中断0=上升 1下降


2.中断的理解
所谓的中断,就是在之前设定的时间到了以后,中断MAIN函数的,运行中断函数里面的程序

中断拥有最高的优先级,当中断发生(端口中断,计时器计数器中断等)后,无条件跳转到中断,中断是独立于主程序之外的。

比如这个看萌狗:
        int main( void )
        {
          // Stop watchdog timer to prevent time out reset
          WDTCTL = WDT_ADLY_250;            //看门狗狗250ms
          IE1 = WDTIE;                        //看门狗定时器能够中断
          P2DIR |= 0xff;                      //让p1.0拉高使输出状态
          _EINT();                           //使能全局中断
          for(;;)
          {
          LPM3;//#define LPM3      _BIS_SR(LPM3_bits)(SCG1+SCG0+CPUOFF)
           _NOP(); //平时是低功耗运行,一旦看门狗定时器跑完250ms,就会唤醒,进入中断
          
          }
        }
知道了看门狗定时器其实也是可以用的,而且可以让机器平时处于低功耗,
一旦看门狗定时器跑完,就允许中断。
还有就是会写中断的表达方式了#pragma vector(这个是向量的意思,指向储存器位置) = WDT_VECTOR(这个就是标注是哪一个中断寄存器)

__interrupt(前面是两个下划线啊,坑爹啊) void (不能丢)wdt(void)(随便自己起名字的)

#pragma vector = WDT_VECTOR
__interrupt void wdt(void)

按键:int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0XF0;//11110000 P1.0到1.3为输入状态
P2DIR |= 0XFF;
P2OUT = 0X00;
for(;;)
{
if (key !=0x0f)
{
   delay();
    if ( key !=0x0f)
    {switch(key)
      {
      case 0x0e:P2OUT = 0XFE;break;//0x00001110
      case 0x0d:P2OUT = 0xfd;break;//0x00001101
      case 0x0b:P2OUT = 0xfb;break;//0x00001011   
      case 0x07:P2OUT = 0xf7;break;//0x00000111
      } }}}}
其实就是一个输入寄存器的使用


#include<msp430x14x.h>
#define key (P1IN &0x0f)
void delay(void);
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0XF0;//11110000 P1.0到1.3为输入状态
P2DIR |= 0XFF;
// P2OUT = 0X00;
P1IE = 0x0f;//设置从P1.0~P1.3允许中断
P1IES = 0xf0;//下降沿触发
_BIS_SR(LPM3_bits + GIE);
for(;;)
{}
}
void delay(void)
{
    unsigned int t;   
   for(t = 12000;t > 0;t--);
}
#pragmavector = PORT1_VECTOR
__interrupt void p1input(void)   //利用中断写的按键处理
{
if (key !=0x0f)
{
   delay();
    if ( key !=0x0f)
    {switch(key)
      {
      case 0x0e:P2OUT = 0XFE;break;//0x00001110
      case 0x0d:P2OUT = 0xfd;break;//0x00001101
      case 0x0b:P2OUT = 0xfb;break;//0x00001011   
      case 0x07:P2OUT = 0xf7;break;//0x00000111
      }}}}
利用中断写的按键处理,机器平时处于低功耗,允许中断,一旦检测到有按键按下,就进入按键。

3、串口:
先写上串口;
一、首先430f149的P3.4,P3.5是uart0的复合用脚,当设置
P3SEL = 0x30;就是设置使用内部的串口模块
二、设置好了,就是打开这些功能了,ME1寄存器就是控制打开发送和接受控制寄存器。
使其USART0的发送和接收使能,只要设置ME1 = UTXE0 + URXE0;
【在这里补充说明一下,由于430头文件的强大,UTXE0就是U0TXE ,URXE0 就是U0RXE全称就是USART0 TX ENABLE,包括像UCTL0就是U0CTL,在编程时候也可以替换的,这样方便记忆。】
三、一般我们发送接收的都是8位的数据位,所以在UCTL0寄存器里面设置:UCTL0 |= CHAR;【为什么是char呢,我个人理解是一般发送的都是字符型(char型)的数据,在C语言中char是8位的】
四、然后一般那些外围的模块和内部资源都要在一定的频率下才能运行,所以毫无例外的要设置其工作的时钟频率了,所以:
UTCTL0|= SSEL0;就是UCLK = ACLK;这个在结构图里面可以查

到,我找找。。。恭喜自己,我找到了   所以只要

设置SSEL0和SSEL1即可。
五、设置波特率了,430设置波特率及其容易,只要设置两个寄存器即可UBR00和UBR10。比如设置UBR00 = 0x0D;UBR10 = 0x00;
就是设置了波特率为2400,好吧,我承认这个比较难理解,我慢慢说。
首先,UBR00,UBR10,这两个寄存器可以理解是一个控制串口0 的16位的寄存器,
UBR00控制低八位,而UBR10控制高八位。从低到高分别对应着2的0次方,2的1次方,2的2次方,一直到2的15次方。
所以UBR00,UBR10等于 0x00, 0x0d;也就是0000 0000 0000 1101,也就是 = 13。
而串口模块的时钟频率我设置为ACLK,也就是32768hz,然后32768除以13,就等于2400,也就是波特率啦。

weihei 发表于 2012-6-8 21:37:31

从51学过来的飘过。。。感觉这样入门会容易一点

xuanke 发表于 2012-6-8 21:40:31

weihei 发表于 2012-6-8 21:37 static/image/common/back.gif
从51学过来的飘过。。。感觉这样入门会容易一点

嗯,当年也是从51飘过来的,很多人写的东西都是很生涩的。所以才想着自己写写。额,后来没坚持下去,要是有人想看,我暑假会更新的。

weihei 发表于 2012-6-8 21:47:30

xuanke 发表于 2012-6-8 21:40 static/image/common/back.gif
嗯,当年也是从51飘过来的,很多人写的东西都是很生涩的。所以才想着自己写写。额,后来没坚持下去,要是 ...

可以结合user‘s guide。。。个人感觉非常快。当时没有留下记录。。。没办法分享。。

skynet 发表于 2012-6-8 21:52:59

最近正在折腾这个,多谢楼主
能不能写写USC,5XX开始时钟都是这个了,和1XX大不相同

xuanke 发表于 2012-6-9 12:21:02

skynet 发表于 2012-6-8 21:52 static/image/common/back.gif
最近正在折腾这个,多谢楼主
能不能写写USC,5XX开始时钟都是这个了,和1XX大不相同 ...

好,不过最近忙飞思卡尔的比赛,没多少时间。过一段时间会写的。放心。

clogord 发表于 2012-6-9 12:39:15

呵呵 我也是大一开始玩的430 最搞笑的是我大一没电脑 只有开发板
页: [1]
查看完整版本: 发一下去年我大一时候学习430时候的心得,全手打。