最近在学习MSP430f149这块单片机,开始程序也没烧进去,弄了一天,发现串口不能下载,买了个jtag下载器,才搞定。现在也谈谈开始写程序的一些方法吧

程序重要的是框架,有这个基础之后才能行云流水的开始写程序。

include <MSP430x14x.h>//函数声明
void InitSys( );
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
InitSys( ); //初始化
start:
//以下填充用户代码
LPM3; //进入低功耗模式n,n 取值为0~4,若不希望进入低功耗模式,屏蔽本句
goto start;
}

/*********************************************************************
系统初始化
***********************************************************************/

void InitSys()
{
unsigned int iq0;
//使用XT2 振荡器
BCSCTL1 &= ~XT2OFF; //打开XT2 振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for(iq0=0xFF;iq0>0;iq0--); //延时,等待XT2 起振
}
while ((IFG1 & OFIFG)!= 0); //判断XT2 是否起振
BCSCTL2=SELM_2+SELS; //选择MCLK、SMCLK 为XT2
//以下填充用户代码,对各种模块、中断、外围设备等进行初始化
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}

/**********************************************************************
端口2 中断函数
***********************************************************************/

#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
//以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。
if((P2IFG&BIT0)==BIT0)
{
//处理P2IN.0 中断
P2IFG &= ~BIT0; //清除中断标志
//以下填充用户代码
}
else if((P2IFG&BIT1)==BIT1)
{
//处理P2IN.1 中断
P2IFG &= ~BIT1; //清除中断标志
//以下填充用户代码
}
else if((P2IFG&BIT2)==BIT2)
{
//处理P2IN.2 中断
P2IFG &= ~BIT2; //清除中断标志
//以下填充用户代码
}
else if((P2IFG&BIT3)==BIT3)
{
//处理P2IN.3 中断
P2IFG &= ~BIT3; //清除中断标志
//以下填充用户代码
}
else if((P2IFG&BIT4)==BIT4)
{
//处理P2IN.4 中断
P2IFG &= ~BIT4; //清除中断标志
//以下填充用户代码
}
else if((P2IFG&BIT5)==BIT5)
{
//处理P2IN.5 中断
P2IFG &= ~BIT5; //清除中断标志
//以下填充用户代码
}
else if((P2IFG&BIT6)==BIT6)
{
//处理P2IN.6 中断
P2IFG &= ~BIT6; //清除中断标志
//以下填充用户代码
}
else
{
//处理P2IN.7 中断
P2IFG &= ~BIT7; //清除中断标志
//以下填充用户代码
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
USART1 发送中断函数
***********************************************************************/

#pragma vector=USART1TX_VECTOR
__interrupt void Usart1Tx()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
USART1 接收中断函数
***********************************************************************/

#pragma vector=USART1RX_VECTOR
__interrupt void Ustra1Rx()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/***********************************************************************
端口1 中断函数
多中断中断源:P1IFG.0~P1IFG7
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次触发中断
************************************************************************/

#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
//以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。
if((P1IFG&BIT0)==BIT0)
{
//处理P1IN.0 中断
P1IFG &= ~BIT0; //清除中断标志
//以下填充用户代码
}
else if((P1IFG&BIT1)==BIT1)
{
//处理P1IN.1 中断
P1IFG &= ~BIT1; //清除中断标志
//以下填充用户代码
}
else if((P1IFG&BIT2)==BIT2)
{
//处理P1IN.2 中断
P1IFG &= ~BIT2; //清除中断标志
//以下填充用户代码
}
else if((P1IFG&BIT3)==BIT3)
{
//处理P1IN.3 中断
P1IFG &= ~BIT3; //清除中断标志
//以下填充用户代码
}
else if((P1IFG&BIT4)==BIT4)
{
//处理P1IN.4 中断
P1IFG &= ~BIT4; //清除中断标志
//以下填充用户代码
}
else if((P1IFG&BIT5)==BIT5)
{
//处理P1IN.5 中断
P1IFG &= ~BIT5; //清除中断标志
//以下填充用户代码
}
else if((P1IFG&BIT6)==BIT6)
{
//处理P1IN.6 中断
P1IFG &= ~BIT6; //清除中断标志
//以下填充用户代码
}
else
{
//处理P1IN.7 中断
P1IFG &= ~BIT7; //清除中断标志
//以下填充用户代码
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/***********************************************************************
定时器A 中断函数
多中断中断源:CC1~2 TA
***********************************************************************/

#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1()
{
//以下为参考处理程序,不使用的中断源应当删除
switch (__even_in_range(TAIV, 10))
{
case 2:
//捕获/比较1 中断
//以下填充用户代码
break;
case 4:
//捕获/比较2 中断
//以下填充用户代码
break;
case 10:
//TAIFG 定时器溢出中断
//以下填充用户代码
break;
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/***********************************************************************
定时器A 中断函数
中断源:CC0
************************************************************************/

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
AD 转换器中断函数
多中断源:摸拟 0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2
***********************************************************************/

#pragma vector=ADC_VECTOR
__interrupt void Adc()
{
//以下为参考处理程序,不使用的中断源应当删除
if((ADC12IFG&BIT0)==BIT0)
{
//通道0
//以下填充用户代码
}
else if((ADC12IFG&BIT1)==BIT1)
{
//通道1
//以下填充用户代码
}
else if((ADC12IFG&BIT2)==BIT2)
{
//通道2
//以下填充用户代码
}
else if((ADC12IFG&BIT3)==BIT3)
{
//通道3
//以下填充用户代码
}
else if((ADC12IFG&BIT4)==BIT4)
{
//通道4
//以下填充用户代码
}
else if((ADC12IFG&BIT5)==BIT5)
{
//通道5
//以下填充用户代码
}
else if((ADC12IFG&BIT6)==BIT6)
{
//通道6
//以下填充用户代码
}
else if((ADC12IFG&BIT7)==BIT7)
{
//通道7
//以下填充用户代码
}
else if((ADC12IFG&BIT8)==BIT8)
{
//VeREF+
//以下填充用户代码
}
else if((ADC12IFG&BIT9)==BIT9)
{
//VREF-/VeREF-
//以下填充用户代码
}
else if((ADC12IFG&BITA)==BITA)
{
//温度
//以下填充用户代码
}
MSP430 系列单片机实用C 语言程序设计
– 118 –
else if((ADC12IFG&BITB)==BITB)
{
//(AVcc-AVss)/2
//以下填充用户代码
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
USART0 发送中断函数
***********************************************************************/

#pragma vector=USART0TX_VECTOR
__interrupt void Usart0Tx()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
USART0 接收中断函数
***********************************************************************/

#pragma vector=USART0RX_VECTOR
__interrupt void Usart0Rx()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
看门狗定时器中断函数
***********************************************************************/

#pragma vector=WDT_VECTOR
__interrupt void WatchDog()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
比较器A 中断函数
***********************************************************************/

#pragma vector=COMPARATORA_VECTOR
__interrupt void ComparatorA()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
定时器B 中断函数
多中断源:CC1~6 TB
***********************************************************************/

#pragma vector=TIMERB1_VECTOR
__interrupt void TimerB1()
{
//以下为参考处理程序,不使用的中断源应当删除
switch (__even_in_range(TBIV, 14))
{
case 2:
//捕获/比较1 中断
//以下填充用户代码
break;
case 4:
//捕获/比较2 中断
//以下填充用户代码
break;
case 6:
//捕获/比较3 中断
//以下填充用户代码
break;
MSP430 系列单片机实用C 语言程序设计
– 120 –
case 8:
//捕获/比较4 中断
//以下填充用户代码
break;
case 10:
//捕获/比较5 中断
//以下填充用户代码
break;
case 12:
//捕获/比较6 中断
//以下填充用户代码
break;
case 14:
//TBIFG 定时器溢出中断
//以下填充用户代码
break;
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
定时器B 中断函数
中断源:CC0
***********************************************************************/

#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0()
{
//以下填充用户代码
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

/**********************************************************************
不可屏蔽中断函数
***********************************************************************/

#pragma vector=NMI_VECTOR
__interrupt void Nmi()
{
//以下为参考处理程序,不使用的中断源应当删除
if((IFG1&OFIFG)==OFIFG)
{
//振荡器失效
IFG1 &= ~OFIFG;
//以下填充用户代码
}
else if((IFG1&NMIIFG)==NMIIFG)
{
//RST/NMI 不可屏蔽中断
IFG1 &= ~NMIIFG;
//以下填充用户代码
}
else if((FCTL3&ACCVIFG)==ACCVIFG)
{
//存储器非法访问
FCTL3 &= ~ACCVIFG;
//以下填充用户代码
}
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}

  框架程序比较长,但却是一个完整的程序结构,对于初学的读者来说,更容易获得整体的概念。MSP430 的中断种类很多,通过这个框架程序也可以方便地查询中断的处理方式。程序中的 main 函数是程序的起点。main 函数中调用了另外一个函数InitSys,InitSys 作用是对系统进行初始化。其余的是中断函数,对中断进行处理。程序的第一句将看门狗关闭,MSP430 的看门狗复位后的默认状态是打开的,如果不使用就必须关闭,否则会产生PUC 信号,从而导致系统复位。另外,在调试时也应当关闭看门
狗。接着进入InitSys 函数,进行初始化。如果使用XT2 振荡器,则必须先打开XT2 振荡器。因为振荡器失效的中断标志OFIFG 复位后是有效的,所以,首先必须复位OFIFG,清除振荡器失效标志。因为XT2 振荡器不会立刻起振,所以需要延时一段时间后再次测试OFIFG。如果OFIFG 为1,则XT2 没有起振,再次复位OFIFG,等待XT2 起振。周而复始,直至XT2起振再向下执行程序。程序接着选择MCLK 和SMCLK 的时钟源为XT2,当然也可以不这样选。接着根据需要对所使用的外围模块进行初始化。最后,如果使用了中断,则打开全局中断控制位。CPU 也可以根据需要选择进入低功耗模式,等待中断被触发再退出低功耗模式。不同的中断函数处理方式有所不同。某些中断要求退出中断函数前要复位中断标志,否则会再次触发中断。多中断源中断函数需要判断中断源,如果同时有多个中断源触发中断,则按照所编写程序判断中断触发源的顺序来确定响应中断的优先级。用户可以按照自己的顺序要求来编写程序。中断函数中最后一句LPMn_EXIT 使程序退出中断程序之后脱离低功耗模式,n 的取值范围为0~4,代表5 种低功耗模式。

  

谈谈MSP430 的框架程序的更多相关文章

  1. .NET 框架程序使用 Win32 API

    .NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库.DllImport 属性用于指定包含外部方法的实现的dll 位置.       DllImport 属性定义如下:      na ...

  2. 关于MFC框架程序中CWinApp::OnIdle

    很早之前就发现,我写的图形引擎在MFC框架程序中的刷帧率始终在60FPS左右.好在自己的程序对刷帧率的要求不是很高,所以一直没有太过纠结此事.直到今天看了别人的程序才发现应该在函数CWinApp::O ...

  3. windows7设置定时任务运行ThinkPHP框架程序

    1. 设置Windows的任务计划 可以参考win7计划任务的设置方法 2. 新建Windows执行文件bat 新建cron.bat文件,内容如下: D: cd \wamp\www\tp32 D:\w ...

  4. CI框架程序--本地调试之后部署新浪SAE

    前几天给朋友写了个简单的网站, 想想还是部署到服务器上让朋友看一下效果! 用CI框架写的,有个SAE新浪云的账号,可以用!就部署到上面去了!途中遇到了一些问题!一一解决了! 在这里分享一下 供遇到这些 ...

  5. Python——Flask框架——程序的结构

    一.项目结构 |-flasky |-app Flask程序一般都保存在这里 |-templates/ |-static/ |main/ |-__init__.py |-errors.py |-form ...

  6. Python——Flask框架——程序的基本结构

    一.安装 pip install flask 二.初始化 from flask import Flask app = Flash(__name__) 三.路由:处理URL和函数之间的关系的程序称为路由 ...

  7. MFC框架程序解析

    MFC的 程序框架: WinMain函数:程序首先到达全局变量theApp,再到达theAPP的构造函数,最后到达WinMain函数处. 问:为何要定义一个全局对象theAPP,让其在WinMain函 ...

  8. 第3章 MFC框架程序剖析

    参考: https://blog.csdn.net/u014162133/article/details/46573873 1. 2.MFC简介:MFC(Microsoft Foundation Cl ...

  9. 轻量级多级菜单控制框架程序(C语言)

    1.前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计:很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网上有很多这种菜单框架 ...

随机推荐

  1. 无状态、REST、RESTful 和 Web Services【整理】

    在理解 OpenStack 的过程中,常常遇到 REST 这个概念,现从各处搜罗如下: 对 Web Service 的理解: Web 服务有点像对计算机友好的网页,基于让程序可以跨网络交换信息的标准和 ...

  2. 使用weka进行Cross-validation实验

    Generating cross-validation folds (Java approach) 文献: http://weka.wikispaces.com/Generating+cross-va ...

  3. 关于C#动态调用VC Dll的方法(转)

    http://blog.csdn.net/null1/article/details/3953155

  4. leetcode@ [54/59] Spiral Matrix & Spiral Matrix II

    https://leetcode.com/problems/spiral-matrix/ Given a matrix of m x n elements (m rows, n columns), r ...

  5. 单点登录与消息队列以及在J2EE中的实现方案

    前言 这次为大家简单介绍两个在WEB开发中经常使用的概念——单点登录和消息队列以及具体到J2EE中的一些实现方案.本文原创性的工作比较少,主要是一些总结概括和自己的理解. 单点登录SSO SSO的业务 ...

  6. Objective-C Runtime 运行时之二:成员变量与属性

    类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的 ...

  7. 转载SSIS中的容器和数据流—数据转换(Transformations)续

    数据挖掘请求 数据挖掘任务是SSIS中一个很重要的任务,它的思想来源于一些算法.数据挖掘请求运行数据挖掘请求,并将结果输出到数据流.它还可以添加一些预测新列,一些应用场合如下列举: 根据已知的一些列, ...

  8. 背景透明文字不透明的最佳方法兼容IE(以背景黑色透明度0.5为例)

    以背景黑色,透明度0.5举例为大家详细介绍下关于背景透明,文字不透明的最佳方法同时兼容IE,具体实现如下,感兴趣的朋友可以参考下哈希望对大家有所帮助 以背景黑色,透明度0.5举例 非IE:backgr ...

  9. hdu1863 畅通工程(最小生成树之prim)

    Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...

  10. nginx编译参数集合

    http://www.ttlsa.com/nginx/nginx-configure-descriptions/ 标题是不是很欠揍,个人认为确实值得一看,如果你不了解nginx,或者你刚学nginx, ...