搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2012-6-8 21:17:09 | 显示全部楼层 |阅读模式
本帖最后由 xuanke 于 2012-6-8 21:30 编辑

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

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

1。各个端口寄存器
P2IN是输入寄存器  不能写入只能读取
P2OUT是输出寄存器
P2DIR是输入输出控制寄存器 PUC后复位(清零,默认输入)1输出
P1P2的八条引脚都能引起中断 P1IE  P2IE 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--);
}
#pragma  vector = 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,也就是波特率啦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-8 21:37:31 | 显示全部楼层
从51学过来的飘过。。。感觉这样入门会容易一点

出0入0汤圆

 楼主| 发表于 2012-6-8 21:40:31 | 显示全部楼层
weihei 发表于 2012-6-8 21:37
从51学过来的飘过。。。感觉这样入门会容易一点

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

出0入0汤圆

发表于 2012-6-8 21:47:30 | 显示全部楼层
xuanke 发表于 2012-6-8 21:40
嗯,当年也是从51飘过来的,很多人写的东西都是很生涩的。所以才想着自己写写。额,后来没坚持下去,要是 ...

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

出0入12汤圆

发表于 2012-6-8 21:52:59 | 显示全部楼层
最近正在折腾这个,多谢楼主
能不能写写USC,5XX开始时钟都是这个了,和1XX大不相同

出0入0汤圆

 楼主| 发表于 2012-6-9 12:21:02 | 显示全部楼层
skynet 发表于 2012-6-8 21:52
最近正在折腾这个,多谢楼主
能不能写写USC,5XX开始时钟都是这个了,和1XX大不相同 ...

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

出0入0汤圆

发表于 2012-6-9 12:39:15 | 显示全部楼层
呵呵 我也是大一开始玩的430 最搞笑的是我大一没电脑 只有开发板
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 10:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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