谈谈MSP430 的框架程序
最近在学习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 的框架程序的更多相关文章
- .NET 框架程序使用 Win32 API
.NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库.DllImport 属性用于指定包含外部方法的实现的dll 位置. DllImport 属性定义如下: na ...
- 关于MFC框架程序中CWinApp::OnIdle
很早之前就发现,我写的图形引擎在MFC框架程序中的刷帧率始终在60FPS左右.好在自己的程序对刷帧率的要求不是很高,所以一直没有太过纠结此事.直到今天看了别人的程序才发现应该在函数CWinApp::O ...
- windows7设置定时任务运行ThinkPHP框架程序
1. 设置Windows的任务计划 可以参考win7计划任务的设置方法 2. 新建Windows执行文件bat 新建cron.bat文件,内容如下: D: cd \wamp\www\tp32 D:\w ...
- CI框架程序--本地调试之后部署新浪SAE
前几天给朋友写了个简单的网站, 想想还是部署到服务器上让朋友看一下效果! 用CI框架写的,有个SAE新浪云的账号,可以用!就部署到上面去了!途中遇到了一些问题!一一解决了! 在这里分享一下 供遇到这些 ...
- Python——Flask框架——程序的结构
一.项目结构 |-flasky |-app Flask程序一般都保存在这里 |-templates/ |-static/ |main/ |-__init__.py |-errors.py |-form ...
- Python——Flask框架——程序的基本结构
一.安装 pip install flask 二.初始化 from flask import Flask app = Flash(__name__) 三.路由:处理URL和函数之间的关系的程序称为路由 ...
- MFC框架程序解析
MFC的 程序框架: WinMain函数:程序首先到达全局变量theApp,再到达theAPP的构造函数,最后到达WinMain函数处. 问:为何要定义一个全局对象theAPP,让其在WinMain函 ...
- 第3章 MFC框架程序剖析
参考: https://blog.csdn.net/u014162133/article/details/46573873 1. 2.MFC简介:MFC(Microsoft Foundation Cl ...
- 轻量级多级菜单控制框架程序(C语言)
1.前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计:很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网上有很多这种菜单框架 ...
随机推荐
- iOS7程序后台运行
介绍 这次 iOS7 对程序后台运行进行了加强,但是仅仅是加强而已,要想像 Android 程序那样自由当然就别想了,苹果这么做主要还是出于电池使用时间考虑,但是这次的加强对大部分程序基本够用. 在介 ...
- 3D魔方游戏
初学OpenGL时做的小程序,涉及到了OpenGL的大部分基本内容,如视图模型变换.色彩.纹理贴图.材质.光照.显示列表.选择等 三阶魔方有3×3×3个方块组成,每个方块的类当中都有一个4×4的矩阵, ...
- Obective-C之宏定义
优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码“#define”这种预处理指令. 什么动画时长啊,cell高度啊,cell的个 ...
- Hadoop概念学习系列之谈谈RPC(三十三)
RPC-------->远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...
- 字符流缓冲区BufferedReader之readLine方法的原理
- JSP九大内置对象分析
JSP九大内置对象分为三类: 1.输入输出对象:out对象.response对象.request对象 2.通信控制对象:pageContext对象.session对象.application对象 3. ...
- Redis 配置文件 Redis.conf 参数说明
Redis 配置文件 Redis.conf 参数说明 参数名 参数说明 参数实例 daemonize 是否以后台守护进程运行,默认为 no, 取值 yes, no daemonize no ...
- java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)
java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) 这节主要是ffmpeg的相关方法封装,在实际调用中主要使用f ...
- iOS调用系统通讯录获取姓名电话号码(转)
原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...
- Android应用插件式开发解决方法[转]
一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块.此时可能就需要考虑如何分 ...