【速成MSP430f149】电赛期间学习MSP430f149笔记

前言

由于本人加入实验室较晚,起步较迟,目前接触单片机不到10个月,接触过arduino,stc15单片机,熟悉51单片机,STM32单片机,由于上届省电赛采用TI芯片,然后大胆的推测这次不会用TI的MCU,可往往天意弄人,这次承继了上次国赛的两个小车通信要求,但是可以不加视觉,难度均衡国赛,本人想在此短时间速成MSP430f149的使用,完成赛题。今天是江苏省级电赛的第一天。

一、编译、烧录软件

在这里插入图片描述
第一个是我购买的淘宝Studing店铺给的芯片资料,其他是b站上热门视频附带的资料,第一个里面我下载了烧录软件

———————————————————————————————————这里做个勘误,我觉得第一个文件夹里面的不太好用,建议用后三个
在这里插入图片描述
在这里插入图片描述

  • 编译平台 IAR(推荐IAR EW430 5.3版本) 管理员打开下载包可以防止之后因为权限原因编译不成功
  • ★★★下载需要是.txt文件,在Debug------>Exe 文件夹下面 ★★★

二、宁波欣创f149

1、观看的视频是宁波欣创电子科技的视频资料
在这里插入图片描述
在这里插入图片描述
外部供电和引脚供电不要同时使用,否则会对芯片造成不可估量的损失

2、芯片引脚电路图
在这里插入图片描述
3、资料官网
TI:https://www.ti.com.cn/product/zh-cn/MSP430F149?keyMatch=MSP430F149&tisearch=search-everything&usecase=GPN
欣创:www.avrgcc.com 技术交流栏目
4、建立工程
(1)新建工程
在这里插入图片描述
(2)保存为英文路径,不然编译容易出错
在这里插入图片描述
(3)保存对话框
在这里插入图片描述
关于一些 IAR 工程的配置和基础使用,视频里面有,这里就不提了

三、点亮LED灯

1、关于Options里的一些配置记录
在这里插入图片描述

  • 当选择软件仿真器的时候,其他都无所谓的
  • .h的头文件调用直接放到主函数main.c的路径下,直接编译
  • 另外用第三方的软件下载,BSL,不是IAR,所有要输出txt文件
    这个是BSL下载器的文件夹,推荐使用MspFet下载(管理员身份打开)
    在这里插入图片描述

四、仿真器

由于时间紧、任务重,这里暂时先跳过仿真器不看,如果后面有需要再看

五、时钟系统、LED控制

1、区别于MSP430f169:

  • f169比f149多一些片内设备,比如说f169有ADC、DAC、I2C,而f149只有ADC,其他基本是一样的。
  • 外形一样
    在这里插入图片描述
    小圆点左下为1脚,逆时针,如果接反,长时间上电,烧掉的可能性就非常大

2、有内部时钟,可以不接晶振,接上电源就可以工作
3、48个IO口,P1.0-1.7、P2.0-2.7、…、P6.0-6.7
4、这里讲到复用功能,让我联想到了stm32的复用功能,查找百度得到更好的理解
在这里插入图片描述
5、时钟周期要进入一个稳定周期(在代码里表现)
在这里插入图片描述
6、高频高功耗,反应快,低频低功耗,反应慢
7、LED程序讲解

LED8

//调试环境:EW430 V5.30
//作者:www.avrgcc.com
//时间:2014.03.01
********************************************************************/

#include <msp430x14x.h>
#include "Config.h"

//***********************************************************************
//               MSP430IO口初始化
//***********************************************************************
void Port_Init()                   //IO口初始化
{
  LED8DIR = 0xff;                  //设置IO口方向为输出
  LED8 = 0x00;                     //初始设置为00  全亮
}

//***********************************************************************
//      主程序
//***********************************************************************
void main(void)
{ 
  WDT_Init();         //看门狗设置,这个函数是必须的,防止程序跑飞,一般在学习的过程中是把看门狗的程序关闭的,不工作,打开必须喂狗,程序就会复位
  
  Clock_Init();       //时钟初始化
  Port_Init();        //端口初始化,用于控制IO口输入或输出
  while(1)
  {
    LED8=0x00;       //点亮LED
    delay_ms(500);   //延迟函数是IAR自带的一个函数
    LED8=0xff;       //熄灭LED
    delay_ms(500);
  }
}

LED8_1

/********************************************************************
//DM430-L型最小系统板控制1个发光二极管闪烁测试程序
//发光二极管使用D1,同时可以用于指示串口数据
//调试环境:EW430 V5.30
//作者:www.avrgcc.com
//时间:2014.03.01
********************************************************************/

#include <msp430x14x.h>
#include "Config.h"

//***********************************************************************
//               MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
  LED8DIR = 0xff;                    //设置IO口方向为输出
  LED8 = 0xFF;                       //初始设置为00
}



//***********************************************************************
//      主程序
//***********************************************************************
void main(void)
{ 
  WDT_Init();
  Clock_Init();                         //时钟初始化
  Port_Init();                          //端口初始化,用于控制IO口输入或输出
  while(1)
  {
    
    LED8 |= 1<<0;  //对某一位置1        //如果要显示闪烁别的灯,改后面0为其他就可以(0~7)  0是低位对于LED8  
                        
    delay_ms(500);
                          
    LED8 &= ~(1<<0);//对某一位置0
    
    delay_ms(500);
  }
}

输入输出模式和拉灌电流没有关系,在编写中,这里如果要读信号就要输入,写就要输出,MSP430f149就是一个很好的例子,由灌电流输入,低电平控制,但是要输出模式,而51单片机中,由单片机给引脚高电平,输出模式,防止电流倒灌,对单片机造成影响。

六、I/O端口

在这里插入图片描述
设置输入、输出或者模式或者引脚第二功能
& 是输入 , | 是输出
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
用于中断操作的三个寄存器
在这里插入图片描述

/********************************************************************
//DM430-L型最小系统板4位独立按键测试程序,采用查询模式
//按不同的按键,显示不同的LED灯,具体请看程序
//调试环境:EW430 V5.30
//作者:www.avrgcc.com
//时间:2014.03.01
********************************************************************/

#include <msp430x14x.h>
#include "Config.h"

uchar key;

//*************************************************************************
//	初始化IO口子程序
//*************************************************************************
void Port_init()
{

  P1SEL = 0x00;                   //P1普通IO功能,当作为普通IO时可以不用设置,这里只是给大家一个明确概念要设置
  P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻
  P6SEL = 0x00;                   //P6口普通IO功能
  P6DIR = 0xFF;                   //P6口输出模式
}

//**********************************************************************
//	键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************

uchar Key_Scan(void) 
{
  uchar key_check;
  uchar key_checkin;
  key_checkin=KeyPort;          	//读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;          		//读取IO口状态,判断是否有键按下
  if(key_checkin!=0x0F)            	//IO口值发生变化则表示有键按下
    {
      delay_ms(20);                 //键盘消抖,延时20MS
      key_checkin=KeyPort;
      if(key_checkin!=0x1F)
        {  
          key_check=KeyPort;
          switch (key_check & 0x0F)
            {
              case 0x0E:key=1;break;
              case 0x0D:key=2;break;
              case 0x0B:key=3;break;
              case 0x07:key=4;break;
            }
          
        }
      
   }
  else
   {
     key=0xFF;        
   }
  return key;
} 
//*************************************************************************
//		主程序
//*************************************************************************

void main(void)
{     
  WDT_Init();                            //看门狗设置
  Clock_Init();                          //系统时钟设置
  Port_init();                           //系统初始化,设置IO口属性
  delay_ms(100);                         //延时100ms
  while(1)
    {
      Key_Scan();                       //利用查询方式,独立式键盘扫描,看是否有按键按下
      if(key!=0xff)                     //如果有按键按下,则显示该按键键值1~4
        {
	  {
            switch(key)
              {
	        case 1: LED8 = 0xFC;break;        //给不同的键赋键值,键值1,亮2个LED灯
                case 2: LED8 = 0xF3;break;        //给不同的键赋键值,键值2,亮2个LED灯
                case 3: LED8 = 0xCF;break;	 //给不同的键赋键值,键值3,亮2个LED灯
                case 4: LED8 = 0x3F;break;	 //给不同的键赋键值,键值4,亮2个LED灯
              }

          }
	
       }
     else
      {
        //LED=key;              	//没有按键的时候显示上次的键值
      }
    }

}

七、中断系统设置及应用

1、不像51、32单片机既有高低电平中断,也有上升沿和下降沿中断,而MSP430只有上升沿和下降沿中断
2、中断服务程序对应不同的中断有不同的服务程序,是放在中断向量入口地址的位置,当对应的中断源和中断种类来临的时候,中断服务程序就要执行
3、
在这里插入图片描述
4、

/********************************************************************
//DM430-L型最小系统板4位独立按键作为中断按键使用测试程序,下降沿触发
//按不同的按键,显示不同的LED灯,具体请看程序,测试外部中断功能
//调试环境:EW430 V5.30
//作者:www.avrgcc.com
//时间:2014.03.01
********************************************************************/

#include <msp430x14x.h>
#include "Config.h"

uchar key;

//*************************************************************************
//	初始化IO口子程序
//*************************************************************************
void Port_init()
{

  P1SEL = 0x00;                   //P1普通IO功能
  P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻
  P1IE  = 0x0F;                   //开启P1低四位中断
  P1IES = 0x0F;                   //下降沿触发中断
  P1IFG = 0x00;                   //软件清零中断标志寄存器
  
  LED8DIR = 0xFF;                 //P6口输出模式
  LED8  = 0xFF;                   //先关闭所有LED
}

//**********************************************************************
//	P1口中断服务程序,需要判断
//**********************************************************************
#pragma vector = PORT1_VECTOR                           //定义一下中断向量,PORT1_VECTOR中断向量
__interrupt void P1_IRQ(void)                           //中断服务函数的申明,__interrupt中断关键字,P1_IRQ自己起的名字
{
  switch(P1IFG&0x0F)
  {
  case 0x01: key=0x01;LED8 = 0xFC;P1IFG=0x00;break;     // 引脚0对应S1中断,必须手动清标志位,点亮D1D2
  case 0x02: key=0x02;LED8 = 0xF3;P1IFG=0x00;break;     // 引脚1对应S2中断,必须手动清标志位,点亮D3D4
  case 0x04: key=0x03;LED8 = 0xCF;P1IFG=0x00;break;     // 引脚2对应S3中断,必须手动清标志位,点亮D5D6
  case 0x08: key=0x04;LED8 = 0x3F;P1IFG=0x00;break;     // 引脚3对应S4中断,必须手动清标志位,点亮D7D8
  }
}

//*************************************************************************
//		主程序
//*************************************************************************

void main(void)
{     
  WDT_Init();                            //看门狗设置
  Clock_Init();                          //系统时钟设置
  Port_init();                           //系统初始化,设置IO口属性
  delay_ms(100);                         //延时100ms
  _EINT();                               //使能中断
  while(1);
}

八、看门狗

在这里插入图片描述

  • 个人理解看门狗就是一个定时复位的程序,到了周期自动复位,如果执行喂狗操作(清除定时器),看门狗不作用(结合51单片机自己大致想了一下,前面寄存器和电路没看,后面我开2倍速,如果有误愿请告知)
  • 另外,看门狗还可以作为定时器使用

九、USART串行通信模块(UART)

1、串行:一根线传输数据
并行:八根线传输数据
2、同步:时钟一样,低速传输,如:spi
异步:时钟可以不同,低速传输
3、
在这里插入图片描述

  • P3.4、P3.5、P3.6、P3.7
  • ttl通信:RX—TX,TX—RX 可以实现单片机与单片机之间的通信
  • usb转ttl:可以实现电脑和单片机之间的通信
    这是 IO口第二功能,需要复用
    4、寄存器
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、计算波特率
(1)
在这里插入图片描述
(2)
在这里插入图片描述
6、

/********************************************************************
//DM430-L型最小系统板串口测试程序,使用单片机的串口0
//使用板载BSL模块或者用户外接串口线到DB9,要求是直连公对母串口线
//使用串口调试助手发送数据到系统板,比如02,03等
//系统板会将收到的数据再发送到串口调试助手,接收采用中断模块,发送用查询
//板载的BSL模块可以通过跳线帽设置为USB转串口模式,笔记本电脑没有串口可以直接代替
//开发板的BSL_Config区的RXD和TXD0连接,TXD和RXD0连接即可,另外2个跳线帽取下
//使用USB转串口功能时,BSL失效,因此操作前应该先将程序下载至芯片中再调整跳线帽
//调试环境:EW430 V5.30
//作者:www.avrgcc.com
//时间:2014.03.01
********************************************************************/

#include <msp430x14x.h>
#include "Config.h"

//*************************************************************************
//               MSP430串口初始化
//*************************************************************************
void UART_Init()
{
  U0CTL|=SWRST;               //复位SWRST
  U0CTL|=CHAR;                //8位数据模式 
  U0TCTL|=SSEL1;              //SMCLK为串口时钟
  U0BR1=baud_h;               //BRCLK=8MHZ,Baud=BRCLK/N
  U0BR0=baud_l;               //N=UBR+(UxMCTL)/8
  U0MCTL=0x00;                //微调寄存器为0,波特率9600bps
  ME1|=UTXE0;                 //UART0发送使能
  ME1|=URXE0;                 //UART0接收使能
  U0CTL&=~SWRST;              //置0
  IE1|=URXIE0;                //接收中断使能位
  
  P3SEL|= BIT4;               //设置IO口为普通I/O模式
  P3DIR|= BIT4;               //设置IO口方向为输出
  P3SEL|= BIT5;
}

//*************************************************************************
//              串口0发送数据函数     //这种方式是可靠的,发送采用查询模式,接收采用中断模式
//*************************************************************************

void Send_Byte(uchar data)
{
  while((IFG1&UTXIFG0)==0);          //发送寄存器空的时候发送数据
    U0TXBUF=data;
}

//*************************************************************************
//               处理来自串口 0 的接收中断    //接收也可以采用中断模式
//*************************************************************************

#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
  uchar data=0;
  data=U0RXBUF;                       //接收到的数据存起来
  Send_Byte(data);                    //将接收到的数据再发送出去
}

//*************************************************************************
//            处理来自串口 0 的发送中断,预留
//*************************************************************************

#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void)
{

}

//*************************************************************************
//           主函数
//*************************************************************************
void main(void)
{ 
  WDT_Init();                         //看门狗设置
  Clock_Init();                       //系统时钟设置
  UART_Init();                        //串口设置初始化
  _EINT();                            //开中断
  while(1)                            //无限循环
    {
    }
}

7、串口调试助手
在这里插入图片描述

总结

个人感觉f149和32单片机的使用极为相似,甚至Ctrl+F是查找功能都是与keil5一模一样,f149又是老版本的TI芯片,属于TI的MCUf1x系列,就好比stm32f1x系列的分类,对于大众来说还是比较容易上手的,有幸在我认知范围内可以查找到学习资料,十几个小时的教学视频是开了不同的倍速观看的,加之之前对stm32的理解,短时间可以速成,如果有32单片机的基础建议了解一下。
———————————————————————————————————————————————————————————Verify complete

  • 13
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
很高兴您对MSP430F149感兴趣!MSP430F149是德州仪器(Texas Instruments)推出的一款低功耗、高性能的16位微控制器。以下是一些MSP430F149学习笔记: 1. 架构和特性:MSP430F149采用了精简指令集(RISC)架构,具有低功耗特性和较高的运算性能。它具有16位数据总线和16位地址总线,支持多种外设和通信接口。 2. 开发环境:在开始学习MSP430F149之前,您需要安装MSP430开发环境。您可以使用MSP430 LaunchPad开发板,以及TI的MSP430编译器和调试工具。 3. 编程语言:MSP430F149可以使用C语言或汇编语言进行编程。C语言是更常用的编程语言,可以提高开发效率和可移植性。 4. GPIO控制:MSP430F149具有多个通用输入输出引脚(GPIO),可以用于连接外部设备或传感器。您可以使用编程方法来控制这些引脚的输入和输出。 5. 定时器和计数器:MSP430F149内置了多个定时器和计数器模块,用于定时、计数和产生脉冲。您可以使用这些模块来实现定时任务和测量时间间隔。 6. 串口通信:MSP430F149支持多种串行通信接口,如UART、SPI和I2C。您可以使用这些接口与其他设备进行数据交换和通信。 7. 中断处理:MSP430F149具有强大的中断系统,可以响应外部事件和优先级处理。您可以使用中断来处理实时事件和提高系统的响应性能。 这些是关于MSP430F149的一些学习笔记,希望对您有所帮助!如果您有任何具体的问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clockwisee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值